1.mysql的二进制日志文件

MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数据或有可能引起数据变更的MySQL语句。二进制日志(binary log)中记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间、执行时长、操作数据等其它额外信息,但是它不记录SELECT、SHOW等那些不修改数据的SQL语句。二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操作。

2.复制解决的问题

    1)改变数据的分布,将其迁移到不同的数据中心或者服务器

    2)进行负载均衡,复制可以将读操作分布到多个服务器上,实现对密集型应用的优化

    3)备份,可以通过复制的方式来备份数据

    4)高可用性和故障切换,复制能够帮助应用程序避免Mysql单点失败,一个包含复制的设计良好的故障切换系统能够显著的缩短宕机时间。

3.复制工作如何工作

1)在主库上把数据更改记录(就是会改变数据的sql)记录到到二进制日志文件中,这些记录被称为二进制日志事件(这个记录顺序是按照事务的提交顺序来记录的而不是每条语句的执行顺序来记录的)

2)备库将主库上的日志复制到自己的中继日志中

3)备库读取中继日志中的事件,将其放到备库数据之上

备库将主库的二进制日志复制到其本地的中继日志中,首先,备库会启动一个工作线程,称为I/O线程。I/O线程会跟主库建立一个普通的客户端连接,然后在主库上启动一个二进制转储线程,他会读取主库上二进制日志中的事件,他不会对事件进行轮询。如果该线程追赶上了主库那么它进入休眠状态,直到主库发送信号量通知其有新的事件产生,这是就会被唤醒,备库I/O线程会将接受到的事件记录到中继日志中。

备库的sql线程执行最后一步,该线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新。

其实可以这样理解,就是主库在对数据操作时会记录下自己都干了啥,写在了日志文件中,备库读取该文件到当前服务器,然后重新执行一遍主库数据库执行的操作,如果执行到了现在主库正在执行的日志的地方,说明更新就完成了或者复制完了。在这个过程中有个好处就是获取事件和重放事件解耦了,这两者是异步的过程,但是有个缺点就是在主库上并发运行的查询在备库上只能串行化,因为只有一个sql线程来重放中间日志中的事件。(主库和备库在刚开始是具有相同的数据的)

4.从另一个服务器开始复制

前面我们所说的复制都是假设两台服务器初始时的数据是完全一样的,并且知道当前主库的二进制日志。如果现在一台服务器还没有数据,那么复制就需要克隆数据到备库上:

主库复制数据,从另一台备库克隆数据,使用最近一次备份启动备库,需要三个条件来让主库和备库保持同步:

1)在某个时间点的主库的数据快照

2)主库当前的二进制日志文件,和获得数据快照时在该二进制日志文件中的偏移量,我们把这两个值称为日志文件坐标,通过这两个值可以定位二进制文日志的位置

3)从快照时间到现在的二进制日志

其它一些从别的服务器克隆备库的方法:

1)使用冷备份。关闭主库,将数据复制到备库,重启主库,使用新的二进制日志文件。在备库通过执行change master to指令指向新二进制日志文件的起始处。

缺点,复制数据时要关闭主库

2)热备份。在不关闭主库的情况下复制数据

3)使用mysqldump

4)使用快照或备份(需要知道生成快照后的二进制日志坐标)

5)使用另外的备库获得备份

5.复制的原理

1)基于语句的复制

基于语句的复制:就是从库(slave)基于产生变化的SQL语句从主库(master)进行复制。在MySQL5.1.4版本之前是binlog和复制唯一支持的模式,也是MySQL5.5中默认的格式。

(就是记录那些对数据造成更改的查询,当备库读取并重放这些事件的时候,实际上就是把主库上执行过的sql在执行一遍,省带宽。基于语句的复制过程基本上就是执行sql语句,如果正在使用触发器或者存储过程中,就不要使用基于语句的复制模式)

优点:

  • 久经考验,或者说是很成熟的技术,从MySQL3.23版本已经开始支持。
  • 更少的数据需要写入binlog文件中;当update,insert或者delete影响很多行时,它会占用很少的存储空间,同样也意味着当从备份中恢复会更快。

缺点:

  • sql语句没法被正确复制,例如使用了current_user()函数的语句,存储过程和触发器在使用基于语句的复制模式时可能也存在问题。 
  • 更新是串行的。
  • 基于语句的复制的语句,数据是不安全的。不是所有可能修改数据的语句都可以通过基于语句的复制而进行安全,无误差的复制。一些不确定的因素或者说行为导致很难通过基于语句进行复制

2)基于行的复制

基于行的复制:基于行的复制不复制SQL语句,而是将插入,删除或更新操作的各行进行复制。master的binlog记录的是各个表中行的变化。这种方式会将实际数据记录在二进制日志文件中

优点:

  •  任何情况都可以被复制,这对复制来说是最安全可靠的
  • 和其他大多数数据库系统的复制技术一样
  •  多数情况下,从服务器上的表如果有主键的话,复制就会快了很多

缺点:

  • binlog 大了很多
  •  复杂的回滚时 binlog 中会包含大量的数据
  • 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
  • 无法从 binlog 中看到都复制了些什么语句