ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

KingbaseES指定备份集恢复:原理、实操与避坑指南

KingbaseES指定备份集恢复:原理、实操与避坑指南 做数据库运维这几年如果让我排一个“最怕遇到、却又最该掌握”的操作清单指定备份集恢复绝对能进前三。上周刚处理完一个现场业务同事在一个大表上执行全表UPDATE条件写错等发现已经是下午三点而昨晚凌晨两点的物理备份集还安安静静躺在备份目录里。整个恢复动作其实只花十来分钟但前提是你得清楚怎么从一堆备份集里把指定的那一个捞出来并且恢复得干净利落。今天就把kingbase数据库指定备份集恢复这套流程完整拆给你从原理到实操到踩坑一次说透。这篇内容适合一直在跑KingbaseES的DBA、运维同学以及那些刚接手金仓数据库、正在补备份恢复课的人。1. 先搞清楚KingbaseES的备份集到底是个什么东西1.1 备份工具三条路线要分清很多人在备份恢复上栽跟头第一关就栽在“用错工具”。KingbaseES体系里常见备份手段大致分三类。第一类是物理备份工具是sys_backup.sh也有环境里叫kb_backup或直接调底层命令。它做的事情是直接复制数据文件、WAL日志和数据库运行需要的元信息类似给整个数据库做了一次“块级别快照”。物理备份恢复出来的东西和备份时刻的实例状态是一模一样的速度也快适合中大型生产库、整实例恢复。第二类是逻辑备份工具是sys_dump和sys_restore。它把表、视图、函数、数据等内容按SQL语句导出适合小库、单表、部分对象恢复。逻辑备份更灵活但它导出的是逻辑数据不包含数据库底层的物理布局恢复时需要通过SQL重新执行。第三类是图形化工具比如KStudio自带的备份恢复插件。本质上前两类工具的封装适合不习惯敲命令的场景。对于“指定备份集恢复”这个需求主力场景其实是物理备份的sys_backup.sh偶尔也会用逻辑备份文件做单表回滚。所以下面我重点展开物理备份集逻辑备份在后面单独给一节。1.2 物理备份目录里到底存了什么理解备份集先理解备份目录的结构。我用一个实际初始化的备份目录举例/kbbak ├── backup_list ├── backup_list.old ├── system ├── archived_wal │ ├── 000000010000000000000001 │ ├── 000000010000000000000002 │ └── ... ├── backups │ ├── 20241010020000 │ │ ├── backup_info │ │ ├── backup_label │ │ ├── data_files.tar.gz │ │ └── pg_wal.tar.gz │ └── 20241011020000 │ └── ... └── logs └── sys_backup.logbackups目录下每个以时间戳命名的子目录就是一个备份集。backup_info记录了这次备份的类型、开始时间、结束时间、备份方式、校验信息等backup_label是数据库实例记录的备份标签data_files.tar.gz是核心数据文件的压缩包pg_wal.tar.gz是备份时刻的WAL日志。archived_wal目录是归档日志的存放位置。为什么恢复时经常离不开它因为一个完整恢复链条是“基础全量备份集 之后的增量备份集 归档WAL日志”三样齐了才可能把数据恢复到任意时间点。1.3 为什么要“指定”备份集而不是直接恢复最新不少新手有个误区备份目录里只有一个最新备份restore命令默认恢复最新就可以了干嘛还要指定真实生产环境远没有这么简单。我在维护一套核心系统时备份策略是每天凌晨2点全量备份、每2小时增量备份、持续归档WAL。一个月下来备份集可能有几十个。一旦业务在上午10点误删数据你想恢复的不是“最新备份集”而是“昨天晚上2点那个全量备份再配合WAL日志把数据回放到今天上午9点50分的位置”。这就有两个“指定”指定备份集ID指定恢复目标时间点。甚至有一种需求更纯粹测试环境要用线上前几天某个时刻的数据做联调你只想要那天那个备份集不需要回放到任何时间点。这种情况下“指定备份集恢复”就成了唯一正确姿势。2. 动手恢复前必须完成的准备和确认2.1 恢复决策四连问在敲任何命令之前我习惯先逼自己回答四个问题。别嫌啰嗦这四个问题能避免80%的恢复事故。第一问我要恢复的目标是什么是整库恢复还是某个Schema还是某一张表整库用物理备份集单表用逻辑备份文件更方便。第二问恢复的时间点在哪里如果只要回到“备份集完成那一刻”那么直接用备份集本身即可如果要回到“备份集完成之后、故障发生之前的某个时间”就必须靠归档WAL继续回放。第三问恢复到哪台机器、哪个目录是原来这台机器原位恢复还是一台新机器做异机恢复这决定了数据目录清理力度和系统环境一致性要求。第四问这个备份集是否完整、可用这一步常被跳过但恰恰最致命。一个损坏的备份集恢复执行到一半才报错那种感觉比没备份还痛苦。2.2 确认备份集列表并做完整性校验任意一次恢复前我都会先跑到备份目录下用sys_backup.sh show看一眼当前有哪些备份集。这个命令输出的信息大致长这样BACKUP ID TIME MODE STATUS 20241010020000 2024-10-10 02:00 FULL OK 20241011020000 2024-10-11 02:00 FULL OK 20241011140000 2024-10-11 14:00 INCR OKBACKUP ID就是后面指定恢复时最关键的标识。MODE代表备份类型FULL是全量INCR是增量。STATUS是备份集自身的校验状态如果显示OK说明这个备份集在备份完成后做过完整性检查。再进一步我还会对要用的备份集单独执行一次validate校验。不同版本参数稍有差异但逻辑一样sys_backup.sh validate -B /kbbak -i 20241011020000这一步会检查备份集文件是否存在、文件校验和是否匹配、和它关联的WAL归档是否完整。实测中它最常发现的问题是有备份集目录、但内部文件被清理了一部分或者增量备份集对应的基础全量被误删了。这种问题不提前校验恢复时就是灾难。2.3 原位恢复vs异机恢复两条路线的差别原位恢复就是直接在原来那个数据目录上恢复。操作上要先把现有数据目录改个名字然后用备份集内容覆盖过去。优点是环境路径、配置完全一致缺点是如果原数据目录已经损坏严重或磁盘空间不足这条路可能走不通。异机恢复是把备份集搬到另一台相同操作系统、相同数据库大版本的机器上恢复。这条路线多用于容灾演练、测试环境构建、生产故障后快速拉起新实例。异机恢复的坑在于操作系统架构、用户权限、数据库安装路径需要尽量保持一致否则恢复后启动时容易报配置错误。实操中我的建议是优先在独立环境做“演练式恢复”验证通过后再考虑生产原位处理。原因很简单错误操作导致原数据目录被二次破坏的风险远比多花一点时间大。2.4 恢复前的现场保护这一点我放在最前面警示过但还是要再强调一次。执行恢复前至少做三件保护动作如果数据库还能启动先通过逻辑导出方式把关键业务表的数据单独dump一份哪怕量很大也要挑最核心的表导出来这是最后一根稻草。原数据目录不要直接删执行mv改名即可。例如mv /kbdata /kbdata_bak_20241011。关闭所有自动任务、备份任务、监控采集任务防止恢复过程中有进程往数据目录写入内容。很多恢复失败案例都不是恢复命令本身错了而是恢复环境被其他进程干扰了。3. 实操物理备份集指定恢复全流程3.1 停止服务保护好原现场物理备份集恢复的前提是目标数据目录没有被数据库进程占用。无论原位恢复还是异机恢复第一步都是把实例停下来。# 停止KingbaseES服务 sys_ctl stop -D /kbdata # 确认进程已退出 ps -ef | grep kingbase | grep -v grep停止服务之后如果原数据目录还要保留就执行改名mv /kbdata /kbdata_bak_$(date %Y%m%d)这里有个细节改名之后建议立刻检查磁盘剩余空间。恢复过程会同时占用三份空间原数据目录改名后的备份空间、备份集目录占用的空间、恢复出来的新数据目录空间。磁盘写满导致恢复中断是我见过最高频的故障之一。简单算一下用df -h确认可用空间至少是“备份集大小 预计数据目录大小”的1.5倍。3.2 从备份目录里选择目标备份集假设现在备份目录下有多个备份集我想找回2024年10月11日凌晨2点那个全量备份。先执行sys_backup.sh show -B /kbbak确认目标备份集ID是20241011020000状态为OK。然后执行校验sys_backup.sh validate -B /kbbak -i 20241011020000校验输出末尾一般会显示Success或OK。有问题的备份集千万别硬用先查归档日志和备份日志找原因。如果你发现目标备份集是增量备份比如20241011140000那要有个意识增量备份集不能独立恢复它必须依赖它对应的基础全量备份集。执行恢复命令时工具一般会自动查找并读取基础全量但人工干预时千万别只拷贝增量备份集目录到目标环境那必然恢复失败。3.3 执行指定备份集恢复命令恢复命令本身不复杂关键是参数要对。我常用的一种形式是sys_backup.sh restore -B /kbbak -D /kbdata -i 20241011020000分别说明一下-B指定备份目录就是存放所有备份集的那个根目录。-D指定目标数据目录也就是要把数据恢复到哪个目录。-i指定备份集ID这就是“指定备份集”的核心参数。有一点必须提醒KingbaseES不同小版本的命令参数可能会有变化有的版本用-i有的用--backup-id有的甚至支持交互式选择。我不建议死记参数操作前先执行一次sys_backup.sh --help确认当前环境的参数写法这比凭记忆敲命令可靠得多。执行恢复命令后工具会先恢复基础全量备份集再检查是否需要叠加增量备份集最后解压数据文件到目标数据目录。整个过程的耗时取决于数据量大小和磁盘速度。我恢复过一个2TB的实例全量备份集恢复大约用了四十分钟而恢复一个200GB的实例通常几分钟就完成了。恢复命令结束后目标数据目录下应该能看到完整的PG_VERSION、base目录、global目录、pg_wal目录等。先别急着启动数据库因为很多场景下你还需要决定直接让数据库停在备份集时间点还是继续用归档WAL回放到指定时间点。3.4 配置恢复目标时间点启动并等待恢复完成如果你只需要“备份集完成那一刻的数据”那么恢复完直接启动即可sys_ctl start -D /kbdata启动后数据库处于recovery状态会自动应用备份集里携带的WAL日志应用完后自动结束恢复进入正常读写状态。如果你要恢复到“备份集完成之后某个具体时间点”就需要用到基于时间点恢复PITR。在KingbaseES里不同版本的配置方式有所不同我常用的是在数据目录下配置恢复参数。老版本习惯用recovery.conf新版本则可能在数据库配置文件中添加恢复目标参数。典型配置如下restore_command cp /kbbak/archived_wal/%f %p recovery_target_time 2024-10-11 09:50:00 recovery_target_inclusive truerestore_command告诉数据库去哪找归档WAL文件recovery_target_time指定回放停止时间点。配置完成后启动数据库sys_ctl start -D /kbdata启动后数据库会进入恢复模式这时它只能执行查询操作不能写数据。观察日志数据库会在到达指定时间点后停止恢复。这一步很关键如果日志显示一直在应用WAL说明目标时间点设置得晚于备份集之后可用的最后一个WAL要么等它追到末尾自动停止要么说明归档WAL不完整。确认数据正确后必须把恢复配置清理掉。老版本的做法是把recovery.conf改名或删除例如改成recovery.done新版本则要移除参数文件里的恢复目标项。清掉之后重启数据库让它进入正常读写模式。这个收尾动作一定不能忘——我见过有人在恢复模式下忘了清理配置第二天业务发来“数据库只能读不能写”的投诉一查才发现恢复配置还留着。3.5 恢复完成后的验证动作启动后别急着让业务接入先做几项验证。第一基础检查。查询数据库版本、当前时间、数据库列表确认实例基础信息正常。select version(); select now(); select datname from sys_database;第二业务数据验证。找几张核心业务表分别统计行数、查看最大ID、抽查几行关键数据和业务方确认数据是否符合预期。如果是从备份集回放到指定时间点的恢复这个环节尤其重要因为时间点设置偏差可能导致数据比预期旧或比预期新。第三逻辑一致性检查。比如外键关系是否完好、序列当前值是否合理。有一个坑很典型误删数据后恢复表数据回来了但自增序列的值还在故障之后的位置导致后续插入主键冲突。遇到这种情况需要把序列重新校正到当前表数据最大值之后。第四物理完整性校验。有条件的话可以运行数据库自带的校验工具检查数据文件的物理完整性。4. 逻辑备份场景指定一个备份文件恢复4.1 sys_dump产生的“备份集”长什么样物理备份集恢复解决的是整实例问题但很多时候业务只误删了一张表恢复整个实例影响太大。这时候逻辑备份就派上用场。sys_dump导出的文件就是逻辑备份集常见格式有两种纯SQL文本格式和自定义归档格式。纯SQL格式就是一个.sql文件可以直接用sys_restore或者ksql执行自定义归档格式是一个二进制压缩文件恢复时需要用sys_restore来解析。我建议日常逻辑备份都用自定义归档格式因为sys_restore可以灵活选择恢复哪些对象、哪些表而不必把整个文件全部执行一遍。命令示例sys_dump -U system -F c -f /kbbak/logical/20241011_backup.dmp kingbase-F c表示自定义归档格式-f指定输出文件路径最后那个kingbase是库名。4.2 用sys_restore恢复指定备份文件假设现在要恢复那个.dmp文件中的全部数据sys_restore -U system -d kingbase -c /kbbak/logical/20241011_backup.dmp-d指定目标数据库-c表示在恢复前清理目标库中的已存在对象。执行过程中如果有对象已经存在可能会报一些错误大多数情况下可以忽略但如果在意可以先用-l参数查看备份文件里有哪些对象再按需恢复。表级恢复是我最常用的功能。比如我只想找回误删的public.orders表sys_restore -U system -d kingbase -t public.orders /kbbak/logical/20241011_backup.dmp这样只恢复这一张表不动其他数据。注意-t参数可以写多个只要在sys_restore里重复出现即可。逻辑恢复最容易被忽略的是依赖顺序。如果目标表和其他表有外键关联单独恢复一张表可能会导致数据完整性问题。我通常建议表级恢复后手工检查一下关联表的数据必要时补做一次外键校验。4.3 逻辑恢复的适用边界逻辑备份集恢复的优势是灵活、对象级可控但它有两个硬伤。一是速度慢数据量超过几百GB后逻辑恢复的时间成本会明显上升二是它不包含数据库的物理结构、权限、表空间等底层信息恢复出来的数据要重新建立部分依赖关系。所以我的经验是生产环境恢复优先考虑物理备份集方案因为它能还原出最贴近真实的数据库状态逻辑备份集则作为补充防线专门处理单表回滚和跨环境数据抽取。5. 频率最高的故障与排查手册5.1 恢复报错备份集不存在或ID不匹配这个错误多数时候不是备份真的丢了而是-i参数写错了。比如备份ID写成了时间字符串2024-10-11 02:00:00而show输出的实际是20241011020000。解决办法很简单以show输出为准直接复制BACKUP ID不要手工输入。还有一种情况是备份目录确实缺少该备份集。可能是备份过期被清理策略删掉了也可能备份集所在磁盘损坏。预防方案是备份集一定要做异地或离线归档不要和数据库放在同一块磁盘上。5.2 恢复执行到一半磁盘满了恢复过程对磁盘空间的消耗比预期大。备份集压缩包需要解压解压后的数据文件比压缩包大不少加上原数据目录如果还保留着磁盘很容易被打满。建议执行恢复前用du -sh分别确认备份集大小和原数据目录大小再对比df -h的剩余空间。低于1.5倍余量坚决不开始恢复。如果恢复中途磁盘满了数据库进程会异常退出数据目录可能处于不完整状态。这时候只能清理空间然后把数据目录删干净重新执行一次恢复不要试图续传。5.3 启动后一直处于恢复状态无法正常读写这种情况十有八九是恢复了备份集之后又配置了时间点恢复而recovery_target_time设置的时间晚于备份集后实际可用的WAL覆盖范围。数据库会一直尝试应用WAL直到无法继续此时会停在一个看似“卡住”的状态。排查方法是查看数据库日志重点观察最后几条WAL记录的应用结果。如果显示到达了WAL末尾说明归档不完整如果显示等待下一个WAL文件说明restore_command里指定的归档路径不对或文件缺失。修正后清理恢复配置重启实例一般就能恢复。5.4 把增量备份集当独立备份集恢复增量备份集内部只记录了相对基础全量的变更不包含基础全量的完整数据。直接对增量备份集执行恢复结果大概率是数据目录不完整启动报错。正确姿势是使用增量备份集恢复时务必通过工具的完整恢复流程让它自动找到对应的基础全量备份集并一起恢复。如果需要手工拷贝备份集那就把基础全量和依赖的增量备份集一起拷贝归档WAL也别漏。5.5 恢复出来的数据比预期旧时间点恢复时recovery_target_inclusive参数容易搞混。设成true表示包含目标时间点那一刻的事务设成false表示只恢复到目标时间点之前。业务说“恢复到9点50分之前”如果你设成true9点50分整秒提交的事务也会进来。精度要求高的场景我一般把目标时间再往前退10秒同时把recovery_target_inclusive设为false给恢复留一点缓冲。5.6 异机恢复后启动报权限错误这个坑在测试环境恢复时特别常见。备份集里的文件属主是原机器的数据库用户比如kingbase如果新机器上的数据库用户UID和原机器不一致或者文件属主不对数据库启动就会报权限错误。解决办法很简单恢复完数据文件后统一把数据目录属主改成当前机器的数据库运行用户chown -R kingbase:kingbase /kbdata再启动实例大部分权限问题立刻消失。6. 这些坑我都踩过给你几条保命经验6.1 恢复前“三查”原则我把恢复前的检查总结成“三查”每次照做查备份集列表和状态查磁盘空间余量查数据库版本和操作系统架构。三个条件任何一个不满足都坚决不动手。版本这一项尤其重要。KingbaseES大版本之间数据文件格式不一定兼容异机恢复时新机器上的数据库版本必须和备份集来源版本一致。就算版本号看着差不多也建议先用select version();比对详细信息。6.2 定期做恢复演练别等故障发生再学很多团队备份策略做得很好看但从没实际恢复过一次。真出故障时才发现备份目录权限不对、归档日志被定期任务清理了、备份集校验早就失败了。这种“假备份”比没备份还坑人。我建议至少每季度做一次恢复演练选一个空闲窗口把线上最近的物理备份集恢复到一台测试机然后跑核心业务表的查询验证记录整个恢复耗时。演练过程中暴露的问题全部整理到运维手册里。真出了事照着手册操作心态也会稳很多。6.3 备份集文件也要监控和告警备份任务执行成功不代表备份集一定可用。我见过备份进程返回成功码但备份集文件因为磁盘坏道而损坏的情况。所以光有备份调度还不够还要监控两点备份目录磁盘剩余空间、备份集文件的完整性。有条件的把validate的结果也纳入监控范围。6.4 把恢复步骤写成脚本模板每次手动敲恢复命令难免会有疏漏。我后来把常用恢复场景做成了脚本模板里面自动处理三件事保护原数据目录、执行恢复、启动并验证。脚本启动前只要求人工确认备份集ID和时间点。这样做既减少了操作失误也方便团队其他人接手。说句心里话备份集恢复这件事练得越多、越熟练就越不希望在线上真正用到它。但万一真的需要用只希望每个DBA手里的备份都是完整可用的每个恢复步骤都是提前演练过的。哪怕今天这篇文章你只看懂了“先show、再validate、最后-restore指定ID”这三步也值了。
返回列表