mysql binlog

一:定义:

二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中;

作用:

MySQL的作用类似于Oracle的归档日志,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作)、数据库增量备份和恢复(增量备份和基于时间点的恢复)、Mysql的复制(主主数据库的复制、主从数据库的复制)

1) Replication
对于主从部署的mysql server,master将所有可能更改数据库状态的操作写入binlog并将其同步给slave,后者重放binlog中的操作序列以便使其数据库状态与master达到一致,这样就实现了master-slave的数据同步。


2) Data Recover
数据库恢复时可以回放binlog重建宕机时的数据状态。假设数据库在某个备份点后又运行一段时间后宕机,则server重启后,可以在上次备份点的基础上,通过回放binlog来重做数据以便恢复上次备份点到server宕机这段时间内的数据状态。
注意:binlog只包含可能改变数据库状态的操作,因此,select或show等不会修改数据的操作不会记录在binlog中。

二进制日志的信息:

文件位置:默认存放位置为数据库文件所在目录下

文件的命名方式: 名称为hostname-bin.xxxxx (重启mysql一次将会自动生成一个新的binlog)

状态的查看:mysql> show variables like '%log_bin%';

mysql> show variables like '%log_bin%';

binlog配置:

1)生成的日志文件后缀则是6位数字的编码,从000001开始

log-bin = E:/log/logbin.log  

2)log_slave_updates
在replication部署方式下,slave是否将同步自master的updates写入自己的binlog,只在slave启用binlog时有意义。不可动态配置

3) max_binlog_cache_size
同写文件类似,binlog也是先写内核buffer然后在某个时机下才刷盘的。该配置项指明binlog内存cache的最大size,默认最小值为4096Bytes。可以动态配置,一旦修改,则立即对当前所有活跃会话(active sessions)生效。

 4) max_binlog_size
指定单个binlog文件的最大size,超过该值则关闭当前binlog文件并创建新的binlog以便后续写入。最小值为4096Bytes,最大值为1GB,默认也为1GB。可以动态配置

 5) sync_binlog
指定binlog刷盘的触发时机。若值大于0,则每sync_binlong次写binlog的操作会触发一次刷盘。若配为1,则每次写binlog操作都会刷盘,最大程度地保证了数据安全,但效率最低;实际生产环境中,需根据业务需求配置合理的阈值。可以动态配置

查看binlog:

1:使用mysql客户端查看binlog

(1)查看所有日志文件:

show binary logs;

(2)查看正在写入的日志文件:
show master status;

(3)查看当前binlog文件内容:

show binlog events;

(4)查看指定的binlog日志文件

show binlog events in 'mysql_bin.000001'

2:用mysql自带的工具mysqlbinlog

根据mysql文档,写binlog的时机是:sql语句或transaction执行完,但任何相关的locks还未释放或事务还未最终commit前。这样保证了binlog记录的操作时序与数据库实际的数据变更顺序一致。
可以通过mysqlbinlog工具查看binlog内容,在mysql安装目录下输入./bin/mysqlbinlog -?或--help可以看到其用法,这里不再赘述。

导出:

c:mysqlin>mysqlbinlog e:/log/logbin.000001 > e:/log/log.txt

">": 导入到文件中; ">>": 追加到文件中

如果有多个日志文件

c:mysqlin> mysqlbinlog e:/log/logbin.000001 > e:/log/log.sql
c:mysqlin> mysqlbinlog e:/log/logbin.000002 >> e:/log/log.sq

按指定位置导出:

c:mysqlin>mysqlbinlog --start-position=185 --stop-position=338 e:/log/logbin.000001 > e:/log/log3.txt

按指定时间导出:
c:mysqlin>mysqlbinlog --start-datetime="2010-01-07 11:25:56" --stop-datetime="2010-01-07 13:23:50" e:/log/logbin.000001 > e:/log/log_by_date22.txt

mysql删除binlog日志

1、设置日志保留时长expire_logs_days自动删除

#查看当前日志保存天数:
show variables like ‘%expire_logs_days%’;
#这个默认是0,也就是logs不过期,可通过设置全局的参数,使他临时生效:
set global expire_logs_days=7;
#设置了只保留7天BINLOG, 下次重启mysql这个参数默认会失败,所以需在my.cnf中设置  
expire_logs_days = 7  

2、手动删除BINLOG (purge binary logs)

#用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件 
PURGE {MASTER | BINARY} LOGS TO ‘log_name’  
PURGE {MASTER | BINARY} LOGS BEFORE ‘date’
 
#例如:
PURGE MASTER LOGS TO ‘mysql-bin.010′;  
PURGE MASTER LOGS BEFORE ‘2008-06-22 13:00:00′;  
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);

其它:
查看当前日志文件列表:show binary logs或是show master logs; 
使用binlog日志的目的是为了方便恢复数据,所以我们不光要会删除,还要会用日志来恢复数据。

2.启用新的日志文件,一般备份完数据库后执行

flush logs;

3: 清空现有的所用bin-log

reset master;

使用日志恢复数据的方法

mysqlbinlog -d test /root/mysql/mysql-bin.000001|mysql -uroot -ppassword  
  
#1、关于mysqlbinlog在mysql 5.0上的使用方法,可以参考:官方资料
#2、如果不知道log-bin存放的文件位置,可以使用下面的命令查看:
mysql -uroot -ppassword -e 'SHOW BINLOG EVENTS G'
 
#3、当只是需要恢复部分记录的时候,你可以使用时间点或位置点来定位,例如:  
mysqlbinlog --start-date="2005-04-20 9:01:00" --stop-date="2005-04-20 10:00:01" /var/log/mysql/bin.123456|mysql -uroot -ppassword[code]
 
#意思是恢复4月20日早上9点到10点这一段时间的数据。 
mysqlbinlog --start-position="368301" --stop-position="368312"/var/log/mysql/bin.123456| mysql -uroot -pmypwd
#意思是重做368301到368312位置点之间的操作。(位置点可以就是用mysqlbinlog看到的at xxx节点)

mysqlbinlog --start-date="2005-04-20 9:55:00" --stop-date="2005-04-20 10:05:00" /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
#同样的,如果只是想查看某段时间的操作,直接把它导到一个文件即可。

有关mysql中binlog日志的删除,以及恢复数据的方法,就介绍这些了,希望对大家有所帮助。

原文地址:https://www.cnblogs.com/Alight/p/4485375.html