广州总部电话:020-85564311
广州总部电话:020-85564311

广州网站建设-小程序商城开发-广州小程序开发-企业微信开发公司-网站建设高端品牌-优网科技

20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

MySQL 备份和恢复(三):xtrabackup 备份工具
发布日期:2025-04-28 17:09:30 浏览次数: 816 来源:SRE运维派

点击上方 SRE运维派?关注我?,选择 设为星标

优质文章,及时送达

1 MySQL 备份和恢复

1.3 xtrabackup 备份工具

1.3.1 xtrabackup 介绍

Xtrabackup 备份工具

Xtrabackup 是 percona 公司开发的一款 MySQL 数据库备份工具,支持对 InnoDB 引擎和 XtraDB 引擎进行热备。

XtraDB 存储引擎是由 Percona 开发的一款 MySQL 数据库的高性能存储引擎,其目的是用来代替 InnoDB 存储引擎,可用于需要更高性能的环境。

#下载地址-8.0https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
#下载地址-2.4https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
#文档地址-8.0https://docs.percona.com/percona-xtrabackup/8.0/index.html
#文档地址-2.4https://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 包安装
#下载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 #主程序
1.3.3 xtrabackup 使用
[xtrabackup [--defaults-file=#] --backup | xtrabackup [--defaults-file=#] --prepare] [OPTIONS]
#常用选项#https://docs.percona.com/perconaxtrabackup/8.0/xtrabackup_bin/xbk_option_reference.html-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@rocky86 ~]# mkdir /backup/
#开始备份[root@rocky86 ~]# 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 wordpressxtrabackup_tablespacesbinlog.000007 ibdata1 sys xtrabackup_binlog_infobinlog.index mysql testdb xtrabackup_checkpointsdiscuz mysql.ibd undo_001 xtrabackup_infoeshop performance_schema undo_002 xtrabackup_logfile
#备份时的相关信息[root@rocky86 ~]# cat /backup/base/xtrabackup_infouuid = 00cefafe-8d9a-11ed-a151-000c29b13f86name =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_checkpointsbackup_type = full-backuped #完全备份from_lsn = 0 #备份开始lsn号to_lsn = 223560262 #备份结束lsn号last_lsn = 223560262 #备份结束时最大lsn号flushed_lsn = 223560262 redo_memory = 360redo_frames = 1
#将备份文件CP到远程主机[root@rocky86 ~]# scp -/backup root@10.0.0.164:/root/
在远程主机上还原
#远程主机需要安装相同版本的xtrabackup,相同版本的MySQL
#查看[root@rocky86 ~]# du -sh backup/133M backup/
#执行还原前的整理,将备份时没提交的事务进行回滚[root@rocky86 ~]# xtrabackup --prepare --target-dir=/root/backup/base
#整理后的大小[root@rocky86 ~]# du -sh backup/177M backup/
#mysql服务不能开启,数据目录不能有数据[root@rocky86 ~]# systemctl is-active mysqld.serviceinactive[root@rocky86 ~]# ll /var/lib/mysqltotal 0
#开始还原[root@rocky86 ~]# xtrabackup --copy-back --target-dir=/root/backup/base --datadir=/var/lib/mysql
#修改权限[root@rocky86 ~]# chown -R mysql.mysql /var/lib/mysql/*
#启动MySQL服务查看[root@rocky86 ~]# systemctl start mysqld.service[root@rocky86 ~]# mysql -uuser1 -p123456 -"show databases;"mysql: [WarningUsing 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日志文件的LSNPages 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/base14M /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/base14M /backup/inc114M /backup/inc2
#复制到远程主机[root@rocky86 ~]# scp -r /backup/* root@10.0.0.164:/root/backup/
在远程主机上还原
#查看[root@rocky86 ~]# ls /root/backup/base inc1 inc2
[root@rocky86 ~]# du -sh /root/backup/*133M /root/backup/base14M /root/backup/inc114M /root/backup/inc2
#还原前整理#整理全量备份数据,不回滚[root@rocky86 ~]# xtrabackup --prepare --apply-log-only --targetdir=/root/backup/base
[root@rocky86 ~]# du -sh /root/backup/*153M /root/backup/base #占用空间变大14M /root/backup/inc114M /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/base22M /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/base22M /root/backup/inc146M /root/backup/inc2 #占用空间变大
#停止MySQL服务[root@rocky86 ~]# systemctl stop mysqld.service
#删除数据目录内容[root@rocky86 ~]# rm -rf /var/lib/mysql/*
#还原数据[root@rocky86 ~]# 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      |+----+------+------+--------+
1.3.4.3 xtrabackup 实现单表备份和还原
xtrabackup -uuser1 -p123456 --backup --target-dir=/backup/testdb_t1 --include='testdb.t1'

— END —


-点击下方卡片关注-

点赞、转发、在看!

您的鼓励是对我最大的支持!

优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
联系专属顾问
联系专属顾问
联系专属顾问
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询

和我们在线交谈!