点击蓝字关注我吧
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]# ls
all mysql_bak
[root@localhost data]# mv all mysql
[root@localhost data]# ll
total 8
drwxr-x--- 7 root root 4096 Aug 18 22:15 mysql
drwxr-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]# ll
total 8
drwxr-xr-x 7 mysql mysql 4096 Aug 18 22:15 mysql
drwxr-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]# ll
total 8
drwxr-xr-x 7 mysql mysql 4096 Aug 18 22:56 mysql
drwxr-xr-x 7 mysql mysql 4096 Aug 18 22:53 mysql_bak
[root@localhost data]#
最后,我们来验证一下数据,看看增备是否成功
好了,这就是今天给大家分享的内容,如有问题,欢迎指出,谢谢大家。
加笔者的微信,可以一起讨论后端技术,共同进步。
本文分享自微信公众号 - OutOfMemoryError(backend_technology)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4564034/blog/4448812