数据备份与恢复--MySQL--XtraBackup
在进行性能测试、操作数据的过程中可能会出现数据错误,甚至数据库崩溃的情况,而有效的定时备份能很好地保护数据库。
但MySQL备份工具种类繁多,如何在这些繁杂的工具中找到一款适合自己的呢?
想知道答案的话,就跟随小编往下看吧!
1 MySQL数据备份策略
首先,让我们了解下MySQL数据备份策略。常见的MySQL数据备份策略有以下三种:
1. 直接拷贝数据库文件(文件系统备份工具CP):适合小型数据库,是最可靠的。
2. 利用mysqldump(单线程)/mysqlpump(多线程)/mysqldumper(多线程)备份数据库(完全备份+增加备份):备份数据速度相对较慢,适合中小型数据库。
3. 利用XtraBackup(免费)/innobackup(收费)/mysqlbackup(收费)备份数据库:从物理角度实现几乎热备的完全备份,配合二进制日志备份实现增量备份,适合业务比较繁忙的大型数据库。
在性能测试过程中,随着性能测试种类(负载测试、压力测试、并发测试、可靠性测试…)及场景的不断增加,数据量也在不断倍增,mysqldumper在大数据量面前已经显得捉襟见肘。
因此,对于数据库十分庞大的苍穹系统而言,采取第三种数据备份策略更为合适。但具体应选择哪一款备份工具呢?XtraBackup是一款又快又好用且零成本的备份工具,可满足苍穹系统。
接下来,小编就为大家详细讲解如何利用XtraBackup对MySQL数据进行备份与还原。
注:后续讲解均基于MySQL5.x版本。
2 数据备份类型
在讲解具体的备份与还原步骤前,我们有必要先了解下备份类型。
备份类型主要分为热备与冷备两种:
1)热备:在线备份,在数据库节点不停机的状态下执行的备份。
热备存在的问题:数据库备份的时候会全局加读锁,备份期间节点只能读取数据不能写入数据。
热备原理示例
2)冷备:需要停机,在数据库已经关闭的情况下对数据进行备份。
冷备存在的问题:
数据库必须停机备份;
备份的文件非常占用存储空间,不支持增量备份;
冷备的是所有数据文件和日志文件,所以无法按照逻辑库和数据表恢复数据。
冷备原理示例
注:
从另外一个维度出发,数据备份可分为逻辑备份及物理备份,如下所示:
逻辑备份与物理备份区别
3 XtraBackup工具简介
XtraBackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具,具有开源、免费、支持在线热备、备份恢复速度快、占用磁盘空间小等特点,并且支持不同情况下的多种备份形式。
XtraBackup的官方下载地址如下:
http://www.percona.com/software/percona-xtrabackup。
XtraBackup包含两个主要的工具,即xtrabackup和innobackupex。
3.1 优势
1. 备份过程中加读锁,数据可读,但是不可写;
2. 备份过程不会打断正在执行的事务;
3. 能够基于压缩等功能节约磁盘空间和流量。
3.2 原理
1. 物理备份工具,通过协议链接到MySQL服务端,然后读取并复制底层的文件,完成物理备份。
XtraBackup备份原理示例
2. 支持对InnoDB引擎做全量备份和增量备份,但对MyISAM引擎只能做全量备份。
XtraBackup全量备份原理示例
增量备份的过程主要是通过拷贝innodb中有变更的“页”,这些变更的数据页指的是“页”的LSN(Log Sequence Number,日志序列号)大于xtrabackup_checkpoints中给定的LSN。
XtraBackup增量备份原理示例
当数据库执行了delete、update、insert操作,LSN变大,备份工具会识别这个最大号备份,从而执行增量备份。
3.3 安装方法
利用Centos7安装XtraBackup,具体方法如下:
软件包下载:
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.24/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
软件包安装:
yum install -y percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
XtraBackup安装示例
3.4 常用命令
XtraBackup常用命令
小知识:
1. Xbstream创建压缩文件和写入压缩包有2次IO操作,而使用流式压缩不需要创建硬盘文件,直接创建压缩文件,只有1次IO操作。
备份和压缩文件原理示例
2. XtraBackup无法备份MyISAM引擎,且只能备份数据文件,无法备份结构文件 。
3. innobackupex支持备份数据文件、结构文件和索引文件,同时也支持备份MyISAM引擎,但只能全量备份不能增量备份,而备份inNoDB引擎则支持全量和增量备份。
虽然目前一般不用MyISAM表,但是MySQL库下的系统表是MyISAM,因此备份基本都是通过innobackupex命令进行。
3.5 备份流程
XtraBackup的备份流程如下所示:
XtraBackup备份流程图
4 XtraBackup备份与还原详解
4.1 全量备份
全量备份是备份全部数据。备份过程时间长,占用空间大。
备份命令如下:
innobackupex --defaults-file=/etc/my.cnf --host=192.168.99.151 --user=admin --password=admin --port=3306 -S /var/lib/mysql/mysql.sock --compress --compress-threads=8 --compress-chunk-size=4G --parallel=4 --stream=xbstream ./ >/home/demo1.xbstream
命令解析如下:
--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行的第一个选项位置。
--host:该选项表示备份的数据库地址,如果备份的是本机,可省略。
--user:该选线表示备份的账号。
--password:该选项表示备份的密码。
--port:该选线表示备份的端口号,如果端口号为默认的3306,可省略。
--stream:开启流式压缩。
--compress:开启压缩。
--compress-threads=8:使用8个线程做压缩,默认使用4个线程。
--compress-chunk-size:压缩线程的缓存,机器内存够大可以配置大一些。
--parallel=4:备份线程数4个,默认使用4个。
-S:备份数据库启动的sock。
./:表示备份当前数据库所有内容。
--databases:该选项接收的参数为数据库名,如果要指定多个数据库,彼此间需要用空格隔开,例:xtra_test dba_test。该选项对innodb引擎表无效,还是会备份所有的innodb表。例子:mysqldatabase.tablebos。
--include:需要备份的数据表的正则表达式。
查看备份结果,如下图所示:
备份结果示例
查看备份目录,如下图所示:
备份目录示例
小知识:
1. 不建议使用远程备份,远程备份有大量IO操作及网络传输,且需要查找本地MySQL数据目录,软件也不支持断点续传。
2. 推荐使用流式备份--stream=xbstream,例如:500GB的数据文件耗时80分钟压缩之后,文件大小为170GB,而流式备份耗时40分钟即可将文件大小压缩至46GB,无论是时间还是空间,流式备份的优势明显。
3. 可以指定数据库备份,但是不建议这么做,备份完整的库,能够避免恢复时出现意料之外的问题。
4. MySQL备份文件包含:数据文件、日志文件(事务日志、二进制日志)、存储过程、存储函数、触发器、配置文件。
4.2 增量备份
增量备份只备份变化的那部分数据,备份时间短,占用空间小。
增量备份原理示例
注:增量备份前提是必须先做一轮全量备份。
增量备份命令:
Innobackupex --defaults-file=/etc/my.cnf --host=192.168.0.100 --user=admin --password=admin --port=3306 --incremental-basedir=/home/backup/2021-09-17_22-30-52 --compress --compress-thread=8 --stream=xbtream --incremental /home/backup/increment
命令解析:
--incremental-basedir:全量备份路径,如第二次增量,填写第一次增量路径。
--incremental:增量备份路径,如第二次增量,填写第二次增量备份路径。
注意事项:
无论全量热备份使用了流式压缩,还是内容加密,都必须解密、解压缩成普通全量热备份。
增量热备份可以使用流式压缩或者内容加密。
增量备份不单只备份数据文件,还备份日志。
4.3 全量还原
全量还原的具体步骤如下:
步骤一: 删除数据库,然后恢复全备,命令如下:
mysql> drop database XXX_database;Query OK, 1 row affected (0.04 sec)
步骤二:关闭MySQL数据库,命令如下:
[root@MySQL-PerTest]# /etc/init.d/mysqld stopShutting down MySQL.....
步骤三:处理压缩文件及日志。
1)解压流式压缩文件,命令如下:
xbstream -x<backup.xbstream //解压backup.xbstream生成的文件
解压结果示例
在使用XtraBackup备份时使用了--compress,则在恢复时需要使用qpress命令解压后缀名为qp的文件,命令如下:
for f in `find ./ -iname "*\.qp"`; do qpress -dT4 $f $(dirname $f) && rm -rf $f;done
2)处理日志。XtraBackup备份的时候不锁表,如果备份时,有些事务正在执行,先处理事务日志:没有提交的进行回滚,已提交的还没写入的,则同步至事务日志。命令如下:
innobackupex --apply-log -redo-only /home/backup/2021-09-17_22_30_50 innobackupex --apply-log -redo-only /home/backup/2021-09-17_22_30_50 --incremental-dir=/home/backup/2021-09-23_22_30_59 innobackupex --apply-log -redo-only /home/backup/2021-09-17_22_30_50 --incremental-dir=/home/backup/2021-09-30_23_22_32
步骤四:执行还原。
1)将备份数据复制到新的数据文件目录下,命令如下:
[root@MySQL-01 ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /全量备份文件路径地址/ innobackupex: Starting to copy InnoDB log files innobackupex: in '/data/backup/2021-11-03_23-05-04' innobackupex: back to original InnoDB log directory '/data/mysql' innobackupex: Copying '/data/backup/2021-11-03_22-03-04/ib_logfile1' to '/data/mysql/ib_logfile1' innobackupex: Copying '/data/backup/2021-11-03_22-03-04/ib_logfile0' to '/data/mysql/ib_logfile0' innobackupex: Finished copying back files. 170507 22:27:38 innobackupex: completed OK!
2)修改权限,命令如下:
[root@MySQL-01 ~]# chown -R mysql.mysql /data/mysql //启动数据库 [root@MySQL-01 ~]# /etc/init.d/mysqld start Starting MySQL.................
4.4 增量还原
增量备份只备份更新的数据,但是还原的时候,数据库备份的数据和还原的数据相差较大,XtraBackup无法感知哪些数据需要还原,哪些不需要还原。对此,最简单粗暴的处理方式为:把增量同步到全量里,用全量的数据去还原。
具体而言,先处理全量备份的日志,再处理增量备份中的事务日志,把第一次增量备份的数据同步到全量备份中去。
处理备份日志流程示例
如选择还原第二次增量,则把第二次增量备份的数据同步到第一次增量数据中去。
选择增量备份还原点示例
处理压缩文件及日志的具体步骤同全量还原的步骤三。
接着,关闭数据库并删除数据库数据文件,命令如下:
service mysqld_3308 stop rm -rf /var/data/mysql3308/data/*
最后,执行还原,命令如下:
innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/2021-10-07_22_23_56
选项说明如下:
--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir目录;
--move-back:这个选项与--copy-back相似,唯一的区别是它不是拷贝文件,而是移动文件到目的地。这个选项移除backup文件,必须谨慎使用。
还原注意事项:
1. datadir目录必须为空,除非指定innobackupex --force-non-empty-directorires选项,否则--copy-backup选项不会覆盖;
2. 在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中;
3. 由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属性主改为mysql(chown -R mysql:mysql /data/mysql),这些文件将属于创建备份的用户。
5 划重点
全量备份:
1) 利用 innobackupex 进行全量备份,并指定备份目录路径;
2) 在还原前,需要使用 --apply-log 参数先进行合并数据文件,确保数据的一致性要求。
增量备份:
1) 增量备份需要使用参数 --incremental 指定需要备份到哪个目录,使用 incremental-dir 指定全备目录;
2) 进行数据备份时,需要先使用参数 --apply-log redo-only 合并全备目录数据,确保全备目录数据的一致性;再将增量备份数据使用参数 --incremental-dir 合并到全备数据当中;最后通过最新的全备数据进行恢复数据。
如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。
#往期推荐#
更多精彩内容,“码”上了解!↓
数据备份与恢复--MySQL--XtraBackup
本文2024-09-23 01:12:14发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-144435.html