Percona XtraBackup 是基于mysql服务器的开源热备份工具;
支持的数据库 Percona , MySQL, MariaDB;
支持数据库引擎 InnoDB, XtraDB, HailDB,(MyISAM, Merge,Archive 需暂停写);

特性:
1. 快速可靠地完成备份
2. 备份期间不间断事务处理
3. 节省磁盘空间和网络带宽
4. 自动备份验证
5. 更快的恢复时间
6. 进行差异备份
7. 更容易在线创建备库
8. 支持备份加密

 

备份过程:

记录日志序列号 (LSN) 
复制数据文件
XtraBackup启用后台进程监控事务日志文件,并复制变更日志

 

XtraBackup 下载地址:​https://www.percona.com/downloads/XtraBackup/​

 

XtraBackup 安装:

tar zxvf percona-xtrabackup-2.4.5-Linux-x86_64.tar.gz
mv percona-xtrabackup-2.4.5-Linux-x86_64 /usr/local/xtrabackup

ln -s /usr/local/xtrabackup/bin/innobackupex /usr/bin/innobackupex
ln -s /usr/local/xtrabackup/bin/xbcloud /usr/bin/xbcloud
ln -s /usr/local/xtrabackup/bin/xbcloud_osenv /usr/bin/xbcloud_osenv
ln -s /usr/local/xtrabackup/bin/xbcrypt /usr/bin/xbcrypt
ln -s /usr/local/xtrabackup/bin/xbstream /usr/bin/xbstream
ln -s /usr/local/xtrabackup/bin/xtrabackup /usr/bin/xtrabackup

 

xtrabackup   : 备份数据库(InnoDB和XtraDB)
innobackupex : 备份数据库(MyISAM;perl脚本对xtrabackup进行封装)
xbcrypt : 加密解密备份文件
xbstream : 压缩或自定流格式
xbcloud : 从云上传或下载 xbstream 文件
xbcloud_osenv :

备份还原所需权限:

系统权限:数据库目录的 READ , WRITE , EXECUTE
数据库权限:RELOAD , LOCK TABLES , REPLICATION CLIENT , CREATE TABLESPACE , PROCESS , SUPER , CREATE , SELECT

 

xtrabackup 配置:命令行或 /etc/my.cnf
读取模块:[mysqld] 和 [xtrabackup] ([xtrabackup] 优先读取)


定义备份文件存储位置两种方法:
方法一:
xtrabackup --backup --target-dir=/data/backups/

方法二:
[xtrabackup]
target_dir = /data/backups/

备份时需指定命令 --backup ,备份不会覆盖已存在的文件,存在则备份失败。备份可随时取消,对数据库无影响。
注:xtrabackup只备份数据文件,并不备份数据表结构(.frm),恢复时必须存在表结构(.frm)。

增量备份:每个数据页都有一个日志序列号(LSN),LSN 是整个数据库的系统版本号,LSN 都记录最近的变化。所以增量备份会复制那些自上次全备或曾备以来变化的页面。

 

当前 my.cnf 未进行配置,基本如下:

# cat /etc/my.cnf 
[mysqld]
port=3306
user=mysql
server_id = 1
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
log-error=/var/log/mysqld.log
autocommit = 1
skip-name-resolve
skip-external-locking
lower_case_table_names=1
character_set_server=utf8
default_storage_engine = InnoDB
explicit_defaults_for_timestamp = 1
transaction_isolation = READ-COMMITTED
skip-external-locking

完整备份

#全部备份
innobackupex --user=root --password=123456 /data/backups/
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /data/backups/

#单库备份
innobackupex --user=root --password=123456 --database=test /data/backups/

#压缩备份
innobackupex --user=root --password=123456 --stream=tar /data/backups | gzip > /data/backups/`date +%F_%H-%M-%S`.tar.gz

#不创建时间戳目录,所有文件都在备份目录下(--no-timestamp)
innobackupex --user=root --password=123456 /data/backups/ --no-timestamp

mkdir /data/backups/fullbackup20170201
innobackupex --user=root --password=123456 /data/backups/fullbackup20170201/ --no-timestamp

完整备份还原

#停止服务
service mysqld stop

#保存备份(实际只还原 data 中的数据,data目录需为空)
mv /usr/local/mysql /usr/local/mysql_bak
mv /usr/local/mysql/data /usr/local/mysql/data_bak

#应用日志保证数据一致性(撤销或重播事务 --apply-log);可指定内存,越大会越好(默认100MB)
innobackupex --defaults-file=/etc/my.cnf --apply-log --use-memory=1G /data/backups/2017-02-09_15-46-04

# --move-back 比 --copy-back 更快(选择其中一种即可)
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /data/backups/2017-02-09_15-46-04

#设置用户&组
chown -R mysql:mysql /usr/local/mysql/data

#启动服务
service mysqld start

增量备份测试

1. 完整备份,更名
innobackupex --user=root --password=123456 /data/backups/

mv /data/backups/2017-02-09_16-13-26 /data/backups/full_backuptest

2. 创建测试库、表、记录
mysql> create database testdb;
mysql> use testdb;
mysql> create table testtab(id int(11) NULL, name varchar(20) NULL) ENGINE=innodb;
mysql> insert into testtab values(1,'a');
mysql> select * from testtab;

3.创建第一次增量备份(--incremental-basedir 为全备目录;--incremental 为增量保存目录)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental-basedir=/data/backups/full_backuptest --incremental /data/backups/

mv /data/backups/2017-02-09_16-23-36 /data/backups/incr_backuptest01

4. 新增记录
mysql> insert into testtab values(2,'b'),(3,'c');
mysql> select * from testtab;

5.创建第二次增量备份(--incremental-basedir 上次增量目录;--incremental 为新的增量保存目录)
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental-basedir=/data/backups/incr_backuptest01 --incremental /data/backups/

mv /data/backups/2017-02-09_16-30-05 /data/backups/incr_backuptest02


6. 表被删除了!
mysql> drop table testtab;

 

其他增量备份方法:

#查看备份文件的 lsn 信息
# cat full_backuptest/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 12655760
last_lsn = 12655769
compact = 0
recover_binlog_info = 0
# cat incr_backuptest01/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 12655760
to_lsn = 12660175
last_lsn = 12660184
compact = 0
recover_binlog_info = 0
# cat incr_backuptest02/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 12660175
to_lsn = 12662078
last_lsn = 12662087
compact = 0
recover_binlog_info = 0

#增量备份另一种方法:查看 xtrabackup_checkpoints ,也可以从 to_lsn 开始增量备份
#innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /data/backups/ --incremental-lsn=12655760
#innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --incremental /data/backups/ --incremental-lsn=12660175

增量备份还原:

#增量备份整合到完整备份中
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /data/backups/full_backuptest
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /data/backups/full_backuptest --incremental-dir=/data/backups/incr_backuptest01
innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /data/backups/full_backuptest --incremental-dir=/data/backups/incr_backuptest02

#停止服务
service mysqld stop

#当前数据作为临时备份
mv /usr/local/mysql/data /usr/local/mysql/data_bak

# 还原
innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /data/backups/full_backuptest

#设置用户&组
chown -R mysql:mysql /usr/local/mysql/data

#启动服务
service mysqld start

 

汇总:

# 拷贝需要的备份出来到指定目录,
cd /data/data_backup/
cp 53307-all_databases-20181105-full.xbstream.bz2 /data/

# 创建文件保存目录
mkdir /tmp/full_datadir

# bz2 解压,解压后为 xbstream 文件
bunzip2 53307-all_databases-20181105-full.xbstream.bz2

# xbstream 解压,数据解压到目录 full_datadir 中.(文件 xbstream 仍然存在)
xbstream -x < 53307-all_databases-20181105-full.xbstream -C /tmp/full_datadir

# 如果有增量,先应用到全量,再将增量合并到全量目录
# innobackupex --apply-log --redo-only /tmp/full_datadir
# innobackupex --apply-log --redo-only /tmp/full_datadir --incremental-dir=/tmp/incr_datadir01
# innobackupex --apply-log --redo-only /tmp/full_datadir --incremental-dir=/tmp/incr_datadir02

# (最后一步)全量数据应用
innobackupex --apply-log /tmp/full_datadir

# 停止 MySQL 服务
service mysqld stop

# 先将旧数据文件备份
# mv /usr/local/mysql/data /usr/local/mysql/data_bak

# 如果用新的数据存储目录,可以用用上一步,然后直接配置 /etc/my.cnf 中的 datadir 指向新路径
mkdir -p /data/mysql_data

# vim /etc/my.cnf
datadir= /data/mysql_data

# 将数据应用到 MySQL 数据存储目录(--move-back 比 --copy-back 更快)
innobackupex --defaults-file=/etc/my.cnf --user=mysql --move-back /tmp/full_datadir

# 设置用户&组
# chown -R mysql:mysql /usr/local/mysql/data
chown -R mysql:mysql /data/mysql_data

# 启动服务
service mysqld start

# 使用还原的实例账号密码登录。

 

mkdir /tmp/full_datadir
bunzip2 3306-all_databases-20200614-full.xbstream.bz2
xbstream -x < 3306-all_databases-20200614-full.xbstream -C /tmp/full_datadir

#mysql5.6/5.7 (Full + Incremental)
xtrabackup --apply-log --redo-only /tmp/full_datadir
xtrabackup --apply-log --redo-only /tmp/full_datadir --incremental-dir=/tmp/incr_datadir01
xtrabackup --apply-log --redo-only /tmp/full_datadir --incremental-dir=/tmp/incr_datadir02
xtrabackup --apply-log /tmp/full_datadir

#mysql5.6/5.7 (Full Only)
xtrabackup --apply-log /tmp/full_datadir

#mysql8.0 (Full Only)
xtrabackup --move-back --target-dir=/tmp/full_datadir --datadir=/u1/mysql/data

#mysql8.0 (Full + Incremental)
xtrabackup --prepare --target-dir=/tmp/full_datadir
xtrabackup --prepare --apply-log-only --target-dir=/tmp/full_datadir
xtrabackup --prepare --apply-log-only --target-dir=/tmp/full_datadir --incremental-dir=/data/backups/incr_datadir01
xtrabackup --prepare --target-dir=/tmp/full_datadir --incremental-dir=/data/backups/incr_datadir02

#stop mysql service
mysqladmin -hlocalhost -P3306 -uroot -pmysql -S /u1/mysql/tmp/mysql.sock shutdown

#Remove or backup source data
mv /u1/mysql/data /u1/mysql/data_bak
mv /u1/mysql/log/binlog /u1/mysql/log/binlog_bak

xtrabackup --move-back --target-dir=/tmp/full_datadir --datadir=/u1/mysql/data
chown -R mysql:mysql /u1/mysql/{data,log/binlog}

mysqld_safe --defaults-file=/u1/mysql/etc/my.cnf --user=mysql &
mysql -hlocalhost -P3306 -uroot -pmysql -S /u1/mysql/tmp/mysql.sock

参考:Percona XtraBackup - Documentation