mysql 复制是基于binlog日志的,binlog日志中根据事件类型,事件以不同的格式被记录到二进制日志中,复制的格式由系统变量binlog_format控制,mysql支持三种格式的binlog日志格式设置,各有优缺点:如下
1.基于语句的格式 SBR
主库将sql语句文本记录到二进制日志,在从库上回放时执行sql语句
优点:
<1>技术成熟
<2>写入日志文件数据较少,节省存储空间
<3>日志文件中包含数据变更的原始语句,可用于数据库审计
缺点:
<1>一些执行结果不确定的DML语句,不能使用基于statement格式的复制,会造成主从库数据不一致
<2>UDF用户自定义函数和存储过程执行结果也不确定会导致主从数据不一致
<3>一些内置函数可能无法复制
<4>未使用索引的update语句需要进行全表扫描,基于语句的复制可能比基于行复制锁定的行数多
注意基于语句的复制在隔离级别为read-committed,执行DML操作报错
mysql> show global variables like '%isolation%';
+-----------------------+----------------+
| Variable_name | Value |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
| tx_isolation | READ-COMMITTED |
+-----------------------+----------------+
mysql> insert into test1(name) values('xxx');
ERROR 1665 (HY000): Cannot execute statement: impossible to write to binary log since
BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to
row-based logging. InnoDB is limited to row-logging when transaction isolation level
is READ COMMITTED or READ UNCOMMITTED.
mysql>
mysql>
mysql> exit;
2.基于行的复制 RBR
主库将产生的事件(每种DML操作对应一组事件)写入到二进制日志中,以事件来表示数据变更,将这些变更事件复制到从库并在从库引用这些事件
优点:
<1>可以正确复制所有数据变更,最安全的复制模式
<2>DML从库需要行锁可能更少(二进制日志记录的是逐行数据变更)
缺点:
<1>生成更多的二进制日志,每行变更都会写到日志,利用二进制日志进行备份恢复时间也就越长
<2>解析二进制日志看不到具体的sql语句(可以通过添加binlog_rows_query_log_events参数来记录原始的sql语句)
3.混合模式的格式(mixed)MBR
主库使用混合格式statement和row记录二进制日志,具体根据二进制日志内容,安全语句按照statement格式记录,不安全语句按照row格式记录
参考 1,2
注意:
使用row格式的二进制日志时,如果从库在更新非事务表时停止了复制线程,则从库可能发生数据不一致,非事务表数据无法
回滚,因此建议使用基于row复制时,所有的表都使用事务存储引擎innodb,在复制环境中关闭数据库前,最好先停止从库的
复制stop slave
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。