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直接进入数据库)