bin log只会记录数据库更改的所有操作,即便操作没有对数据库产生变化也会记录。

bin log主要有以下三个作用:

  • 恢复:通过bin log可以将数据恢复到过去的某个时刻。
  • 复制:通过复制和执行bin log使一台远程的MySQL数据库与令一台MySQL数据库进行实时同步。
  • 审计:可以通过bin log中的信息进行审计,判断是否有对数据库进行注入的攻击。

bin log默认是不开启的,需要手动指定参数启动。

在my.inf主配置文件中直接添加三行即可开启bin log:

//第一个参数是打开binlog日志
log_bin=ON
//第二个参数是binlog日志的基本文件名,后面会追加标识来表示每一个文件
log_bin_basename=/var/lib/mysql/mysql-bin
//第三个参数指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
log_bin_index=/var/lib/mysql/mysql-bin.index

//5.7及以上版本的话,重启mysql服务会报错,必须还要指定一个参数
server-id=123454

配置文件中的其他参数:

  • max_binlog_size:指定bin log文件的最大值,如果超过该值则产生新的bin log文件,后缀+1,并记录到.index文件。
  • binlog_cache_size:当使用InnoDB存储引擎时,所有未提交的bin log会被记录到一个缓存中,等该事务提交时会直接将缓存中的bin log写入bin log文件,该缓存的大小由binlog_cache_size控制,默认为32KB。
  • sync_binlog:默认bin log先写入缓存等提交事务再写入磁盘,当数据库所在操作系统宕机时会导致最后一部分数据没有写入bin log文件。sync_binlog=1表示采用同步写磁盘的方式,不适用缓存;sync_binlog=0是默认值,使用缓存。推荐设置成sync_binlog=1,但即便这样还会有个问题,bin log同步写入磁盘后,提交事务之前发生宕机,那么下次启动时事务被回滚,但是bin log已经记录了该事务,不能被回滚。这个问题可以通过参数innodb_support_xa设为1来解决,可以确保bin log和InnoDB存储引擎数据文件同步。
  • binlog-do-db:表示记录指定数据库的bin log,默认全部记录。
  • binlog-ignore-db:表示不记录指定数据库的bin log。
  • log-slave-update:表示将会从master数据库获得bin log写入到slave数据库。
  • binlog_format:可设置值为STATEMENT、ROW、MIXED
  • STATEMENT:记录逻辑SQL语句。在复制的情况下,如果在主服务器运行rand、uuid等函数或触发器等操作会造成主从服务器上表数据不一致。
  • ROW:记录表的更改情况。解决了STATEMENT格式在复制情况下数据不一致的问题。
  • MIXED:STATEMENT和ROW的混合格式,默认采用STATEMENT格式,在以下情况会使用ROW格式:
  1. 表的存储引擎为NDB
  2. 使用了临时表
  3. 使用了用户定义函数(UDF)
  4. 使用了INSERT DELAY 语句
  5. 使用了uuid()、user()、current_user()、found_rows()、row_count()等不确定函数。

注意:ROW格式记录的数据会远远大于STATEMENT格式记录的数据。