MySQL复制优点,原理详解

  

复制是将主数据库的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复制优点,原理详解“> <br/>
  </p>
  <p>查看主库:</p>
  
  <pre类=   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线程应用继电器日志的进度。

MySQL复制优点,原理详解