MYSQL 主从复制---原理
复制的核心步骤
- 在主库上把数据更改记录到二进制日志(Binary Log)中;
- 备库将主库上的日志复制到自己的中继日志(Relay Log)中;
备库读取中继日志中的事件,将其重放到备库数据之上;
下图即MySQL复制如何工作的细节

第一步,在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
第二步,备库首先会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog
dump)线程,该线程会读取主库上二进制日志中的事件。它不会对事件进行轮询,只有它赶上主库时会进入睡眠状态,直到主库发送信号量,备库I/O线程会将接收到的事件记录到中继日志中。
第三步,备库的SQL线程从中继日志中读取事件并在备库执行,从而实现备库数据的更行。当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所以中继日志的开销很低。
配置复制
假设主库和备库拥有相同的初态,同时由于MySQL的向后兼容性,备库的版本不能低于主库版本。此时有服务器server1(192.168.0.1)和服务器server2(192.168.0.2)。
- 创建复制帐号
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.2' IDENTIFIED BY 'password';
- 1
- 1
在备库运行的I/O线程会建立一个到主库的TCP/IP连接,因此必须在主库创建一个用户并赋予合适的权限。
2. 配置主库和备库
假设主库是server1,在主库的my.ini或my.cnf文件中增加或修改以下内容:
log_bin = mysql-bin
# 注意每个服务器server_id应该互不相同
server_id = 1
必须明确指定一个唯一的服务器ID。如果之前没有在MySQL的配置文件中指定log-bin选项,就需要重新启动MySQL。通过下面命令确认二进制日志文件是否已经在主库上创建:
mysql> SHOW MASTER STATUS;
备库上也需要在my.ini或my.cnf中增加类似配置,并重启MySQL:
log_bin = mysql-bin
server_id = 2
# 指定中继日志的位置和命名
relay_log = /var/lib/mysql/mysql-relay-bin
# 允许备库将其重放的事件也记录到自身的二进制日志中
log_slave_updates = 1
read_only = 1
如果可能的话,最好使用read_only配置选项,该选项会阻止任何没有特权权限的线程修改数据。但read_only选项常常不是很实用,特别是对于那些需要在备库建表的应用。
3. 启动复制
接下来是告诉备库如何连接到主库并重放其二进制日志,我们使用CHANGE MASTER TO语句替代my.cnf中相应的设置:
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.1',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql_bin.000001',
-> MASTER_LOG_POS=0;
MASTER_LOG_FILE和MASTER_LOG_POS参数是主库中SHOW MASTER STATUS中显示的File和Position字段。两个参数必须保持与主库一致,这样才能保证读取二进制日志的位置相同。当执行完上述语句后,可以通过以下语句检查复制是否正确执行:
mysql> SHOW SLAVE STATUS\G
如果Slave_IO_State、Slave_IO_Running和Slave_SQL_Running显示当前备库复制未运行,则可能原因为:
- 网络连接问题(如防火墙阻止3306端口)
- 密码错误
- 权限设置问题
发生错误时可以通过查看mysql错误日志分析具体原因。如果Slave_IO_Running和Slave_SQL_Running都显示Yes则表明此时server1->server2的单向复制已成功开启。
结论
现在大家可以尝试在server1上进行编辑、插入、删除数据等操作并查看server2上的数据,从而测试MySQL复制是否配置成功。
如果想实现server1<–>server2的双向复制,只要用同样的方法将server1设置为server2的从服务器即可。
MYSQL 主从复制---原理的更多相关文章
- mysql 主从复制原理
主从形式 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主 ...
- [转]MySQL主从复制原理介绍
MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...
- Mysql主从复制原理及配置
Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...
- MySQL主从复制--原理
简介 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一 ...
- mysql 主从复制原理(转)
本文转自https://blog.csdn.net/php_younger/article/details/59673879 mysql 主从复制原理 主从形式 mysql主从复制 灵活 一主一从 ...
- 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?
如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...
- Mysql主从复制原理及搭建
## Mysql主从复制原理 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.对于多级复制,数据库服务器即可充当主机,也可充当从 ...
- mysql主从复制原理及实践
Mysql主从复制原理及实践 mysql主从框架 MySQL主从架构是MySQL集群中最基本也是最常用的一种架构部署,能够满足很多业务需求,常见的有一主一从或者一主多从.可以防止单一主机的 ...
- 深度探索MySQL主从复制原理
深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQ ...
- Mysql主从复制原理及同步延迟问题
本文转载自:Mysql主从复制原理及同步延迟问题 主从复制解决的问题 数据分布:通过复制将数据分布到不同地理位置 负载均衡:读写分离以及将读负载到多台从库 备份:可作为实时备份 高可用性:利用主主复制 ...
随机推荐
- 如何用Android Studio同时使用SVN和Git管理项目
这篇来讲讲如何在 Android Studio 上同时用 SVN 和 Git 来管理项目.我知道,你肯定会说我吃饱了撑着,没事找事做,为啥要同时用 SVN 和 Git 来管理项目.问题是,我也不想啊, ...
- 4本相见恨晚的Linux入门书籍
有读者问可否推荐一些 Linux 入门书籍,刚好在知乎也看到类似的问题,几个零碎的命令难以在 Linux 环境中存活,如果要真正形成自己的知识体系,还是要靠阅读专业书籍来积累.Linux 对后端开发是 ...
- MicroService.Core简易微服务框架《一、简介》
MicroService.Core MicroService.Core 的初衷是为了方便的创建一个微服务, 可作为 Windows Service 或者控制台模式启动. 它底层使用了 OWin 自托管 ...
- sed命令详解 vim高级技巧 shell编程上
第1章 sed命令详解 1.1 查找固定的某一行 1.1.1 awk命令方法 [root@znix ~]# awk '!/oldboy/' person.txt 102,zhangyao,CTO 10 ...
- easyui dialog 中嵌入html页面
最近使用easyui比较多,这个插件确实很好用.在使用时也遇到了大大小小的问题,好在都一一解决了. 记录一下今天遇到的问题. 目的:用easyui的dialog嵌入一个html页面(html中仍有要执 ...
- 远程连接SQL Server 2014遇到的问题和解决
在本机可以通过IP地址的数据库引擎登录数据库,可用同网段的其它电脑远程登录一直不成功.查看网上资料,认为是主机防火墙的问题. 在微软网站上查找相关的文档找到了答案.http://msdn.micros ...
- 简单类型对象 String
简单值不是对象,因此也没有属性方法,因此运行下面代码时 var s1 = “some text”; var s2 = s1.substring(2); 实际上是运行在read模式,字符串的值会 ...
- SpringAop源码情操陶冶-JdkDynamicAopProxy
承接前文SpringAop源码情操陶冶-AspectJAwareAdvisorAutoProxyCreator,本文在前文的基础上稍微简单的分析默认情况下的AOP代理,即JDK静态代理 JdkDyna ...
- CentOS卸载原有旧版OPENJDK并安装SUNJDK解决方案
PS:由于图片是安装后进行截图所以出现的是1.8版本,步骤是完全正确的. 一.检测JDK 首先你要打开终端,为避免可能出现的权限问题建议直接su进入root.(PS:密码可以输入但不显示) 然后输入j ...
- C# 中英文符号互转
/// 转全角的函数(SBC case) /// ///任意字符串 /// 全角字符串 /// ///全角空格为12288,半角空格为32 ///其他字符半角(33 ...