Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131366
  • 博文数量: 21
  • 博客积分: 576
  • 博客等级: 中士
  • 技术积分: 319
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-23 16:19
个人简介

没评论

文章分类

全部博文(21)

文章存档

2013年(1)

2012年(20)

我的朋友

分类: Mysql/postgreSQL

2012-04-27 19:26:45

二进制日志的作用:

    用于审计

    用于PITR(即时恢复)

    用于复制

Binlog日志记录了可能改变数据库的语句,包括那些潜在会改变数据库的语句。如drop table if existscreate table if not exists,带where子句但是没有匹配任何行的deleteupdate语句。

1.      Binlog日志结构

通常事务可以交错并行的执行,但是每个事务在binlog里的顺序取决于commit的时间。Binlog由一系列binlog文件和1binlog索引文件组成。每个binlog文件由一个4字节的magic number0xfe 0x62 0x69 0x6e )和一系列的binlog事件组成。每个binlog文件通常以格式描述事件开头,以日志轮换事件结束。但如果服务器被非正常停止情况下,文件末尾可能不是日志轮换事件。

2.      Binlog事件格式

Mysql5.0版本导入了新的binlog格式——binlog版本4,这里的讨论只基于这个版本。每个binlog事件由3个部分组成:通用头、提交头和事件体。

1) 通用头(common header

固定长度19字节,除非扩展了extra_headers。这是所有binlog事件都具有的信息,包含事件的基本信息,其中最重要的是事件类型和事件大小。

    Timestamp

4字节无符号整型。表示sql语句开始执行的时间,从1970UTC)开始,精确到秒。

    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,34)。

    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

记录语句运行的一些变量,如sqlmodecharsettime_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

 

阅读(1514) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~