Mysql之面试连环问:Mysql主从是如何复制的?Mysql复制模式有哪几种?他们分别有哪些区别?

Mysql主从是如何复制的:
Master将数据改变记录到⼆进制⽇志(binary log)中,也就是配置⽂件log-bin指定的⽂件,这些记录叫做⼆进制⽇志事件(binarylog events).
Slave通过I/O线程读取Master中的binary log events并写⼊到它的中继⽇志(relay log),Slave重做中继⽇志中的事件,把中继⽇志中的事件信息⼀条⼀条
的在本地执⾏⼀次,完成数据在本地的存储,从⽽实现将改变反映到它⾃⼰的数据(数据重放),如图:
在这里插入图片描述其中需要注意的是:
dump过程是push还是pull⽅式
⽤户提交对数据的修改,然后Master(主库)把所有数据库变更写进Binary Log(⼆进制⽇志),主库通过Binlog Dump线程把⼆进制⽇志内容推送给Slave(从库),从库被动接收数据,不是主动去获取,除⾮是新建连接
slave为甚么要⽤多个线程来处理数据同步,⼀个线程不可以吗?
实现获取时间和重放时间的解耦每⼀对主从关系中,都有三个线程。主库可以连接多个从库,⽽且会为每⼀个连接成功的从库创建⼀个BinlogDump线程;从库也可以连接多个主库(多源复制),⽽且会为每⼀个连接成功的主库创建⾃⼰的I/O线程和SQL线程。从库使⽤两个线程分别将主库的⼆进制⽇志读取到本地,并应⽤这些⽇志以实现主从之间的数据同步。因此,即便SQL线程执⾏语句缓慢,也不会影响I/O线程读取⽇志的速度(正常情况下,I/O线程不会成为性能瓶颈,除⾮⽹络出现问题)。如果SQL线程已经应⽤完所有的中继⽇志,就表明I/O线程已经获取了主库中所有的⼆进制⽇志。

关于中继⽇志
从服务器 I/O 线程将主服务器的 Binlog ⽇志读取过来,解析到各类 Events 之后记录到从服务器本地⽂件,这个⽂件就被称为 relay log。然后 SQL 线程会读取 relay log ⽇志的内容并应⽤到从服务器,从⽽使从服务器和主服务器的数据保持⼀致。中继⽇志充当缓冲区,这样 master 就不必等slave 执⾏完成才发送下⼀个事件。

Mysql复制模式有哪几种,有哪些区别

我们可以根据其优缺点来回答。

首先有row,statement,mixed三种。
row的优缺点
优势:
可以正确复制所有数据的变更,这是最安全的复制格式
劣势:
⽣成更多的⼆进制⽇志数据,因为基于row的复制会将每⾏数据的变更都写⼊⼆进制⽇志。利⽤⼆进制⽇志进⾏备份和恢复的时间也会更⻓。此外,⼆进制⽇志的⽂件锁也会因为需要更⻓的时间来写⼊数据⽽被持有更久的时间,这可能会影响数据库的并发能⽆法直接看到从库中执⾏的语句,但是可以使⽤mysqlbinlog⼯具。
基于statement的优劣势?
优势:
写⼊⽇志⽂件的数据较少。当更新或删除操作涉及多⾏时,可以⼤⼤减少存储空间,在利⽤⼆进制⽇志备份与恢复数据时也可以快速完成。
⽇志⽂件中包含所有的数据变更的原始语句,可⽤于数据库审计。
劣势:
⼀些执⾏结果不确定的DML语句,不能使⽤基于statement的复制,否则可能会造成主从库的数据不⼀致DML语句中,使⽤不带ORDER BY的LIMIT⼦句时,由于在主从库之间执⾏的排序结果可能不同,所以执⾏结果是不
确定的使⽤statement格式的⽇志时,⼀些内置的函数⽆法正确复制,如下:
LOAD_FILE()
UUID()
UUID_SHORT()
USER()
FOUND_ROWS()
SYSDATE()(主库和从库都使⽤–sysdate-is-now选项启动时适⽤)
GET_LOCK()
IS_FREE_LOCK()
IS_USED_LOCK()
MASTER_POS_WAIT()
RAND()
RELEASE_LOCK()
SLEEP()
VERSION()

关于mixed其就是对于上述两种方法进行混合使用。

看完以上,其次还有

关于安全与不安全数据复制

什么情况下是不安全复制:
“安全”是指是否可以使⽤基于statement的格式(这⾥指的是在⼆进制⽇志⽂件中实际记录的内容为statement格式,不是指设置系统变binlog_format = statement)正确复制语句,如果能正确复制,则认为语句是安全的,否则就认为是不安全的
Mysql对不安全执⾏的处理
使⽤mixed格式的⽇志时,被视为不安全的语句在记录到⼆进制⽇志时会⾃动转换为row格式,被视为安全的语句在记录到⼆进制⽇志时会使statement格式使⽤statement格式的⽇志时,对标记为不安全的语句会⽣成警告,甚⾄拒绝执⾏,被标记安全的语句则被正常记录。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工藤学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值