在mysql5.6复制中,binlog的记录格式有3种:
基于语句的格式(statement)--默认方式
基于行的格式(row)
混合格式( mixed)
1.基于语句的复制(binlog_format = statement)
日志中的记录都是已sql语句的形式记录,备机中在进行应用日志的时候,相当于在数据库中重新执行一遍语句。
优点:
2.基于行的复制(binlog_format = row)
日志中的直接记录相关表中行的变更信息。
优点:
3.混合模式
默认采用statement的方式记录日志,当遇到一下情况时会切换到row方式记录日志
指定日志记录格式,修改/etc/my.cnf中添加
1.基于语句:binlog_format = statement
2.基于行记录:binlog_format = row
3.混合模式:binlog_format = mixed
参考文档: http://dev.mysql.com/doc/refman/5.6/en/replication-formats.html
基于语句的格式(statement)--默认方式
基于行的格式(row)
混合格式( mixed)
1.基于语句的复制(binlog_format = statement)
日志中的记录都是已sql语句的形式记录,备机中在进行应用日志的时候,相当于在数据库中重新执行一遍语句。
优点:
- 记录的日志量少
- 由于日志中记录了sql语句,因此可以用来对数据库进行审计工作
- 在自定义的函数和存储过程中,如果结果集不是确定性的(nondeterministic),在主节点和备节点调用的过程中可能会造成结果不一致
- 如果使用未包含order by的排序分页(limit)修改删除操作,可能会造成主备节点数据不一致
- 相关的系统函数无法正常的运行LOAD_FILE()、UUID()、UUID_SHORT()、USER()、FOUND_ROWS()、SYSDATE() (unless both the master and the slave are started with the --sysdate-is-now option)、GET_LOCK()、IS_FREE_LOCK()、IS_USED_LOCK()、MASTER_POS_WAIT()、RAND()、RELEASE_LOCK()、SLEEP()、VERSION()
- 语句会比基于行的格式占用更多的锁
- 批量sql语句执行的时候可能会比基于行的格式执行效率满(因为sql语句必须全部重新执行一般,而基于行的格式只需要记录更改行就行)
2.基于行的复制(binlog_format = row)
日志中的直接记录相关表中行的变更信息。
优点:
- 记录了数据库中的更改信息,是最安全的记录方式
- 比基于语句的格式需求的数据库锁更少(提高数据库的并发)
- 由于日志是按照行的更改来进行记录,所以记录的日志量会比基于statement的要大
- 确定性结果集的UDF如果包含大数据格式,记录的日志量也会比基于statement 的要大
- 无法通过日志来确定数据更改是通过哪儿条语句执行的,因此无法审计
- 对于MyISAM存储引擎而言,insert语句没有基于statement的并发性好
3.混合模式
默认采用statement的方式记录日志,当遇到一下情况时会切换到row方式记录日志
- 使用函数uuid(),found_rows(),row_count(),user(),current_user(),current_user,load_file()
- 调用表中的auto_increment列
- 视图下面的基表可能调用row格式记录
- 在非事务表中执行insert delayed
- 在使用临时表的会话中使用基于row的方式(注:mysql会将该会话中的子语句标记为unsafe,直到该会话涉及到的临时表删除。row格式不记录临时表的日志信息)
指定日志记录格式,修改/etc/my.cnf中添加
1.基于语句:binlog_format = statement
2.基于行记录:binlog_format = row
3.混合模式:binlog_format = mixed
参考文档: http://dev.mysql.com/doc/refman/5.6/en/replication-formats.html