MySQL-主从复制原理

复制原理

  • Mysql主库在事务提交的时候会把数据库变更为事件Events记录在二进制文件binlog中,主库上的sys_binlog控制binlog日志刷新到磁盘。
  • 主库推送二进制文件binlog中的事件到从库的中继日志relay.log,之后从库根据中继日志重做数据库变更。以此来达到数据一致。
  • Mysql通过3个线程来完成主从库之间的数据复制:其中BinLog Dump线程跑在主库上,I/O线程和SQl线程跑在从库上。当从库启动复制(start slave)时,首先创建I/O线程连接主库,主库随后创建Binlog Dump线程读取数据库事件并发给I/O线程,I/O线程获取到数据库事件更新到从库的中继日志Realy log中去,之后从库上的SQl线程读取中继日志relay log 中更新的数据库事件并应用。

MySQL binlog格式

binlog的格式也有三种:STATEMENT、ROW、MIXED - STATMENT模式:基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog中。 - - 优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。 - - 缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题) - ROW模式:不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。 - - 优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。 - - 缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。 - MIXED模式:以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。

复制的常见架构

Mysql如何查看binlog日志内容


-- 只查看第一个binlog文件的内容 show binlog events; -- 查看指定binlog文件的内容 show binlog events in 'mysql-bin.000002'; -- 查看当前正在写入的binlog文件 show master status\G -- 获取binlog文件列表 show binary logs;

如何使用mysqlbinlog工具


mysqlbinlog --start-datetime='2016-08-02 00:00:00' --stop-datetime='2016-08-03 23:01:01' -d hadoop /var/lib/mysql/mysql-bin.000001
鲁ICP备16017569号-2