MySQL实现配置主从复制项目实践


Posted in MySQL onMarch 31, 2022

一、检测通信

查看master(centos7)和slave(win10)的ip地址,并检测是否可以相互通信

MySQL实现配置主从复制项目实践

MySQL实现配置主从复制项目实践

MySQL实现配置主从复制项目实践

MySQL实现配置主从复制项目实践

到这里我们知道,master的ip为192.168.131.129,slave的ip为192.168.0.6,并且可以相互通信

查看防火墙状态

systemctl status firewalld.service

临时手动启动、停止防火墙

systemctl start firewalld.service
systemctl stop firewalld.service

持久打开、关闭防火墙(重启服务生效)

systemctl enable firewalld.service
systemctl disable firewalld.service

MySQL实现配置主从复制项目实践

开放3306端口

MySQL实现配置主从复制项目实践

二、master配置

1. 开启二进制日志

配置log_bin和全局唯一的server-id,和slave区分开,不能配置成一样的(如果是my.cnf新添加配置,一定要重启MySQL服务)

MySQL实现配置主从复制项目实践

2. 创建一个用于主从库通信用的账号

即在master中创建一个账号,用于slave登录master读取binlog

虽然我们在Linux上查看的ip地址是192.168.131.129,但我们创建账户登录时不写这个ip,写的是192.168.131.1。因为我这里虚拟机用的是NAT模式,虚拟机(master)和物理机(slave)通信的时候,虚拟机先把数据发送到网关192.168.131.1(默认与VMnet8通信),192.168.131.1再转发到物理机,所以物理机接收到的是192.168.131.1的数据,故我们在master上为slave创建账户的时候,应该写192.168.131.1

MySQL实现配置主从复制项目实践

如果给slave配置的不是网关192.168.131.1地址,错误日志(可在my.cnf中指定)中会有如下信息:

MySQL实现配置主从复制项目实践

意思是从192.168.131.1的mslave用户权限不够,那是因为我们在master上配置的是允许从其他地址登录,并不是允许从192.168.131.1地址登录,这就导致权限不够。

由于master这边收到的就是来自192.168.131.1的请求,所以错误日志显示的是192.168.131.1

所以创建账户的命令应如下:

mysql> CREATE USER 'mslave'@'192.168.131.1' IDENTIFIED BY '1qaz@WSX';
mysql> GRANT REPLICATION SLAVE ON *.* to 'mslave'@'192.168.131.1' IDENTIFIED BY '1qaz@WSX';
mysql> FLUSH PRIVILEGES;

开启主从复制的权限,从库可以通过这个账户和密码,从这个IP来请求访问这个主库上的任意库,同步这个主库的任意库里的任意表

3. 获取binlog文件名和position

看当前二进制日志的名字,主库的更新是往哪个binlog写的,以及当前写日志的位置,从这个位置往后开始进行主从同步

show master status;

MySQL实现配置主从复制项目实践

三、slave配置

1. 配置全局唯一的server-id

找到my.ini

MySQL实现配置主从复制项目实践

配置全局唯一的server-id

MySQL实现配置主从复制项目实践

重启MySQL服务

MySQL实现配置主从复制项目实践

2. 使用master创建的账户读取binlog同步数据

这一步配置主要是给IO线程读取binlog使用

mysql> CHANGE MASTER TO MASTER_HOST='192.168.131.129',MASTER_PORT=3306,MASTER_USER='mslave',MASTER_PASSWORD='1qaz@WSX',
MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=1262;

MASTER_HOST:指定master的ip
MASTER_LOG_FILE:binlog文件名
MASTER_LOG_POS:binlog的position

3. 开启slave服务

通过show slave status命令查看主从复制状态,show processlist查看master和salve相关线程的运行状态

MySQL实现配置主从复制项目实践

四、配置中可能出现的问题

1. 网络连接问题

通过show slave status命令查看主从复制状态

MySQL实现配置主从复制项目实践

连接connection错误,先考虑是否网络互通,ping一下

然后再检查从库里面的配置信息是否正确

MySQL实现配置主从复制项目实践

如果都正确,还可以检查一下master的3306端口是否可以连接

telnet xxx.xxx.xxx.xxx 3306

最重要的是,自己玩的时候,如果虚拟机是NAT模式,则需要写成VMnet8网关ip。如果都是物理机通信,那直接写正确的ip即可

可以在MySQL数据库下的mysql库的user表中更改允许登录的ip

MySQL实现配置主从复制项目实践

然后重新赋予权限

mysql> GRANT REPLICATION SLAVE ON *.* to 'mslave'@'xxx.xxx.xxx.xxx' IDENTIFIED BY '1qaz@WSX';

出现错误后还可以查看错误日志中提示的ip是否和自己允许slave登录的ip一致

MySQL实现配置主从复制项目实践

2. binlog的position问题

MySQL实现配置主从复制项目实践

在master中查看show master status一下binlog日志文件名以及position,然后用命令重新配置slave,比如:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.131.129',MASTER_PORT=3306,MASTER_USER='mslave',MASTER_PASSWORD='1qaz@WSX',
MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=1262;

配置slave前需要stop slave,配置完成再start slave

3. SQL线程出错

问题发生原因如下:

首先配置主从复制的时候,slave的mytest库中没有user表,而master的mytest库已经有user表了

配置好主从复制后直接drop table mytest.user,这就会写到binlog里面,然后在通过dump线程和IO线程将这个操作发送到从库的relay log,然后从库的SQL线程从relay log里把drop table mytest.user捞出来在从库执行这个SQL,可从库的mytest根本就没有user表,这就是删除一个不存在的表,于是出现错误了

MySQL实现配置主从复制项目实践

一般我们不会做这样的操作,一般都是主从配置以后,slave从数据开始增量进行同步,先做数据的增量,然后做数据的增删改查

不会配置好主从复制后,一开始就删主库的东西,如果真的出现这样的问题,随时可以在从库 show slave status,来查看主从同步的状态,有什么错误,就相应解决

要么在stop slave,把position重新设置一下,start slave,即重新开启主从同步,从最新的位置,这个drop操作不需要在从库上同步

要么就是stop,跳过该个错误,然后start

stop slave;
set global sql_slave_skip_counter=1;
start slave;

可以通过show slave status查看以下标识,IO线程出错一般是网络问题,SQL线程出错一般是SQL在slave库执行出现了问题

MySQL实现配置主从复制项目实践

 到此这篇关于MySQL实现配置主从复制项目实践的文章就介绍到这了,更多相关MySQL  主从复制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL infobright的安装步骤
Apr 07 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
MySQL基础快速入门知识总结(附思维导图)
Sep 25 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
MySQL数据库完全卸载的方法
Mar 03 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
MySQL学习之基础命令实操总结
Mar 19 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 #MySQL
MySQL Server层四个日志的实现
分享几个简单MySQL优化小妙招
MySQL Server 层四个日志
MySQL RC事务隔离的实现
mysql中DCL常用的用户和权限控制
Mar 31 #MySQL
Mysql分析设计表主键为何不用uuid
You might like
php 随机排序广告的实现代码
2011/05/09 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
制作特殊字的脚本
2006/06/26 Javascript
js版本A*寻路算法
2006/12/22 Javascript
Javascript调用C#代码
2011/01/17 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
Jquery为单选框checkbox绑定单击click事件
2012/12/18 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
通俗解释JavaScript正则表达式快速记忆
2017/08/23 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python 调用VC++的动态链接库(DLL)
2008/09/06 Python
详解python中的文件与目录操作
2017/07/11 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
pytorch 更改预训练模型网络结构的方法
2019/08/19 Python
python3文件复制、延迟文件复制任务的实现方法
2019/09/02 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
Python创建文件夹与文件的快捷方法
2020/12/08 Python
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
办理信用卡工作证明
2014/09/30 职场文书
2015年学校财务工作总结
2015/05/19 职场文书