binlog是mysql的日志工具,binlog日志可以记录insert、update、delete的sql和操作时间。因为log数据是二进制格式的,所以称为binary log,即binlog。


文章目录

  • binlog是什么
  • binlog有什么用
  • binlog的3种录入格式



binlog是什么

binlog在MySQL的server层产生,不属于任何引擎,主要记录用户对数据库操作的SQL语句(除了查询语句)。之所以将binlog称为归档日志,是因为binlog不会像redo log一样擦掉之前的记录循环写,而是一直记录(超过有效期才会被清理),如果超过单日志的最大值(默认1G,可以通过变量 max_binlog_size 设置),则会新起一个文件继续记录。但由于日志可能是基于事务来记录的(如InnoDB表类型),而事务是绝对不可能也不应该跨文件记录的,如果正好binlog日志文件达到了最大值但事务还没有提交则不会切换新的文件记录,而是继续增大日志,所以 max_binlog_size 指定的值和实际的binlog日志大小不一定相等。

正是由于binlog有归档的作用,所以binlog主要用作主从同步和数据库基于时间点的还原


binlog有什么用

  1. 排查数据问题
    比如线上出现了莫名其妙的数据,就可以通过binlog来查询是什么sql导致了这个数据问题。
  2. 当数据丢失时,可以恢复数据
    当某段时间的数据丢失时,可以按照时间查询binlog日志,从而按照binlog恢复数据。
  3. 做主从同步用
    从库读取主库的binlog,来做主从同步。

binlog的3种录入格式

有三种格式,statement,row和mixed

  1. statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。
  2. row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
  3. mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。