主从复制配置命令
条件:master和slave机器的信息
master(centos7):192.168.131.129
slave(win10):192.168.0.6
保证master和slave之间的网络互通,并且保证3306端口是开放的。
检查一下网络互通:
网络是互通的!!!
查看防火墙:
开放3306端口
master配置
1、开启二进制日志 配置log_bin和全局唯一的server-id(和从库区分开来)。(如果是新配置,一定要重启MySQL服务)
2、创建一个用于主从库通信用的账号
用%表示任意的IP,谁都可以通过这账号密码登录。为了权限的收缩,最小化,固定从库在哪台机器上,只能从这台机器的IP进行登录。
为什么下面用的IP不是从库的机器的IP?
因为我们的特殊环境造成的,linux是在Windows下装的虚拟机,虚拟机是net模式,如果是桥接模式就无所谓,直接用IP就可以了。
这个net模式下的工作方式是:Windows上的IP发送消息包到网关上(192.168.131.1),然后这个网关再转发到linux上。
重新创建一个用户,专门用来从库连接主库进行身份验证,验证成功了后,通过这个用户的身份进行binlog的主从同步。(密码有强度的验证,简单的密码通过不了)
第二条语句的星号点星号是任意库的任意表的意思
开启主从复制的权限,从库可以通过这个账户和密码,从这个IP来请求访问这个主库上的任意库,同步这个主库的任意库里的任意表。
查看错误日志:
3、获取binlog的日志文件名和position
mysql> show master status;
(看当前二进制日志的名字,主库的更新是往哪个二进制日志写的,以及现在的位置,从这个位置往后开始进行主从同步)
slave配置
Windows下mysql的数据在:
server-id默认的是1,我们要改为2,因为不能重复,要区分开。更改配置,要重启服务。
更改配置,要重启服务。
1、配置全局唯一的server-id(涉及修改配置文件,需要重启mysql57服务)
2、使用master创建的账户读取binlog同步数据(stop slave;start slave)
因为从库IO线程要主动去连接主库,告诉主库master的信息,连接主库用的用户。从这个二进制文件的哪个位置开始主从复制。
3、START SLAVE (开启从库的服务,开启I/O线程,sql线程,relaylog)
通过show slave status命令查看主从复制状态。
show processlist查看master和salve相关线程的运行状态。
主从复制实践
我们用linux上的mysql server 作为主库,Windows上的mysql server作为从库
linux:
通过ifconfig 看主库的IP地址
Windows :
cmd打开
输入命令ipconfig
网络互通检测
网络是互通的。
保证3306端口是开放的。
开启centos防火墙3306端口
进入root用户
centos7防火墙配置不再是iptables了,配置如下:
可以在win下测试是否通过mysql命令能够成功连接centos的mysqld服务。systemctl start firewalld.service 手动的启动
systemctl stop firewalld.service 手动的停止
systemctl enable firewalld.service 真真正正的启动,重启也是生效的
systemctl disable firewalld.service 真真正正的关闭, 重启也是生效的
systemctl status firewalld.service 查看状态
master配置:
开启二进制日志
创建一个用于主从库通信用的账号
从库连接主库,进行身份验证。
获取binlog的日志文件名和position
主从同步的时候,都是基于binlog,从binlog的哪个位置开始进行主从复制。
从库配置
这个表示已经写完了。(落后于主库多少,因为是主库先产生操作,然后同步操作到从库)
这个是表示成功了。已经连接成功了。等待主库发送event。
可以演示主从复制的场景。
配置中出现的问题
1号问题
1045:权限不正确。
连接connection错误。先考虑网络通不通。
1、ping一下,看看网络是否互通。
然后再检查从库里面的配置信息是否正确,是否在主库上带的用户名密码。
2、看主库所在机器的3306端口是否正常
对端口有限制吗?就是防火墙嘛。
3、查看主库的错误日志
这个ip就是net网关的ip,直接配置的时候写到这就可以了。
如果我创建主库时的IP写错了咋办?
我们 use mysql;
里面有很多表
所有的用户管理都在user里面。
然后后面的语句也要重新执行一下。
这个也要重新执行一下
2号问题
1032的错误
position不正确
检查一下,如果不正确,重新配置
重新配置从库记得先stop,配置完了之后,然后start
3号问题
从库没有mytest
主库已经有mytest database,然后配置了主从互通,相当于slave没有mytest database。然后直接drop database mytest,会写到binlog里面,然后在通过线程发送到从库,写到从库的中继日志,然后从库的sql线程从中继日志里把drop database捞上来了,然后在从库执行这个SQL,从库根本就没有mytest这个库,就出现错误了。
一般我们不会去做这样的操作的,一般都是主从配置以后,主库从数据开始增量进行同步,不会同步以后,一开始就删主库的东西,如果真的出现这样的问题,随时可以在从库 show slave datas,来查看主从同步的状态,有什么错误,解决什么错误。
要么在从库stop一下,把position重新设置一下,然后start。
相当于重新开启主从同步,从最新的位置,这个drop database不需要在从库上同步。
要么就是stop,从库上关闭,然后跳过5个错误,然后重启start。
本身是不会跳过的。相当于是异常操作。
我们一般是不会一开始同步就删数据的,因为还没有同步过数据,所有的增删改查都是从主从复制开启时,先做数据的增量,然后做数据的增删改查。