本文分享自华为云社区《GaussDB(DWS)备份问题定位思路》,作者:yd_216390446。
前言
在数据库系统中,故障分为内部故障、系统故障、磁盘(磁盘)故障。对于内部故障和系统故障,使用日志自动恢复,不需要人工参与。对于介质故障,需要预先但备份数据。
那么对于DWS来说是如何进行备份的呢?以及备份的过程中容易出现哪些问题,又怎样去排查、解决呢?
本文主要讲述了DWS备份工具方法的备份原理,以及常见的问题处理套路和相关案例。
一、备份原理
全部数据备份
本文主要说的是备份的物理备份,即通过物理文件拷贝的方式对数据库进行备份,通过备份的数据文件和日志等文件,数据库可以进行完全恢复。
全量备份大致分几个阶段:备份行存、创建屏障点、备份xlog、备份列存。
- 备份行存储:每个节点的主DN的数据,压缩存储到rch文件中
- 创建屏障点:保证CNDN上的所有事务处于一致的状态,恢复到该点比较可靠,创建时会在XLog中写入一条记录。
- 备份xlog:备份startLSN和stopLSN之间的xlog
- 备份列存:由于列存不写xlog,放在最后,其中列存的cudesc文件已在备份行存阶段备份
整体流程如下图所示

容易出现的问题:
- 取消xlog恢复容易造成供应集群
- 延迟DDL也引起了负载严重
注意点:
- 备份流程必须开启FPW
- 备份XLog副本start_lsn和end_lsn之间的xlog
- 备份列存的时候才会开启DDL
为什么延迟延迟DDL?
DDL操作:alter/truncate/autovacuum/drop/vacuum full/insert overwrite这些会改变relfilenode的语句,DDL操作在获取行列存清单后,如果用户进行drop操作,为了保证文件存在,所以要开启延迟DDL
增量备份

增量备份是基于某次备份进行的,在增量备份的命令中需要增加参数–prior-backup-key来表明是基于哪一次的备份。采用cbm文件识别增量页面。增量备份分成总计增量和增量 增量同
- 累计增量:每次备份都是基于同一个全量备份,备份的内容为全量备份与当前时刻的数据修改
- 增量增量:每次备份都是基于上一次的备份,备份的内容为两次备份之间的数据
增量备份的原理:
- 只拷贝上次并备份最近的数据修改部分,拷贝最小单位是block(8KB)
- 集群首次备份时,GaussDB内核会开启guc参数,enable_cbm_tracking=on,然后内核会持续记录数据库文件哪些块被修改过,记录在pg_cbm目录下。
- 备份增量时,查询cbm文件精准获得修改过的块存入内存,然后实施lz4/zlib压缩算法,读取备份介质。
- 恢复增量时,从增量备份集获取各个增量的块内容,对应修改数据库文件相应的块。
- 注意:该guc参数被关闭,或cbm文件被误删除后,只能重新做全量备份,无法继续做增量
cbm文件是什么?
更改块映射,对外提供数据页面的修改情况,并提供外部接口,根据cbm信息可以直接获取两次备份之间发生的数据文件(行存、列存)的增量修改信息,并备份

备份对于系统的影响:
- 备份占用系统IO,业务慢
- 延迟DDL,导致xlog积压,磁盘空间上升
- 增量备份容易造成cbm文件积压,导致架构异常
二、问题定位套路
1)备份调用流程
DWS管控面/FI管控面-> GaussRoach.py/SyncDataToStby.py -> gs_roach内核
管控面调用roach的python脚本,python脚本进行解析参数,并调用内核侧的gs_roach命令。
2)备份失败需要查看日志路径:
- HC/HCS/HCSO集群
- 管控面调用日志: 沙箱外 /home/Ruby/log/cloud-dws-deploy.log
- 管控面归档日志:沙箱外 /home/Ruby/archivelog
- 内核日志:沙箱内 /var/chroot/DWS/manager/backup/log
- 线下资源
- 内核日志:$GAUSSLOG/roach/agent
- Python侧日志:$GAUSSLOG/roach/controller
- obs日志:
- 沙箱内 cd $GAUSSLOG/bin/gs_obs
- vi gs_obs.run.log 查看对应的错误号此处注意并且obs日志需要到具体错误节点上查看

3)常用grep命令:
查看主节点ip: grep “Master Ip” roach_agent*.log
查看备份详细信息:grep “Setting agent state to” roach_agent*.log
查看备份时间:grep “Time take” roach_agent*.log | grep “主”
查看备份是否成功:grep “备份操作成功。备份密钥” roach_agent*.log
查看roach_client ip:grep “成功连接远程媒体” roach_agent*.log
查看线程分配情况:grep “allotInstanceForMyProc” roach_agent*.log
查看备份命令参数:grep “command_dict” roach_controller*.log
如果文件被文件夹,使用“zgrep命令查看即可”
4)备份关键日志
| 关键字 | 说明 |
|---|---|
| 创建线程 Roach 代理 | 开始创建代理进程 |
| RAGENT_EXEC_PREPARING_METADATA com | 开始准备元数据清单 |
| 进入行存储复制的回调 | 开始备份行存 |
| 执行备份输入 | 真正开始执行落盘到rch |
| 在 col 文件复制之前开始延迟 ddl 回收 | 开启延迟DDL |
| 将代理状态设置为 [AGENT_CREATING_BARRIER] | 开始创建障碍 |
| RAGENT_EXEC_BACKUP_XLOGFILES来 | 代理开始备份xlog |
| 进入colstore复制的回调 | 开始备份列存 |
| 复制所有 col 文件后停止延迟 ddl 回收 | 关闭延迟DDL |
| 将主状态设置为 [PERFORM_BOOKKEEPING_INFO] | 备份结束,master节点开始汇总结果 |
三、相关案例
(1)细粒度备份报错Failed to connect to gauss(xxx) via libqp
【问题描述】备份时agent报错Failed to connect to gauss(host:local , port: 25308) via libpq, ERROR: Connection Pointer is NULL


【排查方案】
- 由于报错连接时“host:25308”,查看相应对应时间节点的cn日志
- cn报错 FATAL: “base/2278052” 不是有效的数据目录,怀疑是该数据库的问题
- 手动连接该数据库,发现也连不上
- dn实例目录下查看该目录并不存在,为过量导致
- drop database 删除该数据库后备份成功
【问题原因】数据库存在残留文件
【规避方法】删除该数据库下的残留文件
(2)备份随机失败
【问题描述】NBU问题导致备份随机失败
【排查方案】
- 查看controller日志,显示第一个报错的节点为xx.xx.xx.148
- 到上述节点查看agent日志,报错"Incomplete Message from Roach client",发现日志指向media server,因此查看roach client日志

- 怀疑是nbu的问题,到对应的roach_client节点查看相应日志,通过grep “成功连接远程媒体” roach_agent*.log,找到roach_client的ip地址,ssh到对应的roach_client节点,对应的报错为NBU内的报错,“调用NbuManager::CreateFile错误”,乖NBU侧的同事排查

【问题原因】一般情况下,上述情况是由于roach并发严重,导致NBU负载大,备份报错,但具体细节还需要协调NBU同时排查
【救援措施】如果是并发问题,建议调整大文件分割大小参数并减少并行进程参数,重新拉起备份
NBU同事排查情况如何?
一般roach_client日志出现xbsa、或者创建文件等关键字时
(3)master和agent连接失败导致备份失败
【问题描述】master和agent连接失败导致备份失败
【涉及版本】
【排查方案】日志报错Master和agent连接失败,Agents在600秒内未连接。

【问题原因】
HCS环境下只开放了55000和56000端口,端口未开放导致报错
【问题规避】
方案1:修改roach命令端口
方案2:开放应答端口
(4)精细读取找不到文件信息报错
【问题描述】精细备份报告错误Error:Getting file info failed.
【涉及版本】
【排查方案】查看报错节点agent日志,出现关系xxx的备份主叉失败,Error: Getting file info failed.

【问题原因】细粒度备份期间不支持DDL操作。细粒度备份前会生成所有表的MAP文件,记录涉及的表名、以及表的相关表等信息,所有涉及修改到relfilenode的DDL操作的语句都会满足导致备份失败,例如alter/truncate/autovacuum/drop/vacuum full/insert overwrite等
【问题规避】
方案1:备份并涉及到DDL的业务时间错开
方案2:适当减少每次备份涉及的表,可以降低由于DDL引起的备份失败率
(5)备份过程报错内存临时不可用
【问题描述】 备份转储元数据阶段报错内存暂时不可用。
【排查方案】
控制器报错 内存暂时不可用。
【问题原因】参数cpu-cores过大,导致内存慢
【问题规避】调整小cpu-cores参数
(6)大集群下roach读取cms高峰导致高峰状态不稳定
【问题描述】备份发起时,管控面显示集群状态异常,大集群下gs_roach启动时会间歇访问cms读取集群状态,导致cm_ctl查询集群状态重启
【涉及版本】821以下版本(不包括821版本)
【排查方案】
- 查询cm_server日志(roach启动之后的时间点),报错“CmPqPutMessage return error ret=xx”

- $GAUSSLOG/bin/cm_ctl日志,报错“向 cm_server 发送查询消息失败”

【问题原因】
在roach启动期间,集群调用cm_ctl命令,而集群节点数多,分布数高,会导致页面集群状态监测的脚本执行cm_ctl失败
【问题规避】
升级到821版本
四、常见问题汇总


相关文档:
华为云数仓GaussDB(DWS)备份恢复的实现:华为云数仓GaussDB(DWS)备份恢复的实现-云社区-华为云
数仓GaussDB(DWS)全量备份汇总: https: //bbs.huaweicloud.com/blogs/242694
44



被折叠的 条评论
为什么被折叠?



