# bin log ## Introduce ### binary log构成 binary log由一系列描述数据库变动的事件构成,例如table creation操作或对table data进行的修改操作。 除上述对数据库造成修改的事件外,binary log中还包含`可能会潜在对数据库造成修改的statement`所对应的事件(例如一个没有匹配任何行的delete语句)。 binary log中还会包含每条statement更新数据所花费的时间。 ### binary log用途 binary log用途主要用于如下方面: - `for replication`:source replication server中的binary log提供了要发送给replicas的数据变动。source replication server会将binary log中包含的消息发送给replcias,replicas则是会重新执行这些变动。 - `for data recovery`:某些data recovery操作需要使用binary log。当backup被恢复后,需要对binary log中位于backup之后的时间进行重新执行操作 binary log不会记录`SELECT`或`SHOW`这些并不会对数据库数据进行修改的动作。如果想要对所有statement做记录,需要使用general query log。 在运行mysql server时开启binary log通常会令性能有所降低,但是能带来主从复制和数据恢复方面的好处。 binary log能兼容程序的意外中止,只有已完成的event或transaction才能记录到binary log或从binary log中read back。 写入binary log中的statement如果包含密码,密码将会被server重写,binary log中不会出现密码的明文。 ### binary log variable #### binlog_encryption binary log和relay log可以被加密,用于保护这些日志文件的数据安全。可以通过`binlog_encryption`变量来设置binary log是否被加密。 #### log_bin 通过`log_bin`可以设置binary log是否被启用,`log_bin`环境变量默认为`ON`,是启用的。 如果要在启动mysqld时禁用binary log,可以在`my.cnf`中指定`skip-log-bin`或`disable-log-bin`。 可以通过`--log-bin[=base_name]`来指定binary log file的base name。如果没有指定`--log-bin`选项,那么base name默认为`binlog`(binary log文件名为`binlog.xxxxx`。 mysqld会在base name之后追加数字将其作为binlog的文件名称,每次创建新的binlog文件时,数字都会递增。mysqld会在如下场景下创建新的binlog文件: - mysql server执行`start`或`restart`操作 - server对log进行`flush`操作 - 当前log大小达到`max_binlog_size`的大小 如果在事务中写入大量数据,那么binlog的大小可能会大于`max_binlog_size`,因为同一个事务中的event只会被记录到一个binlog中,不会写入到多个binlog中。