在系统需要做等保的时候都会有要求数据库备份,如果应用部署的云服务当中,可以花钱购买云厂商的数据库备份服务,但是对于我们技术人员来说,能够自己研究的技术方案也是相当香,而且不比购买的服务差,都能实现相同的效果,且底层工具都是一样的。mysql的备份方案主要有三种:实时备份、逻辑备份、物理备份。每种方式各有优劣,取决各自业务的需求,但是有追求的人都会选择xtrabackup来作为备份方案,因为,用过的都说好。
利用MySQL主从复制原理,给MySQL增加一个从节点,从库通过IO线程将主库上的日志复制到自己的中继日志,在通过SQL线程读取中继日志中的事件,将其重放到自己数据上。
优点:适合数据量大的时候,防止数据丢失;
缺点:需要人员维护从节点服务,定期检查服务同步情况。
使用MySQL自带的mysqldump工具进行备份,备份成sql文件形式。
优点:最大好处是能够与正在运行的MySQL自动协同工作,在运行期间可以确保备份是当时的点,它会自动将对应操作的表锁定,不允许其他用户修改(只能访问),sql文件通用方便移植。
缺点:备份时会锁表影响业务操作,当MySQL数据超过10G时,会耗费较长时间导致服务不可用。
直接备份数据文件。
优点:备份和恢复操作都比较简单,恢复速度快,属于文件系统级别的。
缺点:备份文件大,不总是可以跨平台、操作系统和MySQL版本,恢复时需关闭MySQL,清空MySQL数据目录。
在介绍Xtrabackup之前需要了解Mysql的ibbackup,它是由Innodb官方开发,后续被改名为Mysql Enterprise Backup,由于这个软件为收费软件用户并不多,所以后续出现了完全替代品Xtrabackup并且被广泛使用。
Xtrabackup是Percona团队开发的用于MySQL数据库物理热备份的开源备份工具,具有备份速度快、支持备份数据压缩、自动校验备份数据、支持流式输出、备份过程中几乎不影响业务等特点,是目前各个云厂商普遍使用的MySQL备份工具(华为云采用的此方式),XtraBackup是目前首选的备份方案之一。具有以下好处:
Xtrabackup是没有windows和mac版本的,只有linux版本,这里简单记录一下如何安装。
下载地址:Percona XtraBackup
在下载之前,首先需要确认好mysql版本,下载地址注意里面包含很多软件,这里找到如下截图所示的界面,根据自己的Mysql 版本下载:
下载好对应版本之后,将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
centos7的下载libev-4.24-6.el8.x86_64.rpm是可以使用的。如果是内网,通过yum命令安装以上依赖包的,都可以通过这个网站搜索对应的包下载安装。
下载完后,通过rpm命令安装。
想要深入研究的同学可参考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还会在备份目录中创建如下文件:
在进行全量备份之前,需要保证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; #刷新授权表
以下为方便,直接使用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(日志序列号)范围等信息。
进行全量备份恢复时,需要将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服务,查看数据。
使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现,相关备份的LSN查看xtrabackup_checkpoints文件。
在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。
执行全量备份命令,备份文件存放在全量文件夹下:/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
起始点,刚好是全量备份的终点。
数据库数据改变,再次执行增量备份命令,以第一份增量备份为基础,切换到第一份增量备份目录/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,进入查看备份记录
起始点,刚好是第一次备份的终点。
对完整备份做回滚操作
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
数据都合并到全备数据中了,查看合并信息
结束刚好和第二个增量备份结束点一样。
首先停止数据库服务,将数据库文件删除,模拟数据丢失。
使用命令进行数据恢复
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/xtrabackup/backData/full/2023-03-12_17-33-12
数据恢复后授权mysql的数据目录,启动后查看数据验证,此时数据已恢复。