点击上方 SRE运维派,?关注我?,选择 设为星标
优质文章,及时送达
1 MySQL 备份和恢复
1.3 xtrabackup 备份工具
1.3.1 xtrabackup 介绍
Xtrabackup 备份工具
Xtrabackup 是 percona 公司开发的一款 MySQL 数据库备份工具,支持对 InnoDB 引擎和 XtraDB 引擎进行热备。
XtraDB 存储引擎是由 Percona 开发的一款 MySQL 数据库的高性能存储引擎,其目的是用来代替 InnoDB 存储引擎,可用于需要更高性能的环境。
#下载地址-8.0
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
#下载地址-2.4
https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
#文档地址-8.0
https://docs.percona.com/percona-xtrabackup/8.0/index.html
#文档地址-2.4
https://docs.percona.com/percona-xtrabackup/2.4/index.html
XtraBackup8.0 适配 MySQL8.0 及以后的版本,XtraBackup2.4 适配 MySQL5.7 及以前的版本,要根据 MySQL 的版本不同选择不同版本的 XtraBackup 来进行备份。
XtraBackup 特点
备份还原过程快速、可靠
备份过程不会打断正在执行的事务
能够基于压缩等功能节约磁盘空间和流量
自动实现备份检验
-
开源,免费
1.3.2 xtrabackup 安装
yum 在线安装
#先安装官方源
[root@rocky86 ~]# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
#搜索
[root@rocky86 ~]# yum search "percona-xtrabackup"
#安装
[root@rocky86 ~]# yum install percona-xtrabackup-80
#查看
[root@rocky86 ~]# yum info percona-xtrabackup-80
#下载rpm包
[root@rocky86 ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.30-23/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.30-23.1.el8.x86_64.rpm
#使用yum安装来解决依赖
[root@rocky86 ~]# yum install ./percona-xtrabackup-80-8.0.30-23.1.el8.x86_64.rpm
#查看
[root@rocky86 ~]# yum info percona-xtrabackup-80
/usr/bin/xbcloud #云端管理工具,可将备份内容直接上传云端或从云端下载,可支持 AWS S3,MS Azure Cloud 等
/usr/bin/xbcloud_osenv #从OpenStack中读取环境变理和配置,配合xbcloud使用
/usr/bin/xbcrypt #加解密工具
/usr/bin/xbstream #支持并发写的流文件格式
/usr/bin/xtrabackup #主程序
[xtrabackup [--defaults-file=#] --backup | xtrabackup [--defaults-file=#] --prepare] [OPTIONS]
#常用选项
-u|--user=val #MySQL连接用户名
-H|--host=val #MySQL主机地址
-P|--port=val #MySQL主机连接端口
-p|--password[=val] #MySQL连接密码
-S|--socket=val #指定连接使用的socket文件
--print-defaults #输出默认选项和参数
--defaults-file=val #从指定文件读取MySQL配置,必须放在最前面
-v|--version #显示版本号
--target-dir=val #备份文件保存的目标位置
--backup #备份到目标目录
--prepare #还原前预处理
--export #创建导出表所需的文件
--apply-log-only #仅还原,不回滚
--print-param #在终端中输出选项和参数
--incremental #增量份,同时需要指定 --incremental-basedir或 --incremental-lsn
--copy-back #以复制的形式还原,保留备份文件
--move-back #以移动的形式还原,不保留备份文件
--incremental-lsn=val #创建增量备份时,可以指定日志序列号开始备份
--incremental-basedir=val #增量备份基础,是基于此次备份的基础上进行增量备份的
--incremental-dir=name #还原时增量备份内容的目录
--tables=val #只备份指定的表,可使用正则
--tables-file=val #从文件中读取要备份的表
--databases=val #指定要处理的数据库
--databases-file=val #从文件中读取要处理的数据库
--tables-exclude=val #指定不处理的表,此项优先级高于 --tables
--databases-exclude=val #指定不处理的数据库,此项优先级高于 --databases
--compress[=val] #指定压缩算法,quicklz|lz4|zstd,默认 quicklz
--compress-threads=val #压缩线程数,默认1
--compress-chunk-size=val #压缩线程的工作缓冲区大小,默认64k
--compress-zstd-level=val #压缩等级,1-19,默认1
--decompress #解压缩,可以指压缩算法,例如 --decompress=lz4
--remove-original #解压缩后删除压缩文件
-h|--datadir=val #指定数据目录
-t|--tmpdir=val #指定备份期间用于存储临时
--log-bin[=val] #binlog日志文件名
--server-id=val #指定服务器ID
1.3.4 xtrabackup 备份和还原实现
1.3.4.1 xtrabackup 实现完全备份和还原
开始备份
#创建目录
[root ~]# mkdir /backup/
#开始备份
[root ~]# xtrabackup -uuser1 -p123456 --backup --target-dir=/backup/base
#查看
[root@rocky86 ~]# ls /backup/
base
[root@rocky86 ~]# ls /backup/base/
backup-my.cnf ib_buffer_pool shopxo wordpress
xtrabackup_tablespaces
binlog.000007 ibdata1 sys xtrabackup_binlog_info
binlog.index mysql testdb xtrabackup_checkpoints
discuz mysql.ibd undo_001 xtrabackup_info
eshop performance_schema undo_002 xtrabackup_logfile
#备份时的相关信息
[root ~]# cat /backup/base/xtrabackup_info
uuid = 00cefafe-8d9a-11ed-a151-000c29b13f86
name =
tool_name = xtrabackup #备份工具
tool_command = -uuser1 -p=... --backup --target-dir=/backup/base #参数,密码被替换
tool_version = 8.0.30-23 #备份工具版本
ibbackup_version = 8.0.30-23 #备份工具版本
server_version = 8.0.30 #MySQL版本
start_time = 2023-01-06 16:13:27 #开始备份时间
end_time = 2023-01-06 16:13:29 #结束时间
lock_time = 0 #锁表时长
binlog_pos = filename 'binlog.000007', position '157' #binlog文件和pos位置信息
innodb_from_lsn = 0 #开始lsn号
innodb_to_lsn = 223560262 #结束lsn号
partial = N #不是部份备份
incremental = N #不是增量备份
format = file #以文件形式备份
compressed = N #不是压缩格式
encrypted = N #不加密
#检查点相关信息
[root@rocky86 ~]# cat /backup/base/xtrabackup_checkpoints
backup_type = full-backuped #完全备份
from_lsn = 0 #备份开始lsn号
to_lsn = 223560262 #备份结束lsn号
last_lsn = 223560262 #备份结束时最大lsn号
flushed_lsn = 223560262
redo_memory = 360
redo_frames = 1
#将备份文件CP到远程主机
[root ~]# scp -r /backup root@10.0.0.164:/root/
#远程主机需要安装相同版本的xtrabackup,相同版本的MySQL
#查看
[root ~]# du -sh backup/
133M backup/
#执行还原前的整理,将备份时没提交的事务进行回滚
[root ~]# xtrabackup --prepare --target-dir=/root/backup/base
#整理后的大小
[root ~]# du -sh backup/
177M backup/
#mysql服务不能开启,数据目录不能有数据
[root ~]# systemctl is-active mysqld.service
inactive
[root ~]# ll /var/lib/mysql
total 0
#开始还原
[root@rocky86 ~]# xtrabackup --copy-back --target-dir=/root/backup/base --datadir=/var/lib/mysql
#修改权限
[root ~]# chown -R mysql.mysql /var/lib/mysql/*
#启动MySQL服务查看
[root ~]# systemctl start mysqld.service
[root ~]# mysql -uuser1 -p123456 -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| discuz |
| eshop |
| information_schema |
| mysql |
| performance_schema |
| shopxo |
| sys |
| testdb |
| wordpress |
+--------------------+
----|-----------|---------------|-------------|-------------------->
备份开始 事务开始 备份结束 事务结束
================================|-------------|-------------------->
备份的数据中只有事务的开始,没有事务的结束,所以,如果直接还原,则是还原到了一个事务的中间状态,因此需要整理
LSN(log sequence number)日志序列号
LSN 称为日志的逻辑序列号,在 InnoDB 存储引擎中,LSN 占用8字节空间大小。LSN 的值会随着日志的写入而逐渐增大。InnoDB 存储引擎是通过 LSN 来标记相关内容的版本。不同的 LSN 有不同的含义。
LSN不仅存在于重做日志中,在每个数据页头部也会有对应的LSN号。在数据页头部,LSN记录当前页最后一次修改的LSN号,用于在recovery 时对比重做日志 LSN 号决定是否对该页进行恢复数据。
checkpoint 也是有 LSN 号记录的,LSN 号串联起一个事务开始到恢复的过程。
mysql> show engine innodb status\G
Log sequence number 223609615 #当前系统最大的LSN号
Log flushed up to 223609615 #当前已经写入redo日志文件的LSN
Pages flushed up to 223609615 #已经将更改写入脏页的LSN号
Last checkpoint at 223609615 #系统最后一次刷新buffer pool脏中页数据到磁盘的checkpoint
1.3.4.2 xtrabackup 实现增量备份和还原
增量备份是在完全备份的基础上进行的
#完全备份
-------|--------------|-------------|------------------->
事务开始 备份结束 事务结束
#完全备份的数据
======================|-------------|--------------------->
#第一次增量备份
----------------------x------|-----------|-------------|---------->
事务开始 备份结束 事务结束
#第一次增量备份的数据,包含了第完全备份没结束的事务
----------------------x==================|-------------|---------->
#第二次增量备份
----------------------x------------------x-----|-------------|-------------|---->
事务开始 备份结束 事务结束
#第二次增量备份的数据,包含了第一次增量备份没结束的事务
----------------------x------------------x===================|-------------|---->
数据还原时注意,还原顺序一定要正确,先还原完全备份的数据,再还原第一次增量备份的数据,再还原第二次增量备份的数据,如果有多个增量备份,也是按照此规则进行还原。另外,在还原时,只有最后一次的备份文件还原时需要进行事务回滚,之前的都不用回滚。
#完全备份
[root@rocky86 ~]# xtrabackup -uuser1 -p123456 --backup --target-dir=/backup/base
[root@rocky86 ~]# ls /backup/
base
[root@rocky86 ~]# du -sh /backup/*
133M /backup/base
#更改数据
mysql> select * from t1;
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 12 | u11 | 11 | M |
| 13 | u22 | 45 | F |
| 14 | u33 | 33 | M |
| 15 | u44 | 44 | F |
+----+------+------+--------+
4 rows in set (0.00 sec)
mysql> insert into t1(name,age,gender)values('u77',77,'M');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1;
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 12 | u11 | 11 | M |
| 13 | u22 | 45 | F |
| 14 | u33 | 33 | M |
| 15 | u44 | 44 | F |
| 21 | u77 | 77 | M |
+----+------+------+--------+
5 rows in set (0.00 sec)
#第一次增量备份,基于/backup/base 做增量备份
[root@rocky86 ~]# xtrabackup -uuser1 -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
#查看
[root@rocky86 ~]# ls /backup/
base inc1
[root@rocky86 ~]# du -sh /backup/*
133M /backup/base
14M /backup/inc1
#再次更改数据
mysql> insert into t1(name,age,gender)values('u88',88,'F');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 12 | u11 | 11 | M |
| 13 | u22 | 45 | F |
| 14 | u33 | 33 | M |
| 15 | u44 | 44 | F |
| 21 | u77 | 77 | M |
| 22 | u88 | 88 | F |
+----+------+------+--------+
6 rows in set (0.00 sec)
#第二增量备份,基于上一次的增量备份数据进行
[root@rocky86 ~]# xtrabackup -uuser1 -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
#查看
[root@rocky86 ~]# ls /backup/
base inc1 inc2
[root@rocky86 ~]# du -sh /backup/*
133M /backup/base
14M /backup/inc1
14M /backup/inc2
#复制到远程主机
[root@rocky86 ~]# scp -r /backup/* root@10.0.0.164:/root/backup/
#查看
[root ~]# ls /root/backup/
base inc1 inc2
[root@rocky86 ~]# du -sh /root/backup/*
133M /root/backup/base
14M /root/backup/inc1
14M /root/backup/inc2
#还原前整理
#整理全量备份数据,不回滚
[root@rocky86 ~]# xtrabackup --prepare --apply-log-only --targetdir=/root/backup/base
[root ~]# du -sh /root/backup/*
153M /root/backup/base #占用空间变大
14M /root/backup/inc1
14M /root/backup/inc2
#整理第一次增量备份数据,不回滚
[root@rocky86 ~]# xtrabackup --prepare --apply-log-only --targetdir=/root/backup/base --incremental-dir=/root/backup/inc1
[root@rocky86 ~]# du -sh /root/backup/*
153M /root/backup/base
22M /root/backup/inc1 #占用空间变大
14M /root/backup/inc2
#整理第二次增量备份数据,需要回滚
[root@rocky86 ~]# xtrabackup --prepare --target-dir=/root/backup/base --incremental-dir=/root/backup/inc2
[root@rocky86 ~]# du -sh /root/backup/*
153M /root/backup/base
22M /root/backup/inc1
46M /root/backup/inc2 #占用空间变大
#停止MySQL服务
[root ~]# systemctl stop mysqld.service
#删除数据目录内容
[root ~]# rm -rf /var/lib/mysql/*
#还原数据
[root ~]# xtrabackup --copy-back --target-dir=/root/backup/base --datadir=/var/lib/mysql/
#修改文件权限
[root@rocky86 ~]# chown -R mysql.mysql /var/lib/mysql/*
#启动服务
[root@rocky86 ~]# systemctl start mysqld.service
#测试
[root@rocky86 ~]# mysql -uuser1 -p123456 -e "select * from testdb.t1;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 12 | u11 | 11 | M |
| 13 | u22 | 45 | F |
| 14 | u33 | 33 | M |
| 15 | u44 | 44 | F |
| 21 | u77 | 77 | M |
| 22 | u88 | 88 | F |
+----+------+------+--------+
xtrabackup -uuser1 -p123456 --backup --target-dir=/backup/testdb_t1 --include='testdb.t1'
— END —
-点击下方卡片关注-
点赞、转发、在看!
您的鼓励是对我最大的支持!

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!
优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。