使用mysqlbinlog工具的基础上及时恢复数据的位置或点
使用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工具的基础上及时恢复数据的位置或点的更多相关文章
- 利用IDM工具下载ESA上的Sentinel数据
由于美国政府关门,NASA,USGS,NOAA等机构中的非核心部门也都放假了,暂时无法提供Sentinel数据下载,而直接从ESA下载数据比蜗牛上山都慢,幸好发现了IDM工具. 利用浏览器或wget工 ...
- 数据误操作,删库跑路?教你使用ApexSQLLog工具从 SQLServer日志恢复数据!
前几天同事不小心误操作,将SQLServer库的一张表的一个状态字段给刷成了一个统一状态,由于是update执行所以原来的相关状态无法确定.发生这种事情的时候我的小伙伴背后 一凉,估计心里里面想这怕是 ...
- ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程
1.副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录,所以需要对一年前2015年5月1日的数据进行恢复.而2016年初因为进行迁移,所以有些文件可能丢失,手上只有rma ...
- 从WEB SERVICE 上返回大数据量的DATASET
前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作.查遍了网站的文章,问了一 ...
- xtrbackup备份,及恢复数据
模拟定时任务周日备份数据,周一数据变化,周一crontab定时任务增量备份,周二数据变化,周二crontabl增量备份,然后有人删库,我们进行恢复数据 模拟crontab 里的定时任务周日全备 [ro ...
- mysqlbinlog工具基于日志恢复详细解释
如果每天都会生成大量的二进制日志,这些日志长时间不清理的话,将会对磁盘空间带来很大的浪费,所以定期清理日志是DBA维护mysql的一个重要工作 1)RESET MASTER在上面查看日志存放的文件夹中 ...
- MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库【转载】
转自 MYSQL启用日志,查看日志,利用mysqlbinlog工具恢复MySQL数据库 - _安静 - 博客园http://www.cnblogs.com/xionghui/archive/2012/ ...
- [转] 使用 MYSQLBINLOG 来恢复数据
使用 MYSQLBINLOG 来恢复数据 2009-04-05 12:47:05 标签:mysql mysqlbinlog 恢复 数据库 数据 原创作品,允许转载,转载时请务必以超链接形式标明文章 ...
- 使用mysqlbinlog工具进行基于位置或时间点的数据恢复
使用mysqlbinlog工具进行基于位置或时间点的恢复 MySQL备份一般采取全备份加日志备份的方式,比如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL Server故障后可以使 ...
随机推荐
- NTFS权限设置时卡死
客户是一家技术咨询和零部件制造的小公司,使用的文件服务器为R410上插4块1T硬盘做raid 5,服务器操作系统为windows server 2008R2,所有的设计资料的授权都是结合域账户和NTF ...
- SE 2014年3月31日
一. 描述OSPF划分区域的优势. OSPF划分区域的优势主要表现在以下几个方面: 1. 当网络中路由器的数量增大时,划分区域有利于减轻一部分性能较低的设备的处理和维护LSA数据库. 2. 区域的划分 ...
- Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框
现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...
- 为什么推荐std::string而不是char*
例如如下: map<const char*, const char*> map_test; map_test["a"] = "a"; map_tes ...
- 阅读zepto.js的core中的Core methods
学习zepto.js,參考资料:http://www.zeptojs.cn/ 跟jQuery一样.其选择符号也是$; 首先接触的是 $.() 选择 $(selector, [context]) ⇒ ...
- cocos2d-x 精灵的创建和基本使用
在cocos2d-x中.精灵能够说是一个最重要的组成元素,它代表游戏中一个最小的可见单位.同一时候也是CCNode一个最为灵活的子类,由于它能够通过装载一个平面纹理,从而具有丰富的表现力. 在进一步说 ...
- Exec l 中分列的作用
- registerWithTouchDispatcher()函数的使用
registerWithTouchDispatcher()函数的使用 registerWithTouchDispatcher()函数主要用于注册Touch事件. 当我们使用this->setTo ...
- 【Unity Shaders】使用Unity Render Textures实现画面特效——画面特效中的亮度、饱和度和对照度
本系列主要參考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同一时候会加上一点个人理解或拓展. 这里是本书全部的插图. 这里是本书所需的代码 ...
- 【剑指offer】面试题26:复制的复杂链条
def copyRandomList(self, head): if None == head: return None phead = head while phead: pnext = phead ...