您好,欢迎访问一九零五行业门户网

[MySQL 5.1 体验]MySQL 复制

作/译者:叶金荣(email: ),来源:http://imysql.cn mysql 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制。简言之,这种新技术就是关注表中发生变化的记录,而非以前 的照抄 binlog 模式。从 mysql 5.1.12 开始,可以用以下三种模式来实
作/译者:叶金荣(email: ),来源:http://imysql.cn
mysql 5.1 中,在复制方面的改进就是引进了新的复制技术:基于行的复制。简言之,这种新技术就是关注表中发生变化的记录,而非以前
的照抄 binlog 模式。从 mysql 5.1.12 开始,可以用以下三种模式来实现:基于sql语句的复制(statement-based replication, sbr),基于行的复制(row-based replication, rbr),混合模式复制(mixed-based replication, mbr)。相应地,binlog的格式也有三种:statement,row,mixed。mbr 模式中,sbr 模式是默认的。
在运行时可以动态低改变binlog的格式,除了以下几种情况:
存储过程或者触发器中间 启用了ndb 当前会话试用 rbr 模式,并且已打开了临时表 如果binlog采用了 mixed 模式,那么在以下几种情况下会自动将binlog的模式由 sbr 模式改成 rbr 模式。
当dml语句更新一个ndb表时 当函数中包含 uuid() 时 2个及以上包含 auto_increment 字段的表被更新时 行任何 insert delayed 语句时 用 udf 时 视图中必须要求使用 rbr 时,例如创建视图是使用了 uuid() 函数 设定主从复制模式的方法非常简单,只要在以前设定复制配置的基础上,再加一个参数:
binlog_format=statement
#binlog_format=row
#binlog_format=mixed

当然了,也可以在运行时动态修改binlog的格式。例如
mysql> set session binlog_format = 'statement';
mysql> set session binlog_format = 'row';
mysql> set session binlog_format = 'mixed';
mysql> set global binlog_format = 'statement';
mysql> set global binlog_format = 'row';
mysql> set global binlog_format = 'mixed';

现在来比较以下 sbr 和 rbr 2中模式各自的优缺点:
sbr 的优点:
历史悠久,技术成熟 binlog文件较小 binlog中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况 binlog可以用于实时的还原,而不仅仅用于复制 主从版本可以不一样,从服务器版本可以比主服务器版本高sbr 的缺点:
不是所有的update语句都能被复制,尤其是包含不确定操作的时候。 调用具有不确定因素的 udf 时复制也可能出问题 使用以下函数的语句也无法被复制:
* load_file()
* uuid()
* user()
* found_rows()
* sysdate() (除非启动时启用了 --sysdate-is-now 选项) insert ... select 会产生比 rbr 更多的行级锁 复制需要进行全表扫描(where 语句中没有使用到索引)的 update 时,需要比 rbr 请求更多的行级锁 对于有 auto_increment 字段的 innodb表而言,insert 语句会阻塞其他 insert 语句 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 rbr 模式下,只会对那个发生变化的记录产生影响 存储函数(不是存储过程)在被调用的同时也会执行一次 now() 函数,这个可以说是坏事也可能是好事 确定了的 udf 也需要在从服务器上执行 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错 执行复杂语句如果出错的话,会消耗更多资源rbr 的优点:
任何情况都可以被复制,这对复制来说是最安全可靠的 和其他大多数数据库系统的复制技术一样 多数情况下,从服务器上的表如果有主键的话,复制就会快了很多 复制以下几种语句时的行锁更少:
* insert ... select
* 包含 auto_increment 字段的 insert
* 没有附带条件或者并没有修改很多记录的 update 或 delete 语句 执行 insert,update,delete 语句时锁更少 从服务器上采用多线程来执行复制成为可能rbr 的缺点:
binlog 大了很多 复杂的回滚时 binlog 中会包含大量的数据 主服务器上执行 update 语句时,所有发生变化的记录都会写到 binlog 中,而 sbr 只会写一次,这会导致频繁发生 binlog 的并发写问题 udf 产生的大 blob 值会导致复制变慢 无法从 binlog 中看到都复制了写什么语句 当在非事务表上执行一段堆积的sql语句时,最好采用 sbr 模式,否则很容易导致主从服务器的数据不一致情况发生另外,针对系统库 mysql 里面的表发生变化时的处理规则如下:
如果是采用 insert,update,delete 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录 如果是采用 grant,revoke,set password 等管理语句来做的话,那么无论如何都采用 sbr 模式记录注:采用 rbr 模式后,能解决很多原先出现的主键重复问题。
其它类似信息

推荐信息