复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步.MySQL可以从一台主库同时向多台从库进行复制,从库同时也可以作为其他从库的主库,实现链式复制。
MySQL复制的优点:
-
<李>主库故障,可以快速切换至从库提供服务,李>
<李>在从库执行查询操作,降低主库的访问压力;李>
<李>在从库执行备份,避免备份期间对主库影响;李>
<强> MySQL复制原理强>
1, MySQL主库在事务提交时会把数据变更作为事件事件记录在Binlog中,主库上的sync_binlog参数控制Binlog日志刷新到磁盘;
2,主库推送Binlog中的事件到从库的中继日志,之后从库根据中继日志进行重做,通过逻辑复制来达到主从库的数据一致。
MySQL通过3个线程来完成主从库间的数据复制:其中Binlog转储线程运行在主库上,I/O线程和SQL线程运行在从库上。当在从库启动复制(开始奴隶)时,首先创建I/O线程连接主库,主库随后创建Binlog转储线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志中,之后从库上的SQL线程读取中继日志中更新的数据库事件并应用,
如下图所示:
mysql>显示processlist \ G; * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * * Id: 3 用户:根 主持人:10.24.33.187:54194 db:零 睡眠命令: 时间:176年 状态: 信息:零 * * * * * * * * * * * * * * * * * * * * * * * * * * * 2。行* * * * * * * * * * * * * * * * * * * * * * * * * * * Id: 4 用户:根 主持人:10.24.33.187:54195 db:零 睡眠命令: 时间:176年 状态: 信息:零 * * * * * * * * * * * * * * * * * * * * * * * * * * * 3。行* * * * * * * * * * * * * * * * * * * * * * * * * * * Id: 8 用户:根 主持人:localhost db:测试 查询命令: 时间:0 状态:开始 信息:显示processlist * * * * * * * * * * * * * * * * * * * * * * * * * * * 4。行* * * * * * * * * * * * * * * * * * * * * * * * * * * Id: 12 用户:repl 主持人:dsz884.hcg.homecredit.net: 39731 db:零 命令:Binlog转储——Binlog转储线程 时间:87年 状态:主人已经把所有binlog奴隶;等待更多的更新,由此可见,以“推”送的方式同步 信息:零 4行集(0.00秒) 错误: 没有指定查询
查看备库:
mysql>显示processlist \ G; * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * * Id: 1 用户:系统用户 主持人: db:零 命令:连接 时间:4427年 状态:等待主人发送事件 信息:零 * * * * * * * * * * * * * * * * * * * * * * * * * * * 2。行* * * * * * * * * * * * * * * * * * * * * * * * * * * Id: 2 用户:系统用户 主持人: db:零 命令:连接 时间:2044年 状态:奴隶已经阅读所有中继日志;等待更多的更新 信息:空
由此可见,MySQL复制是异步的,从库和主库存在一定的延时。
<强>复制相关的日志强>
1, BinlogBinlog会记录mysql中所有的数据修改操作,可以通过如下方式查看Binlog的格式,对应有三种,分别为声明,行和混合:
mysql>显示变量如“% binlog_format %”; + - - - - - - - - - - - - - - - - - - - - - - - - - + | | Variable_name |值 + - - - - - - - - - - - - - - - - - - - - - - - - - + | | binlog_format |行 + - - - - - - - - - - - - - - - - - - - - - - - - - + 1行集(0.00秒)
2,继电器LogRelay日志的文件格式,内容和Binlog一样,唯一区别是从库上的SQL线程执行完当前日志中继电器的事件后,SQL线程会自动删除该中继日志,从而释放空间,为保证从库事故重启后,从库的I/O线程和SQL线程仍能知道从哪里开始复制,从库默认会创建两个日志文件master.info和relay-log.info来保存复制的进度,这两个文件分别记录了从库的I/O线程当前读取主库Binlog的进度和SQL线程应用继电器日志的进度。