巨杉数据库SequoiaDB备份恢复方案

来源:互联网 发布:淘宝15天退换货的规则 编辑:程序博客网 时间:2024/04/27 14:31
本文主要介绍巨杉数据库的常用备份方法和目前采用的备份策略。通过日常的备份策略,在故障出现时能及时还原,保障数据库的正常运行。--备份方法巨杉数据库备份,包括以下两种方式: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 admin123993 records exportExport SuccessfullyDetail 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 true993 records in file, 993 records importImport SuccessfullyDetail 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+时间,如FullBackup201701013)        每一次全备之前有多个“=”进行分割;4)        备份出错时日志的结尾会有“异常!”等字眼;[sdbadmin@node1 bakfile]# vi autoBackupSdb.sh#! /bin/bashsource ~/.bash_profileweek=`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"` #格式如:FullBackup20170101echo 开始全量备份,文件名为${currentName}: `date +"%Y-%m-%d %H:%M:%S"`>>$logfilesdb -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"`>>$logfileelse       echo 结束全量备份,文件名为${currentName}: `date +"%Y-%m-%d %H:%M:%S"`  异常!>>$logfilefi;echo $currentName>$namefileelse echo 开始增量备份,文件名为${lastName}: `date +"%Y-%m-%d %H:%M:%S"`>>$logfilesdb -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"`>>$logfileelse       echo 结束增量备份,文件名为${lastName}: `date +"%Y-%m-%d %H:%M:%S"`  异常!>>$logfilefi;fi;--定时任务定时任务设定为每天0时0分运行。crontab –e0 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 ~]$ sdbWelcome to SequoiaDB shell!help() for help, Ctrl+c or quit to exit> db = new Sdb('localhost',11810)localhost:11810Takes 0.60666s.>db.listReplicaGroups()  --根据路径/opt/sequoiadb/database/data中有data字样进行判断,找到数据组的名称为"GroupName": "datagroup"> rg = db.getRG ("datagroup");datagroupTakes 0.22072s.> rg.stop()Takes 2.260797s.>--恢复数据[root@node1 ~]# su - sdbadmin[sdbadmin @node1 11820]# sdbrestore -p /opt/sequoiadb/database/data/11820/bakfile/ -n backupCheck sequoiadb(11820) is not running...OKBegin 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:EVENTPID:2826                                 TID:2830Function:restore                         Line:1846File:SequoiaDB/engine/bar/barBkupLogger.cppMessage:Begin to restore[backup]...2017-04-24-01.27.49.606983               Level:EVENTPID:2826                                 TID:2830Function:_openDataFile                   Line:1663File:SequoiaDB/engine/bar/barBkupLogger.cppMessage:Begin to restore data file[/opt/sequoiadb/database/data/11820/bakfile/backup.1]2017-04-24-01.27.51.679672               Level:EVENTPID:2826                                 TID:2830Function:restore                         Line:1867File:SequoiaDB/engine/bar/barBkupLogger.cppMessage:Complete restore[backup]2017-04-24-01.27.53.616844               Level:EVENTPID:2826                                 TID:2826Function:pmdRestoreThreadMain            Line:550File:SequoiaDB/engine/pmd/sdbrestore.cppMessage:Stop sdbrestore, exit code: 0注意:如果没有停止数据组,无法进行恢复,会导致以下错误。[root@node1 11820]# sdbrestore -p /opt/sequoiadb/database/data/11820/bakfile/ -n backupCheck sequoiadb(11820) is not running...FAILED*****************************************************Restore failed: -3(Permission Error)*****************************************************--启动数据库[sdbadmin@node1 ~]# sdbWelcome to SequoiaDB shell!help() for help, Ctrl+c or quit to exit> db = new Sdb('localhost',11810)localhost:11810Takes 0.24731s.> dataRG = db.getRG ( "datagroup" ) ;datagroupTakes 0.13560s.> dataRG.start()最后也可以通过sdbstart命令进行启动。如果启动过程中报下面的错误,很可能是恢复过程中sdb.conf自动被改了权限。这时需要更改成chmod sdbadmin:sdbadmin_group sdb.conf,然后再启动数据库。[sdbadmin@node1 ~]# sdbstartFailed to open config file: /opt/sequoiadb/bin/../conf/local/11820/sdb.confFailed to open config file: /opt/sequoiadb/bin/../conf/local/11820/sdb.confError: Enum [/opt/sequoiadb/bin/../conf/local] sub dirs failed: -3可以查看日志进行定位。[root@node1 11820]# tail -100 /opt/sequoiadb/conf/log/sdbcm.log2017-04-24-02.17.48.892003               Level:ERRORPID:2243                                 TID:2720Function:omStartDBNode                   Line:364File:SequoiaDB/engine/omagent/omagentUtil.cppMessage: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.conf11810: 187 bytes out==>Failed to open config file: /opt/sequoiadb/conf/local/11820/sdb.confRead config file: /opt/sequoiadb/conf/local/11820/sdb.conf failed, rc: -3Failed resolving arguments(error=-3), exit<==Error: Start [/opt/sequoiadb/bin/../conf/local/11820] failed, rc: 129(Permission Error)Total: 1; Succeed: 0; Failed: 1