复制的核心步骤

  1. 在主库上把数据更改记录到二进制日志(Binary Log)中;
  2. 备库将主库上的日志复制到自己的中继日志(Relay Log)中;
  3. 备库读取中继日志中的事件,将其重放到备库数据之上;

    下图即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)。

  1. 创建复制帐号
  1. 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文件中增加或修改以下内容:

  1. log_bin = mysql-bin
  2. # 注意每个服务器server_id应该互不相同
  3. server_id = 1

必须明确指定一个唯一的服务器ID。如果之前没有在MySQL的配置文件中指定log-bin选项,就需要重新启动MySQL。通过下面命令确认二进制日志文件是否已经在主库上创建:

  1. mysql> SHOW MASTER STATUS;

备库上也需要在my.ini或my.cnf中增加类似配置,并重启MySQL:

  1. log_bin = mysql-bin
  2. server_id = 2
  3. # 指定中继日志的位置和命名
  4. relay_log = /var/lib/mysql/mysql-relay-bin
  5. # 允许备库将其重放的事件也记录到自身的二进制日志中
  6. log_slave_updates = 1
  7. read_only = 1

如果可能的话,最好使用read_only配置选项,该选项会阻止任何没有特权权限的线程修改数据。但read_only选项常常不是很实用,特别是对于那些需要在备库建表的应用。
3. 启动复制
接下来是告诉备库如何连接到主库并重放其二进制日志,我们使用CHANGE MASTER TO语句替代my.cnf中相应的设置:

  1. mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.1',
  2. -> MASTER_USER='repl',
  3. -> MASTER_PASSWORD='password',
  4. -> MASTER_LOG_FILE='mysql_bin.000001',
  5. -> MASTER_LOG_POS=0;

MASTER_LOG_FILEMASTER_LOG_POS参数是主库中SHOW MASTER STATUS中显示的FilePosition字段。两个参数必须保持与主库一致,这样才能保证读取二进制日志的位置相同。当执行完上述语句后,可以通过以下语句检查复制是否正确执行:

  1. mysql> SHOW SLAVE STATUS\G

如果Slave_IO_StateSlave_IO_RunningSlave_SQL_Running显示当前备库复制未运行,则可能原因为:

  1. 网络连接问题(如防火墙阻止3306端口)
  2. 密码错误
  3. 权限设置问题

发生错误时可以通过查看mysql错误日志分析具体原因。如果Slave_IO_RunningSlave_SQL_Running都显示Yes则表明此时server1->server2的单向复制已成功开启。

结论

现在大家可以尝试在server1上进行编辑、插入、删除数据等操作并查看server2上的数据,从而测试MySQL复制是否配置成功。
如果想实现server1<–>server2的双向复制,只要用同样的方法将server1设置为server2的从服务器即可。

MYSQL 主从复制---原理的更多相关文章

  1. mysql 主从复制原理

    主从形式   mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制---     用途及条件   mysql主 ...

  2. [转]MySQL主从复制原理介绍

    MySQL主从复制原理介绍 一.复制的原理 MySQL 复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新.删除等等).每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新,以 ...

  3. Mysql主从复制原理及配置

    Mysql主从复制原理及配置 1.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其 ...

  4. MySQL主从复制--原理

    简介 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一 ...

  5. mysql 主从复制原理(转)

    本文转自https://blog.csdn.net/php_younger/article/details/59673879 mysql 主从复制原理 主从形式   mysql主从复制 灵活 一主一从 ...

  6. 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?

    如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...

  7. Mysql主从复制原理及搭建

    ## Mysql主从复制原理 主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.对于多级复制,数据库服务器即可充当主机,也可充当从 ...

  8. mysql主从复制原理及实践

    Mysql主从复制原理及实践 mysql主从框架       MySQL主从架构是MySQL集群中最基本也是最常用的一种架构部署,能够满足很多业务需求,常见的有一主一从或者一主多从.可以防止单一主机的 ...

  9. 深度探索MySQL主从复制原理

    深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQ ...

  10. Mysql主从复制原理及同步延迟问题

    本文转载自:Mysql主从复制原理及同步延迟问题 主从复制解决的问题 数据分布:通过复制将数据分布到不同地理位置 负载均衡:读写分离以及将读负载到多台从库 备份:可作为实时备份 高可用性:利用主主复制 ...

随机推荐

  1. LeetCode 442. Find All Duplicates in an Array (在数组中找到所有的重复项)

    Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others ...

  2. 67、django之模型层(model)--查询补充及mookie

    本篇导航: F查询与Q查询 cookie 一.F查询与Q查询 1.以Book表为例 class Book(models.Model) : title = models.CharField(max_le ...

  3. 用BroadcastReceiver监听手机网络状态变化

    android--解决方案--用BroadcastReceiver监听手机网络状态变化 标签: android网络状态监听方案 2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报 ...

  4. TiDB 作为 MySQL Slave 实现实时数据同步

    由于 TiDB 本身兼容绝大多数的 MySQL 语法,所以对于绝大多数业务来说,最安全的切换数据库方式就是将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方,这样对业务方实现完全没有侵入性 ...

  5. Ionic3 遇到的一些错误-Error: Cannot find module 'reflect-metadata'

    E:\Projects\ionic\myApp5>ionic serve Error: Cannot find module 'reflect-metadata' 解决方法: npm insta ...

  6. R学习笔记 第五篇:数据变换和清理

    在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用 ...

  7. Lua5.3 注册表 _G _ENV

    Lua5.3 注册表 _G _ENV 来源:http://blog.csdn.net/murisly/article/details/46518551 注册表的描述,借用PIL中的一段话: regis ...

  8. JS是按值传递还是按引用传递?【转载】

    最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?” 在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference). ...

  9. 分享如何将git项目导入GitHub(附创建分支)

    前言:我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了. 一:下载git 下载链接git链接,根据自 ...

  10. unity下跨平台excel读写

    这是以前写的跨windows和ios读写excel的工具,因为原来导表工具引用的第三方读写excel的dll只能在windos下使用,造成要在mac机器上跑PC端或者打包的时候,每次都要先在windo ...