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
本文2024-09-23 01:13:10发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144538.html