没评论
分类: Mysql/postgreSQL
2012-04-27 19:26:45
• 用于审计
• 用于PITR(即时恢复)
• 用于复制
Binlog日志记录了可能改变数据库的语句,包括那些潜在会改变数据库的语句。如drop table if exists或create table if not exists,带where子句但是没有匹配任何行的delete和update语句。1. Binlog日志结构
通常事务可以交错并行的执行,但是每个事务在binlog里的顺序取决于commit的时间。Binlog由一系列binlog文件和1个binlog索引文件组成。每个binlog文件由一个4字节的magic number(0xfe 0x62 0x69 0x6e )和一系列的binlog事件组成。每个binlog文件通常以格式描述事件开头,以日志轮换事件结束。但如果服务器被非正常停止情况下,文件末尾可能不是日志轮换事件。
2. Binlog事件格式
Mysql5.0版本导入了新的binlog格式——binlog版本4,这里的讨论只基于这个版本。每个binlog事件由3个部分组成:通用头、提交头和事件体。
1) 通用头(common header)
固定长度19字节,除非扩展了extra_headers。这是所有binlog事件都具有的信息,包含事件的基本信息,其中最重要的是事件类型和事件大小。
• Timestamp
4字节无符号整型。表示sql语句开始执行的时间,从1970(UTC)开始,精确到秒。
• type
1字节枚举型。表示事件类型。1表示start_event_v3,2表示query_event,以此类推。
Binlog 中关于事件类型的描述在源代码/sql/log_event.h中,以下是其中关于事件类型的部分:
enum Log_event_type
{ UNKNOWN_EVENT= 0,
START_EVENT_V3= 1,
QUERY_EVENT= 2,
STOP_EVENT= 3,
ROTATE_EVENT= 4,
INTVAR_EVENT= 5,
……
• Server_id
4字节无符号整型。创建该事件的server id。
• Total_size
4字节无符号整型。该事件的总长度,单位为字节,包括通用头、提交头和事件体。一般事件长度都在1000字节以内,除了load data infile(它会包含导入的文件)。
• master_position
4字节无符号整型。表示master binlog中下个事件开始的位置。注意:Relay log中表示的也是在master binlog中的下个事件开始的位置。
• flags
2字节位阀。用来记录binlog文件是否正常关闭等信息。
• extra_headers
当前为空。用来扩展binlog格式时使用。长度为格式描述事件中的common_header_len-19。使用于除格式描述事件和日志轮换事件外的其它事件。
2) 提交头(post header)
提交头的格式和长度与特定的事件类型有关,但是同一事件类型其大小固定。
3) 事件体(event body)
最后是事件体,其大小可变,即使同一事件类型,大小也可能不一致。事件体大小在通用头中给出,它存储事件的主要数据,内容因事件类型不同而异。
3. 格式描述事件:
格式描述事件的作用是定义该文件中所有事件的格式,描述了binlog版本和服务器版本。
格式描述事件只有通用头和提交头:
• binlog_version
2字节整型。binlog版本(1,3或4)。
• server_version
50字节字符串。Mysql服务器版本。
• create
4字节无符号整型。表示事物开始的时间。一般为空。只有在第一个binlog文件中不为空,其值跟通用头的timestamp的值一样。所以目前只能用来判断当前binlog是不是第一个,除此之外别无它用。
• common_header_len
1字节整型。通用头长度。
• post_header_len
这是一个数组,它包含了所有事件类型(除了unkown_event之外)的提交头长度。一个字节对应一个事件类型。
4. 查询事件
记录所有改动数据库的语句的binlog,不记录基于行的复制的binlog。
以下为Query_log_event的提交头:
• slave_proxy_id
4字节无符号整型。用来区分不同客户端在发布sql时可能产生的本地临时表。
• exec_time
4字节无符号整型。表示查询开始执行到写入binlog的时间。
• db_len
1字节整型。当前数据库名的长度。
• error_code
2字节无符号整型。Master产生的error code。当master产生错误时,slave也会产生对应的错误,除了ER_DB_CREATE_EXISTS == 1007 和 ER_DB_DROP_EXISTS == 1008外。
• status_vars_len
2字节无符号整型。表示status_vars的长度。status_vars为事件体的一部分。
查询事件事件体包括3个部分:
• status variables
记录语句运行的一些变量,如sqlmode、charset和time_zone等等。
• Db
记录当前数据库名。其长度由提交头的db_len给出。
• Query
记录查询语句。
5. 日志轮换事件
当binlog文件大小超过限定时,自动产生一个日志轮换事件。其作用是告诉slave下一个binlog文件名以及下个事件的位置。
Rotate_log_event的提交头只包含一个部分:
• position
8字节整型。轮转到的binlog位置,即下个binlog日志文件中第一个事件开始位置。
其事件体也只包含一个内容——下个binlog文件的名字。
参考:1.
2. mysql 5.5.22 source
3.
MySQL_High_Availability_Tools_for_Building_Robust_Data