数据备份与恢复--MySQL--XtraBackup

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

数据备份与恢复--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包含两个主要的工具,即xtrabackupinnobackupex


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),这些文件将属于创建备份的用户。   


划重点

全量备份

1) 利用 innobackupex 进行全量备份,并指定备份目录路径;

2) 在还原前,需要使用 --apply-log 参数先进行合并数据文件,确保数据的一致性要求。


增量备份

1) 增量备份需要使用参数 --incremental 指定需要备份到哪个目录,使用 incremental-dir 指定全备目录;

2) 进行数据备份时,需要先使用参数 --apply-log redo-only 合并全备目录数据,确保全备目录数据的一致性;再将增量备份数据使用参数 --incremental-dir 合并到全备数据当中;最后通过最新的全备数据进行恢复数据。

如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。




#往期推荐#


# 手把手教你打造Jmeter压测可视化监控平台

# Jmeter高阶系列——Beanshell脚本

# Jmeter高阶系列——使用JDBC协议获取数据

Jmeter高阶系列—数据参数化及使用场景


更多精彩内容,“码”上了解!↓



数据备份与恢复--MySQL--XtraBackup

在进行性能测试、操作数据的过程中可能会出现数据错误,甚至数据库崩溃的情况,而有效的定时备份能很好地保护数据库。但MySQL备份工具种类...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息