二进制日志(binlog)
一、简介
二进制日志(binlog)记录了数据库中所有的DDL和DML(除select语句)操作,语句以“事件”的形式保存,记录了数据库的更改变化,在主从复制和数据恢复中起着重要的作用。但要注意的一点是,只有成功执行了的事件才会记录在二进制日志中,未执行成功的不会保存在二进制日志中。
二、格式
mysql二进制日志有三种格式:statement、row、mixed。
该参数控制二进制日志文件的格式,可选格式有:
1. STATEMENT:日志中记录的是执行的SQL语句,日志量小,但是复制会出现主从不一致的情况
2. ROW:日志记录每一行数据的变化,日志量大,好处是主从复制数据不会出现不一致的情况,推荐使用这种方式
3. MIXED:结合STATEMENT和ROW的日志格式。
1、statement
基于段的格式 binlog_format=STATEMENT
这是mysql5.7之前默认的二进制日志格式
记录的是mysql执行的sql语句
优点:
日志记录量相对较小,节约磁盘及网络I/O
缺点:
必须要记录上下文信息,保证在从服务器上执行结果和主服务器上相同
对一些非确定性函数无法进行正确复制,比如UUID(), user()等
可能造成mysql复制的主备服务器数据不一致
2、row
基于行的日志格式 binlog_format=ROW
记录的是增删改查的数据行信息
优点:
使mysql主从复制更加安全
对每一行数据的修改比基于段的复制高效
由于误操作修改数据库信息,且没有备库可恢复时,可通过对日志文件数据操作反向处理恢复数据
缺点:
记录日志量较大
binlog_row_image =[FULL|MINIMAL|NOBLOB]
3、mixed
混合日志格式 binlog_format=MIXED
特点:
根据sql语句由系统决定在基于段和基于行的日志格式中进行选择
三、参数设置
1. log_bin: 该参数控制binlog文件存放的位置
2. binlog_format:该参数控制二进制日志文件的格式,具体格式上文已经提及。
3. expire_logs_days:该参数控制二进制日志保留天数,过了指定的天数后,日志将会自动删除。
4. max_binlog_size:该参数控制二进制日志文件的大小。
当日志文件达到该参数指定的大小时,就会创建新的二进制日志文件。不过,实际上二进制日志文件可能会超过该值,比如当二进制日志快要写满时,执行一个超大事物,由于事物特性决定相关事件必须连续,这种情况下,事件必须写到同一个日志文件,就会出现日志大于 max_binlog_size值的现象。该参数默认为1073741824 即(1GB).可以通过该性质判断是否有大事务。
5. sync_binlog
该参数控制二进制日志刷新到磁盘的频率,单位为秒(s)。(双一之一)