replication format(日志记录格式)

来源:互联网 发布:淘宝返现软件哪个好 编辑:程序博客网 时间:2024/05/15 16:50
在mysql5.6复制中,binlog的记录格式有3种:
基于语句的格式(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格式不记录临时表的日志信息)
safe语句使用statement方式记录日志,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
















































0 0