分类: Mysql/postgreSQL
2012-01-12 13:43:20
binary log,是mysql中一个非常重要的部分,其主要作用有两个:
本文简单介绍binary log的结构.
注:本文中,”binary log”是指整体,包括所有binlog文件和binlog index文件,而”binlog”,是指单独的某个二进制日志文件,”binlog index”,就是指二进制日志索引文件.
一.开启binary log功能
在my.cnf文件中添加:
log-bin是指定以后生成的各个binlog文件的前缀,在这里我们设为master-bin,因此以后生成的binlog文件将会是:
master-bin.000001 master-bin.000002 ......而log-bin-index则是指定binlog index文件的名称,这里我们设为master-bin.index.
二.Binary log的结构和组织
1.每个binlog记录的是一个个事件,是对数据库产生变动了的事件,例如一条update语句,而select语句一般不会写入binlog,因为它对数据库不产生变动.,在这里我们简称这些事件为”event”.注意不要和mysql的stored routines中的event混淆.
2.binlog index文件只有一个,它记录的是所有binlog的文件名称,引用”MySQL High Availability”中的图来表述各个binlog文件和binlog index文件之间的关系:
再实例查看一下,在某个存放了binlog文件的目录下:
[zhouminjun.pt@xxxx data]$ ls -l -rw-rw---- 1 zhouminjun.pt users 973 Aug 23 17:06 mysql-bin.000001 -rw-rw---- 1 zhouminjun.pt users 106 Aug 23 17:07 mysql-bin.000002 -rw-rw---- 1 zhouminjun.pt users 324 Aug 23 17:08 mysql-bin.000003 -rw-rw---- 1 zhouminjun.pt users 598 Aug 23 21:01 mysql-bin.000004 -rw-rw---- 1 zhouminjun.pt users 149 Aug 24 08:36 mysql-bin.000005 -rw-rw---- 1 zhouminjun.pt users 3249 Aug 24 13:25 mysql-bin.000006 -rw-rw---- 1 zhouminjun.pt users 114 Aug 24 08:36 mysql-bin.index [zhouminjun.pt@xxxx data]$ cat mysql-bin.index ./mysql-bin.000001 ./mysql-bin.000002 ./mysql-bin.000003 ./mysql-bin.000004 ./mysql-bin.000005 ./mysql-bin.000006可以看到,binlog index文件其实就是很简单的记录当前所有binlog的文件名,每行一个.当你使用”RESET MASTER”、”FLUSH LOGS”这类命令时,binlog index文件也会相应变动.
3.再看看binlog文件,binlog文件是二进制的,直接打开是不可阅读的.有两种方法阅读其中的内容:
a.在客户端中使用”show binlog events”查看:
可以看到,当前有两条event,下面解释下各个字段的意义:
Log_name:这个event所在的binlog名称.这里是在mysql-bin.000005
Pos:这个event在当前binlog中的位置
Event_type:这个event的类型,类型是有很多,当前这个是Format_desc类型
Server_id:这个event是在哪个server上发生的.注意在replication中,这个server id记录的是master端的server id.
End_log_pos:下一个event的位置.因此当前这个event的长度是End_log_pos-Pos.
Info:直观的可读的关于本条event的信息.
在刚才查看binlog的时候,里面有两条event,第一条类型是Format_desc,第二条是Rotate:
Format_desc:这是每一个binlog文件的头,是每一个binlog文件必有的第一个event,在这个event中,记录了一些诸如binary log格式版本,产生这个event的mysql server版本等等. Rotate:一般来说,这是每个binlog文件的结束event.有如下情况(我在5.1.49-debug-log上已测):这里有一点要说明的是,用show binlog events命令查看的永远是binlog index文件中的第一个binlog文件内容,一般来说是master-bin.000001文件,要查看其他binlog文件需要使用:
show binlog events in 'mysql-bin.000003';查看mysql目前正在写哪个binlog文件可以先执行”show master status\G;”查看.
b.使用mysql自带的工具mysqlbinlog,比如对于一个经历了正常启动,再正常关闭(mysqladmin shutdown)的binlog来说,用mysqlbinlog查看:
[zhouminjun.pt@xxxxx data]$ mysqlbinlog mysql-bin.000007 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #100825 19:19:30 server id 1 end_log_pos 106 Start: binlog v 4, server v 5.1.49-debug-log created 100825 19:19:30 at startup ROLLBACK/*!*/; BINLOG ' Qvx0TA8BAAAAZgAAAGoAAAAAAAQANS4xLjQ5LWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABC/HRMEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC '/*!*/; # at 106 #100825 19:20:12 server id 1 end_log_pos 125 Stop DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;用mysqlbinlog查看binlog可能比乱一点.但是能查看到更多的内容.
每个event都是以类似下面两行开始: