第16章、复制

查看服务器环境

主从两台MySQL服务器均使用以下环境。

shell > lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.3.1611 (Core) 
Release:        7.3.1611
Codename:       Core

查看MySQL版本

shell > mysql -u root -p
// 服务器 A
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 128
Server version: 5.7.18-log MySQL Community Server (GPL)
// 服务器 B
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.19-log MySQL Community Server (GPL)

观察到服务器版本略有差异,应用在生产环境时最好将MySQL的版本保持一致。最不济也要保证前两位(5.7)版本保持一致,不要出现主(5.7)从(5.1)这种跨版本的情况。

设置复制主机配置

要配置主机以使用基于二进制日志文件位置的复制,您必须启用二进制日志记录并建立唯一的服务器ID

shell > service mysqld stop

关闭 mysqld 服务 并 编辑 my.cnf ,配置 server-id 时需要注意:此ID用于标识组内的各个服务器,并且必须为1到(2 32)-1 之间的正整数。

[mysqld]
log-bin             = mysql-bin
server-id           = 1 
read-only           = 0         # 主库读写都可以
binlog-do-db        = test      # 需要备份的库,多个库写多行
binlog-ignore-db    = mysql     # 无需备份的库,多个库写多行

注意:test 库是一个新库。采用新库的目的是避免主从库的结构、数据的不同导致主从复制失败。实际在生产环境下,主从库结构数据同步这步是漏不掉的。

创建用户进行复制

任何一个已被授予 REPLICATION SLAVE 权限的用户都可以连接到主机并执行复制操作。可以专门为为每个从机创建复制帐户,也可以多个从机使用一个帐户。但需要注意的是仅授予其复制过程中需要的权限(白名单原则),以减少因此引入的危害。

[mysql] > CREATE USER 'repl'@'slave-ip-address' IDENTIFIED BY 'slave-password';
[mysql] > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'slave-ip-address';

需要注意: slave-ip-address 表示 从机服务器的ip地址; slave-password 表示 从机新用户的密码;

复制主二进制日志坐标

MySQL [(none)]> use mysql;
MySQL [mysql]> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000016 |      154 | test         |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

生成数据快照

使用mysqldump创建数据快照。当主库与从库之间信息不对等时,可以在启动复制之前先将主库数据导入到从库。

mysqldump -u root -p --databases test --master-data > dbdump.db
  • --databases test表示只选择 test 库
  • --ignore-table 选项排除数据库中的所有表 。
  • 更多信息可以参考链接:选择数据快照的方法

设置复制从站

[mysqld]
server-id           = 2 

要注意 server-id与其它主机或从机均不同。修改完需要重启mysqld。可以不启用该从机的二进制日志功能,除非它需要作为其它从机的主机。

在从站上设置主站配置

要设置从站与主站进行通信以进行复制,请使用必要的连接信息配置从站。为此,请在从站上执行以下语句,将选项值替换为与系统相关的实际值:

MySQL [mysql]> CHANGE MASTER TO
    -> MASTER_HOST = '主库IP地址',
    -> MASTER_USER = 'repl',
    -> MASTER_PASSWORD = '主库用户repl的密码',
    -> MASTER_LOG_FILE = 'mysql-bin.000016',
    -> MASTER_LOG_POS = 154;
Query OK, 0 rows affected, 2 warnings (0.04 sec)

MASTER_LOG_FILEMASTER_LOG_POS可见上面复制主二进制日志坐标查询出的结果。

最后启动从服务器,执行此过程后,从服务器连接到主服务器,并复制从快照执行以来在主服务器上发生的任何更新。

MySQL [mysql]> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

最后检查是否主从复制配置生效

查看从机的状态,如果Slave_IO_RunningSlave_SQL_Running都是Yes则说明主从配置成功。

MySQL [mysql]> SHOW SLAVE STATUS\G;

//...
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
//...

如果出现一直Connecting则需要进行排查。查看从机的错误日志,位置可以通过查看文件/etc/my.cnf得到错误日志的位置。

 tail -f /data/mysql/mysql-error.log

2017-08-07T09:29:39.327901Z 18 [ERROR] Slave I/O for channel '': error connecting to master 'repl@47.**.**.**:3306' - retry-time: 60  retries: 38, Error_code: 1130

遇到错误可以查看MySQL错误码清单(服务端)MySQL错误清单(客户端)依据错误码可以方便的定位错误。

我的错误排查过程

Error_code: 1130

我遇到的错误是Error_code: 1130,对应的解释是Message: Host '%s' is not allowed to connect to this MySQL server

原因是我配置连接主库时,我录入的是从库的ip地址。所以导致从库尝试连接从库,但是使用的是从库不存在的用户。所以即报了上述错误。

Error_code: 2003

修改完上述问题后,又出现Error_code: 2003,对应的解释是Message: Can't connect to MySQL server on '%s' (%d)

1)检查主机是否开启tcp连接。

lsof -i tcp:3306

如果没有tcp连接,则需要去/etc/my.cnf中设置bind-address = 0.0.0.0

2)检查主机防火墙是否拦截了该连接。

service iptables stop

在测试远程连接mysql -u repl@'%' -p -P3306 -h 47.**.**.**;,登录正常。

无论是测试环境还是生产环境,关闭iptables只为取悦mysql都是不恰当的做法。所以我们需要为特定的ip地址开放3306端口,有关安全方面都建议使用最小权限原则(白名单)

# 仅允许指定ip地址
iptables -A INPUT -p tcp --dport 3306 -s 47.**.**.**  -j ACCEPT
# 保存规则
/sbin/service iptables save 
# 重启iptables
service iptables restart

主从复制测试截图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏cloudskyme

Apache nutch1.5 & Apache solr3.6

第1章引言 1.1nutch和solr Nutch 是一个开源的、Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。 Solr 拥有像 w...

38740
来自专栏Java架构师历程

ssh工作原理

1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

16630
来自专栏小白安全

SQLMAP命令中文注释

sqlmap常用命令大全 sqlmap -u “http://url/news?id=1″ –current-user #获取当前用户名称sqlmap...

34550
来自专栏黑泽君的专栏

day66_Solr学习笔记

目录结构详解如下:   bin:solr的运行脚本。   contrib:solr的一些扩展jar包,用于增强solr的功能。   dist:该目录包含bui...

24340
来自专栏散尽浮华

[原创]CI持续集成系统环境---部署gerrit环境完整记录

开发同事提议在线上部署一套gerrit代码审核环境,废话不多说,部署gerrit的操作记录如下: 提前安装好java环境,mysql环境,nginx环境 测试系...

42390
来自专栏Netkiller

Apache Hbase 快速入门

本文节选自《Netkiller Database 手札》 ? 第 62 章 Apache Hbase 目录 62.1. 安装 Apache Hbase 62...

37060
来自专栏坚毅的PHP

hbase问题总结

 1 java.io.IOException: java.io.IOException: java.lang.IllegalArgumentException:...

74160
来自专栏运维

RH413-RHEL6.4课程总结

RH413-RHEL6.4课程总结 Unit1 Tracking Security Updates 更新分以下三类 RHSA RHBA RHEA yum up...

14810
来自专栏IT笔记

JavaWeb项目架构之Kafka分布式日志队列

架构、分布式、日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Kafka做消息队列罢了。

855100
来自专栏WindCoder

SSM笔记(一)框架整合

用了好久了,但都是当初大神配置完后直接粘贴复制过来的,一直没仔细看过相关配置,趁此机会对自己也算是一个复习与深入,也希望对初学者有所帮助。本系列均是基于IDEA...

22010

扫码关注云+社区

领取腾讯云代金券