巨杉数据库SequoiaDB备份恢复方案
本文主要介绍巨杉数据库的常用备份方法和目前采用的备份策略。通过日常的备份策略,在故障出现时能及时还原,保障数据库的正常运行。 --备份方法 巨杉数据库备份,包括以下两种方式: 1. sdbexport工具:sdbexport工具只能导出指定的集合。 2. sdb命令backupOffline:使用backupOffline命令可以备份整个库。 巨杉数据库深入的备份方案可以参考官方网站(http://doc.sequoiadb.com/cn/index-cat_id-1432190664-edition_id-0)上的描述。 --sdbexprt导出方式 sdbexprt是巨杉数据库自带的导出工具,它可以将集合导出成csv或json文件。sdbexprt工具位于sdb安装目录下的bin目录下,默认位于/opt/sequoiadb/bin目录。 使用方法如下:需要指定主机名、端口号、账户、密码、集合空间、集合名称、字段、导出类型、导出文件名。 /opt/sequoiadb/bin/sdbexprt --hostname localhost --svcname 11810 --type csv --file person.csv -c nsfwxxk -l person --fields name,age --user root --password admin123 993 records export Export Successfully Detail in log path: ./sdbexport.log 相反,如果有csv或json文件,也可以通过sdbimprt导入到数据库中。 /opt/sequoiadb/bin/sdbimprt --hostname localhost --svcname 11810 --type csv --file person.csv -c nsfwxxk -l person_bak --fields name,age --user root --password admin123 --headerline true 993 records in file, 993 records import Import Successfully Detail in log path: ./sdbimport.log --backupOffline导出方式 数据备份支持离线备份,即数据备份期间需要中断插入、更新、删除等变更操作,只支持查询操作。当前备份支持两种方式: 1. 全量备份。 2. 增量备份。 --全量备份 全量备份是指备份整个数据库的配置、数据和日志。在数据量比较大的时候,全备所耗费的时间比较多,而且全备的时候所有增删改操作都无法进行。所以全备一般只有在中断业务的情况下才能进行。 具体操作如下:连接数据库,执行db.backupOffline({Name:"xx"}),xx表示备份的名称。 [sdbadmin@node1 ~]# /opt/sequoiadb/bin/sdb > db = new Sdb('localhost',11810) > db.backupOffline({Name:"backup"}) 执行完后,默认会在目录/opt/sequoiadb/database/data/11820/bakfile下面生成备份文件。 [sdbadmin @node1 bakfile]# ll 总用量 38704 -rw-r-----. 1 sdbadmin sdbadmin_group 39418004 4月 22 20:56 backup.1 -rw-r-----. 1 sdbadmin sdbadmin_group 65536 4月 22 20:56 backup.bak 其中较大的文件backup.1是数据组datagroup的备份文件,较小的文件backup.bak是编目节点SYSCatalogGroup的备份文件。 > db.listBackup() { "Name": "backup", "NodeName": "node1:11820", "GroupName": "datagroup", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 160, "StartTime": "2017-04-22-20:56:27", "HasError": false } { "Name": "backup", "NodeName": "node1:11800", "GroupName": "SYSCatalogGroup", "EnsureInc": false, "BeginLSNOffset": 0, "EndLSNOffset": 468, "StartTime": "2017-04-22-20:56:27", "HasError": false } --增量备份 增量备份是指在上一个全量备份或增量备份的基础上备份新增的日志和配置。增量备份一般每天做一次,数据量比较小,备份速度较快。 具体操作如下:连接数据库,执行db.backupOffline({Name:"xx",EnsureInc:true }),xx表示备份的名称。EnsureInc:true表示增量备份。 [sdbadmin @node1 ~]# /opt/sequoiadb/bin/sdb > db = new Sdb('localhost',11810) > db.backupOffline({Name:"backup",EnsureInc:true}) 注意:名称backup要和全备的名称一致,否则会报错。具体报错提示为:Backup does not exist。 执行完后,默认会在目录/opt/sequoiadb/database/data/11820/bakfile下面生成备份文件。 [sdbadmin @node1 bakfile]# ll 总用量 38632 -rw-r-----. 1 sdbadmin sdbadmin_group 39418004 4月 22 20:56 backup.1 -rw-r-----. 1 sdbadmin sdbadmin_group 6132 4月 22 20:56 backup.2 -rw-r-----. 1 sdbadmin sdbadmin_group 65536 4月 22 20:56 backup.bak -rw-r-----. 1 sdbadmin sdbadmin_group 65536 4月 22 20:56 backup.bak.1 --备份策略 目前我们采取的备份策略为:每周进行一次全备份,每天进行一次增量备份。 --shell脚本 1) 备份频率为每周周六00:00进行全量备份,每天00:00进行增量备份; 2) 每次全备时,备份文件名称自动改为FullBackup+时间,如FullBackup20170101 3) 每一次全备之前有多个“=”进行分割; 4) 备份出错时日志的结尾会有“异常!”等字眼; [sdbadmin@node1 bakfile]# vi autoBackupSdb.sh #! /bin/bash source ~/.bash_profile week=`date +%w`; namefile=./autoBackupSdb.ini #存放全备的名称,每次全备后,将备份文件的名称写入ini文件,增量备份时从ini文件读取名称。 logfile=./autoBackupSdb.log #存放日志 lastName=`cat $namefile` if [ $week -eq 6 ];then #周六全备,若备份文件的名称不变,会覆盖原来的全备和增备。 echo "=======================================">>$logfile #每次全备开始前的分隔符 currentName="FullBackup"`date +"%Y%m%d"` #格式如:FullBackup20170101 echo 开始全量备份,文件名为${currentName}: `date +"%Y-%m-%d %H:%M:%S"`>>$logfile sdb -s " var db = new Sdb('localhost',11810,'root','admin123'); db.backupOffline({Name:'${currentName}'}); " if [ $? -eq 0 ];then echo 结束全量备份,文件名为${currentName}: `date +"%Y-%m-%d %H:%M:%S"`>>$logfile else echo 结束全量备份,文件名为${currentName}: `date +"%Y-%m-%d %H:%M:%S"` 异常!>>$logfile fi; echo $currentName>$namefile else echo 开始增量备份,文件名为${lastName}: `date +"%Y-%m-%d %H:%M:%S"`>>$logfile sdb -s " var db = new Sdb('localhost', 11810,'root','admin123'); db.backupOffline({Name:'${lastName}',EnsureInc:true}); " if [ $? -eq 0 ];then echo 结束增量备份,文件名为${lastName}: `date +"%Y-%m-%d %H:%M:%S"`>>$logfile else echo 结束增量备份,文件名为${lastName}: `date +"%Y-%m-%d %H:%M:%S"` 异常!>>$logfile fi; fi; --定时任务 定时任务设定为每天0时0分运行。 crontab –e 0 0 * * * ~/autoBackupSdb.sh > ~/job.log 2>&1 --数据文件 备份的文件默认存放在/opt/sequoiadb/database/data/11820/bakfile下面。 --日志文件 日志文件包括两种,一种是shell脚本备份数据库时写的日志,一种是巨杉数据库自身的日志。在日常数据库巡检的时候可以同时结合两种日志进行排查问题。 --autoBackupSdb.log日志 autoBackupSdb.log是shell脚本写的日志文件。每一次全备之前有多个“=”进行分割。备份出错时结尾会有“异常!”等字眼,可以快速判断备份是否正常进行。 [sdbadmin@node1 ~]# cat autoBackupSdb.log ======================================= 开始全量备份,文件名为FullBackup20170429: 2017-04-29 00:06:21 结束全量备份,文件名为FullBackup20170429: 2017-04-29 00:06:21 开始增量备份,文件名为FullBackup20170429: 2017-04-30 00:00:04 结束增量备份,文件名为FullBackup20170429: 2017-04-30 00:00:04 开始增量备份,文件名为FullBackup20170429: 2017-05-01 00:00:02 结束增量备份,文件名为FullBackup20170429: 2017-05-01 00:00:03 开始增量备份,文件名为FullBackup20170429: 2017-05-02 00:00:05 结束增量备份,文件名为FullBackup20170429: 2017-05-02 00:00:05 开始增量备份,文件名为FullBackup20170429: 2017-05-03 00:00:03 结束增量备份,文件名为FullBackup20170429: 2017-05-03 00:00:03 开始增量备份,文件名为FullBackup20170429: 2017-05-04 00:00:05 结束增量备份,文件名为FullBackup20170429: 2017-05-04 00:00:05 开始增量备份,文件名为FullBackup20170429: 2017-05-05 00:00:02 结束增量备份,文件名为FullBackup20170429: 2017-05-05 00:00:02 ======================================= 开始全量备份,文件名为FullBackup20170506: 2017-05-06 00:00:02 结束全量备份,文件名为FullBackup20170506: 2017-05-06 00:00:03 开始增量备份,文件名为FullBackup20170506: 2017-05-07 00:00:20 结束增量备份,文件名为FullBackup20170506: 2017-05-07 00:00:20 异常! --sdbdiag.log日志 巨杉数据库备份的时候将日志保存在/opt/sequoiadb/database/data/11820/diaglog/ sdbdiag.log文件中。 [sdbadmin@node1 ~]$ cd /opt/sequoiadb/database/data/11820/diaglog [sdbadmin@node1 diaglog]$ tail -50f sdbdiag.log ----恢复方式 巨杉数据库通过sdbrestore工具进行数据的恢复。sdbrestore位于巨杉安装目录bin目录下面,默认位置为/opt/sequoiadb/bin目录下面。恢复前先停止需要恢复的数据组,然后再进行sdbrestore恢复操作。 注意事项: 当前使用的版本,备份和恢复的时候要用linux用户sdbadmin进行操作,如果用root进行备份的话,恢复之后配置文件、数据文件、索引文件的权限都会变成root权限。启动巨杉数据库的时候会因为权限不足而无法启动。 --停止数据组 [root@node1 ~]# su - sdbadmin [sdbadmin@node1 ~]$ sdb Welcome to SequoiaDB shell! help() for help, Ctrl+c or quit to exit > db = new Sdb('localhost',11810) localhost:11810 Takes 0.60666s. >db.listReplicaGroups() --根据路径/opt/sequoiadb/database/data中有data字样进行判断,找到数据组的名称为"GroupName": "datagroup" > rg = db.getRG ("datagroup"); datagroup Takes 0.22072s. > rg.stop() Takes 2.260797s. > --恢复数据 [root@node1 ~]# su - sdbadmin [sdbadmin @node1 11820]# sdbrestore -p /opt/sequoiadb/database/data/11820/bakfile/ -n backup Check sequoiadb(11820) is not running...OK Begin to clean dps logs... Begin to clean dms storages... Begin to init dps logs... Begin to restore... Begin to restore data file: /opt/sequoiadb/database/data/11820/bakfile/backup.1 ... Begin to restore su: nsfwxxk.1.data ... Begin to restore su: nsfwxxk.1.idx ... ***************************************************** Restore succeed! ***************************************************** 恢复完成之后,默认会在/opt/sequoiadb/database/data/11820/diaglog中生成sdbrestore.txt,里面包含了开始恢复的时间,完成恢复的时间,运行成功与否的退出码等。 2017-04-24-01.27.49.605775 Level:EVENT PID:2826 TID:2830 Function:restore Line:1846 File:SequoiaDB/engine/bar/barBkupLogger.cpp Message: Begin to restore[backup]... 2017-04-24-01.27.49.606983 Level:EVENT PID:2826 TID:2830 Function:_openDataFile Line:1663 File:SequoiaDB/engine/bar/barBkupLogger.cpp Message: Begin to restore data file[/opt/sequoiadb/database/data/11820/bakfile/backup.1] 2017-04-24-01.27.51.679672 Level:EVENT PID:2826 TID:2830 Function:restore Line:1867 File:SequoiaDB/engine/bar/barBkupLogger.cpp Message: Complete restore[backup] 2017-04-24-01.27.53.616844 Level:EVENT PID:2826 TID:2826 Function:pmdRestoreThreadMain Line:550 File:SequoiaDB/engine/pmd/sdbrestore.cpp Message: Stop sdbrestore, exit code: 0 注意: 如果没有停止数据组,无法进行恢复,会导致以下错误。 [root@node1 11820]# sdbrestore -p /opt/sequoiadb/database/data/11820/bakfile/ -n backup Check sequoiadb(11820) is not running...FAILED ***************************************************** Restore failed: -3(Permission Error) ***************************************************** --启动数据库 [sdbadmin@node1 ~]# sdb Welcome to SequoiaDB shell! help() for help, Ctrl+c or quit to exit > db = new Sdb('localhost',11810) localhost:11810 Takes 0.24731s. > dataRG = db.getRG ( "datagroup" ) ; datagroup Takes 0.13560s. > dataRG.start() 最后也可以通过sdbstart命令进行启动。 如果启动过程中报下面的错误,很可能是恢复过程中sdb.conf自动被改了权限。这时需要更改成chmod sdbadmin:sdbadmin_group sdb.conf,然后再启动数据库。 [sdbadmin@node1 ~]# sdbstart Failed to open config file: /opt/sequoiadb/bin/../conf/local/11820/sdb.conf Failed to open config file: /opt/sequoiadb/bin/../conf/local/11820/sdb.conf Error: Enum [/opt/sequoiadb/bin/../conf/local] sub dirs failed: -3 可以查看日志进行定位。 [root@node1 11820]# tail -100 /opt/sequoiadb/conf/log/sdbcm.log 2017-04-24-02.17.48.892003 Level:ERROR PID:2243 TID:2720 Function:omStartDBNode Line:364 File:SequoiaDB/engine/omagent/omagentUtil.cpp Message: node[11820] start[cmd: /opt/sequoiadb/bin/sdbstart --confpath /opt/sequoiadb/bin/../conf/local/11820] failed, out info: Failed to open config file: /opt/sequoiadb/bin/../conf/local/11820/sdb.conf 11810: 187 bytes out==> Failed to open config file: /opt/sequoiadb/conf/local/11820/sdb.conf Read config file: /opt/sequoiadb/conf/local/11820/sdb.conf failed, rc: -3 Failed resolving arguments(error=-3), exit <== Error: Start [/opt/sequoiadb/bin/../conf/local/11820] failed, rc: 129(Permission Error) Total: 1; Succeed: 0; Failed: 1