MySQL5.6     主从复制的配置
 环境
操作系统:CentOS-6.6-x86_64
MySQL 版本:mysql-5.6.26.tar.gz
主节点 IP:192.168.31.57        主机名:edu-mysql-01
从节点 IP:192.168.31.59        主机名:edu-mysql-02
 
MySQL 主从复制官方文档
MySQL 主从复制(也称 A/B 复制)的原理
  1. Master 将数据改变记录到二进制日志(binary  log)中,也就是配置文件 log-bin 指定的文件,这些记录叫做二进制日志事件(binary  log  events);
  2. Slave 通过 I/O 线程读取 Master 中的 binary  log  events 并写入到它的 中继日志(relay  log);
  3. Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在 本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的 数据(数据重放)。
主从配置需要注意的点
  1. 主从服务器操作系统版本和位数一致;主从服务器的 hostname 不要一致。
  2. Master 和 Slave 数据库的版本要一致;
  3. Master 和 Slave 数据库中的数据要一致;
  4. Master 开启二进制日志,Master 和 Slave 的 server_id 在局域网内必 须唯一;
  5. Master 和 Slave  都创建数据库 mbank,表 testuser  ;
Master 配置
  1、Master(192.168.31.57)和 Slave(192.168.31.59) 注意:两台数据库服务器的的 selinux 都要 disable(永久关闭 selinux,请 修改/etc/selinux/config,将 SELINUX 改为 disabled)
  2、修改 Master 的配置文件
/etc/my.cnf [root@edu-mysql-01  ~]# vi  /etc/my.cnf
# 在 [mysqld] 中增加以下配置项
# 设置 server_id,一般设置为 IP
server_id=57
# 复制过滤:需要备份的数据库,输出 binlog
binlog-do-db=mbank
# 复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)
binlog-ignore-db=mysql
# 开启二进制日志功能,可以随便取,最好有含义
log-bin=edu-mysql-bin
# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断。
# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一 致
slave_skip_errors=1062
# 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true

  (如想了解以上参数的更多详细解析,可以直接百度参数名)

 2.1 复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:
  1. 在 Master 上过滤二进制日志中的事件;
  2. 在 Slave 上过滤中继日志中的事件。
2.2    MySQL 对于二进制日志 (binlog)的复制类型
  1. 基于语句的复制:在 Master 上执行的 SQL 语句,在 Slave 上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。一旦发现没法精 确复制时,会自动选着基于行的复制。
  2. 基于行的复制:把改变的内容复制到 Slave,而不是把命令在 Slave 上 执行一遍。从 MySQL5.0 开始支持。
  3. 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法 精确的复制时,就会采用基于行的复制。
 3、启动/重启 Master 数据库服务,登录数据库,创建数据同步用户,并授予相应的权限

[root@edu-mysql-01  ~]# service  mysql  restart
Shutting down MySQL..[ OK ] Starting MySQL..[ OK ]
[root@edu-mysql-01 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1
Server version: 5.6.26-log Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reser ved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input stat ement.
#创建数据同步用户,并授予相应的权限
mysql> grant replication slave, replication client on *.* to 'repl'@'192. 168.31.59' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
# 刷新授权表信息
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# 查看 MySQL 现在有哪些用户及对应的 IP 权限
mysql> select user,host from mysql.user;
# 查看 position 号,记下 position 号(从机上需要用到这个 position 号和现 在的日志文件)
mysql> show master status;
Master 重启后会修改 mysql-bin 文件名(序号加 1)   
 4、接下来处理 Slave(192.168.31.59),配置文件只需修改一项,其余配 置用命令来操作 
[root@edu-mysql-02  ~]# vi  /etc/my.cnf
## 在 [mysqld] 中增加以下配置项
# 设置 server_id,一般设置为 IP
server_id=59
# 复制过滤:需要备份的数据库,输出 binlog
binlog-do-db=mbank
#复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)
binlog-ignore-db=mysql
# 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用
log-bin=edu-mysql-slave1-bin
# 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size = 1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中 断。
# 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一 致
slave_skip_errors=1062
# relay_log 配置中继日志
relay_log=edu-mysql-relay-bin
# log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
log_slave_updates=1
# 防止改变数据(除了特殊的线程)
read_only=1

    如果 Slave 为其它 Slave 的 Master 时,必须设置 bin_log。在这里,我们 开启了二进制日志,而且显式的命名(默认名称为 hostname,但是,如果 h ostname 改变则会出现问题)。

relay_log 配置中继日志,log_slave_updates 表示 slave 将复制事件写进自 己的二进制日志。
当设置 log_slave_updates 时,你可以让 slave 扮演其它 slave 的 master。 此时,slave 把 SQL 线程执行的事件写进行自己的二进制日志 (binary  log), 然后,它的 slave 可以获取这些事件并执行它.
 
5、保存后重启 MySQL 服务,还原备份数据
[root@edu-mysql-02  ~]# service  mysql  restart
Shutting down MySQL..[ OK ] Starting MySQL..[ OK ]  
6、登录 Slave 数据库,添加相关参数
###Master 的 IP、端口、同步用户、密码、position 号、读取哪个日志文件
[root@edu-mysql-02  ~]# mysql  -uroot  -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3
Server version: 5.6.26-log Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights rese rved.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input stat ement.
mysql> change master to master_host='192.168.31.57', master_user=' repl', master_password='123456', master_port=3306, master_log_file=' edu-mysql-bin.000001', master_log_pos=429, master_connect_retry=3 0;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
上面执行的命令的解释:
master_host='192.168.31.57'                        ##  Master 的 IP 地址
master_user='repl'                 ## 用于同步数据的用户(在 Master 中授权的用户)
master_password='123456'                          ## 同步数据用户的密码
master_port=3306                   ##  Master 数据库服务的端口
master_log_file='edu-mysql-bin.000001'     ##指定 Slave 从哪个日志文 件开始读复制数据(可在 Master 上使用 show  master  status 查看到日志 文件名)
master_log_pos=429                                  ## 从哪个 POSITION 号开始读
master_connect_retry=30                          ##当重新建立主从连接时,如果连接 建立失败,间隔多久后重试。单位为秒,默认设置为 60 秒,同步延迟调优 参数。
 
 ## 查看主从同步状态 
mysql> show  slave  status\G;
可看到 Slave_IO_State 为空, Slave_IO_Running 和 Slave_SQL_Runnin g 是 No,表明 Slave 还没有开始复制过程。
 ## 开启主从同步
mysql> start  slave;
Query OK, 0 rows affected (0.00 sec)
## 再查看主从同步状态
mysql> show  slave  status\G;
 主要看以下两个参数,这两个参数如果是 Yes 就表示主从同步正常
Slave_IO_Running:  Yes Slave_SQL_Running:  Yes
由截图中的主从同步状态信息可以看出,我们配置的主从同步是正常的。
 可查看 master 和 slave 上线程的状态。在 master 上,可以看到 slave 的 I/O 线程创建的连接:
 Master  :  mysql> show  processlist\G;
  (1)row 为处理 slave 的 I/O 线程的连接。
  (2)row 为处理 MySQL 客户端连接线程。
  (3)row 为处理本地命令行的线程。
Slave  :
mysql> show  processlist\G;
   (1) row 为 I/O 线程状态。
   (2) row 为 SQL 线程状态。
     (3) row 为处理本地命令行的线程。
7、主从数据复制同步测试
(1) 在 Master 中的 mbank 库上变更数据的同步测试;
mysql> INSERT  INTO  `testuser`(`usercode`,`username`)  VALUES  (`1`, '同步测试 1'),(  `2`,'同步测试 2');
Master 中添加完之后,登录 Slave 中查看数据是否已同步。
8、测试过程中,如果遇到同步出错,可在 Slave 上重置主从复制设置(选 操作): 
mysql> reset  slave;
mysql> change master to master_host='192.168.31.57', master_user='repl',
master_password='123456', master_port=3306,
master_log_file='edu-mysql-bin.00000x', master_log_pos=xx, master_connect_retry=30;
(此时,master_log_file 和 master_log_pos 要在 Master 中用 show  master  status 命令查看)
 注意:如果在 Slave 没做只读控制的情况下,千万不要在 Slave 中手动插 入数据,那样数据就会不一致,主从就会断开,就需要重新配置了。
  上面所搭建的是单向复制的主从,也是用的比较多的,而双向主从其实 就是 Master 和 Slave 都开启日志功能,然后在 Master 执行授权用户
(这 里授权的是自己作为从服务器,也就是这里的 IP 地址是 Master 的 IP 地址), 然后再在 Master 上进行 chang  master 操作。 
基于局域网的 Master/Slave 机制在通常情况下已经可以满足“实时”备份 的要求了。如果延迟比较大,可以从以下几个因素进行排查:
  1. 网络延迟;
  2. Master 负载过高;
  3. Slave 负载过高;
  一般的做法是使用多台 Slave 来分摊读请求,再单独配置一台 Slave 只作 为备份用,不进行其他任何操作,就能相对最大限度地达到“实时”的要 求了。
我在部署的时候遇到的问题: 由于我的从服务器是主服务器复制过来的,mysql 的 server_id 一样,在同步的时候出错了:
Fatal error: The slave I/O thread stops because master and slave have equal MySQ L server UUIDs; these UUIDs must be different for replication to work.
 (1)首先检查:

mysql> show variables like ‘server_id';
+—————+——-+
| Variable_name | Value |
+—————+——-+
| server_id | 3 |
+—————+——-+
主从不能不一样。
 (2)如果还不行,继续排查。进入 mysql 的 data 目录,打开 auto.cnf 文件,里面记录了 数据库的 uuid,每个库的 uuid 应该是不一样的。
 [auto] 
server-uuid=6dcee5be-8cdb-11e2-9408-90e2ba2e2ea6
解决办法,按照这个 16 进制格式,随便改下,重启 mysql 即可。
 

MySQL5.6主从复制最佳实践的更多相关文章

  1. ASP.NET跨平台最佳实践

    前言 八年的坚持敌不过领导的固执,最终还是不得不阔别已经成为我第二语言的C#,转战Java阵营.有过短暂的失落和迷茫,但技术转型真的没有想象中那么难.回头审视,其实单从语言本身来看,C#确实比Java ...

  2. paip.mysql fulltext 全文搜索.最佳实践.

    paip.mysql fulltext 全文搜索.最佳实践.  作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blo ...

  3. mongodb 最佳实践

    MongoDB功能预览:http://pan.baidu.com/s/1k2UfW MongoDB在赶集网的应用:http://pan.baidu.com/s/1bngxgLp MongoDB在京东的 ...

  4. RDS最佳实践(一)—如何选择你的RDS

    在去年双11之前,为了帮助商家准备天猫双11的大促,让用户更好的使用RDS,把RDS的性能发挥到最佳,保障双11当天面对爆发性增加的压力,不会由于RDS的瓶颈导致系统出现问题,编写了 RDS的最佳实践 ...

  5. MySQL安装脚本最佳实践

    MySQL安装脚本最佳实践 2018年9月19日 17:01 #!/bin/bash   export host_ip=192.168.7.206   echo '#1.取master主机ip的后三位 ...

  6. 温习《PHP 核心技术与最佳实践》这本书

    再次看这本书,顺手提炼了一下大致目录,以便后续看见目录就知道大概讲的些什么内容 PHP 核心技术与最佳实践 1.面向对象思想的核心概念 1.1 面向对象的『形』与『本』 1.2 魔术方法的应用 1.2 ...

  7. ngx_lua应用最佳实践

    引子: 以下文字,是UPYUN系统开发工程师timebug在SegmentFault D-Day南京站技术沙龙上所做分享的内容要义提炼,主题为UPYUN系统开发团队在进行业务逻辑由C模块到ngx_lu ...

  8. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  9. MySQL 5.7安装最佳实践

    MySQL 5.7安装最佳实践 1.环境准备OS: CentOS Linux release 7.4.1708 (Core) for VMwareMySQL: mysql-5.7.24-linux-g ...

随机推荐

  1. 比特币初始版本VC6.0编译

    1 源码下载 github上初始版本是bitcoin-0.1.5,可以从https://github.com/bitcoin/bitcoin下载,但是从网上可以找到更老版本bitcoin-0.1.0, ...

  2. hexo搭建

    http://blog.csdn.net/gdutxiaoxu/article/details/53576018

  3. Final阶段基于spec评论作品

    组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶  刘佳瑞  公冶令鑫  杨磊  刘欣  张宇  卢帝同 一.测试目标:拉格朗日2018——飞词 1.开始界面,只有一个开始游戏按钮,简约且醒目     ...

  4. PAT 甲级 1022 Digital Library

    https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336 A Digital Library cont ...

  5. [转帖]DRAM芯片战争,跨越40年的生死搏杀

    DRAM芯片战争,跨越40年的生死搏杀 超级工程一览 ·2017-08-20 12:50·半导体行业观察 阅读:1.4万 来源:内容来自超级工程一览 , 谢谢. DRAM是动态随机存储器的意思,也就是 ...

  6. Delphi字符串转日期,强大到窒息,VarToDateTime解决了困扰很久的小问题

    procedure THRForm.Button1Click(Sender: TObject); var D:TDateTime; s:string; begin D:=VarToDateTime(' ...

  7. 页面用一个遮罩层显示加载,加载完后隐藏该div

    <div id="background" class="background" style="display: none; "> ...

  8. 【刷题】BZOJ 2134 单选错位

    Description Input n很大,为了避免读入耗时太多, 输入文件只有5个整数参数n, A, B, C, a1, 由上交的程序产生数列a. 下面给出pascal/C/C++的读入语句和产生序 ...

  9. 首先java中集合类主要有两大分支

    本文仅分析部分原理和集合类的特点,不分析源码,旨在对java的集合类有一个整体的认识,理解各个不同类的关联和区别,让大家在不同的环境下学会选择不同的类来处理. Java中的集合类包含的内容很多而且很重 ...

  10. Github Desktop 克隆仓库一直出现“Authentication failed”

    如图所示: 解决方法: 使用ssh链接下载而不是https