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
基于语句的格式(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
相关文章推荐
- apache不记录指定格式元素的日志
- 不记录制定格式文件类型日志
- [转]使用NLog记录日志到数据库 自定义日志表的数据格式
- PHP记录和读取JSON格式日志文件
- PHP记录和读取JSON格式日志文件
- nginx日志格式记录
- Nginx 和 Apache 日志记录格式设置
- 统一日志的记录格式,用宏调用printf
- nginx日志切割,日志格式,静态文件不记录日志,配置缓存
- IIS W3C格式日志中记录的字段及说明
- 统一日志的记录格式,用宏调用printf
- 服务器接口调用日志文件记录(有格式)
- PHP记录和读取JSON格式日志文件
- nginx的日志格式记录真实客户端IP
- apache日志不记录指定格式元素的日志
- 使用Log4j来记录日志-PatternLayout和格式修饰符
- 自定义nginx日志记录格式
- Nginx和Apache配置日志格式记录Cookie
- apache访问日志开启百度蜘蛛访问记录格式并设置按天记录
- apache 定义日志格式 及日志记录