使用mysqlbinlog工具的基础上及时恢复的位置或点



MySQL备份一般采取完全备份的形式加日志备份。让我们运行一个完整备份,每天。每小时运行二进制日志备份。

这样在MySQL Server故障后能够使用全备份和日志备份将数据恢复到最后一个二进制日志备份前的任何位置或时间。

用来进行全备和日志备的工具各种各样,各有其特色,在这里不做描写叙述。本文主要解说一下在回复全然备份后,怎样应用备份的二进制日志来将数据恢复到指定的位置或时间点。

这里有个十分重要的工具——mysqlbinlog,专门用来查看二进制日志。我们以一些列子来说明问题:

先看看怎样在MySQL Server中直接查看有哪些二进制日志文件及文件里包括哪些事件。

先清空MySQL Server上的全部二进制日志

mysql> reset master;

Query OK, 0 rows affected (0.00 sec)



查看MySQL Server上的二进制日志

mysql> show binary logs;

+---------------------+-----------+

| Log_name            | File_size |

+---------------------+-----------+

| VMS00781-bin.000001 |       120 |

+---------------------+-----------+

查看二进制日志中的事件

mysql>show binlog events;

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                                  |

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

| VMS00781-bin.000001 |   4 | Format_desc |        36 |         120 | Server ver: 5.6.12-log, Binlog ver: 4 |

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

运行一些DML操作

mysql> delete from ab limit 2;

Query OK, 2 rows affected (1.01 sec)

又一次開始一个新的日志文件

mysql> flush logs;

Query OK, 0 rows affected (0.01 sec)

运行一些DML操作

mysql> delete from ab limit 1;

Query OK, 1 row affected (0.00 sec)

mysql> delete from ab limit 2;

Query OK, 2 rows affected (0.01 sec)



查看MySQL Server上的二进制日志

mysql> show binary logs;

+---------------------+-----------+

| Log_name            | File_size |

+---------------------+-----------+

| VMS00781-bin.000001 |       372 |

| VMS00781-bin.000002 |       515 |

+---------------------+-----------+



查看二进制日志中的事件

mysql> show binlog events;

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                                  |

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

| VMS00781-bin.000001 |   4 | Format_desc |        36 |         120 | Server ver: 5.6.12-log, Binlog ver: 4 |

| VMS00781-bin.000001 | 120 | Query       |        36 |         192 | BEGIN                                 |

| VMS00781-bin.000001 | 192 | Table_map   |        36 |         238 | table_id: 204 (test.ab)               |

| VMS00781-bin.000001 | 238 | Delete_rows |        36 |         291 | table_id: 204 flags: STMT_END_F       |

| VMS00781-bin.000001 | 291 | Xid         |        36 |         322 | COMMIT /* xid=289981 */               |

| VMS00781-bin.000001 | 322 | Rotate      |        36 |         372 | VMS00781-bin.000002;pos=4             |

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

默认显示可找到的第一个二进制日志文件里的事件,包括了事件的開始位置、结束位置、事件类型、信息等内容。能够看到,第一个事件为格式描写叙述事件。第二个为查询事件,事务開始;第三个为表映射事件,第四个为我们运行的删除操作。第五个为Xid时间是自己主动提交事务的动作,第六个为日志轮换事件,是我们运行flush logs开启新日志文件引起的。



查看指定的二进制日志中的事件

mysql> show binlog events in 'VMS00781-bin.000002';

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                                  |

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

| VMS00781-bin.000002 |   4 | Format_desc |        36 |         120 | Server ver: 5.6.12-log, Binlog ver: 4 |

| VMS00781-bin.000002 | 120 | Query       |        36 |         192 | BEGIN                                 |

| VMS00781-bin.000002 | 192 | Table_map   |        36 |         238 | table_id: 204 (test.ab)               |

| VMS00781-bin.000002 | 238 | Delete_rows |        36 |         282 | table_id: 204 flags: STMT_END_F       |

| VMS00781-bin.000002 | 282 | Xid         |        36 |         313 | COMMIT /* xid=290004 */               |

| VMS00781-bin.000002 | 313 | Query       |        36 |         385 | BEGIN                                 |

| VMS00781-bin.000002 | 385 | Table_map   |        36 |         431 | table_id: 204 (test.ab)               |

| VMS00781-bin.000002 | 431 | Delete_rows |        36 |         484 | table_id: 204 flags: STMT_END_F       |

| VMS00781-bin.000002 | 484 | Xid         |        36 |         515 | COMMIT /* xid=290005 */               |

| VMS00781-bin.000002 | 515 | Query       |        36 |         593 | flush slow logs                       |

| VMS00781-bin.000002 | 593 | Query       |        36 |         671 | flush slow logs                       |

+---------------------+-----+-------------+-----------+-------------+---------------------------------------+

该命令还包括其它选项以便灵活查看

SHOW BINLOG EVENTS   [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

mysql> show binlog events in 'VMS00781-bin.000002' from 120 limit 2,3;

+---------------------+-----+-------------+-----------+-------------+---------------------------------+

| Log_name            | Pos | Event_type  | Server_id | End_log_pos | Info                            |

+---------------------+-----+-------------+-----------+-------------+---------------------------------+

| VMS00781-bin.000002 | 238 | Delete_rows |        36 |         282 | table_id: 204 flags: STMT_END_F |

| VMS00781-bin.000002 | 282 | Xid         |        36 |         313 | COMMIT /* xid=290004 */         |

| VMS00781-bin.000002 | 313 | Query       |        36 |         385 | BEGIN                           |

+---------------------+-----+-------------+-----------+-------------+---------------------------------+



SHOW BINARY LOGS 等价于 SHOW MASTER LOGS

PURGE BINARY LOGS用于里二进制日志。如:

PURGE BINARY LOGS TO 'mysql-bin.010';

PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';



RESET MASTER 与 RESET SLAVE

前者清空index文件里列出的全部二进制日志,重置index文件为空。并创建一个新的二进制日志文件,一般用于MASTER首次启动时。后者使SLAVE忘记其在MASTER二进制日志文件里的复制位置,它会删除master.info、relay-log.info 和全部中继日志文件并開始一个新的中继日志文件。以便于開始一个干净的复制。

在使用RESET SLAVE前需先关闭 SLAVE复制线程。





上述方式能够查看到server上存在的二进制日志文件及文件里的事件,可是想查看到文件里详细的内容并应于恢复场景还得借助mysqlbinlog这个工具。

查看:

shell> mysqlbinlog [options] log_file ...

比方:

mysqlbinlog [options] VMS00781-bin.000001

输出内容会因日志文件的格式以及mysqlbinlog工具使用的选项不同而略不同。二进制日志文件里详细内容的含义以及mysqlbinlog的可用选项可參考相关手冊。这里就一些须要特别注意的情况进行说明。

二进制日志文件的格式包括行模式、语句模式和混合模式(也即有server决定在什么情况下记录什么类型的日志)。基于语句的日志中事件信息包括运行的语句等,基于行的日志中事件信息包括的是行的变化信息等。混合模式的日志中两种类型的事件信息都会记录。为了便于查看记录了行变化信息的事件在当时具体运行了什么样的SQL语句能够使用mysqlbinlog工具的-v(--verbose)选项,该选项会将行事件重构成被凝视掉的伪SQL语句,假设想看到更具体的信息可

以将该选项给两次如-vv,这样能够包括一些数据类型和元信息的凝视内容,如

mysqlbinlog -v VMS00781-bin.000001

mysqlbinlog -vv VMS00781-bin.000001



另外mysqlbinlog和能够通过--read-from-remote-server选项从远程服务器读取二进制日志文件,这时须要一些而外的连接參数。如--host,--password ,--port,--user,--socket。--protocol等。这些參数仅在指定了--read-from-remote-server后有效。

不管是本地二进制日志文件还是远程server上的二进制日志文件,不管是行模式、语句模式还是混合模式的二进制日志文件,被mysqlbinlog工具解析后都可直接应用与MySQL Server进行基于时间点、位置或数据库的恢复。

比方:

mysqlbinlog  VMS00781-bin.000001 | mysql -uusername -p



或者先将二进制日志写到.sql文件里。然后在mysqlclient运行这些文件,比方:

mysqlbinlog  VMS00781-bin.000001 > /tmp/VMS00781-bin.000001.sql

mysql>source /tmp/VMS00781-bin.000001.sql



这里有几个比較关键的參数:

--database=db_name, -d db_name

该參数使mysqlbinlog仅从本地二进制日志中输出指定的db_name被use命令选作默认数据库时产生的日志事件。行为类似于mysqld的--binlog-do-db命令。若该參数指定了多次那么仅仅有最后一次指定的内容有效。

參数详细的影响依赖于二进制日志格式,仅仅有在使用行模式的日志格式时该參数才干保证一致性。基于语句或混合模式的二进制日志格式中由于可能存在跨库的更新导致--database參数表现不同的行为,从而不能保证数据一致性。

mysqlbinlog  VMS00781-bin.000001  -d testDB | mysql -uusername -p



--force-read, -f

使用了该參数后mysqlbinlog工具在读取到不能识别的日志事件时会打印出warning,忽略事件并继续运行。没有此參数的情况下mysqlbinlog会停止。

mysqlbinlog  VMS00781-bin.000001  -d testDB -f | mysql -uusername -p



--no-defaults

阻止mysqlbinlog工具从不论什么配置文件读取參数, .mylogin.cnf除外(以便于安全的保存password)

mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults| mysql -uusername -p



--start-datetime=datetime

--stop-datetime=datetime

上边一组參数用于指定恢复開始时间点和结束时间点。能够一起或单独给出,也可与--start-position,--stop-position混用

mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults --start-datetime=datetime --stop-position=NNNNNN | mysql -uusername -p



--start-position=N, -j N

--stop-position=N

上边一组參数用于指定恢复開始位置和结束位置,能够一起或单独给出也可与--start-datetime。--stop-datetime混用

mysqlbinlog  VMS00781-bin.000001  -d testDB -f --no-defaults --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p



须要还原的二进制日志文件通常不止一个,那么要是有多个二进制日志文件须要还原呢,该注意些什么?

首先。能够选择上述直接重定向到mysqlclient的方法或先导入到.sql文件然后运行.sql文件的方式逐个应用二进制日志文件。

可是这里存在一个隐患。及,假设二进制日志中记录有使用暂时表的情况,那么当上一个日志应用完,在新连接中应用下一个二进制日志时暂时表就会丢失,引起错误。所以。安全的方式是多个二进制文件同一时候运行。

如:

mysqlbinlog  VMS00781-bin.000001  VMS00781-bin.000002 VMS00781-bin.000003 --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

或mysqlbinlog  VMS00781-bin.00000[1-3] --start-position=NNNNNN --stop-datetime=datetime | mysql -uusername -p

当多个二进制日志文件同一时候运行时。--start-position和--stop-position分别仅仅应用于第一个列出的二进制日志文件和最后一个列出的二进制日志文件



当然也能够先将多个二输出二进制日志文件相同.sql最后,运行该文件.sql文件(它适用于少量的日志的情况下)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

使用mysqlbinlog工具的基础上及时恢复数据的位置或点的更多相关文章

  1. 利用IDM工具下载ESA上的Sentinel数据

    由于美国政府关门,NASA,USGS,NOAA等机构中的非核心部门也都放假了,暂时无法提供Sentinel数据下载,而直接从ESA下载数据比蜗牛上山都慢,幸好发现了IDM工具. 利用浏览器或wget工 ...

  2. 数据误操作,删库跑路?教你使用ApexSQLLog工具从 SQLServer日志恢复数据!

    前几天同事不小心误操作,将SQLServer库的一张表的一个状态字段给刷成了一个统一状态,由于是update执行所以原来的相关状态无法确定.发生这种事情的时候我的小伙伴背后 一凉,估计心里里面想这怕是 ...

  3. ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程

    1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...

  4. 从WEB SERVICE 上返回大数据量的DATASET

    前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作.查遍了网站的文章,问了一 ...

  5. xtrbackup备份,及恢复数据

    模拟定时任务周日备份数据,周一数据变化,周一crontab定时任务增量备份,周二数据变化,周二crontabl增量备份,然后有人删库,我们进行恢复数据 模拟crontab 里的定时任务周日全备 [ro ...

  6. mysqlbinlog工具基于日志恢复详细解释

    如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作 1)RESET MASTER在上面查看日志存放的文件夹中 ...

  7. MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库【转载】

    转自 MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库 - _安静 - 博客园http://www.cnblogs.com/xionghui/archive/2012/ ...

  8. [转] 使用 MYSQLBINLOG 来恢复数据

     使用 MYSQLBINLOG 来恢复数据 2009-04-05 12:47:05 标签:mysql mysqlbinlog 恢复 数据库 数据 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...

  9. 使用mysqlbinlog工具进行基于位置或时间点的数据恢复

    使用mysqlbinlog工具进行基于位置或时间点的恢复 MySQL备份一般采取全备份加日志备份的方式,比如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL Server故障后可以使 ...

随机推荐

  1. UpdatePanel Repeater内LinkButton造成页面刷新问题

    本意:UpdatePanel1内嵌的Repeater1中带有LinkButton1, 将由LinkButton1触发页面的UpdatePanel2更新,而不需要更新UpdatePanel1,当然也不需 ...

  2. Knockout应用开发指南 第五章:创建自定义绑定

    原文:Knockout应用开发指南 第五章:创建自定义绑定 创建自定义绑定 你可以创建自己的自定义绑定 – 没有必要非要使用内嵌的绑定(像click,value等).你可以你封装复杂的逻辑或行为,自定 ...

  3. 程序猿进化 - 在拉钩子1024对APE节讲座计划

    注意:下面这篇文章来自于我在网上拉勾1024对APE节现场演示程序. 我是蒋宇捷,信天创投的合伙人.之前是百度魔图的联合创始人. 我先做个自我介绍,事实上每次介绍自己事实上是非常痛苦的事情,由于我前不 ...

  4. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  5. [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)

    Cellular Automaton Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 3048   Accepted: 12 ...

  6. 使用 angular directive 和 json 数据 D3 随着标签 donut chart演示样本

    使用angular resource载入中priorityData.json中间json数据,结合D3绘制甜甜圈图.执行index.html其结果见于图.: priorityData.json中jso ...

  7. 《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock

    转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最 ...

  8. spring4.1+springmvc4.1+mybatis3.2.8+spring-security3.2.5集成环境建设

    在最近使用的项目ssi+spring-security 结构体.建立你自己的家,这是什么环境. 只有记录的目的. 项目结构: 类文件:                                  ...

  9. Javascript 设计模式 辛格尔顿

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/30490955 我一直很喜欢Js,,,今天写JsSingleton模式来实现,以及 ...

  10. ftp桥接到http服务

    先说一下我的需求:我的linodeserver近期ftp和sftp连不上了,port被封了.仅仅有http能够訪问,我没有办法上传文件了.由于我寻常都用beyond compare上传文件,非常方便. ...