ARTICLE DETAIL

资讯详情

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

KingbaseES数据库物理备份恢复(sys_rman)踩坑实录

KingbaseES数据库物理备份恢复(sys_rman)踩坑实录 前两天快下班的时候领导突然跑过来跟我说要把测试环境的金仓数据库搞一个定时物理备份。而且要求不仅能备还得能随时拉起来验证。这活儿落在我头上了。其实物理备份这个事情在数据库运维里算是比较基础的日常操作。但在金仓数据库KES里它用的工具叫sys_rman。这玩意儿和我们在PostgreSQL里用的pg_rman长得差不多不过底层有些细节还是有点区别的。今天我就把整个配置过程还有中间碰到的一些报错情况给大家仔细理一理。先来看一下我们最后要搞出来的备份基本流程是怎么跑的。业务数据库运行中触发定时任务执行sys_rman全量备份打包数据文件与归档日志推送到异地备份服务器定期拉起备库做恢复测试上面这个图就是一个企业层级里的标准备份流向。那么接下来我们就按步骤一步一步来。一、环境准备与基础概念1.1 测试环境说明先把我的机器情况交代一下免得大家照抄的时候环境对不上。数据库主机IP192.168.10.101操作系统版本CentOS 7.6数据库版本KingbaseES V008R006C008B0014数据库安装目录/opt/Kingbase/ES/V8数据库数据目录/data/kingbase/data1.2 啥是sys_rman在动手之前我先简单说说这个工具。sys_rman其实也就是金仓把自己包装了一下。它底层用的逻辑和开源那边的pg_rman差不多。你把它理解成一个专门给数据库文件拍快照的工具就行了。它跟逻辑备份也就是用ksql导出SQL文件不一样。逻辑备份慢啊如果数据库有几百个G导出SQL可能要跑一整天。物理备份往往仅仅只是把底层的那些数据文件直接复制一份。这样就算数据库有1个T只要你磁盘IO跟得上备份速度也是非常快的。这是一个很大的区别。二、配置归档模式要做物理备份有一个硬性前提。你的数据库必须开启归档模式。如果没有开归档的话sys_rman是直接拒绝运行的。这是一个问题。那为什么会这样呢原因在于物理备份在拷贝文件的时候数据库其实还在跑。这中间产生的新数据系统得靠归档日志来补齐。不然你恢复出来的数据绝对是乱套的。2.1 修改kingbase.conf参数去数据目录下找到kingbase.conf文件。加上或者改下面这两个参数。archive_mode on archive_command cp %p /data/kingbase/archive/%farchive_mode on这个好理解就是打开归档开关。archive_command这行代码的意思是说每次产生一个新的日志文件你就把它复制到/data/kingbase/archive/这个目录下。%p和%f是系统变量不用管它是什么意思照抄就行。但是你得注意这个归档目录必须提前建好。并且要把读写权限给到数据库的运行用户。通常来说金仓是用kingbase这个用户跑的。mkdir-p/data/kingbase/archivechown-Rkingbase:kingbase /data/kingbase/archive2.2 重启数据库并验证改完配置之后得重启一下数据库让配置生效。sys_ctl restart-D/data/kingbase/data接着怎么验证归档有没有真的开起来呢你去归档目录下看一看。如果里面什么都没有你就手动去切一下日志。SELECTsys_switch_wal();去/data/kingbase/archive/下面看一眼如果多出来一个或者几个文件那就说明归档配置是成功的。如果没出来这就是一个报错的情况。大概率是你archive_command里的路径写错了或者目录权限没给够。去日志里查就行了。三、sys_rman初始化配置工具准备好了归档也开了。接下来就是配置sys_rman自己的参数。3.1 拷贝配置文件模板在数据库安装目录的bin下面其实有一个现成的模板文件。叫sys_rman.conf.sample。我们把它拷贝一份出来。cp/opt/Kingbase/ES/V8/bin/sys_rman.conf.sample /opt/Kingbase/ES/V8/bin/sys_rman.conf3.2 修改配置文件内容打开这个sys_rman.conf文件。里面东西很多大部分都是注释掉的。我们其实只需要改几个关键的地方。[REQUIRED] kbserver_path /opt/Kingbase/ES/V8 kingbase_data /data/kingbase/data archive_path /data/kingbase/archive backup_path /data/kingbase/backup [OPTIONAL] ...我给大家用大白话解释一下这几个必填项。kbserver_path就是说你数据库程序装在哪个目录。千万别填错填错了它就找不到那些可执行文件了。kingbase_data是你数据库的数据存放目录。archive_path是你刚才配置的归档日志目录。backup_path是你要把备份文件存放到哪里。这个目录也得提前建好并且给kingbase用户授权。mkdir-p/data/kingbase/backupchown-Rkingbase:kingbase /data/kingbase/backup3.3 初始化备份目录配置文件改好之后还不能直接开始备份。你得先做一次初始化。初始化的动作其实就是在你刚才建的backup_path下面建一些它需要的子目录和记录文件。sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf init执行完这条命令你去/data/kingbase/backup下面看一眼。里面会多出几个文件夹。这就说明初始化成功了。如果这一步报错通常来说就是配置文件里的路径不存在你回去查路径就行了。四、全量备份实操前面那些都是铺垫现在开始真正的备份操作。4.1 执行全量备份命令全量备份的命令非常简单。sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf backup --backup-modefull敲完回车你就等着就行了。它跑起来的时候屏幕上会刷一堆点或者进度条。这个时候你不要去动它也不要去停数据库。等它跑完最后会打印出来一个INFO级别的提示告诉你备份完成了。并且会显示这次备份的ID。4.2 备份集目录结构长什么样备份完之后我们去backup_path下看一看。它会按照日期时间建一个文件夹。比如20231024_143000这种格式的目录。进去之后你会看到几个文件和文件夹。有个backup.ini的文件这个非常重要。它里面记录了这次备份是从哪个时间点开始的对应哪些归档日志。还有一个database文件夹这里面放的就是你数据库的底层物理文件。还有一个arclog文件夹放的是备份期间产生的归档日志。其实它这个目录结构挺有意思的。你把整个日期目录打包拷走放到别的机器上只要配置文件指对了就能直接用来做恢复测试。五、增量备份实操你不可能每天都去跑全量。为啥呢因为太慢了而且占磁盘空间。在企业层级里的真实场景中往往仅仅只是周末跑一次全量然后周一到周六每天跑一次增量。5.1 增量备份的前提条件增量备份有一个硬性要求。必须得有一个全量备份作为基础。没有全量的话你是做不了增量的。它得找参照物看看哪些数据块变了它才好去把变了的块拷出来。5.2 执行增量备份命令命令跟全量差不多就是把后面的参数换一下。sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf backup --backup-modeincremental它自己会去backup_path下面找最近一次的全量备份。然后对比现在的数据文件把修改过的页面抓取出来。这个速度比全量快很多通常来说几十G的库增量可能也就几分钟的事情。六、灾难模拟与恢复实操最关键的环节备份做完了不用它恢复一次心里总是不踏实的。很多同行做完了备份就觉得万事大吉了结果真出事的时候发现备份集是坏的。那麻烦就大了。所以我们接下来模拟一次删库然后用sys_rman给它拉起来。6.1 模拟数据破坏我们先建一张测试表插点数据。CREATETABLEtest_rman(idint,namevarchar(50));INSERTINTOtest_rmanVALUES(1,kingbase);接着我直接跑到系统的数据目录下面把整个数据目录给删了。这够彻底了吧。rm-rf/data/kingbase/data/*数据全没了这是一个非常极端的问题。那为什么会这样呢原因在于我手欠。但在生产环境里可能是磁盘坏了也可能是误操作了。6.2 停止数据库服务虽然数据目录空了但数据库进程可能还在内存里苟延残喘。先把它杀掉。sys_ctl stop-D/data/kingbase/data-mfast这时候报错说找不到kingbase.pid文件了。没关系用kill -9把相关的进程清干净就行了。6.3 执行全量恢复命令恢复的命令也很直接。sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf restore注意啊这里没有指定具体的备份集目录。它是怎么知道恢复哪一次的呢它默认会去找backup_path下面最近的一次完整备份。如果你非要恢复指定的某一次你得加参数这个我后面踩坑部分再说。执行这条命令的时候它会把之前备份的database文件夹里的东西全部拷贝回你的kingbase_data目录。屏幕上也会刷进度。6.4 恢复增量备份如果有如果你在全量之后还做了增量。那么光恢复全量是不够的。你还得把增量也补上。sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf restore --recovery-targetlatest加上--recovery-targetlatest这个参数它就会把全量和后面所有的增量全部按顺序给你叠加上去。6.5 启动数据库并验证恢复完文件之后其实还不能直接启动。你得先生成一个恢复的配置文件。不过sys_rman在新版本里如果你带了恢复参数它往往会自动帮你处理好。直接尝试启动。sys_ctl start-D/data/kingbase/data如果能顺利启动没有报错。你就进去查一下刚才那张表。SELECT*FROMtest_rman;如果数据还在那就说明整个物理备份和恢复的流程是跑通的。这就证明你的备份是可用的。七、踩坑记录与报错排查上面说的是顺利的情况。但我第一次弄的时候其实没这么顺畅。中间碰到了好几个报错。我把它记录下来大家以后遇到了可以对照着看。7.1 报错ERROR: could not stat file这个报错非常常见。完整报错信息大概是这样的。ERROR: could not stat file /data/kingbase/archive/000000010000000000000005: No such file or directory这是一个什么情况呢意思就是它在做备份或者恢复的时候需要找一个归档日志文件但是没找到。那为什么会这样呢原因通常有两个。第一个可能你的archive_command根本没生效。你以为是开了归档其实日志根本没拷过去。你去归档目录看一眼就知道了。第二个可能你手动把归档目录里的文件删了。有些人看磁盘满了就手贱去删归档日志。你一删备份链就断了。sys_rman发现少了一环它就罢工了。7.2 报错ERROR: backup manifest missing完整报错信息ERROR: backup manifest missing for backup 20231025_100000这个报错出现在我尝试恢复指定某次备份的时候。manifest文件不见了。我去备份集目录里看了一眼确实没有backup.ini这个文件。那为什么会这样呢原因在于我上次做备份的时候备份跑到一半我直接把终端关了或者用kill把进程杀掉了。这就导致这次备份是不完整的。不完整的备份集是不能用的。你遇到这个情况别想着修复它直接把那个日期的备份目录删掉换一个完整的备份集来恢复就行了。7.3 归档断层的情况啥叫归档断层呢我给大家举个例子。比如你的归档日志序列是 000000010000000000000001 到 000000010000000000000005。但是你发现 000000010000000000000003 这个文件不在了。中间断了一截。这时候你做恢复往往仅仅只是恢复到 000000010000000000000002 就停了。后面的增量它应用不了。日志会提示你找不到后续的WAL日志。遇到这种事基本上数据就只能恢复到断层之前的那一刻了。断层之后的数据如果没有其他手段那就真没了。所以归档目录的维护是非常重要的千万别乱动里面的文件。7.4 恢复到指定时间点PITR的坑有时候我们不是为了恢复整个库而是为了把某张表恢复到半小时前的状态。这就得用到时间点恢复。我在试这个功能的时候用的命令是这样的。sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf restore --recovery-target-time2023-10-25 10:30:00结果它报错了。说时间格式不对。这是一个小坑。官方文档里其实写了它对时间格式的要求比较死板。你不能随便用横杠或者斜杠。正确的写法往往是这样用标准的格式sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf restore --recovery-target-time2023-10-25 10:30:00--recovery-target-inclusivetrue后面那个--recovery-target-inclusivetrue的意思就是说恢复包含10点30分这个时刻的事务。如果不加这个参数它可能恢复到10点29分59秒就停了差别就在这一秒钟的事情。7.5 备份目录磁盘空间不足这个其实不算严格意义上的报错但是一个很容易翻车的情况。sys_rman在备份的时候它是先在备份目录里建一个临时文件夹写数据的。等全部写完了它再把临时文件夹重命名成正式的日期目录。如果你的备份盘空间不够它写到一半没空间了。这时候它会直接退出。更麻烦的是它退出了但是那个没写完的临时文件夹可能还留在那里。你不去手动清理的话下次你再跑备份它一看有临时文件夹可能会认为上一次备份还没结束直接拒绝运行。所以如果碰到莫名其妙的无法开始备份你去backup_path下面找找看有没有叫.tmp结尾或者类似名字的隐藏目录。有的话删掉再试一次就行了。八、定时任务的配置建议最后再说一下怎么把它放到系统的定时任务里。通常来说我们是用crontab。02* *0kingbase /opt/Kingbase/ES/V8/bin/sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf backup --backup-modefull/data/kingbase/backup/full.log2102* *1-6 kingbase /opt/Kingbase/ES/V8/bin/sys_rman--config/opt/Kingbase/ES/V8/bin/sys_rman.conf backup --backup-modeincremental/data/kingbase/backup/inc.log21这两行的意思很简单。每周日凌晨2点跑一次全量。周一到周六凌晨2点跑一次增量。注意前面的用户我写的是kingbase。也就是说这个定时任务是跟着数据库用户去跑的。这样就不用操心权限不对的问题了。后面的是把日志输出追加到文件里方便你第二天去看有没有报错。另外还有一个建议。就是备份的保留策略。你不能一直备份那样磁盘早晚要爆。sys_rman.conf里面其实有保留天数的参数。你可以设置成保留7天或者14天。它会自动把老的那些备份集给清理掉。这个功能挺实用的建议大家打开。好了这就是我这次搞金仓数据库物理备份恢复的全部过程了。步骤确实有些多中间容易踩坑的地方也不少。但只要把参数的意思弄明白知道报错是因为什么引起的那搞起来也就是个熟能生巧的事情。大家如果在自己的环境里试的时候碰到别的报错也可以留言咱们一起看。
返回列表