zoukankan      html  css  js  c++  java
  • 烂泥:通过binlog恢复mysql备份之前的数据

    本文由秀依林枫提供友情赞助,首发于烂泥行天下

    上一篇文章,我们讲解了如何通过mysql的binlog日志恢复mysql数据库,文章连接为《烂泥:通过binlog恢复mysql数据库》。其中我们提到了的备份数据库要晚与要恢复的数据库时间,即要恢复的数据库在前,而备份的数据库在后。

    当时我提到说会单独写一篇文章讲解这个情况,本篇文章我就来介绍如何通过binlog日志恢复比备份数据库早时的数据库状态。我们还是以上篇文章的数据及备份文件为基础,来进行本篇文章的讲解。

    ailanni数据库完整备份时,其数据库中有1、2、3、4,这四条数据。而此时mysql总共有三个binlog日志文件:mysql-bin.000001、mysql-bin.000002、mysql-bin.000003。其中在mysql-bin.000001中,我们向ilannitable表中插入两个数据1、2。在mysql-bin.000002中我们向ilannitable表中插入两个数据3、4。

    现在我们要求把ailanni数据库恢复到插入数据3后,未插入数据4时的状态。即数据库ailanni中只有数据1、2、3,这三条数据。

    分析:要达到上述的要求,我们需要使用到mysql-bin.000002,这个binlog日志文件。然后根据binlog日志恢复数据库使,可以指定pos位置节点的方法,来恢复ailanni数据库。

    除此非常重要的是,我们还要先把ailanni数据库先恢复到完整备份时的状态,如果不先把ailanni数据库先恢复到完整备份时的状态,我们在使用binlog日志进行恢复时,系统会报错。

    我们需要分以下几个步骤,可以恢复题目要求的ailanni数据库状态。如下:

    1、 完整恢复ailanni数据库

    2、 删除恢复后ailanni数据库中的全部数据

    3、 通过binlog日志恢复ailanni数据库

    一、完整恢复ailanni数据库

    要完整恢复ailanni数据库,我们可以通过mysql命令来实现。但是在这之前,我们还要就有关ailanni数据库是否存在的情况要说明下。

    如果目前mysql数据库服务器上有ailanni这个数据库,那么我们在恢复数据时,就不需要重新创建ailanni数据库。如果目前mysql数据库服务器上没有ailanni这个数据库,那么我们就需要重新创建一个空的ailanni数据库。即该数据库只是一个空的库,里面没有任何表或者其他的元素。

    如果不创建ailanni数据库的话,我们在通过mysql命令恢复数据库时,系统就会报错,如下:

    clip_image001

    现在我们来执行mysql命令导入备份的sql文件,如下:

    create database ailanni;

    /usr/local/mysql/bin/mysql -uroot -p123456 ailanni</root/ailanni.sql

    mysql -uroot -p123456

    use ailanni;

    select id from ilannitable;

    clip_image002

    通过上图,我们可以看到ailanni数据库已经完全恢复。

    二、删除恢复后ailanni数据库中的全部数据

    在第一步中我们已经把ailanni数据库全部恢复,现在我们需要清空ailanni数据库。如下:

    delete from ilannitable;

    select id from ilannitable;

    clip_image003

    通过上图,我们可以看到目前ailanni数据库中已经没有数据,是一个空的数据库。

    三、通过binlog日志恢复ailanni数据库

    第二步已经清空ailanni数据库,这样我们就可以通过mysql的binlog日志来恢复ailanni数据库。

    也许你会问我们为什么要先完整恢复ailanni数据库,然后再把ailanni数据库清空?

    这个是因为如果我们不先完整恢复ailanni数据库的话,我们在使用binlog进行恢复ailanni数据库时,系统会报错的。如下:

    clip_image004

    如果我们不清空ailanni数据库的话,你会发下恢复后的ailanni数据库,还是没有达到我们的要求。如下:

    clip_image005

    所以我们要进行第一、二步的操作。

    现在我们来查看mysql-bin.000002文件,以确定ailanni数据库恢复的pos位置节点,如下:

    /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000002

    clip_image006

    注意图中标记出来的数字304,这个就是binlog的pos节点位置。我们可以看到在该pos节点后mysql才执行插入数据4的SQL语句。那么我们只需要把数据恢复这个节点即可。

    使用如下命令进行恢复数据,如下:

    /usr/local/mysql/bin/mysqlbinlog --stop-position=304 /usr/local/mysql/data/mysql-bin.000002 |mysql -uroot -p123456

    clip_image007

    通过上图,我们现在可以看到ailanni数据库已经恢复到插入数据3之后,未插入4的状态。现在ailanni数据库中确实只有1、2、3,这三条数据,已经达到我们的要求。

    其实我们还可以这样说,目前只有mysql的所有binlog日志,而且还有一个比较完整的数据库备份,那么该如何恢复数据库呢?

    按照上述方法也是可以恢复的。

  • 相关阅读:
    [贪心] Jzoj P4249 游戏
    [数学][快速幂] Jzoj P4248 n染色
    [dfs] Jzoj P4252 QYQ的图
    [折半搜索][has] Jzoj P4250 路径
    [计数dp][数学] Jzoj P4254 集体照
    [Tarjan][并查集][dp] Jzoj P4253 QYQ在艾泽拉斯
    [支配树][lca][倍增][线段树][拓扑] Jzoj P4240 游行
    [贪心] Jzoj P4244 yi
    [数位dp] Jzoj P4239 光棍
    [扫描线][差分约束] Jzoj P4238 纪念碑
  • 原文地址:https://www.cnblogs.com/ilanni/p/4109902.html
Copyright © 2011-2022 走看看