xtrabackup实现mysql备份

1 mysql备份方案介绍

在系统需要做等保的时候都会有要求数据库备份,如果应用部署的云服务当中,可以花钱购买云厂商的数据库备份服务,但是对于我们技术人员来说,能够自己研究的技术方案也是相当香,而且不比购买的服务差,都能实现相同的效果,且底层工具都是一样的。mysql的备份方案主要有三种:实时备份、逻辑备份、物理备份。每种方式各有优劣,取决各自业务的需求,但是有追求的人都会选择xtrabackup来作为备份方案,因为,用过的都说好。

1.1实时备份

利用MySQL主从复制原理,给MySQL增加一个从节点,从库通过IO线程将主库上的日志复制到自己的中继日志,在通过SQL线程读取中继日志中的事件,将其重放到自己数据上。

优点:适合数据量大的时候,防止数据丢失;
缺点:需要人员维护从节点服务,定期检查服务同步情况。

1.2 逻辑备份

使用MySQL自带的mysqldump工具进行备份,备份成sql文件形式。

优点:最大好处是能够与正在运行的MySQL自动协同工作,在运行期间可以确保备份是当时的点,它会自动将对应操作的表锁定,不允许其他用户修改(只能访问),sql文件通用方便移植。
缺点:备份时会锁表影响业务操作,当MySQL数据超过10G时,会耗费较长时间导致服务不可用。

1.3 物理备份

直接备份数据文件。

优点:备份和恢复操作都比较简单,恢复速度快,属于文件系统级别的。
缺点:备份文件大,不总是可以跨平台、操作系统和MySQL版本,恢复时需关闭MySQL,清空MySQL数据目录。

2 xtrabackup介绍

在介绍Xtrabackup之前需要了解Mysql的ibbackup,它是由Innodb官方开发,后续被改名为Mysql Enterprise Backup,由于这个软件为收费软件用户并不多,所以后续出现了完全替代品Xtrabackup并且被广泛使用。
Xtrabackup是Percona团队开发的用于MySQL数据库物理热备份的开源备份工具,具有备份速度快、支持备份数据压缩、自动校验备份数据、支持流式输出、备份过程中几乎不影响业务等特点,是目前各个云厂商普遍使用的MySQL备份工具(华为云采用的此方式),XtraBackup是目前首选的备份方案之一。具有以下好处:

  • 备份速度快,物理备份可靠
  • 备份过程不会打断正在执行的事务(无需锁表
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动备份校验
  • 还原速度快
  • 可以流传将备份传输到另外一台机器上
  • 在不增加服务器负载的情况备份数据

2.1 xtrabackup内部流程图

xtrabackup实现mysql备份_第1张图片

2.2 mysqldump和xtrabackup对比

xtrabackup实现mysql备份_第2张图片

3 xtrabackup下载安装

Xtrabackup是没有windows和mac版本的,只有linux版本,这里简单记录一下如何安装。
下载地址:Percona XtraBackup
在下载之前,首先需要确认好mysql版本,下载地址注意里面包含很多软件,这里找到如下截图所示的界面,根据自己的Mysql 版本下载:

  • 8.0:对应Mysql8.0以上版本。
  • 2.4:对应Mysql5.0 - Mysql5.7版本。

xtrabackup实现mysql备份_第3张图片
下载好对应版本之后,将rpm包上传到数据库服务器上,通过rpm命令安装

rpm -ivh 下载包名

在执行完安装命令后,可能会提示缺少相关的依赖包,如 libev.so.4()(64bit)、perl-DBD-MySQL、perl-Digest-MD5等,可以先通过yum命令安装相关依赖

yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL perl-Digest-MD5

libev.so.4需要下载安装包,下载地址:
rpmfind.net
xtrabackup实现mysql备份_第4张图片
centos7的下载libev-4.24-6.el8.x86_64.rpm是可以使用的。如果是内网,通过yum命令安装以上依赖包的,都可以通过这个网站搜索对应的包下载安装。
下载完后,通过rpm命令安装。

4 xtrabackup命令介绍

想要深入研究的同学可参考xtrabackup官方文档,地址如下:
官网文档
Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

innobackupex [参数] [目的地址] [源地址]
常用选项:  
   --host     指定主机
   --user     指定用户名
   --password    指定密码
   --port     指定端口
   --databases     指定数据库
   --incremental    创建增量备份
   --incremental-basedir   指定包含完全备份的目录
   --incremental-dir      指定包含增量备份的目录   
   --apply-log        对备份进行预处理操作   

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

   --redo-only      不回滚未提交事务
   --copy-back     恢复备份目录

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

  • xtrabackup_checkpoints 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:
    每个InnoDB页(通常为16k大小)
    都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
  • xtrabackup_binlog_info mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。
  • xtrabackup_binlog_pos_innodb 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。
  • xtrabackup_binary 备份中用到的xtrabackup的可执行文件。
  • backup-my.cnf 备份命令用到的配置选项信息:
    在使用innobackupex进行备份时,还可以使用–no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

5 xtrabackup全量备份

在进行全量备份之前,需要保证mysql数据库服务处于运行状态。备份命令中需要指定mysql用户,如果不想使用root用户,可以创建一个最小权限的用户进行备份,通过以下命令创建此类用户:

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';  #创建用户
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';  #回收此用户所有权限
mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost';  #授权刷新、锁定表、用户查看服务器状态
mysql> FLUSH PRIVILEGES;  #刷新授权表

5.1 全量备份过程

以下为方便,直接使用mysql的root用户,有要求的可先创建备份用户。全量备份执行以下命令

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root /data/xtrabackup/backData

执行完命令后,可以看到在/data/xtrabackup/backData目录下有已时间格式命名【2023-03-11_23-26-15】的备份文件夹,进入里面,可以查看xtrabackup_checkpoints文件,可以查看备份类型,和LSN(日志序列号)范围等信息。
xtrabackup实现mysql备份_第5张图片

5.2 全量备份恢复

进行全量备份恢复时,需要将mysql服务停止,然后在将mysql的数据文件目录删除【仅在测试环境参考,生产环境需备份好相关文件】,模拟数据丢失进行全量备份恢复。
模拟数据丢失
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。
innobackupex命令的–apply-log选项可用于实现上述功能,如下面的命令:

innobackupex --apply-log /data/xtrabackup/backData/2023-03-11_23-26-15

在实现"准备"的过程中,innobackupex通常还可以使用–user-memory选项来指定其可以使用的内存的大小,默认为100M.如果有足够的内存空间可用,可以多划分一些内存给prepare的过程,以提高其完成备份的速度。
此时我们得到一个完整的数据文件,可以进行数据恢复了

innobackupex --defaults-file=/etc/my.cnf --copy-back /data/xtrabackup/backData/2023-03-11_23-26-15

此时我们去查看mysql的数据文件目录,数据已经恢复了。
如果安装mysql的时候使用的mysql用户,需要修改数据文件的属主和属组授权给mysql。

chown -R mysql.mysql /data/mysql-5.7.36/data

启动mysql服务,查看数据。

5.3 总结全库备份与恢复三步曲

  1. innobackupex全量备份,并指定备份目录路径;
  2. 在恢复前,需要使用–apply-log参数先进行合并数据文件,确保数据的一致性要求;
  3. 恢复时,直接使用–copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

6 xtrabackup增量备份

使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现,相关备份的LSN查看xtrabackup_checkpoints文件。

在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。

6.1 xtrabackup增量过程

执行全量备份命令,备份文件存放在全量文件夹下:/data/xtrabackup/backData/full

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root /data/xtrabackup/backData/full

此时在改变数据库,增加数据。
在全量备份的基础上,执行增量备份,增量备份数据文件存放在:/data/xtrabackup/backData/inc,切换到
全量备份目录下/data/xtrabackup/backData/full/2023-03-12_17-33-12

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --redo-only --incremental /data/xtrabackup/backData/inc --incremental-basedir=/data/xtrabackup/backData/full/2023-03-12_17-33-12

执行完之后,在inc目录下已经有第一个增量备份信息2023-03-12_17-34-16,进入查看cat /data/xtrabackup/backData/inc/2023-03-12_17-34-16/xtrabackup_checkpoints
xtrabackup实现mysql备份_第6张图片
起始点,刚好是全量备份的终点。
数据库数据改变,再次执行增量备份命令,以第一份增量备份为基础,切换到第一份增量备份目录/data/xtrabackup/backData/inc/2023-03-12_17-34-16

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --redo-only --incremental /data/xtrabackup/backData/inc --incremental-basedir=/data/xtrabackup/backData/inc/2023-03-12_17-34-16

这时生成了第二个增量备份,/data/xtrabackup/backData/inc/2023-03-12_17-36-39,进入查看备份记录

xtrabackup实现mysql备份_第7张图片

起始点,刚好是第一次备份的终点。

6.2 xtrabackup增量恢复

对完整备份做回滚操作

innobackupex --apply-log --redo-only /data/xtrabackup/backData/full/2023-03-12_17-33-12

对第一份增量/data/xtrabackup/backData/inc/2023-03-12_17-34-16,执行合并增量到全量备份中

innobackupex --apply-log --redo-only /data/xtrabackup/backData/full/2023-03-12_17-33-12 --incremental-dir=/data/xtrabackup/backData/inc/2023-03-12_17-34-16

对第二份增量备份/data/xtrabackup/backData/inc/2023-03-12_17-19-46,执行合并增量到全量备份中

innobackupex --apply-log --redo-only /data/xtrabackup/backData/full/2023-03-12_17-33-12 --incremental-dir=/data/xtrabackup/backData/inc/2023-03-12_17-36-39

数据都合并到全备数据中了,查看合并信息
xtrabackup实现mysql备份_第8张图片
结束刚好和第二个增量备份结束点一样。

首先停止数据库服务,将数据库文件删除,模拟数据丢失。
使用命令进行数据恢复

innobackupex --defaults-file=/etc/my.cnf --copy-back /data/xtrabackup/backData/full/2023-03-12_17-33-12

数据恢复后授权mysql的数据目录,启动后查看数据验证,此时数据已恢复。

你可能感兴趣的:(Mysql,mysql,数据库)