xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源,免费,支持在线热备,备份恢复速度快,占用磁盘空间小等特点,并且支持不同情况下的多种备份形式
。xtrabackup的官方下载地址为http://www.percona.com/software/percona-xtrabackup。
它的备份方式是物理备份
非innodb表:是直接锁表,在cp数据,属于温备
innodb表:不锁表,拷贝数据页,最终以数据文件的方式保存下来,并且最大的优势是在备份时,把备份时产生的redo和undo一并备走,属于热备方式
xtrabackup包含两个主要的工具,即xtrabackup和innobackupex,二者区别如下:
(1)xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;
(2)innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份。
XBK在innodb表备份恢复的流程
1.XBK备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
2.备份时,拷贝磁盘数据页,并把备份过程中产生的redo和undo一并考走,也就是checkpoint,LSN之后的日志
3.在恢复之前,模拟innodb自动恢复过程,将redo与undo进行应用
4.恢复过程是cp,备份到元数据目录下
我这里是下载的percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm,上传到虚拟机中,然后yum install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm 自动解决依赖,就可以使用了
innobackex使用
在配置文件中添加新配置:
[client] socket=/tmp/mysql.sock
全备:
默认是以日期命名备份文件 [root@db01 ~]# innobackupex --user=root --password=123 /test [root@db01 ~]# ll /test/ drwxr-x--- 2 root root 6 May 29 20:31 2019-05-29_20-31-45
自定义备份文件的名字 [root@db01 ~]#innobackupex --user=root --password=123 --no-timestamp /test/full [root@db01 ~]# ll /test [root@db01 ~]#drwxr-x--- 5 root root 193 Jun 5 20:10 full
恢复:
恢复之前先csr,进行redo或者undo: [root@db01 ~]# innobackupex --apply-log /test/full 然后进行恢复: 注意,被恢复的datadir必须是空的: [root@db01 ~]# ll /data/mysql total 0 然后进行恢复: [root@db01 ~]# innobackupex --copy-back /test/full 190605 20:50:17 completed OK! [root@db01 ~]# mkdir /data/mysql/data2 -p [root@db01 ~]# cp -a /test/full/* /data/mysql/data2 检查datadir是否有文件: [root@db01 ~]# ll /data/mysql/mysql2 total 122920 -rw-r----- 1 root root 335 Jun 5 20:50 ib_buffer_pool -rw-r----- 1 root root 12582912 Jun 5 20:50 ibdata1 -rw-r----- 1 root root 50331648 Jun 5 20:50 ib_logfile0 -rw-r----- 1 root root 50331648 Jun 5 20:50 ib_logfile1 -rw-r----- 1 root root 12582912 Jun 5 20:50 ibtmp1 drwxr-x--- 2 root root 4096 Jun 5 20:50 mysql drwxr-x--- 2 root root 8192 Jun 5 20:50 performance_schema drwxr-x--- 2 root root 8192 Jun 5 20:50 sys -rw-r----- 1 root root 436 Jun 5 20:50 xtrabackup_info -rw-r----- 1 root root 1 Jun 5 20:50 xtrabackup_master_key_id
因为恢复的时候是以root用户,所以要授权一下 [root@db01 ~]# chown -R mysql.mysql /data/* [root@db01 ~]# ll /data/mysql/data2 total 122920 -rw-r----- 1 mysql mysql 335 Jun 5 20:50 ib_buffer_pool -rw-r----- 1 mysql mysql 12582912 Jun 5 20:50 ibdata1 -rw-r----- 1 mysql mysql 50331648 Jun 5 20:50 ib_logfile0 -rw-r----- 1 mysql mysql 50331648 Jun 5 20:50 ib_logfile1 -rw-r----- 1 mysql mysql 12582912 Jun 5 20:50 ibtmp1 drwxr-x--- 2 mysql mysql 4096 Jun 5 20:50 mysql drwxr-x--- 2 mysql mysql 8192 Jun 5 20:50 performance_schema drwxr-x--- 2 mysql mysql 8192 Jun 5 20:50 sys -rw-r----- 1 mysql mysql 436 Jun 5 20:50 xtrabackup_info -rw-r----- 1 mysql mysql 1 Jun 5 20:50 xtrabackup_master_key_id
修改配置文件,启动,直接恢复数据 [root@db01 ~]#vim /etc/my.cnf
datadir=/data/mysql/data2
[root@db01 ~]# systemctl start mysqld.service
增量备份和恢复
先看看此时数据库有什么数据: 3306 [test1]>show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test1 | +--------------------+ 5 rows in set (0.00 sec) 3306 [test1]>select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ 3 rows in set (0.00 sec)
此时先做个全备:
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp /test/full [root@db01 ~]# ll /test drwxr-x--- 6 root root 206 Jun 5 21:04 full
接下来模拟第一天数据变化:
3306 [test1]>create table t2 (id int); Query OK, 0 rows affected (0.01 sec) 3306 [test1]>insert into t2 values(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 03306 [test1]>show tables; +-----------------+ | Tables_in_test1 | +-----------------+ | t1 | | t2 | +-----------------+ 2 rows in set (0.00 sec)
进行第一天的增量备份:两个参数,指定增量备份文件路径名字,和以哪个备份为基础进行增量备份
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental /test/inc1 --incremental-basedir=/test/full 增量备份完,此时目录中应该有两个备份文件 [root@db01 ~]# ll /test drwxr-x--- 6 root root 206 Jun 5 21:04 full drwxr-x--- 6 root root 232 Jun 5 21:12 inc1
接下来模拟第二天数据变化:
3306 [test1]>create table t3 (id int); Query OK, 0 rows affected (0.01 sec) 3306 [test1]>insert into t3 values(1),(2),(3); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 3306 [test1]>show tables; +-----------------+ | Tables_in_test1 | +-----------------+ | t1 | | t2 | | t3 | +-----------------+ 3 rows in set (0.00 sec)
进行第二天增量备份:此次的增量备份,就要依赖inc1进行增量
[root@db01 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental /test/inc2 --incremental-basedir=/test/inc1 [root@db01 ~]# ll /test total 0 drwxr-x--- 6 root root 206 Jun 5 21:04 full drwxr-x--- 6 root root 232 Jun 5 21:12 inc1 drwxr-x--- 6 root root 232 Jun 5 21:27 inc2
进行模拟第三天数据:但此次不进行增量备份
3306 [test1]>create table t4 (id int); Query OK, 0 rows affected (0.02 sec) 3306 [test1]>insert into t4 values(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 03306 [test1]>show tables; +-----------------+ | Tables_in_test1 | +-----------------+ | t1 | | t2 | | t3 | | t4 | +-----------------+ 4 rows in set (0.00 sec)
目前,我们有一个全备,两个增量备份,和二进制日志,恢复前请 一定要注意!!!
1.增量不能单独备份
2.增量必须按照顺序合并到全备中
3.所有备份必须进行apply-log
4.除了最后一个增量备份文件,其他的必须进行redo,一定不能undo,
下面我们开始实际操作一下
先csr第一个全备
[root@db01 ~]# innobackupex --apply-log --redo-only /test/full
合并与整理inc1
[root@db01 ~]# innobackupex --apply-log --redo-only --incremental-dir=/test/inc1 /test/full
合并与整理inc2,因为inc2是最后一个增量,所以不用加–redo-only
[root@db01 ~]# innobackupex --apply-log --incremental-dir=/test/inc2 /test/full
进行全备最终整理
[root@db01 ~]# innobackupex --apply-log /test/full
到此备份文件已整理好,接下来截取日志文件
判断日志起点 [root@db01 test]# cat inc2/xtrabackup_binlog_info mysql-bin.000001 1619 8d397b30-8791-11e9-acbd-000c2902fc28:1-7 因为是包含1-7,所以起点是8
判断终点 3306 [(none)]> show binlog events in 'mysql-bin.000001'; mysql-bin.000001 | 2049 | Gtid | 6 | 2114 | SET @@SESSION.GTID_NEXT= '8d397b30-8791-11e9-acbd-000c2902fc28:10' 终点是10
截取: [root@db01 test]# mysqlbinlog --skip-gtids --include-gtids='8d397b30-8791-11e9-acbd-000c2902fc28:8-10' /data/binlog/mysql-bin.000001 >/test/bin.sql [root@db01 test]# ll total 8 -rw-r--r-- 1 root root 2500 Jun 5 22:23 bin.sql drwxr-x--- 6 root root 4096 Jun 5 22:17 full drwxr-x--- 6 root root 262 Jun 5 22:14 inc1 drwxr-x--- 6 root root 262 Jun 5 22:15 inc2
最终将全备full下面的文件cp到新环境的datadir下 [root@db01 test]# cp -a /test/full/* /data/3307/data/ 启动数据库 chown -R mysql.mysql /data systemctl start mysqld3307.service 进入数据库恢复日志数据 source /test/bin.sql
至此!所有数据恢复成功,谢谢
评论前必须登录!
注册