分布式数据库的数据备份/恢复,这些你一定要了解
一、概述
二、存储引擎层的备份恢复
- 物理备份恢复方法
1. 前期准备
IP |
Hostname |
SequoiaDB用户 |
备注 |
192.168.1.3 |
sdb03 |
sdbadmin |
|
192.168.1.4 |
sdb04 |
sdbadmin |
|
192.168.1.5 |
sdb05 |
sdbadmin |
备份磁盘(挂载目录/sdbdata/backup) |
[root@sdb05 ~]# cat /etc/exports /sdbdata/backup *(insecure,rw,sync,no_wdelay,insecure_locks,no_root_squash) [root@sdb03 ~]# mount -t nfs -o rw,bg,hard,nointr,tcp 192.168.1.5:/sdbdata/backup /sdbdata/backup [root@sdb03 ~]# chown -R sdbadmin:sdbadmin_group /sdbdata/backup [root@sdb04 ~]# mount -t nfs -o rw,bg,hard,nointr,tcp 192.168.1.5:/sdbdata/backup /sdbdata/backup [root@sdb04 ~]# chown -R sdbadmin:sdbadmin_group /sdbdata/backup [root@sdb04 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 15G 4.4G 11G 29% / /dev/vdb 985G 129G 806G 14% /sdbdata /dev/vda1 497M 172M 326M 35% /boot /dev/vda3 50G 13G 38G 26% /opt 192.168.1.5:/sdbdata/backup 985G 129G 807G 14% /sdbdata/backu
2. 全量备份
[sdbadmin@sdb05 ~]#cat backup_full.sh #!/bin/bash date /opt/sequoiasql/mysql/bin/mysqldump --login-path=mysql -A -d > /sdbdata/backup/full/create`date +%y%m%d%H`.sql /opt/sequoidb/bin/sdblist -l -m list > /sdbdata/backup/full/sdblist`date +%y%m%d%H`.sql /opt/sequoiadb/bin/sdb 'db=new Sdb()' /opt/sequoiadb/bin/sdb 'db.backup ( { Name : "cluster_backup", Path : "/sdbdata/backup/full/%g", Overwrite : true, Description : "full_backup" } ) ;' date db.backup()备份常用参数说明 Name:备份名称,缺省则以当前时间格式命名,如“2016-01-01-15:00:00”,格式为“YYYY-MM-DD-HH:mm:ss”。 Description:备份用户描述信息。 Path:本次备份的指定路径,缺省为配置参数“bkuppath”中指定的路径。 EnsureInc:备份方式,true 表示增量备份,false 表示全量备份,缺省为 false。 OverWrite:对于同名备份是否覆盖,true 表示覆盖,false 表示不覆盖,如果同名则报错;缺省为 false。 GroupName:对指定组进行备份,缺省为对全系统备份,当需要对多个组进行备份可以指定为数组类型,如:["datagroup1", "datagroup2"]。
3. 增量备份
[sdbadmin@sdb05 ~]#cat backup_incre.sh #!/bin/bash date /opt/sequoiasql/mysql/bin/mysqldump --login-path=mysql -A -d > /sdbdata/backup/full/create`date +%y%m%d%H`.sql /opt/sequoidb/bin/sdblist -l -m list > /sdbdata/backup/full/sdblist`date +%y%m%d%H`.sql /opt/sequoiadb/bin/sdb 'db=new Sdb();' /opt/sequoiadb/bin/sdb 'db.backup ( { Name : "cluster_backup", Path : "/sdbdata/backup/full/%g", EnsureInc : true } );' date
4. 全量恢复
(1)配置单向ssh 免密服务 [sdbadmin@sdb05 ~]#ssh-keygen -t rsa [sdbadmin@sdb05 ~]#ssh-copy-id sdbadmin@sdb03 [sdbadmin@sdb05 ~]#ssh-copy-id sdbadmin@sdb04 [sdbadmin@sdb05 ~]#ssh-copy-id sdbadmin@sdb05 (2)恢复脚本 [sdbadmin@sdb05 ~]#cat restore_full.sh #!/bin/bash #停止集群 for hostname in {sdb03,sdb04,sdb05} do ssh $hostname /opt/sequoiadb/bin/sdbstop -t all done #全量恢复一份完整的副本数据 for groupname in `cat /sdbdata/backup/full/sdblist20200717.sql | awk '{print $8}' | grep -Evi "GroupName|SYSCoord" ` do /opt/sequoiadb/bin/sdbrestore -p /sdbdata/backup/full/$groupname/ -n cluster_backup -b 0 -i 0 done #删除另外2台服务器之前的副本数据,scp拷贝全量恢复的副本数据 for hostname in {sdb03,sdb04} do for dbpath in `cat /sdbdata/backup/full/sdblist20200717.sql | awk '{print $10}'| grep -Evi "dbpath|*11810"` do ssh -t sdbadmin@$hostname "rm -rf "$dbpath* scp -pr $dbpath* $hostname:$dbpath & done done #启动集群 /bin/read -p " Do you want to start SequoiaDB(yes or no)? " Do while [[ "$Do" != "no" ]] && [[ "$Do" != "yes" ]] do /bin/read -p "Do you want to start SequoiaDB(yes/no)?" Do done if [ "$Do" == "yes" ] then for hostname in {sdb03,sdb04,sdb05} do ssh $hostname /opt/sequoiadb/bin/sdbstart -t all done elif [ "$Do" == "no" ] then echo "please start SequoiaDB by hand" fi sdbrestore数据恢复常用参数: --bkpath -p:备份源数据所在路径。 --increaseid -i:需要恢复到第几次增量备份,缺省恢复到最后一次 ( -1 )。 --beginincreaseid -b:需要从第几次备份开始恢复,缺省由系统自动计算 ( -1 )。 --bkname -n:需要恢复的备份名。 --action -a:恢复行为,“restore”表示恢复,“list”表示查看备份信息,缺省为“restore”。 --diaglevel -v:恢复工具自身的日志级别,缺省为 WARNING ( 3
5. 增量恢复
[sdbadmin@sdb05 ~]#cat restore_incre.sh #!/bin/bash #停止集群 for hostname in {sdb03,sdb04,sdb05} do ssh $hostname /opt/sequoiadb/bin/sdbstop -t all done #增量恢复副本数据 for groupname in `cat /sdbdata/backup/full/sdblist20200717.sql | awk '{print $8}' | grep -Evi "GroupName|SYSCoord"` do /opt/sequoiadb/bin/sdbrestore -p /sdbdata/backup/full/$groupname/ -n cluster_backup -b -1 done #启动集群 /bin/read -p " Do you want to start SequoiaDB(yes or no)? " Do while [[ "$Do" != "no" ]] && [[ "$Do" != "yes" ]] do /bin/read -p "Do you want to start SequoiaDB(yes/no)?" Do done if [ "$Do" == "yes" ] then for hostname in {sdb03,sdb04,sdb05} do ssh $hostname /opt/sequoiadb/bin/sdbstart -t all done elif [ "$Do" == "no" ] then echo "please start SequoiaDB by hand" fi
逻辑备份恢复方法
1. sdbexprt 工具使用
(1)导出集合sbtest.sbtest1 的数据 sdbexprt \ --hostname "localhost" \ --svcname "11810" \ --user "sdbadmin" \ --password "sdbadmin" --type 'json' \ --csname 'sbtest' \ --clname 'sbtestl' \ --file '/tmp/sbtest.sbtest1.json' (2)导出集合空间sbtest下,所有集合的数据 sdbexprt \ --hostname "localhost" \ --svcname "11810" \ --user "sdbadmin" \ --password "sdbadmin" --type 'json' \ --cscl 'sbtest' \ --dir '/tmp'
2. sdbimprt工具使用
sdbimprt \ --hosts 'localhost:11810' \ --user 'sdbadmin' \ --password 'sdbadmin' \ --csname 'sbtest' \ --clname 'sbtest1' \ --insertnum 10000 \ --jobs 20 \ --type 'json' \ --file '/tmp/sbtest.sbtest1.json' --coord false \ --ignorenull true \ --verbose true \ --force false \ --errorstop true \ --sharding true \ --transaction false \ --allowkeydup true
三、SQL 实例层的备份操作
1. mysqldump 工具使用
(1)备份所有库: mysqldump -h 192.168.3.6 -P 3306 -u root -p root123456 -A > /backup/all.sql (2)备份几个库: mysqldump --h 192.168.3.6 -P 3306 -u root -p root123456 -B 库名1 库名2 > /backup/database.sql (3)备份单个库某几个表(表名用空格隔开即可) Mysqldump -h 192.168.3.6 -P 3306 -u root -p root123456 库名 表名1 表名2> /backup/table.sql (4)mysqldump恢复 mysql -h 192.168.3.6 -P 3306 -u root -p root123456 < /backup/all.sql; 或者 MySQL>source /backup/all.sql
2. mydumper&myloader工具使用
$time mydumper -h 192.168.3.6 -P 3306 -u root -p root123456 -t 6 -c -e -B sbtest -o /home/data/ $time myloader -h 192.168.3.6 -P 3306 -u root -p root123456 -t 6 -B sbtest -o -d /home/data
- 小结