MySQL之xtrabackup的使用
1.xtrabackup介绍
1.1xtrabackup概念
Xtrabackup是由Percona开发的一个开源软件,可实现对InnoDB的数据备份,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。
1.2xtrabackup的工具
xtrabackup有2个工具,分别是xtrabakup、innobakupex。
1.3备份方式
- 热备份:读写不受影响(mysqldump–>innodb)
- 温备份:仅可以执行读操作(mysqldump–>myisam)
- 冷备份:离线备份,读写都不可用
- 逻辑备份:将数据导出文本文件中(mysqldump)
- 物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)
- 完整备份:备份所有数据
- 增量备份:仅备份上次完整备份或增量备份以来变化的数据
- 差异备份:仅备份上次完整备份以来变化的数据
1.4xtrabackup特点
- 备份速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
2.xtrabackup的安装
下载地址
https://www.percona.com/downloads/XtraBackup/LATEST/
可以选择rpm包方式安装,也可以下载源码包编译安装,这里直接采用rpm包的方式进行安装
下载好之后我们用xftp上传到xshell
[root@localhost ~]# ls
anaconda-ks.cfg
mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bun.tar
//解压
[root@localhost ~]# tar xf Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bun.tar
[root@localhost ~]# ls
anaconda-ks.cfg
mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
Percona-XtraBackup-2.4.22-rc99a781-el8-x86_64-bun.tar
percona-xtrabackup-24-2.4.22-1.el8.x86_64.rpm //安装这个包
percona-xtrabackup-24-debuginfo-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-24-debugsource-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-test-24-2.4.22-1.el8.x86_64.rpm
percona-xtrabackup-test-24-debuginfo-2.4.22-1.el8.x86_64.rpm
[root@localhost ~]# yum install -y percona-xtrabackup-24-2.4.22-1.el8.x86_64.rpm
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。
常用选项:
--host 指定主机
--user 指定用户名
--password 指定密码
--port 指定端口
--databases 指定数据库
--incremental 创建增量备份
--incremental-basedir 指定包含完全备份的目录
--incremental-dir 指定包含增量备份的目录
--apply-log 对备份进行预处理操作
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only 不回滚未提交事务
--copy-back 恢复备份目录
3.xtrabackup的备份与恢复
3.1全量备份与恢复
3.1.1应用案例
//插入数据
mysql> create database school;
Query OK, 1 row affected (0.00 sec)
mysql> use school;
Database changed
mysql> create table student(id int not null primary key auto_increment,name varchar(100) not null,age tinyint);
Query OK, 0 rows affected (0.06 sec)
mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.02 sec)
mysql> insert student(name,age) values ('tom',20),('jerry',66);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
+----+-------+------+
//全量备份
[root@localhost ~]# mkdir /var/lib/mysql/
[root@localhost ~]# ln -s /tmp/mysql.sock /var/lib/mysql/
[root@localhost ~]# ll /tmp/mysql.sock /var/lib/mysql/mysql.sock
srwxrwxrwx. 1 mysql mysql 0 5月 9 10:18 /tmp/mysql.sock
lrwxrwxrwx. 1 root root 15 5月 9 12:43 /var/lib/mysql/mysql.sock -> /tmp/mysql.sock
[root@localhost ~]# innobackupex --user root --password lixirong123! /backup
// --user=root 指定备份用户
// --password=lixirong123! 指定备份用户密码
// --host 指定主机 因这里是本机所以不用指定
// /backups 指定备份目录
3.1.2模拟误删
mysql> drop database school;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
3.1.3恢复
//对备份进行预处理操作
[root@localhost ~]# innobackupex -uroot -plixirong123! --apply-log /backup/2021-05-09_14-04-23
//删除原有的数据
root@localhost ~]# rm -rf /opt/data/
// 恢复数据
[root@localhost ~]# innobackupex -uroot -plixirong123! --copy-back /backup/2021-05-09_14-04-23
//修改数据库的所有者和所属组,因为恢复是用root恢复的。
[root@localhost ~]# chown -R mysql.mysql /opt/data
//杀进程重启服务
[root@localhost ~]# pkill mysql
[root@localhost ~]# ps -ef|grep mysql
root 4745 1966 0 14:24 pts/1 00:00:00 grep --color=auto mysql
[root@localhost ~]# service mysqld start
Starting MySQL.Logging to '/opt/data/localhost.localdomain.err'.
.. SUCCESS!
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 80 *:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
//数据恢复成功
[root@localhost ~]# mysql -uroot -plixirong123! -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| student |
+------------------+
1 row in set (0.01 sec)
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
+----+-------+------+
2 rows in set (0.01 sec)
总结全量备份与恢复步骤如下:
1.用innobackupex进行全量备份,并指定备份路径
2.恢复之前,用- -apply-log参数对数据进行合并处理,保证数据一致性
3.停止服务。
4.恢复时,直接使用- -copy-back参数进行恢复
5.重启服务,查看数据是否已经恢复
3.2增量备份与恢复
使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。
要实现第一次增量备份,可以使用下面的命令进行:
基于全量备份的增量备份与恢复
做一次增量备份(基于当前最新的全量备份)
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --incremental /backups/ --incremental-basedir=/backups/2018-07-30_11-01-37
1. 准备基于全量
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37
2. 准备基于增量
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /backups/2018-07-30_11-01-37 --incremental-dir=/backups/2018-07-30_13-51-47/
3. 恢复
innobackupex --copy-back --defaults-file=/etc/my.cnf /opt/2017-01-05_11-04-55/
解释:
1. 2018-07-30_11-01-37指的是完全备份所在的目录。
2. 2018-07-30_13-51-47指定是第一次基于2018-07-30_11-01-37增量备份的目录,其他类似以此类推,即如果有多次增量备份。每一次都要执行如上操作。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
①需要在每个备份 (包括完全和各个增量备份)上,将已经提交的事务进行"重放"。“重放"之后,所有的备份数据将合并到完全备份上。
②基于所有的备份将未提交的事务进行"回滚”
3.2.1应用案例
增量备份1
//新增数据
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
+----+-------+------+
2 rows in set (0.01 sec)
mysql> insert student(name,age) value ('lisi',88);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
| 3 | lisi | 88 | //lisi 88为新增
+----+-------+------+
3 rows in set (0.00 sec)
//用innobackupex进行备份
[root@localhost ~]# ls /backup
2021-05-09_14-04-23 //之前的全备
//基于2021-05-09_14-04-23进行增量备份
[root@localhost ~]# innobackupex -uroot -plixirong123! --incremental /backup/ --incremental-basedir=/backup/2021-05-09_14-04-23/
[root@localhost backup]# cd /backup/2021-05-09_14-04-23/
[root@localhost 2021-05-09_14-04-23]# ls
backup-my.cnf ibdata1 ib_logfile1 mysql school xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool ib_logfile0 ibtmp1 performance_schema sys xtrabackup_info xtrabackup_master_key_id
[root@localhost 2021-05-09_14-04-23]# cat xtrabackup_checkpoints
backup_type = full-prepared //备份类型为全量备份
from_lsn = 0 //lsn从0开始
to_lsn = 2754513 //lsn到2754513结束
last_lsn = 2754522
compact = 0
recover_binlog_info = 0
flushed_lsn = 2754522
[root@localhost backup]# cd /backup/2021-05-09_17-17-30
[root@localhost 2021-05-09_17-17-30]# ls
backup-my.cnf ibdata1.delta mysql school xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool ibdata1.meta performance_schema sys xtrabackup_info
[root@localhost 2021-05-09_17-17-30]# cat xtrabackup_checkpoints
backup_type = incremental //备份类型为增量备份
from_lsn = 2754513 //lsn从2754513开始,衔接全量备份
to_lsn = 2754797 //lsn到2754797结束
last_lsn = 2754806
compact = 0
recover_binlog_info = 0
flushed_lsn = 2754806
增量备份2
//新增数据
mysql> select * from student;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
| 3 | lisi | 88 |
+----+-------+------+
3 rows in set (0.00 sec)
mysql> insert student(name,age) value ('wangwu',100);
Query OK, 1 row affected (0.01 sec)
mysql> select * from student;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
| 3 | lisi | 88 |
| 4 | wangwu | 100 | //wangwu 100为新增
+----+--------+------+
4 rows in set (0.00 sec)
//用innobackupex进行备份
[root@localhost 2021-05-09_17-17-30]# cd /backup
[root@localhost backup]# ls
2021-05-09_14-04-23 //全备 2021-05-09_17-17-30 //增备1
//基于2021-05-09_17-17-30 进行增量备份
[root@localhost backup]# innobackupex -uroot -plixirong123! --incremental /backup/ --incremental-basedir=/backup/2021-05-09_17-17-30/
[root@localhost backup]# cd /backup/2021-05-09_17-49-59/
[root@localhost 2021-05-09_17-49-59]# ls
backup-my.cnf ibdata1.delta mysql school xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool ibdata1.meta performance_schema sys xtrabackup_info
[root@localhost 2021-05-09_17-49-59]# cat xtrabackup_checkpoints
backup_type = incremental //备份类型为增量备份
from_lsn = 2754797 //lsn从2754797开始,衔接增量备份1
to_lsn = 2754977 //lsn到2754977结束
last_lsn = 2754986
compact = 0
recover_binlog_info = 0
flushed_lsn = 2754986
3.2.2模拟误删
mysql> drop database school;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
//停止服务
[root@localhost ~]# service mysqld stop
Shutting down MySQL.. SUCCESS!
//查看端口号3306已停止
[root@localhost ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
//查看进程已停止
[root@localhost ~]# ps -ef|grep mysql
root 5386 1966 0 19:07 pts/1 00:00:00 grep --color=auto mysql
//删除数据目录中的所有数据
[root@localhost ~]# rm -rf /opt/data/*
[root@localhost ~]# ll /opt/
总用量 0
drwxr-x---. 2 mysql mysql 6 5月 9 19:10 data
3.2.3恢复
//合并全备数据目录,确保数据的一致性
[root@localhost backup]# innobackupex -uroot -plixirong123! --apply-log --redo-only /backup/2021-05-09_14-04-23/
//将增量备份1的数据合并到全量备份数据目录中
[root@localhost backup]# ls
2021-05-09_14-04-23 2021-05-09_17-17-30 2021-05-09_17-49-59
[root@localhost backup]# innobackupex -uroot -plixirong123! --apply-log --redo-only /backup/2021-05-09_14-04-23/ --incremental-dir /backup/2021-05-09_17-17-30/
//将增量备份2的数据合并到全量备份数据目录中
[root@localhost backup]# ls
2021-05-09_14-04-23 2021-05-09_17-17-30 2021-05-09_17-49-59
[root@localhost backup]# innobackupex -uroot -plixirong123! --apply-log /backup/2021-05-09_14-04-23/ --incremental-dir /backup/2021-05-09_17-49-59/
//恢复数据
[root@localhost backup]# innobackupex -uroot -plixirong123! --copy-back /backup/2021-05-09_14-04-23/
//修改数据库的所有者和所属组
[root@localhost backup]# chown -R mysql.mysql /opt/data
[root@localhost backup]# ll /opt/data/
总用量 122920
-rw-r-----. 1 mysql mysql 436 5月 9 19:46 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 5月 9 19:46 ibdata1
-rw-r-----. 1 mysql mysql 50331648 5月 9 19:46 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 5月 9 19:46 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 5月 9 19:46 ibtmp1
drwxr-x---. 2 mysql mysql 4096 5月 9 19:46 mysql
drwxr-x---. 2 mysql mysql 8192 5月 9 19:46 performance_schema
drwxr-x---. 2 mysql mysql 58 5月 9 19:46 school
drwxr-x---. 2 mysql mysql 8192 5月 9 19:46 sys
-rw-r-----. 1 mysql mysql 485 5月 9 19:46 xtrabackup_info
-rw-r-----. 1 mysql mysql 1 5月 9 19:46 xtrabackup_master_key_id
//重启服务
[root@localhost backup]# service mysqld start
Starting MySQL.Logging to '/opt/data/localhost.localdomain.err'.
.. SUCCESS!
[root@localhost backup]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 80 *:3306 *:*
LISTEN 0 128 [::]:22 [::]:*
//数据恢复成功
[root@localhost ~]# mysql -uroot -plixirong123!
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use school;
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;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | tom | 20 |
| 2 | jerry | 66 |
| 3 | lisi | 88 |
| 4 | wangwu | 100 |
+----+--------+------+
4 rows in set (0.00 sec)
总结增量备份与恢复步骤如下:
1.增量备份需要使用参数- -incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录
2.进行数据备份时,需要使用参数- -apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性
3.再将增量备份数据使用参数- -incremental-dir依次合并到全备数据当中,注意顺序,早的在前
4.停止服务。
5.最后使用直接使用- -copy-back参数对最后的全量备份数据进行恢复
6.重启服务,查看数据是否已经恢复