MySQL binlog 数据恢复

数据库

19-1-17 16:28:38

MySQL server开启binlog

binlog 基本认识
    MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

    一般来说开启二进制日志大概会有1%的性能损耗。二进制有两个最重要的使用场景: 
    其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。 
    其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

开启方法
my.ini 增加或去掉注释
log-bin=mysql-bin

#expire_logs_days = 10                 定义了mysql清除过期日志的时间。 默认值为0,表示“没有自动删除”。

#max_binlog_size = 100M          如果二进制日志写入的内容超出给定值,日志就会发生滚动。开启新日志文件

//binlog-format = row            默认值就行  



mysql> show variables like 'log_%'; 
log_bin          ON表示已经开启binlog日志

 1.查看所有binlog日志列表
   mysql> show master logs;

  2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
   mysql> show master status;

   3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
     mysql> flush logs;
    注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

    4.重置(清空)所有binlog日志
      mysql> reset master;

--------------------------------------------------------------------------------------------------------------------
查看日志内容
mysqlbinlog ../data/mysql-bin.000002   直接查看
mysqlbinlog ../data/mysql-bin.000002 >1.txt  写入文档

也可以 
SHOW master LOGS  查看日志列表
SHOW BINLOG EVENTS IN  'mysql-bin.000003'  查看具体
SHOW BINLOG EVENTS IN  'mysql-bin.000003' from 666;   666节点开始
SHOW BINLOG EVENTS IN  'mysql-bin.000003' FROM 666 LIMIT 3 ;   666开始以后3条

end_log_pos ***  是该命令的偏移节点 恢复数据会用到
------------------------------------------------------------------------------------------------------------------
恢复数据
总结:所谓恢复,就是让mysql将保存在binlog日志中指定段落区间的sql语句逐个重新执行一次而已。

mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 -v数据库名

常用参数选项解释:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2016-9-25 22:01:08" 起始时间点
--stop-datetime="2019-9-25 22:09:46" 结束时间点
--database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)

事故现场!
比如 每天0点自动全量备份数据  然后执行刷新flush logs;生成新的binlog记录
在10点出现问题,马上刷新当前(flush logs),生成新的记录,0点到10点的日志不会继续写入数据,(在写入的都进入了新的日志)
先恢复昨日0点的全量备份,然后恢复今日事故期间的binlog文件 到某个节点

恢复命令
mysqlbinlog --stop-position=937 --database=youdb  ../data/mysql-bin.000003  | mysql -uroot -p123456 -v youdb  (-v直接进入数据库)

---------------------------------------------------------------------------------------------------------------------------------------------
模拟

0点  mysqldump -h127.0.0.1  -P3306 -uroot -p111 yourdb -F > yourdb.sql;全量备份  (-F既马上刷新日志)
10点  增删改!!!  误操作了! 擦!
         SHOW master LOGS 查看当前日志
         mysqlbinlog ../data/mysql-bin.00000*  查看误操作的最后 end_log_pos *** 节点
         flush logs  刷新日志 生成新日志
         mysql -uroot -p111  yourdb < d:\bak\yourdb.sql;                          恢复昨晚全量数据
         mysqlbinlog --stop-position=937 --database=youdb  ../data/mysql-bin.00000*  | mysql -uroot -p111 -v youdb  (-v直接进入数据库)