xtrabackup: MySQL 数据库备份工具

发布时间: 更新时间: 总字数:4788 阅读时间:10m 作者:IP:上海 网址

Percona XtraBackup 是一款开源的热备份工具,适用于基于 MySQL/MariaDB 的服务器,可在计划维护窗口期间保持数据库完全可用。

说明

xtrabackup 会强制备份 ibdata1。这是因为 ibdata1 是 InnoDB 引擎的系统表空间(System Tablespace),它是数据库的核心,包含以下不可或缺的信息:

  • 数据字典(Data Dictionary):记录了所有表的元数据(表结构、ID 等)。如果丢失,InnoDB 根本不知道有哪些表,也就无法识别 .ibd 文件
  • Undo Logs(回滚日志):用于 MVCC(多版本并发控制)和事务回滚。没有它,备份的数据将无法恢复到一致性状态(Consistent Snapshot)
    • 在 MySQL 5.6 及更早版本(以及 5.7 默认配置)中,Undo Log 默认存放在 ibdata1 中
    • ibdata1 文件只增不减。即使长事务结束了,Purge Thread 清理了 Undo Log,ibdata1 里的空间虽然标记为“空闲”,但文件本身的大小不会收缩(不会还给操作系统)
    • MySQL 8.0 (及配置了独立 Undo 表空间的 5.7),MySQL 引入了 Undo Tablespaces (undo_001, undo_002…),Undo Log 不再占用 ibdata1
  • 双写缓冲(Doublewrite Buffer):用于保障数据写入的可靠性

安装

  • Percona XtraBackup 2.4 针对 MySQL 5.7 发行版本
  • Percona XtraBackup 8.0.x 针对 MySQL 8.0.x 发行版本
  • Percona XtraBackup 8.4.x 针对 MySQL 8.4.x 发行版本

参考Debian-based systems

curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo apt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb
sudo apt update
sudo percona-release setup pxb-80
sudo apt install percona-xtrabackup-80

$ xtrabackup --version
xtrabackup version 8.0.35-32 based on MySQL server 8.0.35 Linux (x86_64) (revision id: c339924a)

help

xtrabackup--help ...

支持的压缩算法 lz4、zstsd,使用需要安装对应的工具:

$ sudo apt install lz4
$ sudo apt install zstd

常用命令

  • 备份
# 备份,添加 --slave-info 备份集中会生成一个 xtrabackup_slave_info 文件,该文件记录备份时对应主库的一致性位置点信息
xtrabackup --user=xxx --password=xxx --backup --use-memory=10G \
--slave-info --compress --compress-threads=10 --target-dir=/data/backup、mysql_$(date +%Y%m%d%H%M) 1> backup.log 2> backup.err

# 备份&压缩
xtrabackup --backup --compress --target-dir=/data/compressed/
xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/compressed/
xtrabackup --backup --compress=zstd --target-dir=/data/backup
xtrabackup --backup --compress=zstd --compress-zstd-level=1 -target-dir=/data/backup
xtrabackup --backup --compress=lz4 --target-dir=/data/backup
  • 还原
# 压缩的备份,还原前解压缩命令
xtrabackup --decompress --target-dir=/data/compressed/

# 准备备份:数据文件在准备好之前并不是时间点一致的,因为它们是在程序运行的不同时间复制的,而且在复制的过程中可能会发生变化。如果你试图用这些数据文件启动 InnoDB,它会检测到损坏并自行崩溃,以防止你在损坏的数据上运行。
xtrabackup --prepare --target-dir=/data/compressed/

# 还原备份,还原到服务器的 datadir
xtrabackup --copy-back --target-dir=/data/backups/

# 修改权限
chown -R mysql:mysql /var/lib/mysql

# 启动 MySQL 服务
  • 无压缩
xtrabackup --backup --target-dir=/data/backups/
xtrabackup --prepare --target-dir=/data/backups/
xtrabackup --copy-back --target-dir=/data/backups/
xtrabackup --move-back --target-dir=/data/backups/ # 等价于 rsync -avrP /data/backup/ /var/lib/mysql/
chown -R mysql:mysql /var/lib/mysql

主库发起流备份并通过管道传输到从库解包

# 主库备份
xtrabackup -ubackup -pfanderpassword -H127.0.0.1 -P3306 \
  --backup \
  --stream=xbstream \
  --compress \
  --target-dir=/data/backups/ | ssh root@192.168.0.2 "xbstream -x -C /data/backups/"

# 从库恢复
xtrabackup --decompress --parallel=4 --remove-original --target-dir=/data/backups/

xtrabackup --prepare --use-memory=1GB --target-dir=/data/backups/

xtrabackup --defaults-file=/etc/my.cnf --move-back --parallel=4 --target-dir=/data/backups/

chown -R mysql:mysql /var/lib/mysql/

# 获取 gtid
$ cat ./xtrabackup_info | grep binlog_pos
binlog_pos = filename 'mysql-bin.0000xx', position 'xxx', GTID of the last change 'xxx-xxx-xxx-xxx-xxx:1-xxxx'

# 启动服务,并登录
mysql> reset master;  # 不一定要支持,如果已经有了 gtid 的信息,可以跳过该步骤
mysql> set global gtid_purged="xxx-xxx-xxx-xxx-xxx:1-xxxx"

# 启动主从复制
mysql> CHANGE MASTER TO
        MASTER_HOST='<mysql-master-ip>',
        MASTER_USER='repl',
        MASTER_PASSWORD='xxx',
        MASTER_PORT=3306,
        MASTER_AUTO_POSITION=1;
mysql> start slave;

说明:主库本地备份的路径 /data/backups 不占用 空间

流式备份到 s3

$ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \
xbcloud put --storage=s3 \
--s3-endpoint='s3.amazonaws.com' \
--s3-access-key='YOUR-ACCESSKEYID' \
--s3-secret-key='YOUR-SECRETACCESSKEY' \
--s3-bucket='mysql_backups'
--parallel=10 \
$(date -I)-full_backup

Incremental Backup

  • XtraBackup 的差异备份是基于完整备份的增量备份,只记录自上次完整备份以来发生变化的数据页
    • 差异备份:总是基于完整备份,记录自完整备份以来的所有变化
    • 增量备份:可以基于完整备份或前一个增量备份,只记录自上次备份以来的变化
# 全量备份
$ xtrabackup --backup --target-dir=/data/backups/base

# 增量备份
xtrabackup --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base

xtrabackup --backup --target-dir=/data/backups/inc2 \
--incremental-basedir=/data/backups/inc1

# 还原
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1
xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2

xtrabackup --prepare --target-dir=/data/backups/base
xtrabackup --copy-back --target-dir=/data/backups/base

F&Q

xtrabackup: File ‘/var/lib/mysql/mysql-bin.000005’ not found (OS errno 2 - No such file or directory)

xtrabackup 8.0 之后的版本,需要在命令运行的服务器上能访问对应的目录,如果是通过 docker 容器的 MySQL 服务,建议通过 docker run -v <datadir>//var/lib/mysql/ 将数据目录挂载到容器中

xtrabackup unknown argument: –password

使用问题,通过 xtrabackup --password="xxx" 的形式使用

本文总阅读量 次 本站总访问量 次 本站总访客数