1. 备份方案的整体设计:并行、限速、永久增量到底怎么组合
做DBA这行,最怕的不是数据损坏,而是备份策略本身就有问题。KingbaseES作为国产数据库里用得比较多的一款,很多运维团队一开始用的都是最简单的那种全量备份——每天晚上跑一次,数据量小的时候没事,等到库涨到几TB,问题全来了:备份窗口不够、磁盘撑爆、恢复时发现备份链断掉。这套“并行处理 + IO 限速 + 永久增量备份”的组合,就是针对这些实际痛点来的。
先说说我为什么推荐把这三个东西放在一起讲。并行处理解决的是备份效率问题,全量备份单线程跑太慢,parallel参数能充分利用多核CPU,把大表拆分到多个会话同时读;IO限速解决的是备份影响在线业务的问题,数据库备份的时候如果磁盘读写太猛,生产库的查询响应会明显变慢,严重时直接把业务拖垮;永久增量备份解决的是备份窗口和存储空间的问题,不用每次全量,基线之后只做增量,而且增量可以一直叠下去,配好归档日志后还能做到任意时间点恢复。
这三个机制不是孤立存在的。打个比方,你开车上高速,并行处理就是多车道同时通行,IO限速就是限速牌防止超速造成事故,永久增量备份则是只记录新跑过的里程,不用每次都把整车里程清零重计。三者配合得好,备份既能跑得快,又不影响边上正常行驶的车辆,还能把历史留得足够长。
这套方案适合谁?如果你正在用KingbaseES V8或者V9版本,数据库文件总量在几百GB到几十TB之间,业务对备份窗口有硬性要求,或者领导开始问“能不能恢复到昨天早上10点半的数据”,那你需要把这篇文章看完。我会把每个参数的设置逻辑、命令的执行顺序、以及我踩过的坑都写出来。
2. 并行处理:不是parallel开得越大越好
2.1 并行备份的基本原理
KingbaseES的备份工具sys_backup底层用的是物理备份机制,备份进程需要把数据库文件从头到尾读一遍。单进程读大文件,瓶颈通常在磁盘的顺序读速度上,但如果数据库分布在多个磁盘或者文件系统上,单进程就没法同时从不同位置取数据。并行备份的原理就是把需要备份的数据文件按一定粒度拆分成多个任务,每个任务由独立的备份进程去跑,最后合并结果。
具体到sys_backup.conf里,控制并行的核心参数是PARALLEL_PROCESS。这个参数的值表示同时开启几个备份子进程,每个子进程负责备份一部分数据文件。比如一个库有32个数据文件,并行度设为8,那么每4个文件会分给一个子进程处理。这样总耗时理论上能降到单进程的1/8,虽然实际上因为文件大小不均、磁盘争抢等因素,达不到这么理想,但效果依然非常可观。
我遇到过最典型的一个场景:客户的生产库大概5TB,机械磁盘阵列,之前全量备份要跑10个小时,备份窗口根本不够。把PARALLEL_PROCESS从默认值调到8之后,耗时压到了2小时出头,窗口问题直接解决。但注意,我并没有继续往16、32去调,原因后面细讲。
2.2 并行度怎么定才科学
并行度的设置,一看CPU核心数,二看磁盘能力,三看备份期间业务负载。很多文档只告诉你“并行度越高越快”,实际落地时这个经验害了不少人。
我自己的习惯是:先看服务器CPU是几核,并行度一般不超过核心数的一半。比如32核的机器,并行度先给6到8;如果是64核,给8到12。为什么不直接怼满?因为备份进程不只是占CPU,还会占内存、占I/O,而且备份期间数据库本身还有后台进程在跑,你给备份分了太多资源,业务SQL就会饿死。
再一个看磁盘。如果数据库放在SSD上,或者存储是分布式存储池,可以适当调高一点;如果还是机械盘RAID5这类,并行度超出磁盘并发能力后,多个进程同时读盘反而会增加寻道开销,性能不升反降。判断方法很简单:调高并行度跑一次全量,观察备份耗时和磁盘util,如果util已经到90%以上,耗时却没明显缩短,那说明瓶颈在磁盘,再加大并行度没有意义。
还有个容易漏掉的细节:并行备份开启后,备份临时文件也会并发写入备份目录,所以备份盘的速度同样会制约整体效率。如果你的备份目标盘是慢速NFS,并行度再高也被写入速度卡死。让我说句实在话——很多备份慢的问题,根源在备份盘上,不在数据库上。
2.3 并行恢复同样值得关注
并行不只用于备份,恢复过程同样支持并行。sys_backup创建的物理备份集里包含了数据文件列表,恢复时可以通过参数让多个文件同时被拷贝和回放。这里的一个关键点在于:恢复的并行度和备份时的并行度并不需要完全一致,建议恢复并行度按照恢复目标机器配置重新评估,而不是照搬备份参数。
我经历过一次灾备演练,备份时用的parallel=8,目标恢复机器是16核新机器,结果用默认并行度恢复,全量恢复耗时比备份还长,一度让我怀疑备份集有问题。后来发现是恢复机的磁盘延迟偏高,并行进程一多反而互相干扰,把并行度调到4之后恢复了正常。这件事给我的教训是:参数是给人用的,不是给文档看的,一切以实测为准。
3. IO限速:让备份不打扰生产系统
3.1 为什么必须限速
数据库备份要读大量数据文件,这种密集的顺序读会抢占磁盘I/O带宽。对于纯OLTP业务来说,大量小随机读本身就需要磁盘快速响应,备份流量一来,磁盘队列深度被占满,业务SQL的延迟立刻飙升。我接手过一个系统,上线备份功能后第二天就收到业务投诉——页面打开慢了好几个量级,一查就是备份导致的I/O抢占。
IO限速解决的就是这个问题。KingbaseES的备份工具支持设置备份过程的读写速率上限,让备份流量像一个谦让的住户,不走高速高峰,慢慢来但稳定到达。代价是备份时间会变长,但换来的业务稳定,这笔账是划算的。
限速的默认单位是MB/s,比如设置MAX_RATE=100表示备份进程整体最多占用100MB/s的I/O带宽。这个值是所有并行子进程加起来的总上限,不是每个子进程单独的上限,这点一定要搞清楚,不然你以为限了速,实际每个进程都在跑满速,总量早就超了。
3.2 限速值怎么算
限速值我用这个思路来定:先看备份期间业务允许让出多少I/O。如果生产磁盘阵列整体能扛200MB/s的顺序读,业务高峰期实测占用50MB/s,那备份限速可以设在100到150MB/s之间,留出余量防止突发流量。
公式可以这样参考:备份限速上限 = 磁盘总带宽 × 40% ~ 60%。保守一点就取40%,业务比较闲的时候可以放到60%。设置完跑一次全量,通过iostat观察%util,如果业务高峰时段磁盘util已经到80%以上,就调低MAX_RATE。
另外要注意一点:MAX_RATE影响的是读端。如果你备份的同时还开了压缩,压缩过程会消耗CPU,但不会额外增加I/O,所以限速值不需要因为开启压缩而调整。相反,如果备份端同时往备份盘写入和从源库读取,写入端慢的话,读端的限速值就要结合备份盘的写能力来综合判断,否则容易在备份目录堆积大量未写完的临时文件。
3.3 限速和并行一起设置的效果
并行和限速同时配置,看起来有点矛盾:并行是加速的,限速是降速的,两者怎么平衡?其实它们作用在不同层面:并行解决的是“多任务协同”的问题,限速解决的是“总量可控”的问题。设置并行度8、MAX_RATE=200,效果就是8个进程同时跑,但总I/O不会超过200MB/s。这个过程相当于高速公路上开放8条车道,但入口统一限流,保证不会堵死别的路。
实际配置时,我建议先定限速值,再根据限速值反推并行度。比如磁盘带宽200MB/s,限速100MB/s,每个备份进程平均也就分到12MB/s的吞吐,并行度设到8是完全够用的,设到16反而每个进程分到的吞吐过低,增加了线程切换开销而几乎没有收益。
4. 永久增量备份:理解原理才能不踩坑
4.1 永久增量到底是个什么机制
先说清楚概念:永久增量备份不是“永远只做增量不做基线”,而是“以一次全量作为基线,后续所有备份都是增量,且增量之间可以无限累积”。每次增量备份都记录自上一次备份以来变化的数据块,恢复时按照“全量 + 增量1 + 增量2 + … + 增量N”的顺序依次应用,最终得到最新数据。
KingbaseES的物理增量备份是基于WAL归档机制实现的。数据库在运行中产生的每一条变更都会写入WAL日志,sys_backup在做增量备份时,会先记录当前数据文件的整体状态,然后借助WAL日志把变化的部分提取出来,形成一个增量备份集。增量备份集比全量备份小得多,备份时间也快得多,所以可以频繁执行,比如每天一次甚至在业务低峰期每小时一次。
永久增量备份的价值在于备份窗口和存储成本的降低。假设数据库1TB,每天变化量10GB,如果每天全量,一周就要7TB备份空间,而“周一全量 + 周二到周日各10GB增量”的方案,总空间只有1TB加上60GB,空间节省非常可观。
4.2 增量链的完整性和风险
增量备份的核心风险在于增量链的连续性——链条上任何一个增量备份集损坏或者丢失,后续所有增量全部无法使用。这就是为什么讲永久增量备份的时候,我格外强调备份集校验和定期恢复演练。
另外一个容易忽视的点是:增量备份集依赖全量基线,基线如果过期被清理,增量就成了孤儿。备份策略中要设计基线的保留策略,比如保留最近2份完整基线,配合近30天的增量集,这样即使最新一份基线损坏,还有前一份基线可以接上。
我还建议对增量备份做异地副本同步。本地备份集raid损坏的情况虽然少,但一旦发生,影响是灾难性的。增量集体积小,同步成本低,利用定时任务把增量备份目录rsync到另一台机器或者对象存储,这个操作性价比极高。
4.3 永久增量配合时间点恢复
永久增量备份集加连续WAL归档日志,就可以实现时间点恢复(PITR)。原理是:先恢复到最近一次增量备份完成时的状态,然后重放该时间点之后的WAL日志,直到目标时间点为止。这比“恢复到备份时刻”更进一步,能应对“10秒前误删了一张表”这类事故。
时间点恢复的前提是:WAL归档是连续不断的。所以备份策略要把数据库的归档配置打开,确保每一份WAL日志都有归档副本。很多团队只做备份没开归档,出问题时才发现只能恢复到备份时刻,误删之后的所有操作全丢了,这种情况我见得太多了。
5. 完整实操流程:从环境准备到首次增量备份
5.1 部署前绕不开的准备项
KingbaseES装完后的第一件事,很多人会卡在登录上。这里说两个和本文主题间接相关但特别关键的准备工作。
第一是初始密码。KingbaseES安装过程中会让用户为system超级用户设置密码,没有固定默认值。如果你是用一键脚本部署并且跳过了设置步骤,密码可能被写在安装日志里。登录失败时的排查顺序是:确认是否区分大小写、确认是否在命令中加了空格、最后检查安装目录下的日志文件看看有没有初始化的痕迹。忘记密码的处理办法是用单用户模式重置,这个操作建议提前做好方案。
第二是授权文件。KingbaseES需要有效的license文件才能正常运行,试用版授权可以从官网申请下载。备份工具本身在授权有效期内才允许执行备份和恢复操作,如果license过期后备份任务报错,不要怀疑备份配置问题,先检查授权状态。授权文件下载后放到安装目录的对应位置,并确认环境变量指向正确,否则会出现工具能启动但授权读取失败的诡异问题。
这些基础项排查干净,再往下走备份配置,否则备份脚本跑到一半报权限或授权错误,排错非常痛苦。
5.2 sys_backup.conf核心参数配置
KingbaseES的备份工具通过一个配置文件控制所有行为,路径一般在kingbase/etc/sys_backup.conf。核心配置我按分类整理如下:
| 参数 | 说明 | 建议值 |
|---|---|---|
TARGET_DB_HOST | 源库地址 | 本机可填127.0.0.1 |
TARGET_DB_PORT | 源库端口 | 按实际端口填写 |
TARGET_DB_USER | 备份用户 | 建议使用具有备份权限的专用账号 |
TARGET_DB_PASSWORD | 备份用户密码 | 建议加密保存 |
BACKUP_MODE | 备份模式 | 全量填FULL,增量填INCREMENTAL |
PARALLEL_PROCESS | 并行度 | 先按CPU核心数一半预估 |
MAX_RATE | IO限速(MB/s) | 按磁盘带宽的40%-60% |
COMPRESS_LEVEL | 压缩级别 | 0-9,推荐3-5平衡速度与空间 |
配置文件的路径和参数在不同小版本里略有差异,修改前务必先备份原文件。参数生效方式是重新执行备份命令,不需要重启数据库服务,这个设计对在线操作很友好。
5.3 首次全量加多次增量的命令序列
初始化备份环境后,整个操作流程是这样:
- 执行全量备份:
sys_backup.sh init -U sys_backup -W 密码,这个命令会创建备份目录结构,并开始第一次全量备份。 - 确认全量备份完成后,查看备份集列表确认BASELINE信息。
- 执行增量备份:
sys_backup.sh incremental,系统会自动判断上一个备份集的LSN位置,只备份变化的数据块。 - 按业务节奏持续执行增量备份,每次增量都会在上一个备份集之后追加。
我实际操作中喜欢把增量备份做成crontab定时任务,每天凌晨2点跑一次。第一次跑之前先手动执行一次,确认日志输出正常再交给调度系统。定时任务执行时注意环境变量,crontab里PATH往往不完整,最好在脚本开头source数据库用户的环境变量文件。这个坑我同事踩过——命令手动跑一切正常,crontab里跑就报找不到命令,最后发现是PATH问题。
5.4 恢复演练:验证增量链是否可靠
备份做得再好,恢复不了等于白做。恢复操作我建议每季度至少演练一次,而且必须是“破坏性演练”——把备份集恢复到一台独立的测试机器上,确认数据可用后再销毁。
恢复流程概要是:
# 停止目标实例(防止数据文件被占用) sys_ctl stop -D 数据目录 # 执行恢复命令,指定备份集ID sys_backup.sh restore -U sys_backup -W 密码 -D 数据目录 # 按需回放到指定时间点 # 完成后启动数据库并检查一致性 sys_ctl start -D 数据目录恢复完成后重点检查三件事:数据库能否正常启动、关键业务表的数据是否完整、最后一次增量之后的事务是否已经包含。只检查启动成功是不够的——我就见过一次恢复演练,数据库启动正常,但某张核心业务表的最后一批数据丢了,就是因为增量备份集有缺失没被发现。
6. 常见问题与避坑技巧速查
6.1 我整理的高频问题清单
备份相关的坑,很多是重复出现的。下面这几个问题,基本覆盖了我处理过的大部分备份故障:
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 备份执行报权限不足 | 备份用户缺少备份权限 | 检查sys_backup用户角色权限 |
| MAX_RATE不生效 | 参数单位理解错误或参数未重载 | 确认MB/s换算,重新执行备份命令 |
| 增量备份集异常巨大 | 有大量临时表或未清理的膨胀数据 | 检查数据库膨胀率,先执行vacuum再备份 |
| 恢复后时间点不正确 | 归档日志不连续 | 检查WAL归档目录是否有缺失 |
| 备份突然中断 | 磁盘空间不足 | 检查备份目录空间,及时清理旧备份集 |
6.2 几个必须上心的小细节
关于并行度,我再强调一次:不要超配。32核机器设parallel=16,实际跑起来CPU使用率能到90%以上,业务高峰时这种配置等于自杀。建议先在业务低峰期做一次24小时监控,了解当前CPU基线和磁盘util再定参数。
关于限速,MAX_RATE设定后,备份耗时可以通过备份数据量 ÷ 限速值来粗估。比如数据量500GB,限速100MB/s,理论耗时就是500000MB ÷ 100MB/s ≈ 5000秒,约1.4小时。如果实际耗时远超这个估算值,说明瓶颈不在限速上,要检查是否有其他进程在争抢I/O。
关于增量备份,最重要的建议是:高频增量搭配低频全量。全量基线建议至少保留两份,增量集按保留窗口滚动清理。清理时用工具提供的删除功能,不要手动删目录文件——手动删除会破坏备份集间的引用关系,恢复时会报找不到某个文件。
最后分享一个习惯:每次备份完成后,我都习惯性地看一眼备份日志的结尾几行,确认backup completed successfully这样的字样出现,而不是看完命令返回值就离开。备份这件事,机器出错的概率远低于人出错,定时任务配上日志监控,才是真正靠谱的运维方式。