乐趣区

关于数据库:分布式数据库的数据备份恢复这些你一定要了解

一、概述

在数据作为生产资料的明天,数据早已成为各行各业的生命源泉,数据安全的重要性显而易见。数据备份是数据安全的根底, 残缺的备份和无效的复原伎俩是应答所有突发状况的重要保障。同时数据备份也对数据的从新利用,施展数据更大价值,有着重大的作用。

而数据备份的重点是对数据库的备份。定期对数据库进行数据备份,以便能在将来产生系统故障、人为误操作等状况时,进行数据恢复,防备于未然。

巨杉数据库作为新一代分布式交易型数据库,采纳“计算与存储拆散”的架构;和同期间倒退分布式数据库的灯塔厂商 AWS 在架构上不约而同。可能在微服务时代更好撑持利用便捷开发的需要。

计算与存储拆散的架构,也使得巨杉数据库领有多种多样的备份复原办法。在巨杉数据库的存储引擎层和 SQL 实例层都能够达到对数据库备份复原的目标。

计算与存储拆散架构图

二、存储引擎层的备份复原

巨杉数据库采纳自研的 SequoiaDB 分布式存储引擎,反对物理备份 (db.backup) 与逻辑备份(sdbexprt)。

物理备份是指转储数据库物理文件(如数据文件、日志文件等), 一旦数据库产生故障, 能够利用这些文件进行还原;通常能够分为全量备份与增量备份。巨杉数据库物理备份能够针对全库进行或者指定数据组进行;

巨杉数据库做物理备份和复原工作时,要留神分布式数据库与关系型数据库的不同,即分布式数据库数据恢复会波及到多台服务器的数据库物理文件,而不只是某一台服务器上的数据库物理文件。

逻辑备份是指对数据库对象 (如用户、表、存储过程等) 利用工具进行导出, 同时也能够利用工具把逻辑备份文件导入到数据库。巨杉数据库逻辑备份能够将汇合 (表) 导出为 json 或者 csv 格局,实现疾速平滑的迁徙。

物理备份复原办法

上面采纳 3 台机器的巨杉数据库级群(3 正本),来阐明存储引擎层的物理备份复原办法。

1. 后期筹备

  • 主机信息备注:

  • 通过 NFS 将备份目录共享
> \[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"\]。
  • 执行全量备份,查看表 test100.b 的记录

  • 执行全量备份

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
  • 执行增量备份,向表 test100.b 中插入 100 万条数据

  • 进行增量备份

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 
  • 执行全量复原,清空 test100.b 表的记录

  • 执行全量复原

  • 查看全量复原后 test100.b 表的记录条数

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
  • 执行增量复原

  • 查看增量复原后 test100.b 表的记录条数

  • 增量复原后,表 test100.b 数据完全恢复

逻辑备份复原办法

巨杉数据库自带的逻辑备份复原工具为 sdbexprt 和 sdbimprt。

1. sdbexprt 工具应用

sdbexprt 能够将汇合从 SequoiaDB 数据库导出为 json 格局或者 csv 格局的数据存储文件。sdbexprt 反对将一个汇合导出到一个文件中,同时也反对将多个汇合批量导出到指定目录下。

  • sdbexprt 罕用参数阐明

  • SequoiaDB 采纳 json 文档类型定义数据存储模型(类对象存储)。逻辑备份复原采纳 json 格局,更加平滑高效。上面把数据导出 json 格局为例:

(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'

Note:

SQL 实例层与存储引擎层对应关系为库名等同于底层的汇合空间;表名等同于底层的汇合。

2. sdbimprt 工具应用

sdbimprt 是巨杉数据库自带的数据导入工具,它能够将 json 格局或 csv 格局的数据高效平滑的导入到巨杉数据库中。

为了能够最大化晋升 I/O 与网络吞吐量,对于百 GB 级文件倡议将数据导入文件切分为多个子文件并且寄存于不同服务器, 采纳多服务器并行加载策略;并且在文件加载过程中应用 -j 参数开启多线程。

sdbimprt 并行导入架构图

  • sdbimprt 罕用参数阐明

  • 上面以导入 json 格局数据为例
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 实例层的备份操作

巨杉数据库在联机交易场景下,SQL 实例层次要以 MySQL 为主;原生 MySQL 数据库同样反对物理备份 (Xtrabackup 等) 和逻辑备份(mysqldump、mysqlpump、mydumper)。

原生 MySQL 数据库物理文件只存在于单台服务器与分布式数据库存在较大差别;物理备份工具 (Xtrabackup 等) 并不适用于巨杉数据库 SQL 实例层。逻辑备份工具 (mysqldump、mysqlpump、mydumper) 是齐全实用的,上面以 mysqldump、mydumper 为例进行阐明。

1. mysqldump 工具应用

mysqldump 是 MySQL 自带的逻辑备份工具。它的备份原理是,通过协定连贯到 MySQL 数据库,将须要备份的数据查问进去,将查问出的数据转换成对应的 insert 语句。

mysqldump 的长处是简略灵便,数据格式清晰,不便编辑,能够进行不同级别备份。mysqldump 的毛病是备份的过程是串行化的,不能并行的进行备份,速度较慢。

  • mysqldump 罕用参数阐明

  • 应用 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 工具应用

mydumper&myloader 是用于对 MySQL 数据库进行多线程备份和复原的开源 (GNU GPLv3)工具。开发人员次要来自 MySQL、Facebook 和 SkySQL 公司,目前由 Percona 公司开发和保护。

  • mydumper 罕用参数阐明:

  • myloader 罕用参数阐明:

  • 示例:备份复原 sbtest
$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

小结

除了上文介绍到的一些技术点,咱们在理论利用中也能够抉择第三方备份软件或者数据备份一体机进行集中的数据备份治理;实现对数据库、文件、操作系统、虚拟机的实时、定时备份。这里大家能够也和咱们互动一下,一起分享一下大家应用第三方工具、软件进行数据恢复备份的一些教训。

数据备份和复原,是所有 DBA 和零碎运维人的必修课,在分布式环境下,尽管分布式数据库会有不同的机制保证数据的平安,然而数据的备份和复原依然是在生产环境中特地须要留神的一个重点,也心愿大家肯定要熟练掌握。

退出移动版