mysql的复制是异步的,所以slave机器不是一直连接来接受master上的更新,在5.6版本支持半同步复制,在半同步中master在至少一个slave接收更新并写入中继日志返回确认信息后才会提交,5.6也支持延时复制,slave的机器故意的延时至少指定的时间来复制。5.6.5之后开始支持基于全局事务标识符的事务的复制,当使用这种方式的复制时候,不必直接的使用log 文件或这些文件中的位置,很大的简化了任务。
基于语句与基于行的复制的优势与劣势
基于语句的复制的优势:
1更少的数据写入日志文件
2日志文件中是语句,可以用来审计数据库
基于语句的复制的劣势:
1语句是不安全的,并不是所有的语句都能被复制,任何不确定的行为都是有风险的,例如:
依赖UDF的语句或存储过程
delete update没有加order by 的limit语句
使用下面函数的语句不能被安全的复制
-
SYSDATE()
(unless both the master and the slave are started with the--sysdate-is-now
option)
[Warning] Statement is not safe to log in statement format.insert ...select要求更多的行锁
对innodb,使用auto_increment的insert语句阻塞别的非冲突的insert语句
对复杂的语句,语句在slave上必须要被评估和执行,基于行的复制,slave只修改受影响的行,不执行全部的语句。
基于行复制的优势:
1所有的改变被复制
2在master上需要更少的锁
3在slave上对dml语句需要更少的行锁
基于行复制的劣势:
1可能产生更多需要被记录的数据,行复制写每个改变到二进制日志,如果语句改变了很多的行,基于行的复制可能写大量的数据到二进制日志中,也就是说备份和恢复要很多的时间。二进制日志会被锁很长的时间,可能引起并发的问题,使用binlog_row_image=minimal来明显的减少不利条件。
2不能再slave上看到语句,可以使用带--base64-output=DECODE-ROWS和--verbose选项的mysqlbinlog来查看数据的改变。
3使用MyISAM的行复制,并发插入是不被支持的。