MySQL数据库备份&恢复(备份恢复)【备份策略四:xtrabackup备份数据库】
Xtrabackup简介Xtrabackup特性备份目录文件解释语法样式常用参数使用示范(备份)备份单个数据库备份多个数据库备份单张表备份多张表备份所有数据库(完全备份)增量备份 使用示范(恢复)Xtrabackup简介
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
xtrabackup 只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表。innobackupex 是参考了InnoDB Hotbackup的innoback脚本修改而来的。
innobackupex是一个perl脚本封装,封装了xtrabackup。主要为了方便同时备份InnoDB和MyISAM引擎的表,但需要在处理myisam时添加一个读锁,并且加入一些使用的选项:如slave-info可以记录备份恢复后作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
Xtrabackup特性
备份过程快速、可靠;备份过程不会打断正在执行的事务;能够基于压缩等功能节约磁盘空间和流量;自动实现备份检验;还原速度快;备份目录文件解释
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。【存放于指定的备份目录中(默认为时间戳格式目录)】
xtrabackup_checkpoints —— 存放备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)、LSN(日志序列号)范围信息;
【注:每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的】xtrabackup_binlog_info —— 存放mysql服务器当前正在使用的二进制日志文件以及至备份这一刻为止二进制日志事件的位置;xtrabackup_binlog_pos_innodb —— 存放二进制日志文件以及用于InnoDB或XtraDB表的二进制日志文件的当前position;xtrabackup_binary —— 存放备份中用到的xtrabackup的可执行文件;backup-f —— 存放备份命令用到的配置选项信息;
语法样式
Usage: innobackupex [--defaults-file=#] --backupORinnobackupex [--defaults-file=#] --prepare [OPTIONS]
常用参数
–defaults-file 指定服务器的配置文件(如果服务器配置文件采用默认位置,可以不填写)
格式:–defaults-file=/etc/f
–user | -u 备份使用的用户
格式:–user=root | -u root
–password | -p 备份使用的用户的密码
格式:–password=123456 | -p 123456
–host | -H 指定服务器IP地址(根据实际需要选择是否添加此参数)
格式:–host=192.168.1.1 | -H 192.168.1.1
–port | -P 指定端口号(根据实际需要选择是否添加此参数)
格式:–port=3306 | -P 3306
–socket | -S 指定套接字文件所在路径(用于区分多实例环境下不同MySQL数据库)
格式:–socket=/tmp/mysql.sock
–no-timestamp 不另外使用时间戳格式的目录存放备份文件(不添加默认采用时间戳格式另外创建一个目录存放备份文件)
【添加此参数会将备份文件存储至末尾指定的目录中】
–apply-log
解释:启动MySQL准备备份,应用BACKUP-DIR/BACKUP-f中的xtrabackup_logfile事务日志文件,并按照BACKUP-DIR/BACKUP-f中的指定创建新的InnoDB日志文件
【作用:促使数据文件数据一致。在备份完成后,数据不能直接用于恢复操作,主要是不确定备份的数据中是否包含尚未提交的事务或者是否包含提交后尚未与数据文件同步的事务。准备备份可以通过回滚未提交的事务以及让提交后的事务与数据文件进行同步】
–copy-back
解释:将备份目录下的所有文件复制到数据库数据目录
【要求:数据库数据目录必须为空,可以通过添加参数–force-non-empty-directories解决此问题,但是仍然要求数据目录不能有与备份目录相同的文件,不然仍然会恢复失败(报错)】
–databases 指定数据库(多个库之间用空格隔开),如果不指定就是对全库做备份
【如果需要指定表,可以在对应数据库后增加,可以实现备份多库多表】
【注:不建议指定数据库,因为通过数据恢复发现,每一次恢复都需要将原有的数据库数据目录清空,仅备份个别库和表会导致恢复数据时,其它数据丢失;因此一般建议进行全备或增倍,除非在恢复时添加–force-non-empty-directories参数,可以在数据库数据目录在非空情况下复制备份文件进行数据恢复】
格式:–database=“db1” | --database=“db1 db2” | --database=“db1[.tb1] db2[.tb2]”
–no-lock 不锁表
–incremental 创建增量备份
–incremental-basedir 指定增量备份的基本数据集的完整备份路径,与–incremental参数配合使用
【备份时使用】
格式:–incremental-basedir=DIRECTORY
–incremental-dir 指定增量备份将与完整备份相结合的路径,以便进行新的完整备份,与–incremental参数配合使用
【恢复时使用】
格式:–incremental-dir=DIRECTORY
–redo-only 告知xtrabackup进行–apply-log-only操作,在“备份进行准备工作”或者“合并增量备份”添加此参数
【将增量备份添加到最初的完全备份中】
【在进行增量备份还原时添加此参数】
–apply-log-only 在备份还在进行准备工作时,跳过消除(undo)阶段,只执行重做(redo)阶段,从而进行增量备份
使用示范(备份)
备份单个数据库
//备份test库[root@localhost ~]# innobackupex -u root -p "MySql@123" --databases=test --no-timestamp /backup/test/[root@localhost ~]# ll /backup/test///查看备份目录下的备份结果total 12312-rw-r----- 1 root root426 Apr 29 21:40 backup-f-rw-r----- 1 root root450 Apr 29 21:40 ib_buffer_pool-rw-r----- 1 root root 12582912 Apr 29 21:40 ibdata1drwxr-x--- 2 root root122 Apr 29 21:40 test-rw-r----- 1 root root 63 Apr 29 21:40 xtrabackup_binlog_info-rw-r----- 1 root root113 Apr 29 21:40 xtrabackup_checkpoints-rw-r----- 1 root root564 Apr 29 21:40 xtrabackup_info-rw-r----- 1 root root2560 Apr 29 21:40 xtrabackup_logfile
备份多个数据库
//备份test1 & test2库[root@localhost ~]# innobackupex -u root -p "MySql@123" --databases="test1 test2" --no-timestamp /backup/test1-2/[root@localhost ~]# ll /backup/test1-2///查看备份目录下的备份结果total 12312-rw-r----- 1 root root426 Apr 29 21:48 backup-f-rw-r----- 1 root root450 Apr 29 21:48 ib_buffer_pool-rw-r----- 1 root root 12582912 Apr 29 21:48 ibdata1drwxr-x--- 2 root root138 Apr 29 21:48 test1drwxr-x--- 2 root root 58 Apr 29 21:48 test2-rw-r----- 1 root root 64 Apr 29 21:48 xtrabackup_binlog_info-rw-r----- 1 root root113 Apr 29 21:48 xtrabackup_checkpoints-rw-r----- 1 root root575 Apr 29 21:48 xtrabackup_info-rw-r----- 1 root root2560 Apr 29 21:48 xtrabackup_logfile
备份单张表
//备份test库的emp表[root@localhost ~]# innobackupex -u root -p "MySql@123" --databases="test.emp" --no-timestamp /backup/test_emp/[root@localhost ~]# ll /backup/test_emp///查看备份目录下的备份结果total 12312-rw-r----- 1 root root426 Apr 29 21:51 backup-f-rw-r----- 1 root root450 Apr 29 21:51 ib_buffer_pool-rw-r----- 1 root root 12582912 Apr 29 21:51 ibdata1drwxr-x--- 2 root root 36 Apr 29 21:51 test-rw-r----- 1 root root 64 Apr 29 21:51 xtrabackup_binlog_info-rw-r----- 1 root root113 Apr 29 21:51 xtrabackup_checkpoints-rw-r----- 1 root root573 Apr 29 21:51 xtrabackup_info-rw-r----- 1 root root2560 Apr 29 21:51 xtrabackup_logfile
备份多张表
//备份test库的score & student表[root@localhost ~]# innobackupex -u root -p "MySql@123" --databases="test.score test.student" --no-timestamp /backup/test_score-student/[root@localhost ~]# ll /backup/test_score-student///查看备份目录下的备份结果total 12312-rw-r----- 1 root root426 Apr 29 22:10 backup-f-rw-r----- 1 root root438 Apr 29 22:10 ib_buffer_pool-rw-r----- 1 root root 12582912 Apr 29 22:10 ibdata1drwxr-x--- 2 root root 78 Apr 29 22:10 test-rw-r----- 1 root root 63 Apr 29 22:10 xtrabackup_binlog_info-rw-r----- 1 root root113 Apr 29 22:10 xtrabackup_checkpoints-rw-r----- 1 root root597 Apr 29 22:10 xtrabackup_info-rw-r----- 1 root root2560 Apr 29 22:10 xtrabackup_logfile
备份所有数据库(完全备份)
//备份所有库所有表[root@localhost ~]# innobackupex -u root -p "MySql@123" --no-timestamp /backup/full/[root@localhost ~]# ll /backup/full///查看备份目录下的备份结果total 12340-rw-r----- 1 root root426 Apr 29 22:12 backup-fdrwxr-x--- 2 root root 48 Apr 29 22:12 db1drwxr-x--- 2 root root 92 Apr 29 22:12 homework1-rw-r----- 1 root root438 Apr 29 22:12 ib_buffer_pool-rw-r----- 1 root root 12582912 Apr 29 22:12 ibdata1drwxr-x--- 2 root root 58 Apr 29 22:12 itdrwxr-x--- 2 root root4096 Apr 29 22:12 mysqldrwxr-x--- 2 root root8192 Apr 29 22:12 performance_schemadrwxr-x--- 2 root root 92 Apr 29 22:12 schooldrwxr-x--- 2 root root 56 Apr 29 22:12 studentdrwxr-x--- 2 root root8192 Apr 29 22:12 sysdrwxr-x--- 2 root root 92 Apr 29 22:12 testdrwxr-x--- 2 root root138 Apr 29 22:12 test1drwxr-x--- 2 root root 58 Apr 29 22:12 test2-rw-r----- 1 root root 63 Apr 29 22:12 xtrabackup_binlog_info-rw-r----- 1 root root113 Apr 29 22:12 xtrabackup_checkpoints-rw-r----- 1 root root547 Apr 29 22:12 xtrabackup_info-rw-r----- 1 root root2560 Apr 29 22:12 xtrabackup_logfile
增量备份
增量备份必须要在完全备份之后作出更新(创建新的库、插入新的数据)
mysql> use test2;Database changedmysql> show tables;+-----------------+| Tables_in_test2 |+-----------------+| Student |+-----------------+1 row in set (0.00 sec)mysql> select * from Student;+-----+----------+------+------+-----------------+| Sno | Sname | Ssex | Sage | Sdept |+-----+----------+------+------+-----------------+| 1 | 陆亚| 男 | 24 | 计算机网络|| 2 | tom| 男 | 26 | 英语 || 3 | 张阳| 男 | 21 | 物流管理 || 4 | alex| 女 | 22 | 电子商务 || 5 | xumubin | 男 | 29 | 中文专业 || 6 | wangzhao | 男 | 21 | 导弹专业 |+-----+----------+------+------+-----------------+6 rows in set (0.00 sec)#查看test2库的原样#为test2库的Student表插入2条新的数据mysql> INSERT INTO Student values(0007,'孟非','男',21,'播音主持'),(0008,'许三多','男',31,'影视表演');Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0mysql> select * from Student;+-----+-----------+------+------+-----------------+| Sno | Sname| Ssex | Sage | Sdept |+-----+-----------+------+------+-----------------+| 1 | 陆亚| 男 | 24 | 计算机网络|| 2 | tom | 男 | 26 | 英语 || 3 | 张阳| 男 | 21 | 物流管理 || 4 | alex| 女 | 22 | 电子商务 || 5 | xumubin | 男 | 29 | 中文专业 || 6 | wangzhao | 男 | 21 | 导弹专业 || 7 | 孟非| 男 | 21 | 播音主持 || 8 | 许三多 | 男 | 31 | 影视表演 |+-----+-----------+------+------+-----------------+8 rows in set (0.00 sec)#查看test2库的Student表,可以看到新增数据已存在
进行第一次增量备份
[root@localhost ~]# innobackupex -u root -p "MySql@123" --no-timestamp --incremental /backup/incremental/ --incremental-basedir=/backup/full/[root@localhost ~]# ll /backup/incremental1///查看备份目录下的备份结果total 72-rw-r----- 1 root root 426 Apr 30 00:14 backup-fdrwxr-x--- 2 root root 73 Apr 30 00:14 db1drwxr-x--- 2 root root 150 Apr 30 00:14 homework1-rw-r----- 1 root root 438 Apr 30 00:14 ib_buffer_pool-rw-r----- 1 root root 16384 Apr 30 00:14 ibdata1.delta-rw-r----- 1 root root 44 Apr 30 00:14 ibdata1.metadrwxr-x--- 2 root root 88 Apr 30 00:14 itdrwxr-x--- 2 root root 4096 Apr 30 00:14 mysqldrwxr-x--- 2 root root 8192 Apr 30 00:14 performance_schemadrwxr-x--- 2 root root 150 Apr 30 00:14 schooldrwxr-x--- 2 root root 85 Apr 30 00:14 studentdrwxr-x--- 2 root root 8192 Apr 30 00:14 sysdrwxr-x--- 2 root root 150 Apr 30 00:14 testdrwxr-x--- 2 root root 230 Apr 30 00:14 test1drwxr-x--- 2 root root 88 Apr 30 00:14 test2-rw-r----- 1 root root 103 Apr 30 00:14 xtrabackup_binlog_info-rw-r----- 1 root root 117 Apr 30 00:14 xtrabackup_checkpoints-rw-r----- 1 root root 651 Apr 30 00:14 xtrabackup_info-rw-r----- 1 root root 2560 Apr 30 00:14 xtrabackup_logfile
#再一次为test2库的Student表插入2条数据mysql> use test2;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> INSERT INTO Student values(0009,'张艺谋','男',61,'导演专业'),(0010,'徐静蕾','女',36,'导演专业');Query OK, 2 rows affected (0.00 sec)Records: 2 Duplicates: 0 Warnings: 0mysql> select * from Student;+-----+-----------+------+------+-----------------+| Sno | Sname| Ssex | Sage | Sdept |+-----+-----------+------+------+-----------------+| 1 | 陆亚| 男 | 24 | 计算机网络|| 2 | tom | 男 | 26 | 英语 || 3 | 张阳| 男 | 21 | 物流管理 || 4 | alex| 女 | 22 | 电子商务 || 5 | xumubin | 男 | 29 | 中文专业 || 6 | wangzhao | 男 | 21 | 导弹专业 || 7 | 孟非| 男 | 21 | 播音主持 || 8 | 许三多 | 男 | 31 | 影视表演 || 9 | 张艺谋 | 男 | 61 | 导演专业 || 10 | 徐静蕾 | 女 | 36 | 导演专业 |+-----+-----------+------+------+-----------------+10 rows in set (0.00 sec)#可看出test2库的Student表2条增添的数据已存在
进行第二次增量备份
[root@localhost ~]# innobackupex -u root -p "MySql@123" --no-timestamp --incremental /backup/incremental2/ --incremental-basedir=/backup/incremental1/[root@localhost ~]# ll /backup/incremental2///查看备份目录下的备份结果total 72-rw-r----- 1 root root 426 Apr 30 00:14 backup-fdrwxr-x--- 2 root root 73 Apr 30 00:14 db1drwxr-x--- 2 root root 150 Apr 30 00:14 homework1-rw-r----- 1 root root 438 Apr 30 00:14 ib_buffer_pool-rw-r----- 1 root root 16384 Apr 30 00:14 ibdata1.delta-rw-r----- 1 root root 44 Apr 30 00:14 ibdata1.metadrwxr-x--- 2 root root 88 Apr 30 00:14 itdrwxr-x--- 2 root root 4096 Apr 30 00:14 mysqldrwxr-x--- 2 root root 8192 Apr 30 00:14 performance_schemadrwxr-x--- 2 root root 150 Apr 30 00:14 schooldrwxr-x--- 2 root root 85 Apr 30 00:14 studentdrwxr-x--- 2 root root 8192 Apr 30 00:14 sysdrwxr-x--- 2 root root 150 Apr 30 00:14 testdrwxr-x--- 2 root root 230 Apr 30 00:14 test1drwxr-x--- 2 root root 88 Apr 30 00:14 test2-rw-r----- 1 root root 103 Apr 30 00:14 xtrabackup_binlog_info-rw-r----- 1 root root 117 Apr 30 00:14 xtrabackup_checkpoints-rw-r----- 1 root root 659 Apr 30 00:14 xtrabackup_info-rw-r----- 1 root root 2560 Apr 30 00:14 xtrabackup_logfile
使用示范(恢复)
由于其它单库单表、多库多表恢复操作暂不理解,且实施非常麻烦,此处不作演示
xtrabackup一般建议进行完全备份和增量备份,不建议进行单库单表、多库多表的备份恢复
//应用完全备份[root@localhost ~]# innobackupex --apply-log --redo-only /backup/full///应用第一次增量备份[root@localhost ~]# innobackupex --apply-log --redo-only /backup/full/ --incremental-dir=/backup/incremental///应用第二次增量备份[root@localhost ~]# innobackupex --apply-log --redo-only /backup/full/ --incremental-dir=/backup/incremental2///关闭数据库服务[root@localhost ~]# systemctl stop mysqld//模拟数据丢失(将数据库数据目录中的数据移植去别的地方)[root@localhost ~]# cp /var/lib/mysql/\* /var/lib/mysql_bak2/[root@localhost ~]# rm -rf /var/lib/mysql/\*//注:上方两条命令“*”前的“\”表示转译,不然会以为我这是注释,复制到Linux中记得删除“\”//复制合并后的完全备份目录到数据库数据目录中[root@localhost ~]# innobackupex --copy-back /backup/full///更改数据库数据目录以及里面所有文件的所属组和所属用户(不改全部为root,后面启动MySQL服务会报错)[root@localhost ~]# chown -R mysql.mysql /usr/local/mysql/data///开启数据库服务[root@localhost ~]# systemctl start mysqld
mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || db1|| homework1|| it || mysql || performance_schema || school || student || sys|| test|| test1 || test2 |+--------------------+12 rows in set (0.00 sec)mysql> use test2;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> select * from Student;+-----+-----------+------+------+-----------------+| Sno | Sname| Ssex | Sage | Sdept |+-----+-----------+------+------+-----------------+| 1 | 陆亚| 男 | 24 | 计算机网络|| 2 | tom | 男 | 26 | 英语 || 3 | 张阳| 男 | 21 | 物流管理 || 4 | alex| 女 | 22 | 电子商务 || 5 | xumubin | 男 | 29 | 中文专业 || 6 | wangzhao | 男 | 21 | 导弹专业 || 7 | 孟非| 男 | 21 | 播音主持 || 8 | 许三多 | 男 | 31 | 影视表演 || 9 | 张艺谋 | 男 | 61 | 导演专业 || 10 | 徐静蕾 | 女 | 36 | 导演专业 |+-----+-----------+------+------+-----------------+10 rows in set (0.00 sec)#可以看到所有数据已恢复,同时test2库的Student表中增添的4条数据均已存在