Percona XtraBackup(简称PXB)是 Percona 公司开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQL(Oracle)、Percona Server 和 MariaDB,并且全部开源。
官网介绍:https://www.percona.com/software/mysql-database/percona-xtrabackup
安装教程:https://www.percona.com/doc/percona-xtrabackup/2.4/installation.html
[root@ansible ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.21/binary/tarball/percona-xtrabackup-2.4.21-Linux-x86_64.glibc2.12.tar.gz
[root@ansible ~]# tar xvf percona-xtrabackup-2.4.21-Linux-x86_64.glibc2.12.tar.gz
[root@ansible ~]# mv percona-xtrabackup-2.4.21-Linux-x86_64.glibc2.12 percona-xtrabackup-2.4.21
[root@ansible ~]# cd percona-xtrabackup-2.4.21/
[root@ansible percona-xtrabackup-2.4.21]# tree bin/
bin/
├── innobackupex -> xtrabackup
├── xbcloud
├── xbcloud_osenv
├── xbcrypt
├── xbstream
└── xtrabackup
0 directories, 6 files
1、innobackupex # 这个工具在之前的版本中是一个perl脚本,会调用xtrabackup这个二进制工具。从xtrabackup 2.3开始,该工具使用C语言进行了重写,当前它是xtabackup二进制工具的一个软连接,但是实际的使用方法却不同,并且在以后的版本中会删除该工具。
2、xtrabackup # 备份功能的主程序
3、xbcloud, xbcloud_osenv # 是xtrabackup新的高级特性云备份。
4、xbcrypt # 是加解密用的;
5、xbstream # 支持流式备份功能。可以将备份的内容打包并通过管道传递
【注】Percona XtraBackup 支持增量备份,但是只能对InnoDB做增量,MyISAM没有增量备份机制。
(1)建用户及授权
mysql> CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT,super ON *.* TO 'xtrabackup'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> show grants for "xtrabackup"@"localhost";
+--------------------------------------------------------------------------------------------------+
| Grants for xtrabackup@localhost |
+--------------------------------------------------------------------------------------------------+
| GRANT RELOAD, PROCESS, SUPER, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost' |
+--------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
(2)准备测试数据
[root@ansible ~]# cd employees_db/
[root@ansible employees_db]# mysql -uroot -h10.25.25.25 -p123456 -t < employees.sql
(3)创建备份目录
[root@ansible ~]# mkdir -p /data/backup/
[root@ansible ~]# cd percona-xtrabackup-2.4.21/
[root@ansible bin]# ./xtrabackup --user=xtrabackup --password="123456" --backup --target-dir=/data/backup/
[root@ansible ~]# ll /data/backup/ #查看备份文件
total 12336
-rw-r----- 1 root root 487 Jul 10 11:33 backup-my.cnf # 备份的配置文件
drwxr-x--- 2 root root 272 Jul 10 11:33 employees
-rw-r----- 1 root root 301 Jul 10 11:33 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jul 10 11:33 ibdata1
drwxr-x--- 2 root root 4096 Jul 10 11:33 mysql
drwxr-x--- 2 root root 8192 Jul 10 11:33 performance_schema
drwxr-x--- 2 root root 8192 Jul 10 11:33 sys
-rw-r----- 1 root root 141 Jul 10 11:33 xtrabackup_checkpoints # 指明备份类型以及开始与结束的位置
-rw-r----- 1 root root 452 Jul 10 11:33 xtrabackup_info # 记录备份信息
-rw-r----- 1 root root 2560 Jul 10 11:33 xtrabackup_logfile # 备份的日志文件
[root@ansible ~]# cd /data/backup/
[root@ansible backup]# cat xtrabackup_info
uuid = a2a803b6-e12f-11eb-8a4f-52540012414e
name =
tool_name = xtrabackup
tool_command = --user=xtrabackup --password=... --backup --target-dir=/data/backup/
tool_version = 2.4.21
ibbackup_version = 2.4.21
server_version = 5.7.31
start_time = 2021-07-10 11:33:42
end_time = 2021-07-10 11:33:47
lock_time = 1
binlog_pos =
innodb_from_lsn = 0
innodb_to_lsn = 370569585
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
[root@ansible backup]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 370569585
last_lsn = 370569594
compact = 0
recover_binlog_info = 0
flushed_lsn = 370569594
[root@ansible ~]# systemctl stop mysqld.service # 暂停数据库
[root@ansible ~]# cp -rf /mysql/data/ /mysql/data.bak # 备份MySQL数据目录
[root@ansible ~]# rm -rf /mysql/data/* # 清空MySQL数据目录
# 恢复数据
[root@ansible ~]# cd percona-xtrabackup-2.4.21/
[root@ansible percona-xtrabackup-2.4.21]# cd bin/
[root@ansible bin]# ./xtrabackup --copy-back --target-dir=/data/backup
# 修改恢复目录的授权
[root@ansible ~]# cd /mysql/
[root@ansible mysql]# chown -R mysql:mysql data/
[root@ansible mysql]# chmod -R 755 data/
[root@ansible ~]# systemctl restart mysqld # 启动MySQL服务器
# 校验数据
[root@ansible ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use employees;
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> show tables;
+---------------------+
| Tables_in_employees |
+---------------------+
| departments |
| dept_emp |
| dept_manager |
| employees |
| salaries |
| titles |
+---------------------+
6 rows in set (0.00 sec)
mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.12 sec)
(1)创建备份目录
[root@ansible ~]# mkdir -p /data/backup_incr
(2)插入新数据
mysql> use employees;
mysql> select * from departments;
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+
9 rows in set (0.00 sec)
mysql> show create table departments\G
*************************** 1. row ***************************
Table: departments
Create Table: CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`),
UNIQUE KEY `dept_name` (`dept_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
# 插入数据
mysql> insert into departments(dept_no,dept_name) values('d010','Network');
Query OK, 1 row affected (0.00 sec)
mysql> select * from departments;
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d010 | Network |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+
10 rows in set (0.00 sec)
(3)基于全备的增备
开始第一次增备,只要全备和多个增备的LSN号连续,那么就可以逐个进行恢复。可以再备份目录xtrabackup_checkpoints文件中看到,其中全备的from_lsn=0,增备的from_lsn应该等于上一个增备或者全备的to_lsn。
[root@ansible ~]# cd percona-xtrabackup-2.4.21/
[root@ansible percona-xtrabackup-2.4.21]# cd bin/
[root@ansible bin]# ./xtrabackup --user=xtrabackup --password="123456" --backup --target-dir=/data/backup_incr --incremental-basedir=/data/backup/
[root@ansible bin]# ll /data/backup_incr/
total 136
-rw-r----- 1 root root 487 Jul 10 14:33 backup-my.cnf
drwxr-x--- 2 root root 4096 Jul 10 14:33 employees
-rw-r----- 1 root root 301 Jul 10 14:33 ib_buffer_pool
-rw-r----- 1 root root 81920 Jul 10 14:32 ibdata1.delta
-rw-r----- 1 root root 60 Jul 10 14:32 ibdata1.meta
drwxr-x--- 2 root root 4096 Jul 10 14:33 mysql
drwxr-x--- 2 root root 8192 Jul 10 14:33 performance_schema
drwxr-x--- 2 root root 8192 Jul 10 14:33 sys
-rw-r----- 1 root root 141 Jul 10 14:33 xtrabackup_checkpoints
-rw-r----- 1 root root 498 Jul 10 14:33 xtrabackup_info
-rw-r----- 1 root root 2560 Jul 10 14:33 xtrabackup_logfile
【注】--incremental-basedir是上次全备或者增备出来的文件夹。当第一次增备的时候,一般填上次全备,第二次增备的时候,如果--incremental-basedir填上次全备,那么本次增备就会包含上次全备到现在变化的内容。
(1)创建备份目录
[root@ansible ~]# mkdir -p /data/backup_all
[root@ansible ~]# mkdir -p /data/backup_incr1
[root@ansible ~]# mkdir -p /data/backup_incr2
(2)完成一次全备
mysql> select * from departments;
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+
10 rows in set (0.00 sec)
[root@ansible bin]# ./xtrabackup --user=xtrabackup --password="123456" --backup --target-dir=/data/backup_all
[root@ansible bin]# ll /data/backup_all/
total 12336
-rw-r----- 1 root root 487 Jul 10 16:37 backup-my.cnf
drwxr-x--- 2 root root 272 Jul 10 16:37 employees
-rw-r----- 1 root root 301 Jul 10 16:37 ib_buffer_pool
-rw-r----- 1 root root 12582912 Jul 10 16:37 ibdata1
drwxr-x--- 2 root root 4096 Jul 10 16:37 mysql
drwxr-x--- 2 root root 8192 Jul 10 16:37 performance_schema
drwxr-x--- 2 root root 8192 Jul 10 16:37 sys
-rw-r----- 1 root root 135 Jul 10 16:37 xtrabackup_checkpoints
-rw-r----- 1 root root 453 Jul 10 16:37 xtrabackup_info
-rw-r----- 1 root root 2560 Jul 10 16:37 xtrabackup_logfile
[root@ansible bin]# cat /data/backup_all/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2736437
last_lsn = 2736490
compact = 0
recover_binlog_info = 0
flushed_lsn = 2736446
(3)基于全备的第一次增备
mysql> insert into departments(dept_no,dept_name) values('d010','Network');
Query OK, 1 row affected (0.00 sec)
mysql> select * from departments;
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d011 | Computer |
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d010 | Network |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+
11 rows in set (0.00 sec)
[root@ansible bin]# ./xtrabackup --user=xtrabackup --password="123456" --backup --target-dir=/data/backup_incr1 --incremental-basedir=/data/backup_all/
[root@ansible bin]# cat /data/backup_incr1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2736437
to_lsn = 2737476
last_lsn = 2737485
compact = 0
recover_binlog_info = 0
flushed_lsn = 2737485
(4)基于第一次增备的增备
mysql> insert into departments(dept_no,dept_name) values('d011','Computer');
Query OK, 1 row affected (0.00 sec)
mysql> select * from departments;
+---------+--------------------+
| dept_no | dept_name |
+---------+--------------------+
| d011 | Computer |
| d009 | Customer Service |
| d005 | Development |
| d002 | Finance |
| d003 | Human Resources |
| d001 | Marketing |
| d010 | Network |
| d004 | Production |
| d006 | Quality Management |
| d008 | Research |
| d007 | Sales |
+---------+--------------------+
11 rows in set (0.00 sec)
[root@ansible ~]# cd percona-xtrabackup-2.4.21/bin/
[root@ansible bin]# ./xtrabackup --user=xtrabackup --password="123456" --backup --target-dir=/data/backup_incr2 --incremental-basedir=/data/backup_incr1
[root@ansible bin]# cat /data/backup_incr2/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 2737476
to_lsn = 2738465
last_lsn = 2738474
compact = 0
recover_binlog_info = 0
flushed_lsn = 2738474
这里需要做三次prepare,第一次是把全备给prepare,要加入--apply-log-only参数,因为在每个备份过程中,都会碰到一些事务进来执行,而备份结束时可能有些事务并没有执行完毕,所以在默认prepare中这些事务就会被回滚(rollback),而加入了--apply-log-only就不会回滚这些事务,而是等待prepare下次增备。第二次prepare就是准备第一次增备的目录,这个prepare目的就是把第一次增备期间发生的变化写入到全备的目录中去,然后第一次增备的目录就没有用处了,因为我们最终拷贝表空间文件是把增备目录拷贝过去。无论多少个增备,最后prepare的那个增备是不能加--apply-log-only参数的,因为最后一次增备还没有完成的事务就要彻底回滚来保证一致性。
(1)第一次prepare全备
[root@ansible ~]# cd percona-xtrabackup-2.4.21/
[root@ansible percona-xtrabackup-2.4.21]# cd bin/
[root@ansible bin]# ./xtrabackup --prepare --apply-log-only --target-dir=/data/backup_all
(2)第二次prepare增备
[root@ansible bin]# ./xtrabackup --prepare --apply-log-only --target-dir=/data/backup_all --incremental-dir=/data/backup_incr1
(3)第三次prepare增备
[root@ansible bin]# ./xtrabackup --prepare --target-dir=/data/backup --incremental-dir=/data/backup_incr2
(4)备份恢复
[root@ansible ~]# systemctl stop mysqld.service # 暂停数据库
[root@ansible ~]# cp -rf /mysql/data/ /mysql/data.bak2 # 备份MySQL数据目录
[root@ansible ~]# rm -rf /mysql/data/* # 清空MySQL数据目录
# 恢复数据
[root@ansible ~]# cd percona-xtrabackup-2.4.21/
[root@ansible percona-xtrabackup-2.4.21]# cd bin/
[root@ansible bin]# ./xtrabackup --copy-back --target-dir=/data/backup_all
# 修改恢复目录的授权
[root@ansible ~]# cd /mysql/
[root@ansible mysql]# chown -R mysql:mysql data/
[root@ansible mysql]# chmod -R 755 data/
[root@ansible ~]# systemctl restart mysqld # 启动MySQL服务器
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。