二进制日志记录对数据库修改的语句。它还可能包括一些可能对数据库修改的语句(例如:delete数据where匹配为空),除非使用ROW记录格式。二进制日志还记录每条语句执行花费的时间。

一、二进制日志介绍

1.1、二进制日志记录的内容

1、二进制日志记录事件的格式

2、事件发生的日期和时间

3、服务器标识

4、结束的位置 end_log_pos

5、事件类型

6、执行时的线程ID

7、语句的时间戳与写入二进制文件中的时间差

8、错误代码

9、事件内容

1.2、二进制日志管理

1、mysqld将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名称。每次服务器创建一个新的日志文件时,该编号都会增加,从而创建一系列有序的文件。

2、要跟踪哪些二进制日志文件已被使用, mysqld还会创建一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。

3、您可以使用该RESET MASTER语句或其子集删除所有二进制日志文件 PURGE BINARY LOGS。

1.3、数据库mysql的记录日志

MySQL服务中的mysql数据库,记录了服务的管理信息。对mysql数据库中有关权限信息的表格的修改分为两类:直接修改(insert,update,delete)和间接修改(grant\revoke等)。有关权限表修改的语句二进制记录方式规则如下:

MySQL根据binlog_format设置,记录直接修改的语句;这涉及到语句,如 INSERT, UPDATE, DELETE, REPLACE, DO, LOAD DATA INFILE,SELECT,和 TRUNCATE TABLE。

MySQL不管binlog_format设置为何,都以语句(statements)方式记录间接修改的语句。这涉及语句,例如 GRANT, REVOKE, SET PASSWORD, RENAME USER, CREATE(所有形式的除外 CREATE TABLE ... SELECT), ALTER(所有形式的),和DROP(各种形式)。

CREATE TABLE … SELECT是数据定义和数据操作的组合。该CREATE TABLE 部分是利用语句格式记录,且 SELECT部分是根据的值记录binlog_format。

1.4、二进制日志功能性说明

1、运行启用二进制日志记录的服务器会使性能稍微降低。但是,二进制日志的优势使您能够设置复制和恢复操作,这通常会超过此次要的性能下降。

2、二进制日志通常对意外暂停具有弹性,因为只有完整的事务被记录或回读。

3、写入二进制日志的语句中的密码(服务管理)被服务器重写,不会以纯文本形式出现。

4、具有该SUPER 特权的客户端可以通过使用SET sql_log_bin=0语句禁用其自己的语句的二进制日志记录。

5、默认情况下,服务器记录事件的长度以及事件本身,并使用它来验证事件写入是否正确。您还可以通过设置binlog_checksum系统变量,使服务器为事件写入校验和 。

6、记录在二进制日志中的事件的格式取决于二进制日志记录格式。支持三种格式类型,基于行的日志记录,基于语句的日志记录和混合基日志记录。

7、服务器以–binlog-do-db与–binlog-ignore-db设置二进制日志过滤。

8、二进制日志记录发生在语句或事务完成后,而不是任何锁定被释放或者任何提交完成之前。这可以确保日志按提交顺序进行记录。

9、非事务表的更新在执行后立即存储在二进制日志中。

10、二进制日志格式有一些已知的限制,可能会影响从备份恢复。

11、默认情况下,二进制日志在每次write(sync_binlog=1)时同步到磁盘。

12、在解析二进制日志时,以下系统变量的会话值将写入二进制日志并由复制从属服务器执行:

Sql_mode(除了 NO_DIR_IN_CREATE不复制模式;请参见 第16.4.1.38节“复制和变量”)

foreign_key_checks

unique_checks

character_set_client

collation_connection

collation_database

collation_server

sql_auto_is_null

二、MySQL 二进制日志参数说明

2.1、二进制日志设置参数列表

log_bin

是否开启二进制日志;设置二进制日志的存储文件

binlog_format

二进制日志模式

binlog_cache_size

高速缓存的大小,用于在事务处理期间更改二进制日志。

max_binlog_cache_size

BinLog 能够使用的最大cache 内存大小

max_binlog_size

二进制日志文件最大SIZE

sync_binlog

二进制日志同步方式

binlog-do-db

二进制日志记录的数据库

binlog-ignore-db

二进制日志忽略的数据库

expire_logs_days

二进制日志过期天数

log_slave_updates

Slave SQL_THREAD 操作写入日志

2.2、log_bin 开启二进制日志

配置文件中设置log_bin参数为二进制日志文件名;Mysql实例会根据log_bin参数开启二进制日志;并设置二进制文件名为log_bin_basename,设置log_bin_index参数。

2.3、binlog_format 日志模式

MySQL 服务有三种日志模式,这是一个很重要的设置;请参考下面文档链接:

2.4、binlog_cache_size 每个客户端日志缓存大小

高速缓存的大小,用于在事务处理期间更改二进制日志。如果服务器支持任何事务性存储引擎,并且服务器启用了二进制日志(–log-bin选项),则为每个客户端分配一个二进制日志高速缓存。如果您经常使用大型事务,则可以增加此缓存大小以获得更好的性能。

2.5、max_binlog_cache_size 最大日志缓存大小

Binlog能够使用的最大cache内存大小。

当执行多语句事务时,max_binlog_cache_size 如果不够大,系统可能会报出“Multi-statement transaction required more than ‘max_binlog_cache_size’ bytes of storage”的错误。

2.6、max_binlog_size 二进制文件大小

二进制日志文件最大SIZE

2.7、sync_binlog 二进制日志同步到磁盘设置

在将二进制日志同步到磁盘之前,控制要收集的二进制日志提交组的数量。

二进制日志同步的方式;影响到二进制日志记录的性能和二进制日志记录数据的完整性。

参数说明:

sync_binlog=0;当事务提交之后,MySQL 不做fsync 之类的磁盘同步指令刷新binlog_cache 中的信息到磁盘,而让Filesystem 自行决定什么时候来做同步,或者cache 满了之后才同步到磁盘。

sync_binlog=1;所有事务在提交之前都会同步到二进制日志中。因此,即使意外重启,二进制日志中缺少的任何事务也只能处于准备状态。

sync_binlog>1;事务将被提交而不被同步到磁盘。因此,如果发生电源故障或操作系统崩溃,服务器可能会提交一些未被同步到二进制日志的事务

2.8、binlog-do-db 指定数据库

哪些数据库的二进制日志会记录到二进制日志中。

2.9、binlog-ignore-db 忽略的数据库

忽略指定的数据库的修改操作记录二进制日志。

2.10、expire_logs_days 日志过期设置

默认值为0,表示二进制日志永远不过期

补充:binlog-do-db和binlog-ignore-db 在使用时,应当注意他们的实现过程。

Mysql服务判断数据更改的操作是否要记录日志,并没有那么智能和完善。

正常情况下时,是根据“选择数据库”(use dbname)操作来确定修改操作是否要记录的。其中根据binlog_format的类型不同还会存在差别。

非正常的情况:如果没有“选择数据库”(use dbname)或者“选择A数据库,更改B数据库数据”;这种情况下,就会造成数据修改操作在日志中丢失的情况。

三、主从同步注意点

默认情况下,Slave服务不会将从Master服务接收到的任何数据修改写入其自己的二进制日志。要记录这些修改,请设置–log-slave-updates参数。

slave实例配置–log-bin选项也只会记录slave实例自己的数据修改操作。

3.1、log_slave_updates default OFF

slave数据库实例从master实例读取到的修改记录写入到中继日志;然后在slave实例中执行更新;最后写入到slave实例中二进制日志中。

1、log_slave_updates 选项没有开启,就不会执行最后的操作。

2、log_slave_updates 选项开启后,就会执行上面的最后操作。

3、为了使这个选项有效,从站也必须使用–log-bin选项来启动二进制日志记录。