MySQL物理备份之xtrabackup

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

MySQL物理备份之xtrabackup

1 简要

随着计算机网络的飞速发展,信息安全的重要性日趋明显,但是,数据备份作为信息安全的一个重要内容,其重要性却往往被人们所忽视。只要发生数据传输、数据存储、数据交换、软件故障、硬盘坏道等等,就有可能产生数据故障。这时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,没有数据就没有了一切,数据备份就是一种防范灾难于未然的强力手段。企业应当把企业数据备份的工作列为一项不可忽视的系统工作,为其选择响应的备份设备和技术,进行经济可靠的数据备份,提高系统的高可用性和灾难可恢复性,从而避免可能发生的重大损失。


2 MySQL备份方案

类别

备份周期

备份保留策略

备份工具

恢复方式

灾备策略

MySQL

数据库

每周全备+每天增备+实时binlog日志

至少保留一个月的完整备份

xtrabackup+rsync

xtrabackup+mysqlbinlog

本机+异机


3 备份工具安装

3.1 xtrabackup工具安装

Xtrabackup工具官网下载地址:https://www.percona.com/downloads

可根据实际情况下载对应版本


下载后解压到/usr/local目录下,并重命名为xtrabackup目录

# tar -xf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17.tar.gz -C /usr/local

# mv /usr/local/ percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17 /usr/local/xtrabackup

 

添加命令路径到/etc/profile中

# echo "export PATH=\$PATH:/usr/local/xtrabackup/bin" >>/etc/profile

# source /etc/profile

# which xtrabackup

# xtrabackup --version

3.2 xtrabackup常用参数

参数

说明

--defaults-file

指定配置文件:只能从给定的文件中读取默认选项。   且必须作为命令行上的第一个选项;必须是一个真实的文件,它不能是一个符号链接

--databases

指定备份的数据库和表,格式为:--database=“db1[.tb1]   db2[.tb2]” 多个库之间以空格隔开,如果此选项不被指定,将会备份所有的数据库。

--include

用正则表达式的方式指定要备份的数据库和表,格式为   --include='^mydb[.]mytb' ,对每个库中的每个表逐一匹配,因此会创建所有的库,不过是空的目录

--host

该选项表示备份的数据库地址,如果备份的是本机,可省略

--user

该选项表示备份的账号

--password

该选项表示备份的密码。

--port

该选项表示备份的端口号,如果端口号为默认的3306,可省略

--stream

开启流式压缩

--compress

此选项指示xtrabackup压缩备份的InnoDB数据文件,会生成 *.qp 文件,需要安装qpress工具

官方推荐lz4或者zstd格式,--compress=lz4

--decompress

解压缩qp文件,为了解压缩,必须安装 qpress 工具。 Percona XtraBackup不会自动删除压缩文件,为了清理备份目录,用户应手动删除 * .qp文件:find /data/backup -name “*.qp” | xargs   rm。

--parallel

此选项接受一个整数参数,指定xtrabackup子进程应用于同时备份文件的线程数。请注意,此选项仅适用于文件级别,也就是说,如果您有多个.ibd文件,则它们将被并行复制; 如果表一起存储在一个表空间文件中,它将不起作用。

--target-dir

指定目的目录

--incremental

这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。它传递到   xtrabackup 子进程。当指定这个选项,可以设置 --incremental-lsn 或 --incremental-basedir。如果这2个选项都没有被指定,--incremental-basedir 传递给 xtrabackup 默认值,默认值为:基础备份目录的第一个时间戳备份目录

--incremental-basedir

该选项接受一个字符串参数,该参数指定作为增量备份的基本数据集的完整备份目录。它与 --incremental 一起使用

--incremental-dir

该选项接受一个字符串参数,该参数指定了增量备份将与完整备份相结合的目录,以便进行新的完整备份。它与 --incremental 选项一起使用

--prepare

准备一个备份用于恢复

--apply-log-only

这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要

--copy-back

拷贝先前备份所有文件到它们的原始路径。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项。

 注:此文以MySQL8.0.26版本、xtrabackup8.0.26版本为例


3.3 备份命令参考

全量备份

# xtrabackup --defaults-file=数据库my.cnf配置文件绝对路径 --host=备份主机 --user=用户名 --password=密码 --no-lock --backup --compress=lz4 --target-dir=全备备份路径

 

增量备份

# xtrabackup --defaults-file=数据库my.cnf配置文件绝对路径 --user=用户名 --password=密码 --no-lock --backup --compress=lz4 --target-dir=增量备份路径 --incremental-basedir=上一次的备份路径

注:--incremental-basedir 首次增量备份,就指定全量备份路径。如果是第二次增量备份,就指定第一次增量备份路径。

Tips:如果是数据量过大,可以添--compass参数进行压缩,但是还原时需要手动解压

 

3.4 恢复命令参考

(1)清空需要还原的数据路径和binlog路径

(2)如有压缩备份,请先解压缩备份目录(包括全备和增量):xtrabackup --parallel=4 --decompress --remove-original --target-dir=全量/增量备份路径

(3)应用全量备份:#xtrabackup --no-server-version-check --prepare --apply-log-only --host=恢复主机 --user=用户名 --password=密码  --port=端口 --target-dir=全量备份路径

(4)应用增量备份:xtrabackup --no-server-version-check --prepare --apply-log-only --host=恢复主机 --user=用户名 --password=密码  --port=端口 --target-dir=全量备份路径 --incremental-dir=增量备份路径

注:多份增量备份,请按照备份的先后顺序依次还原

(5)拷贝数据文件:xtrabackup --no-server-version-check --copy-back --host=恢复主机 --user=用户名 --password=密码  --port=端口 --target-dir=全量备份路径

(6)修改数据库目录权限: chown mysql. -R 数据库目录 和 binlog目录

(7)启动mysql服务

 

mysqlbinlog

mysqlbinlog能够解析binlog文件,可以用于恢复在备份点之后的实时数据

解析binlog文件: mysqlbinlog --start-position=起始位点 --stop-position=结束位点 binlog文件 >解析的文件名.sql

注:结束位点不指定的话,即从起始位点到整个binlog文件

导入实时数据:mysql  -h  数据库主机 -u 用户名 -P 端口 < 解析的文件名.sql


4 备份测试

测试备份过程:插入数据01-->全量备份-->插入数据02-->第一次增量备份-->插入数据03-->第二次增量备份-->插入数据04-->备份binlog-->模拟宕机


(1)第一次插入10000行数据:


(2)全量备份:

# mkdir -p /var/kingdee/cosmic/mysql/backup/20230301/full

# xtrabackup --defaults-file=/var/kingdee/cosmic/mysql/mysql3306/etc/my.cnf --user=cosmic --password=Cosmic@2020 --no-lock --backup --compress=lz4 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full

 

(3)第二次插入10000行数据


(4)第一次增量备份

# mkdir -p /var/kingdee/cosmic/mysql/backup/20230301/incr01

# xtrabackup --defaults-file=/var/kingdee/cosmic/mysql/mysql3306/etc/my.cnf --user=cosmic --password=Cosmic@2020 --no-lock --backup --compress=lz4 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr01 --incremental-basedir /var/kingdee/cosmic/mysql/backup/20230301/full


(5)第三次插入10000行数据


(6)第二次增量备份

# mkdir -p /var/kingdee/cosmic/mysql/backup/20230301/incr02

# xtrabackup --defaults-file=/var/kingdee/cosmic/mysql/mysql3306/etc/my.cnf --user=cosmic --password=Cosmic@2020 --no-lock --backup --compress=lz4 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr02 --incremental-basedir /var/kingdee/cosmic/mysql/backup/20230301/incr01


(7)第四次插入10000行数据


(8)再备份一次binlog

切换一次binlog文件

# flush logs

 

备份binlog文件

# rsync -ravzP --delete /var/kingdee/cosmic/mysql/mysql3306/log/binlog/* /var/kingdee/cosmic/mysql/backup/binlog_backup


5 恢复测试

5.1 模拟数据库宕机

注:请勿在正常使用的生产环境上操作

# systemctl stop mysqld

清理数据文件和日志文件(清理前请备份好binlog日志文件)

# rm -rf mysql3306/data/mysqldata/*

# rm -rf mysql3306/log/binlog/*


5.2 还原实时数据

还原过程:使用全量备份+第一份增量备份+第二份增量备份+第n份增量备份+实时binlog进行还原

(1)如压缩备份,请先解压缩备份目录

解压全备文件:# xtrabackup --parallel=4 --decompress --remove-original --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full

解压第一份增量备份文件# xtrabackup --parallel=4 --decompress --remove-original --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr01

解压第二份增量备份文件# xtrabackup --parallel=4 --decompress --remove-original --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr02

解压第n份增量备份文件# xtrabackup --parallel=4 --decompress --remove-original --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr0n


(2)应用全备日志

# xtrabackup --no-server-version-check --prepare --apply-log-only --host=127.0.0.1 --user=cosmic --password=Cosmic@2020 --port=3306 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full

 

(3)应用第一份增量备份日志

# xtrabackup --no-server-version-check --prepare --apply-log-only --host=127.0.0.1 --user=cosmic --password=Cosmic@2020 --port=3306 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full --incremental-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr01

 

(4)应用第二份增量备份日志

# xtrabackup --no-server-version-check --prepare --apply-log-only --host=127.0.0.1 --user=cosmic --password=Cosmic@2020 --port=3306 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full --incremental-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr02

 

(5)应用第n份增量备份日志,(有多份增量依次应用即可)

# xtrabackup --no-server-version-check --prepare --apply-log-only --host=127.0.0.1 --user=cosmic --password=Cosmic@2020 --port=3306 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full --incremental-dir=/var/kingdee/cosmic/mysql/backup/20230301/incr0n

 

(6)拷贝数据文件到数据目录

# xtrabackup --no-server-version-check --copy-back --host=127.0.0.1 --user=cosmic --password=Cosmic@2020 --port=3306 --target-dir=/var/kingdee/cosmic/mysql/backup/20230301/full

 

(7)修改数据目录权限

# chown mysql. -R mysql3306/

 

(8)启动数据库

# systemctl start mysqld

 

(9)查看最后一次增量备份的信息,查到binlog文件和位点号


(10)查看备份的binlog文件,来决定需要还原的binlog


结合最后一次增量备份信息和备份的binlog可知,如上我们需要还原的数据有 mysql_bin_30001.000007的196位点开始一直到mysql_bin_30001.000009的binlog文件。

 

(10)依次将binlog文件解析成sql文件

# mysqlbinlog --start-position=196  ../../binlog_backup/mysql_bin_30001.000007 > incr-mysql_bin_30001.000007.sql

# mysqlbinlog --start-position=1  ../../binlog_backup/mysql_bin_30001.000008 > incr-mysql_bin_30001.000008.sql

# mysqlbinlog --start-position=1  ../../binlog_backup/mysql_bin_30001.000009 > incr-mysql_bin_30001.000009.sql

 

(11)依次导入sql文件

# mysql -ucosmic -pCosmic@2020 -h127.0.0.1 < incr-mysql_bin_30001.000007.sql

# mysql -ucosmic -pCosmic@2020 -h127.0.0.1 < incr-mysql_bin_30001.000008.sql

# mysql -ucosmic -pCosmic@2020 -h127.0.0.1 < incr-mysql_bin_30001.000009.sql

 

(12)查看数据,还原到停数据库前的实时数据


5.3 基于时间点还原

(1)根据实际情况确定需要还原的时间点,例如”2023-03-01 11:51:14”

 

(2)从增量备份的信息可以得知还原的时间点在哪个增量备份区间,下图可知还原点是在第二次增量备份之后,也就是mysql_bin_30001.000007之后的binlog中记录

可以看到是开始还原点的binlog文件为:mysql_bin_30001.000007,位点为196

 

(3)使用mysqlbinlog解析binlog,然后通过过滤来 定位还原点的binlog文件和end_log_pos号

可以查到结束还原点的binlog文件为:mysql_bin_30001.000008 ,位点为:7565

 

(4)开始还原全备和增量备份

应用全量备份日志、应用增量备份日志的步骤参考上文

全量和增量还原、授权文件后,就可以启动数据库

 

(5)依次解析需要还原的binlog文件为sql文件

# mysqlbinlog --start-position=196  ../../binlog_backup/mysql_bin_30001.000007 > incr-mysql_bin_30001.000007.sql

# mysqlbinlog --start-position=1 --stop-position=7565  ../../binlog_backup/mysql_bin_30001.000008 > incr-mysql_bin_30001.000008-pos7565.sql

 

(6)依次导入sql文件

# mysql -ucosmic -pCosmic@2020 -h127.0.0.1 < incr-mysql_bin_30001.000007.sql

# mysql -ucosmic -pCosmic@2020 -h127.0.0.1 < incr-mysql_bin_30001.000008-pos7565.sql

 

(7)查看数据

至此,基于时间点的数据就已经还原完成了。

MySQL物理备份之xtrabackup

1 简要随着计算机网络的飞速发展,信息安全的重要性日趋明显,但是,数据备份作为信息安全的一个重要内容,其重要性却往往被人们所忽视。...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息