MySQL备份工具Percona XtraBackup

1 Percona XtraBackup介绍

Percona XtraBackup是一个开源的MySQL热备份实用工具,用于执行MySQL的InnoDB和XtraDB数据库的非阻塞备份。

无论是24x7高负载服务器还是低事务量环境,Percona XtraBackup都能高效地进行热备份,而不会影响业务可用性和占用过多的数据库资源以及服务器性能。

Percona XtraBackup有以下优势:

  • 免费和开源;
  • 备份效率高,十分安全可靠;
  • 备份不会阻塞事务;
  • 不会占用过多的磁盘空间和网络带宽(可压缩);
  • 自动备份验证;
  • 恢复时间快
  • 支持流、压缩和增量MySQL备份。

官方参考文档:https://docs.percona.com/percona-xtrabackup/8.0/about-xtrabackup.html

2 安装Percona XtraBackup

注意:下载前先确认自己的服务器和数据库的版本信息,根据实际情况下载相应的版本。

手动下载地址:https://www.percona.com/downloads

image.png

2.1 rpm包安装方式

一、使用YUM下载方式,下载RPM包

[root@mysql001 xtrabackup]$ sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

二、启用percona库

[mysql@mysql001 ~]$ sudo percona-release enable-only tools release

三、依赖包下载

[mysql@mysql001 ~]$ sudo yum install lz4 zstd

三、安装

[mysql@mysql001 ~]$ sudo yum install percona-xtrabackup-80

四、检查

[mysql@mysql001 ~]$ xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/disk1/data --log_bin=/disk1/data/binlog/binlog --innodb_log_file_size=100M
xtrabackup version 8.0.22-15 based on MySQL server 8.0.22 Linux (x86_64) (revision id: fea8a0e)

四、卸载

如果版本不可用,需要卸载重装,卸载脚本如下:

[mysql@mysql001 ~]$ yum list | grep percona
[mysql@mysql001 ~]$ yum remove percona-xtrabackup-80.x86_64

2.2 tar包安装

tar包下载要选择的服务器版本是LINUX-GENERIC:

image.png
#解压:
[mysql@mysql001 xtrabackup]$ tar xvf percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17-minimal.tar.gz

#简化路径:
[mysql@mysql001 xtrabackup]$ mv percona-xtrabackup-8.0.34-29-Linux-x86_64.glibc2.17-minimal xtrabackup
[mysql@mysql001 xtrabackup]$ cd xtrabackup

#安装依赖包:
[mysql@mysql001 xtrabackup]$ sudo yum install -y perl-Digest-MD5 perl-DBD-MySQL libev

#bin目录,可执行文件
[mysql@mysql001 bin]$ cd /home/mysql/tools/xtrabackup/xtrabackup/bin/
[mysql@mysql001 bin]$ pwd
/home/mysql/tools/xtrabackup/xtrabackup/bin

#添加环境变量
[mysql@mysql001 bin]$ sudo vim /etc/profile
添加:
export XTRABACKUP_HOME=/home/mysql/tools/xtrabackup/xtrabackup
export PATH=$PATH:$HOME/bin:$XTRABACKUP_HOME/bin

#环境变量生效
[mysql@mysql001 bin]$ source /etc/profile

#检查,包含版本号、数据路径等信息
[mysql@mysql001 ~]$ xtrabackup --version
2024-01-04T01:31:22.623365+08:00 0 [Note] [MY-011825] [Xtrabackup] recognized server arguments: --datadir=/disk1/data --log_bin=/disk1/data/binlog/binlog --innodb_log_file_size=100M
xtrabackup version 8.0.34-29 based on MySQL server 8.0.34 Linux (x86_64) (revision id: 5ba706ee)

3 使用Percona XtraBackup

XtraBackup的备份恢复过程可以分为备份、准备(prepare)和恢复(restore)三个阶段。

在备份阶段,XtraBackup会复制InnoDB的数据文件,同时记录redo日志的变化。这个过程分为两个阶段,首先是备份redo日志文件,然后是复制InnoDB的数据文件。在备份数据文件时,XtraBackup会检测每个表空间中每个页的LSN(Log Sequence Number),如果LSN大于上次备份时的LSN,则备份该页。同时,XtraBackup还会记录当前检查点的LSN,以确保只备份自上次备份以来发生更改的数据页。

在准备阶段,XtraBackup的主要工作是通过回滚未提交的事务及同步已经提交的事务至数据文件来使数据文件达到一致性状态。这个过程类似于InnoDB的实例恢复。

在恢复阶段,XtraBackup会启动一个内嵌的InnoDB实例,然后回放xtrabackup日志(xtrabackup_log),将提交的事务信息变更应用到InnoDB数据/表空间,同时回滚未提交的事务。

3.1 备份

全量备份

[mysql@mysql001 full]$ xtrabackup --user=root --password=Mysql123. --backup --parallel=8 --target-dir=/disk1/bak/full

[mysql@mysql001 full]$ ls /disk1/bak/full/
backup-my.cnf  binlog.index    ibdata1  mysql.ibd           sakila  undo_001  xtrabackup_binlog_info  xtrabackup_info     xtrabackup_tablespaces
binlog.000045  ib_buffer_pool  mysql    performance_schema  sys     undo_002  xtrabackup_checkpoints  xtrabackup_logfile

增量备份

一、在上面"--target-dir=/disk1/bak/full"全量备份的基础上进行增量备份:

[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --backup --parallel=8 --target-dir=/disk1/bak/inc --incremental-basedir=/disk1/bak/full

[mysql@mysql001 inc]$ ls /disk1/bak/inc/
backup-my.cnf  ib_buffer_pool  mysql            performance_schema  undo_001.delta  undo_002.meta           xtrabackup_info
binlog.000046  ibdata1.delta   mysql.ibd.delta  sakila              undo_001.meta   xtrabackup_binlog_info  xtrabackup_logfile
binlog.index   ibdata1.meta    mysql.ibd.meta   sys                 undo_002.delta  xtrabackup_checkpoints  xtrabackup_tablespaces

以delta结尾的文件,是记录原文件变化的数据。

二、在上面"--target-dir=/disk1/bak/inc --incremental-basedir=/disk1/bak/full"增量备份的基础上再进行增量备份:

[mysql@mysql001 inc1]$ xtrabackup --user=root --password=Mysql123. --backup --parallel=8 --target-dir=/disk1/bak/inc1 --incremental-basedir=/disk1/bak/inc

[mysql@mysql001 inc1]$ ls /disk1/bak/inc1
backup-my.cnf  ib_buffer_pool  mysql            performance_schema  test            undo_002.delta          xtrabackup_checkpoints  xtrabackup_tablespaces
binlog.000047  ibdata1.delta   mysql.ibd.delta  sakila              undo_001.delta  undo_002.meta           xtrabackup_info
binlog.index   ibdata1.meta    mysql.ibd.meta   sys                 undo_001.meta   xtrabackup_binlog_info  xtrabackup_logfile

压缩备份

[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --backup --compress --compress-threads=4 --target-dir=/disk1/bak/compressed

部分备份

可以单独备份表或数据库。

如果只备份sakila数据库中的表,使用如下命令:

#备份sakila所有的表
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --backup --datadir=/disk1/data/ --target-dir=/disk1/bak/part/tab --tables="^sakila[.].*"

#只备份sakila的actor表
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --backup --datadir=/disk1/data/ --target-dir=/disk1/bak/part/tab --tables="^sakila[.]actor"

只备份某些个数据库:

#备份sakila performance_schema information_schema sys mysql
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --backup --target-dir=/disk1/bak/part/db --databases='sakila performance_schema information_schema sys mysql'

3.2 准备

准备全量备份

在全量备份的准备中,为了使数据库保持一致性,将进行以下操作:

  • 根据数据文件从日志文件重放已提交的事务;
  • 回滚未提交的事务。
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --target-dir=/disk1/bak/full

准备增量备份

准备增量备份和准备全量备份不一样,不会执行如全量备份操作时回滚未提交的事务,因为在增量备份时未提交的事务可能正在进行中,它们很可能会在下一个增量备份中提交了。

所以在准备增量备份时,必须跳过未提交事务的回滚,使用 --apply-log-only 选项来阻止回滚操作。

应用全量备份的第一个增量备份准备:

[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --apply-log-only --target-dir=/disk1/bak/full

[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --apply-log-only --target-dir=/disk1/bak/full --incremental-dir=/disk1/bak/inc

原理是,将增量文件应用于/disk1/bak/full中的文件,令它们向前滚到增量备份的时间,对结果应用重做日志。最终数据在/data/backups/base目录下,而不是增量目录下。

同理,应用全量备份的第二个增量备份准备:

[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --parallel=8 --apply-log-only --target-dir=/disk1/bak/full --incremental-dir=/disk1/bak/inc1

第三个。。。

在做最后一个增量备份准备时,不需要再使用 --apply-log-only,因为此时需要将未提交的事务回滚。

注意:如果不使用 --apply-log-only 选项执行准备,那么增量备份将是无用的,不能使用此备份进行恢复。

准备压缩备份

#decompress
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --decompress --target-dir=/disk1/bak/compressed

#prepare
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --target-dir=/data/compressed/

准备部分备份

[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --prepare --export --target-dir=/disk1/bak/part/db

3.3 恢复

要执行恢复备份,必须满足以下条件:

  1. 备份集要完成准备
  2. 数据目录datadir必须为空
  3. 不能恢复到正在运行的mysqld实例的数据目录(除非导入部分备份),在执行恢复之前需要关闭MySQL服务器

完成以上步骤后,就可以对全量备份、增量备份和压缩备份进行恢复:

[mysql@mysql001 disk1]$ sudo systemctl stop mysqld
[mysql@mysql001 disk1]$ systemctl status mysqld
[mysql@mysql001 bak]$ xtrabackup --user=root --password=Mysql123. --copy-back --target-dir=/disk1/bak/full

3.4 报错处理

报错信息如下:

[ERROR] [MY-011825] [Xtrabackup] Failed to connect to MySQL server: Can't connect to local MySQL server through socket

原因是在localhost连接Mysql服务时,会优先使用sock文件进行连接,而不是使用IP端口进行连接。

所以当可执行文件xtrabackup尝试使用sock文件进行连接时,无法获取sock文件的位置。

解决办法是给XtraBackup命令指定socket路径:

#添加
[mysql@mysql001 ~]$ sudo vim /etc/my.cnf
添加:
[xtrabackup]
socket=/var/lib/mysql/mysql.sock

添加的这个路径和[mysqld]中的保持一致。

#重启
[mysql@mysql001 ~]$ sudo systemctl restart mysqld
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容