binary log是mysql中一个重要的部分,主要作用有两个:
Replication:在master端开启binary log后,log会记录所有数据库的改动,然后slave端获取这个Log文件内容就可以在slave端进行同样的操作。
备份:在某个时间点a做了一次备份,然后利用binary
log记录从这个时间点a后的所有数据库的改动,然后下一次还原的时候,利用时间点a的备份文件和这个binary
log文件,就可以将数据还原。
与binary log相关的参数如下:
log-bin和log-bin_index:指定log文件和索引文件的位置。
max_binlog_size: binary log最大的大小
binlog_cache_size: 当前的多少事务cache在内存中
binlog_cache_disk_use:当前有多少事务暂存在磁盘上的,如果这个值有数值的话,就应该要注意调优了。
max_binlog_cache_size: 最大能有多少事务cache在内存中
binlog_do_db和binlog_ingore_db:是一对控制对哪些数据库进行收集的选项。
sync_binlog:这个值控制cache的数据commit多少次才刷到磁盘上。默认是0,也就是让数据库自己决定同步的频率。如设置成1的话,则每commit一次就会将cache的数据同步到磁盘上,这样做最安全,但是性能最差。
log的控制命令:
手工切换log: flush logs
1
2
3
4
5
查看log文件:show binary logs, show master logs
重置log: reset master
删除部分日志: purge binary logs to 'log_name'|'date'
自动删除过期的日志,通过设置expire_logs_days来控制删除几天前的日志
另外binlog_format有三个选项,分别是statement,row,mixed,来控制产生binary
log的格式。
对于产生的binary log可以通过mysqlbinlog命令来将log的信息打印出来。
mysql> show variables like
'%format%';
-------------------------- -------------------
|
Variable_name |
Value |
-------------------------- -------------------
|
binlog_format |
ROW |
[root@rhel131 tmp]# mysqlbinlog /tmp/1.000001
;
;
;
DELIMITER ;
# at 4
#131018 23:31:26 server id 1 end_log_pos 120 CRC32 0x67b9d21f Start: binlog v
4, server v 5.6.13-log created 131018 23:31:26 at startup
# Warning: this binlog is either in use or was not
closed properly.
ROLLBACK;
BINLOG '
TlRhUg8BAAAAdAAAAHgAAAABAAQANS42LjEzLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABOVGFSEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAR/S
uWc=
';
DELIMITER ;
# End of log file
ROLLBACK ;
;
;
expire_logs_days该参数的理解
作者: 周博 日期:2011 年 11 月 15 日发表评论
用的mysql版本是percona的5.0.75今天发现之前10天得binlog依然保存,当天得binlog数据不足1000M,很奇怪为什么没有自动删除呢
expire_logs_days已经设置为2了。后来查了查文档,mysqld对于日志清理的操作是要log flushing
时候才会发生。但什么情况下才会触发log flushing呢有以下几种情况:
1 重启mysql
2 命令行输入
flush Logs
mysqladmin flush-logs,
mysqladmin refresh,
mysqldump –flush-logs,
mysqldump –master-data
3 满足max_binlog_size
当以上几个条件满足后会触发log
flushing操作,它会检查expire_logs_days这个动态参数(set global
expire_logs_days=1)
,对于不满足日志保留时间的会删除掉,并修改mysql-bin.index这个文件索引,关于这个保留时间可以强调一下,他保留的日志是当前天
expire_logs_days=N,简单点说也就是今天如果是15号,expire_logs_days设置为1,那么binlog保留的就是14号以及15号的日志。
产生的问题:针对这种原理的话就会有可能产生我目前遇到的情况,也就是如下图11-4号和11-15号的binlog并存,因为15号的binlog并没有到达max_binlog_size的上限所以没有触发log
flushing,所以只要手动运行flush logs就可以了,或者等到15号的日志到达上限设置的时候自动触发log
flushing.
-rw-rw---- 1 mysql mysql 591 Nov 4 10:28
a01-vimg-test-youku.000004-rw-rw---- 1 mysql mysql 1073741914 Nov 4
11:23 a01-vimg-test-youku.000005-rw-rw---- 1 mysql mysql 1073742237
Nov 4 11:30 a01-vimg-test-youku.000006-rw-rw---- 1 mysql mysql
1073742213 Nov 4 11:38 a01-vimg-test-youku.000007-rw-rw---- 1 mysql
mysql 1073742085 Nov 4 11:45
a01-vimg-test-youku.000008........-rw-rw---- 1 mysql mysql
1073741936 Nov 4 17:28 a01-vimg-test-youku.000050-rw-rw---- 1 mysql
mysql 950199177 Nov 15 10:20 a01-vimg-test-youku.000051$ mysql -e
"show variables like 'expire_logs_days';" ------------------
------- | Variable_name | Value | ------------------ ------- |
expire_logs_days | 2 | ------------------ ------- $ mysql -e "show
variables like 'max_binlog_size';" ----------------- ------------ |
Variable_name | Value | ----------------- ------------ |
max_binlog_size | 1073741824 | ----------------- ------------