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包[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 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 ~]# 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 = 223560262redo_memory = 360redo_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.serviceinactive[root ~]# ll /var/lib/mysqltotal 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\GLog 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 ~]# 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 ~]# 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 ~]# 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端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、微信小程序定制开发、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)等一系列互联网应用服务。
公安局备案号:

