您的位置:首页 > 其它

replication format(日志记录格式)

2015-04-20 15:05 148 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: