主从同步,本质是利用数据库日志,将主库数据复制一份到从库,本质上是使用了数据复制技术。

本文概要

  1. 主库的基本配置
  2. 从库的基本配置
  3. 完全同步的步骤
  4. 注意事项
  5. 工作原理

1. 主库的基本配置

做两件事:启用日志(记录数据库操作),赋予从库复制权限。配置如下:

  1. 启用日志:
# sync_binlog=1 #默认为0,当 sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。 #当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
log_bin=mysql-bin #打开日志,并指定日志基本名称。
log_bin_index=mysql-bin.index
log_bin_trust_function_creators=1
expire_logs_days = 3
  1. 给予从库复制权限

    (不同的主机,配置不同的用户名,以区分。如slave95,m95m96,或者采用统一用户名,如下所示:)
mysql> grant replication slave on *.* to 'slave'@'%' identified by 'dd@2016';
mysql> flush privileges;

2. 从库的基本配置

做两件事:启用(中继)日志,指定从库从主库某个文件(某个位置)复制日志。

  1. 启用(中继)日志
#log-bin=mysql-bin #从库用不上
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
skip-slave-start #防止复制随着mysql启动而自动启动
slave-skip-errors=all
relay_log_info_repository = TABLE
master_info_repository = TABLE
relay_log_recovery = 1
log_bin_trust_function_creators=1
slave-net-timeout = 60 #默认值3600.意味着没有得到更多数据之后slave等待时间
expire_logs_days = 3
read-only=1 #可选项,做读写分离时,可配置 replicate_wild_do_table=datacenter.% #告诉从服务器线程限制复制更新的表匹配指定的数据库和表名模式的语句。
replicate_wild_do_table=kettle.%
  1. 指定从库从主库某个文件(某个位置)复制日志
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.100.104',
MASTER_PORT=3306,
MASTER_USER='slave',
MASTER_PASSWORD='dd@2016',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=839;

3. 完全同步的步骤

主库

  1. 进行锁表,防止数据写入

    使用命令:
mysql> flush tables with read lock;

2.备份数据

mysqldump -uroot -p -B kettle datacenter|gzip>/ddhome/data.sql.gz

3.查看master 状态,解开锁表功能

mysql> show master status;
mysql> unlock tables;

4.把mysql备份文件传到从库机器,进行数据恢复

scp mysql.bak.sql root@192.168.128.11:/tmp/

从库

  1. 停止从库的状态
mysql> stop slave;
  1. 导入数据
mysql -uroot -p  </tmp/mysql.bak.sql
or
mysql> source /tmp/mysql.bak.sql
  1. 设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项
change master to master_host = '10.130.254.13', master_user = 'slave', master_port=3306, master_password='dd@2016', master_log_file = 'mysql-bin.000104', master_log_pos=481224382;
  1. 重新开启从同步
mysql> start slave;
  1. 查看同步状态
mysql> show slave status\G

查看:(参考:mysql主从复制搭建中几种log和pos详解 - 学无涯,愈进而愈惘 - CSDN博客)

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0 Master_Log_File: mysql-bin.000125
Read_Master_Log_Pos: 947053504 #从库IO线程读取主库日志的位置
Relay_Log_File: slave-relay-bin.000064
Relay_Log_Pos: 947053667 #从库IO线程写入本地日志
Relay_Master_Log_File: mysql-bin.000125
Exec_Master_Log_Pos: 947053504 #从库sql线程执行到哪里

简单来讲就是从库先通过io线程读取主库的二进制文件(Master_Log_File)和位置(Read_Master_Log_Pos)然后缓存到本地(从库服务器)的中继文件(Relay_Log_File)中并记录已经读取到的位置(Relay_Log_Pos),再通过从库的sql线程去读取中继文件(Relay_Log_File),这个sql线程执行会记录已经执行到了哪个文件(Relay_Master_Log_File)和哪个位置(Exec_Master_Log_Pos)。

4. 注意事项

  1. 从库每次都要手动start slave,不能自动启动。如果是双主热备时,则自动启动;

  2. 在Slave上使用 replicate_wild_do_table 和 replicate_wild_ignore_table 来解决跨库更新的问题

5. 工作原理

  1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)。
  2. Slave将Master的日志拷贝到自己的中继日志(relay log)中。
  3. Slave重新执行中继日志中的事件并放到自己的数据库中。

MySQL复制的缺点

MySQL的复制(replication)功能让人且爱且恨。MySQL复制配置简单,深受开发人员的喜欢,基于复制的读写分离方案也非常流行。而MySQL数据库高可用大多也是基于复制技术,但是MySQL复制本身依然存在部分缺陷,最为主要的问题如下:

  • 数据丢失问题(consistency)
  • 数据同步延迟问题(delay)
  • 扩展性问题(scalability)

    从MySQL 5.7的lossless semi-sync replication已经解决了数据丢失的问题,MySQL 5.7的multi-thread slave也解决了数据同步延迟的问题,MySQL 5.7的Group replication也扩展性问题。

参考文献


tips:本文属于自己学习和实践过程的记录,很多图和文字都粘贴自网上文章,没有注明引用请包涵!如有任何问题请留言或邮件通知,我会及时回复。

Mysql 5.6主从同步配置的更多相关文章

  1. 基于 CentOS Mysql 安装与主从同步配置详解

    CentOS Mysql 安装 Mysql (Master/Slave) 主从同步 1.为什么要使用主从同步 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操 ...

  2. Mysql 5.6主从同步配置与解决方案

    主库IP:192.168.1.10 从库IP:192.168.1.11 centos的mysql配置文件在:/etc/my.cnf 1.主库配置编辑my.cnf: # 启用二进制日志 log_bin ...

  3. Windows下的 mysql 5.5主从同步配置

    环境说明:   Master:127.0.0.1 3306 Slave:127.0.0.1 3307     MySQL 的 Master 配置:   配置my.ini:   [mysqld]   # ...

  4. Docker Mysql数据库主从同步配置方法

    一.背景 最近在做内部平台架构上的部署调整,顺便玩了一下数据库的主从同步,特此记录一下操作- 二.具体操作 1.先建立数据存放目录(-/test/mysql_test/) --mysql --mast ...

  5. mysql主从同步配置(windows环境)

    mysql主从同步配置(mysql5.5,windows环境)   A主机(作为主服务器)环境:windows8.mysql5.5 ip:192.168.1.100(自己填) B主机(作为从服务器,由 ...

  6. Docker Mysql主从同步配置搭建

    Docker Mysql主从同步配置搭建 建立目录 在虚拟机中建立目录,例如路径/home/mysql/master/data,目录结构如下: Linux中 新建文件夹命令:mkdir 文件夹名 返回 ...

  7. MySQL数据库的主从同步复制配置

    一.主从同步机制原理 MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态), ...

  8. Linux下MySQL数据库主从同步配置

    说明: 操作系统:CentOS 5.x 64位 MySQL数据库版本:mysql-5.5.35 MySQL主服务器:192.168.21.128 MySQL从服务器:192.168.21.129 准备 ...

  9. centos:mysql主从同步配置(2018)

    centos:mysql主从同步配置(2018) https://blog.csdn.net/liubo_2016/article/details/82379115 主服务器:10.1.1.144; ...

随机推荐

  1. 论文阅读及复现 | Effective Neural Solution for Multi-Criteria Word Segmentation

    主要思想 这篇文章主要是利用多个标准进行中文分词,和之前复旦的那篇文章比,它的方法更简洁,不需要复杂的结构,但比之前的方法更有效. 方法 堆叠的LSTM,最上层是CRF. 最底层是字符集的Bi-LST ...

  2. Linux正则表达式扩展部分第一波深度实践详解

    扩展的正则表达式(Extended Regular  Expressions): 使用的命令:grep -E 以及 egrep [了解即可] 1)+ 表示重复”一个或一个以上“ 前面的字符(*是0或多 ...

  3. C# PC版微信消息监听自动回复

    最近有个微商客户需要搞个 个人微信监听群消息关键字并实现自动回复功能, 因为他有很多群  很多买家咨询的话 一个个回复太麻烦, 客户要求 比如群里有人发 关键字 产品1  则自动回复产品1的相关描述 ...

  4. 迭代器iterator和traits编程技法

    前言 这段时间研读SGI-STL-v2.91源码,并提炼核心代码自己实现一遍,感觉受益颇深.觉得有必要写一些文章记录下学习过程的思考,行文旨在总结,会大量参考侯捷<STL源码剖析>的内容. ...

  5. 二叉树(Java实现)

    一.常见用语 1.逻辑结构:描述数据之间逻辑上的相关关系.分为线性结构(如,字符串),和非线性结构(如,树,图). 2.物理结构:描述数据的存储结构,分为顺序结构(如,数组)和链式结构. 3.结点的度 ...

  6. P1062 数列 题解

    (题目为啥要强调用十进制输出呢,明明就是故意提醒) 分析一下样例 k=3k=3时,数列为:1,3,4,9,10,12,13..1,3,4,9,10,12,13.. 转换成三进制就是:1,10,11,1 ...

  7. ffmpeg AVFrame结构体及其相关函数

    0. 简介 AVFrame中存储的是原始数据(例如视频的YUV, RGB, 音频的PCM), 此外还包含了一些相关的信息, 例如: 解码的时候存储了宏块类型表, QP表, 运动矢量等数据. 编码的时候 ...

  8. Ruby Rails学习中:调试信息和 Rails 的三种环境,Users 资源,调试器,Gravatar 头像和侧边栏

    注册 一.调试信息和 Rails 环境 现在咱们要实现的用户资料页面是我们这个应用中第一个真正意义上的动态页面.虽然视图的代码不会动态改变, 不过每个用户资料页面显示的内容却是从数据库中读取的.添加动 ...

  9. pb SendMessage

    PB发送和接收消息send SendMessage 1.用PB自带的SEND函数发送消息 传字符:Send(Handle(w_main),1600,0,'dfdfd') 传LONG:Send(Hand ...

  10. 遗传算法与Java代码简单实现

    参阅地址: https://www.jianshu.com/p/ae5157c26af9 代码实现: public class GA { private int ChrNum = 10; //染色体数 ...