MySQL的全量备份和增量备份

∥☆過路亽.° 提交于 2021-01-06 22:57:06

点击蓝字关注我吧



Hello,今天为大家分享的内容是MySQL裸文件备份和恢复。


        数据的备份有两种形式:冷备和热备。顾名思义,冷备就是在停服务的情况下进行数据的备份和恢复,在备份恢复期间,会影响网站的正常访问。而热备恰恰相反,在不停服务的情况下,进行数据的备份。


        数据的备份又可以分为逻辑备份和裸文件备份。逻辑备份,其实就是备份sql语句,把备份下来的sql语句在MySQL Server上重新执行一遍,就可以恢复数据。裸文件备份是基于底层的copy datafile,备份底层的数据文件。今天的内容,我们利用Percona公司开发的裸文件备份工具Xtrabackup来完成MySQL的热备。

        根据备份的数据,又可以分为全备和增量备份;全备就是把当前数据库里的数据全部备份下来,增备是指要备份当天改变的数据(包括insert,update和delete等)。


备份前准备

环境:

MySQL版本:5.7.26

IP:192.168.234.130

查看系统libgcrypt版本

yum list installed|grep libgcrypt

这个版本信息非常重要。在下载Xtrabackup的时候需要保持版本一致。

安装MySQL:详见笔者的MySQL5.7二进制包安装文章

环境搭建

安装Xtrabackup,下载地址

https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.15/binary/tarball/percona-xtrabackup-2.4.15-Linux-x86_64.libgcrypt153.tar.gz

当然,不同版本的libgcrypt需要安装不同版本的Xtrabackup。

下载后得到一个压缩包,解压:

tar -xf percona-xtrabackup-2.4.15-Linux-x86_64.libgcrypt153.tar.gz

然后进去bin目录,可以看到innobackupex其实是xtrabackup的一个软连接。


启动MySQL,新建一个database和user表,并插入一些数据


全备

首先,创建备份的用户并授权

create user 'bak'&'192.168.234.%' identified by 'bak';grant reload,lock tables,replication client,process,super on *.* to 'bak'@'192.168.234.%';flush privileges;

    全备目前数据库中已有的数据,命令如下

innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --no-timestamp --host=192.168.234.130 /mysql_bak/all

参数详解:

--defaults-file :MySQL所使用的配置文件

--user=bak:备份的用户名

--password=bak:备份的密码

--no-timestamp:不使用系统默认的备份名,自己自定义备份名/mysql_bak/all,表示全备到all目录下,当出现如下截图,说明全备成功


我们来看一下,/mysql_bak/all目录下都有什么文件


这里有备份的数据库名字外,还有一些xtrabackup开头的文件xtrabackup_checkpoints文件记录备份完成时的lsn号和该次备份的类型,是全量备份,标识符是full-backuped


xtrabackup_binlog_file记录二进制日志的偏移量


xtrabackup_info记录备份的详细信息,如命令,备份开始结束时间等。

全备的恢复

恢复之前,我们先模拟数据丢失,停掉mysql,把MySQL服务器存储数据的文件夹和文件删除掉,在这里就是重命名为mysql_bak


校验备份集

innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --host=192.168.234.130 --apply-log /mysql_bak/all/

--apply-log的作用是通过回滚未提交对的事务和同步已提交的事务至数据文件,使数据处于一致状态。出现如下"completed OK!"表示校验结果集完成。


恢复数据

把all目录复制到之MySQL存储数据的地方,并重新命名为mysql,并保持目录的权限和之前目录的权限相同,否则可能会报错

[root@localhost ~]# cp -r /mysql_bak/all/ /data/[root@localhost ~]# cd /data/[root@localhost data]# lsall  mysql_bak[root@localhost data]# mv all mysql[root@localhost data]# lltotal 8drwxr-x--- 7 root  root  4096 Aug 18 22:15 mysqldrwxr-xr-x 7 mysql mysql 4096 Aug 18 21:31 mysql_bak[root@localhost data]# chown -R mysql:mysql mysql[root@localhost data]# chmod 755 mysql[root@localhost data]# lltotal 8drwxr-xr-x 7 mysql mysql 4096 Aug 18 22:15 mysqldrwxr-xr-x 7 mysql mysql 4096 Aug 18 21:31 mysql_bak[root@localhost data]# 

重启MySQL,验证数据是否一致。在这里笔者就不验证了,是一致的。

增备

增备原理:

在上述全备操作中,我们看到全备集中的xtrabackup_checkpoints文件,有着备份完成时的检查点的lsn,其实增备时就是利用这个xtrabackup_checkpoints文件,在进行增备时,xtrabackup会比较表空间每页的lsn是否大于上次备份完成时的lsn,如果大于,则备份该页,并记录当前页的lsn。

增备是基于全备而言的,第一次增备基于上一次的全备,以后每次增备都基于上一次的增备。


增备操作如下:

第一步:第一次全备

innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --no-timestamp --host=192.168.234.130 /mysql_bak/all

插入新数据


第二步:第一次增备

innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --no-timestamp --host=192.168.234.130 --incremental /mysql_bak/all_incr01/ --incremental-basedir=/mysql_bak/all/

--incremental  增备的文件存储位置

--incremental-basedir:上次全备/增备的目录

出现"completed OK!"表示增备成功


插入新数据

第三步:第二次增备

innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --no-timestamp --host=192.168.234.130 --incremental /mysql_bak/incr02/ --incremental-basedir=/mysql_bak/incr01/

同样,出现"completed OK!"表示增备成功。

我们来看一下增备后的文件


包括all全备,incr01第一次增备和incr02第二次增备,再看看各个xtrabackup_checkpoints的lsn信息和backup_type信息,backup_type表明该次备份属于全备类型还是增备类型。

增备恢复

在进行增备恢复前,我们先了解几个问题,

首先要进行全备恢复,其次把增备文件恢复到全备当中,最后一步就是把整个全备文件恢复,前两个步骤需要加上--redo-only参数,表示只回滚日志中已经提交的事务,不回滚那些没有提交的事务,最后一步去掉--redo-only参数就可以了,回滚那些没有提交的事务


命令如下

#恢复全备innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --host=192.168.234.130 --apply-log --redo-only /mysql_bak/all/#恢复第一次增备innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --host=192.168.234.130 --apply-log --redo-only /mysql_bak/all/ --incremental-dir=/mysql_bak/incr01/#恢复第二次增备innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --host=192.168.234.130 --apply-log --redo-only /mysql_bak/all/ --incremental-dir=/mysql_bak/incr02/#全部恢复innobackupex --defaults-file=/etc/my.cnf --user=bak --password=bak --host=192.168.234.130 --apply-log /mysql_bak/all/

当四条命令均出现"completed OK!"表示执行成功


最后,删除MySQL原有的表空间数据,将/mysql_bak/all复制到MySQL存储数据的目录下,并重命名和修改权限

[root@localhost ~]# cp -r /mysql_bak/all/ /data/[root@localhost ~]# cd /data/[root@localhost data]# mv all/ mysql[root@localhost data]# chown -R mysql:mysql mysql[root@localhost data]# chmod 755 mysql[root@localhost data]# lltotal 8drwxr-xr-x 7 mysql mysql 4096 Aug 18 22:56 mysqldrwxr-xr-x 7 mysql mysql 4096 Aug 18 22:53 mysql_bak[root@localhost data]#


最后,我们来验证一下数据,看看增备是否成功



好了,这就是今天给大家分享的内容,如有问题,欢迎指出,谢谢大家。

加笔者的微信,可以一起讨论后端技术,共同进步。





本文分享自微信公众号 - OutOfMemoryError(backend_technology)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!