Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。【存放于指定的备份目录中(默认为时间戳格式目录)】
Usage: innobackupex [--defaults-file=#] --backup
OR innobackupex [--defaults-file=#] --prepare [OPTIONS]
–defaults-file 指定服务器的配置文件(如果服务器配置文件采用默认位置,可以不填写)
格式:–defaults-file=/etc/my.cnf
–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-my.cnf中的xtrabackup_logfile事务日志文件,并按照BACKUP-DIR/BACKUP-my.cnf中的指定创建新的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 root 426 Apr 29 21:40 backup-my.cnf
-rw-r----- 1 root root 450 Apr 29 21:40 ib_buffer_pool
-rw-r----- 1 root root 12582912 Apr 29 21:40 ibdata1
drwxr-x--- 2 root root 122 Apr 29 21:40 test
-rw-r----- 1 root root 63 Apr 29 21:40 xtrabackup_binlog_info
-rw-r----- 1 root root 113 Apr 29 21:40 xtrabackup_checkpoints
-rw-r----- 1 root root 564 Apr 29 21:40 xtrabackup_info
-rw-r----- 1 root root 2560 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 root 426 Apr 29 21:48 backup-my.cnf
-rw-r----- 1 root root 450 Apr 29 21:48 ib_buffer_pool
-rw-r----- 1 root root 12582912 Apr 29 21:48 ibdata1
drwxr-x--- 2 root root 138 Apr 29 21:48 test1
drwxr-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 root 113 Apr 29 21:48 xtrabackup_checkpoints
-rw-r----- 1 root root 575 Apr 29 21:48 xtrabackup_info
-rw-r----- 1 root root 2560 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 root 426 Apr 29 21:51 backup-my.cnf
-rw-r----- 1 root root 450 Apr 29 21:51 ib_buffer_pool
-rw-r----- 1 root root 12582912 Apr 29 21:51 ibdata1
drwxr-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 root 113 Apr 29 21:51 xtrabackup_checkpoints
-rw-r----- 1 root root 573 Apr 29 21:51 xtrabackup_info
-rw-r----- 1 root root 2560 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 root 426 Apr 29 22:10 backup-my.cnf
-rw-r----- 1 root root 438 Apr 29 22:10 ib_buffer_pool
-rw-r----- 1 root root 12582912 Apr 29 22:10 ibdata1
drwxr-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 root 113 Apr 29 22:10 xtrabackup_checkpoints
-rw-r----- 1 root root 597 Apr 29 22:10 xtrabackup_info
-rw-r----- 1 root root 2560 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 root 426 Apr 29 22:12 backup-my.cnf
drwxr-x--- 2 root root 48 Apr 29 22:12 db1
drwxr-x--- 2 root root 92 Apr 29 22:12 homework1
-rw-r----- 1 root root 438 Apr 29 22:12 ib_buffer_pool
-rw-r----- 1 root root 12582912 Apr 29 22:12 ibdata1
drwxr-x--- 2 root root 58 Apr 29 22:12 it
drwxr-x--- 2 root root 4096 Apr 29 22:12 mysql
drwxr-x--- 2 root root 8192 Apr 29 22:12 performance_schema
drwxr-x--- 2 root root 92 Apr 29 22:12 school
drwxr-x--- 2 root root 56 Apr 29 22:12 student
drwxr-x--- 2 root root 8192 Apr 29 22:12 sys
drwxr-x--- 2 root root 92 Apr 29 22:12 test
drwxr-x--- 2 root root 138 Apr 29 22:12 test1
drwxr-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 root 113 Apr 29 22:12 xtrabackup_checkpoints
-rw-r----- 1 root root 547 Apr 29 22:12 xtrabackup_info
-rw-r----- 1 root root 2560 Apr 29 22:12 xtrabackup_logfile
增量备份必须要在完全备份之后作出更新(创建新的库、插入新的数据)
mysql> use test2;
Database changed
mysql> 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: 0
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 | 导弹专业 |
| 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-my.cnf
drwxr-x--- 2 root root 73 Apr 30 00:14 db1
drwxr-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.meta
drwxr-x--- 2 root root 88 Apr 30 00:14 it
drwxr-x--- 2 root root 4096 Apr 30 00:14 mysql
drwxr-x--- 2 root root 8192 Apr 30 00:14 performance_schema
drwxr-x--- 2 root root 150 Apr 30 00:14 school
drwxr-x--- 2 root root 85 Apr 30 00:14 student
drwxr-x--- 2 root root 8192 Apr 30 00:14 sys
drwxr-x--- 2 root root 150 Apr 30 00:14 test
drwxr-x--- 2 root root 230 Apr 30 00:14 test1
drwxr-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 names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO Student values(0009,'张艺谋','男',61,'导演专业'),(0010,'徐静蕾','女',36,'导演专业');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
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 | 导弹专业 |
| 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-my.cnf
drwxr-x--- 2 root root 73 Apr 30 00:14 db1
drwxr-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.meta
drwxr-x--- 2 root root 88 Apr 30 00:14 it
drwxr-x--- 2 root root 4096 Apr 30 00:14 mysql
drwxr-x--- 2 root root 8192 Apr 30 00:14 performance_schema
drwxr-x--- 2 root root 150 Apr 30 00:14 school
drwxr-x--- 2 root root 85 Apr 30 00:14 student
drwxr-x--- 2 root root 8192 Apr 30 00:14 sys
drwxr-x--- 2 root root 150 Apr 30 00:14 test
drwxr-x--- 2 root root 230 Apr 30 00:14 test1
drwxr-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 names
You can turn off this feature to get a quicker startup with -A
Database changed
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 | 导弹专业 |
| 7 | 孟非 | 男 | 21 | 播音主持 |
| 8 | 许三多 | 男 | 31 | 影视表演 |
| 9 | 张艺谋 | 男 | 61 | 导演专业 |
| 10 | 徐静蕾 | 女 | 36 | 导演专业 |
+-----+-----------+------+------+-----------------+
10 rows in set (0.00 sec)
#可以看到所有数据已恢复,同时test2库的Student表中增添的4条数据均已存在