DevOps开发运维
成长之路

MySQL的XBK备份恢复

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

至此!所有数据恢复成功,谢谢

 

赞(0)

评论 抢沙发

评论前必须登录!

 

LNMP社群 不仅仅是技术

关于我们网站地图