增量备份与恢复的特点

  • 增量备份的优点是没有重复数据,备份量不大,时间短。但缺点也很明显,需要建立在上次完全备份及完全备份之后所有的增量才能恢复。
  • MySQL没有提供直接的增量备份方法,但是可以通过mysql二进制日志间接实现增量备份。二进制日志对备份的意义如下:
  • (1)二进制日志保存了所有更新或者可能更新数据库的操作。
  • (2)二进制日志在启动MySQL服务器后开始记录,并在文件达到所设大小或者收到flush logs 命令后重新创建新的日志文件。
  • (3)只需定时执行flush logs方法重新创建新的日志,生成二进制文件序列,并及时把这些文件保存到一个安全的地方即完成了一个时间段的增量备份。

增量备份及恢复

创建基本数据库

create databse school
use school
create table info (name varchar(10),score decimal(5,2));
insert into info (name,score) values ('zhangsan',80);
insert into info (name,score) values ('lisi',80);
//数据库建立以及表数据添加完成
  • 编辑配置文件,打开二进制日志功能

#vim /etc/my.cnf

log-bin=mysql-bin   //添加二进制日志文件

#systemctl restart mysqld.service

#msyqldump -u root -p school > /opt/school.sql //备份数据库文件
mysqladmin -u root -p flush-logs //刷新生成mysql在完全备份后的初始增量备份文件

  • 首先生成创建test01数据的二进制日志:

#mysql -u root -p

>use school;
>insert into info (name,score) values (test01,88);
>quit
//完成数据插入

#mysqladmin -u root -p flush-logs //刷新生成mysql增量备份文件
#cd /usr/local/mysql/data/
#ls //二进制日志已经生成

  • 查看二进制日志文件:(确定增加test01操作是在mysql-bin.000002日志中)

    #mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 //使用64位解码方式

  • 其次生成创建test02数据的二进制日志:

#mysql -u root -p

>use school;
>insert into info (name,score) values (test02,90);
>quit
//完成数据插入

#mysqladmin -u root -p flush-logs //刷新生成mysql增量备份日志文件
#cd /usr/local/mysql/data/
#ls //二进制日志已经生成

  • 当工作人员不慎操作,删除了test01与test02用户,导致数据库不可用,而备份的完整数据中只有zhangsan和lisi账户,
    此时需要根据二进制日志文件按需恢复test01或者test02;

模拟误操作:

#mysql -u root -p

>use school
>delete from info where name='test01';    //执行误操作
>select * from info;    

>delete from info where name='test02';    //执行误操作
>select * from info;

首先恢复完整数据库:

#mysql -u root -p school < /opt/school.sql

  • 当test01用户添加数据在二进制日志msyql-bin.0000002中时:
  • 恢复test01:

#msyqlbinlog --no-defaults /usr/local/mysql/data/msyql-bin.0000002 | msyql -u root -p
#msyql -u root -p

>use school
>select * from info;     //发现test01已经恢复
  • 当test02用户添加数据在二进制日志msyql-bin.0000003中时:
  • 恢复test02:

#mysqlbinlog --no-defaults /usr/local/mysql/data/msyql-bin.0000003 | msyql -u root -p
#mysql -u root -p

>use school
>select * from info;     //发现test02已经恢复

基于时间与位置恢复

  • 创建默认数据库:
    create databse school
    use school
    create table info (name varchar(10),score decimal(5,2));
    insert into info (name,score) values ('tom',80);
    insert into info (name,score) values ('jerry',90);
    //数据库建立以及表数据添加完成

MySQL增量备份与还原详解_第1张图片

  • 打开二进制日志功能

#vim /etc/my.cnf

log-bin=mysql-bin   //添加二进制日志文件

#systemctl restart mysqld.service

#mysqldump -u root -p school > /opt/school.sql //备份数据库文件,只含tom和jerry的默认用户

#mysqladmin -u root -p flush-logs //刷新生成mysql增量备份日志文件
#cd /usr/local/mysql/data/
#ls //二进制日志已经生成

模拟故障:

  • 当某一工作人员在添加test01与test02账户时,中间不小心删除数据库中默认账户tom,导致数据库完整性被破坏。
    下面需要针对在二进制日志文件按位置与时间恢复test01和test02数据以及tom数据;
mysql> insert into info (name,score) values ('test01',88);
Query OK, 1 row affected (0.00 sec)

mysql> delete from info where name='tom';   //故障操作为误删除默认用户tom
Query OK, 1 row affected (0.00 sec)

mysql> insert into info (name,score) values ('test02',70);
Query OK, 1 row affected (0.00 sec)

MySQL增量备份与还原详解_第2张图片

#mysqladmin -u root -p flush-logs //此时在误操作的基础上已经完成了增量备份

  • 由于完成数据库备份文件只有默认tom和jerry用户,并没有test01和test02,若还原增量备份文件,则会删除tom用户,下面将利用二进制日志增量备份文件断点还原test01与test02且不删除tom用户;

  • 首先还原完整数据库:
    drop table info;  //删除原有损坏的数据库

#mysql -u root -p school < /opt/school.sql //还原备份数据库

  • 查看二进制日志增量备份文件:
  • 查找需要还原的断点位置:

  • 由于在断点增量备份文件还原时,还原顺序从文件开头执行,到--stop-datetime错误操作时间点结束;

  • 由于在断点增量备份文件还原时,还原顺序从文件开头执行,到--stop-datetime错误操作时间点结束;当跳过错误时间点,从下一次正确操作时间点--start-datetime开始执行到备份文件结尾。

  • 还原到test01:

#mysqlbinlog --no-defaults --stop-datetime='2018-07-03 19:05:42' /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p //注意修改日期格式xxx-xx-xx

MySQL增量备份与还原详解_第3张图片

  • 跳过错误时间:从下一个正确操作时间开始:

#mysqlbinlog --no-defaults --start-datetime='2018-07-03 19:06:03' /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p //注意修改日期格式xxx-xx-xx

MySQL增量备份与还原详解

  • 这样就跳过了错误操作步骤,直接选择正确操作还原。
  • 注:断点还原只能跳过一次错误,若中间有多个错误操作不可连续还原。

节点还原

  • 注意错误操作前面的at节点号:如图

MySQL增量备份与还原详解_第4张图片

#mysqlbinlog --no-defaults --stop-position='563' /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p

  • 跳过错误时间:从下一个正确操作节点开始:

#mysqlbinlog --no-defaults --stop-position='660' /usr/local/mysql/data/msyql-bin.0000001 | mysql -u root -p

断点恢复特殊案例

MySQL增量备份与还原详解_第5张图片

  • 在添加test01、02、03时,在添加了test01后,误删除了系统默认用户tom,然后继续添加test02,在02和03之间误删除了一个mysql系统中没有的账户wangwu,此时,mysql断点恢复就会报错,一旦报错,接下来的还原过程就会停止。
  • 解决方法有两种:
    一、在数据库中手动添加一个wangwu账户,为了保证恢复可以顺利执行
    二、在二进制日志文件中找到误操作的步骤,删除错误操作步骤,然后再用二进制日志还原

如上,关于节点恢复实验已经完成。