复制的核心步骤

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

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. React UI 组件库uiw v1.2.8 发布

    uiw 高品质的UI工具包,基于React 16+的组件库.

  2. dp百题大过关(第一场)

    好吧,这名字真是让我想起了某段被某教科书支配的历史.....各种DP题层出不穷,不过终于做完了orz 虽然各种手糊加乱搞,但还是要总结一下. T1 Monkey Banana Problem    这 ...

  3. Linux系列教程(十二)——Linux软件包管理之yum在线管理

    上一篇博客我们介绍了rpm包管理之rpm命令管理,我们发现在使用rpm命令手动安装rpm包的时候,会发现安装遇到到的依赖让你痛不欲生,安装一个rpm时会要先先安装某个依赖的rpm,而安装这个依赖的rp ...

  4. this 和 new 构造函数

    function people(name) {     这样定义是在全局命名空间(global namespace)    name: name,    sayname: function() {   ...

  5. Android-Async-Http 特性简单分析

    如下是官方文档描述此库的特点: All requests are made outside of your app’s main UI thread, but any callback logic w ...

  6. C#继承中的override(重写)与new(覆盖)用法

    刚接触C#编程,我也是被override与new搞得晕头转向.于是花了点时间翻资料,看博客,终于算小有领悟,把学习笔记记录于此. 首先声明一个父类Animal类,与继承Animal的两个子类Dog类与 ...

  7. 删除“自豪的采用wordpress”

    网上的都是老一套了,方法不对. 听我的~ 先进入wordpress的安装目录,比如我的是:cd /www/wwwroot/www.yangnan.tk然后再进入,我的主题是twentyseventee ...

  8. mysql存储过程分库分表

    -- 存储过程创建库  分为两条语句删除和创建DELIMITER $$USE myplan $$DROP PROCEDURE IF EXISTS createDBN $$CREATE PROCEDUR ...

  9. 记录一下通过分析Tomcat内部jar包找出request.getReader()所用的字符编码在哪里设置和起效的完整分析流程

    前言: 之前写Java服务端处理POST请求时遇到了请求体转换成字符流所用编码来源的疑惑,在doPost方法里通过request.getReader()获取的BufferedReader对象内部的 R ...

  10. nginx-http-concat资源文件合并模块

    网页中引入多个CSS和JS的时候,浏览器会发出很多(css个数+js个数)次网络请求,甚至有的网页中有数十个以上的CSS或JS文件,用户体验特别不好,正好可以利用nginx-http-concat n ...