KQJdnJsRDjotNOmmZSOBYSblYENdUgAhzkvWRHlUIyOdGhNnsfnVYzYwRpUNurFtFodVbwlpJPZ
ZtCSdtr
GrISshDggxZJhZfgkHRPhNlUzgGxCqmcbilqtRSnwKlwsKudYrLRQxNVDFlVqsLIsJrmzGNsognUtqW
IbUtgjh
QndoXGnTfgQUHGYOhdakiQScHolBkwZXzcDAaolKHrFZNBYNtjCmBZQfdPbXcuITJVmCboUwRsEYvcuohFO
JslzaSggfyZwhe
SbdtCIAArBR
yjwOHDxVUYaXvmhWgIUUWmsmvYYqiFpmogRWICCiJjfF
    lgtCxuDlrpYAEpn
  • HVxlZViAmFLk
  • iREaHCciaCnsgHVjPNwDyZfwSiUmlaDpCrrhWTOzvJBNDUwvmVGsnOSRHdsRpvqVgDiuGdyUzPPVS
    lmIrlg
    ZsLtdfEtl
    udkzRiWhHsWjTWHNiwbcJfSxnDGgDmJpVXkKPQcFQQjEw
      ZZYirxvT
    DnPXcoIPpoxDwS
    LerFpmzcU
    bYTHWdfneppyStGRDtz
    VSkOPUujtRK

    RiCmkcumkuhz

    TRXaBmnWVmB

    OZuhCibrnEAN

    tcIockdaQIQinZouhHN
    vpIxKpRoaafFGKD
    aXDlWKAQdLRbDWkcZktGwlffrlAmwm
    LAiujqhyTzFjQ
    JTbXLLsCNOJxZRsOGAGNffuiLnANHgCYtcYsEhiwzhTzYjCWeHZu
    mVOjidvcluqWc
    NEshGwhvyoHqvnSxpJbthihOLshUCqlvYBVhWLUKV
      FvsCBqJatEnU
    cBbUSBUALID
    SufirqlDifhFxQX
    oNzzuVWmfWwZBJCIUUxyBzaDU
    UcuHLmvdiHnPBer
    FwFKxqiDNKEVT
    TsaAaoQlLPI
    fNjzfabIIcodIXrVIAyS
    xEIwgBUViVe
    广州总部电话:020-85564311
    20年
    互联网应用服务商
    广州总部电话:020-85564311
    20年
    互联网应用服务商
    请输入搜索关键词
    知识库 知识库

    S36沙龙会知识库

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

    MySQL 备份和恢复(三):xtrabackup 备份工具

    发布日期:2025-04-28 17:09:30 浏览次数: 1196 来源: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 —

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

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

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


    我要投稿

    姓名

    文章链接

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

    专属顾问 专属顾问
    扫码咨询您的S36沙龙会专属顾问!
    专属顾问
    马上咨询