mysql数据库主从同步/双机互备
作者:互联网
这篇文章是我的笔记,所以没有太多测试的图片供大家参考。而且测试环境也是新搭建的两台虚拟机,并不会受到其他因素的干扰,才一路顺风的搭建下来;
先说测试环境吧,【两台虚拟机】;
? ? ? ? ? 【一个是redhat7,另一个是centos7】-redhat7 :? 192.168.111.55? ;?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-centos7 :? 192.168.111.66? ;
? ? ? ? ? 【新搭建的mariadb数据库(使用yum安装的)】;
保障:1. 两段服务器都可以互相ping通;
2.selinux和防火墙关掉;(后面会说因为防火墙没关而出现的问题);
3.两边的数据要开启允许远程连接,我是直接开启允许root远程连接的;(也可以另建新账户)
配置文件: /etc/my.conf ;
在 192.168.111.55 的/etc/my.conf中添加或者修改为:
? ? ? ? ? ?server_id=10? ? ? ? ? ? ? ? ? ? ? ? //可以理解成指定的唯一的id
? ? ? ? ? ?log-bin=master_01? ? ? ? ? ? ? //开启二进制日志,作用是另一个服务器可以通过该日志来确定执行操作
? ? ? ? ? ?binlog-do-db=test? ? ? ? ? ? ? ? //同步的库;两边的库名字要一样;
在 192.168.111.66 的/etc/my.conf中添加或者修改为:
? ? ? ? ? ?server_id=20
? ? ? ? ? ?log-bin=master_02? ? ? ? ? ? ?
? ? ? ? ? ?binlog-do-db=test? ? ? ?
添加之后执行命令? systemctl restart mysqld.service? 重启数据库使修改生效。
上述参数解析:
?server_ id 为当前 mysql 服务的识别 ID,必须唯一。
?log - bin 开启二进制日志,每次数据操作都会将操作日志记录在里面,以便从服务可以通过日志确定执行了什么操作。
?bin - do - db 需要同步的数据库,如果有多个数据库需要同步,写多行。 binlog - do - db=db1,db2,db3... 这种写法是错误? ? 的,不会达到预期效果;
分别在两台服务器上进入 mysql,输入? show master status;? ?命令查看当前主机的状态;记录下此时的 file 名以及 position;如我的是:
看完、确认好之后再执行命令:!!!!!
? ?若 slave 开启状态无法执行下面的命令,
?首先执行 stop slave 关闭 slave,
?再执行下面的命令,
?执行后再开启 start slave ;
在 192.168.111.55 数据库中执行:
?CHANGE MASTER TO
? ? MASTER_HOST='192.168.111.66', ? ? ? ?//所要同步的服务器ip
? ? MASTER_USER='root', ? ? ? ? ?//同步服务器的mysql用户名
? ? MASTER_PASSWORD='123456', ? ? ? ?//同步服务器的mysql密码
? ? MASTER_PORT=3306,? ? ? ? ? ? ? ? ? ? ? ? ? ?//数据库端口
? ? MASTER_LOG_FILE='master_02.000002', ? ?//对应 12.168.111.66 的file名
? ? MASTER_LOG_POS=1771, ? ? ? ? ? ? ?//对应10.168.0.126的position
? ? MASTER_CONNECT_RETRY=20; ? ? ? ?//192.168.111.66的server-id
在 192.168.111.66?数据库中执行:
? ? CHANGE MASTER TO
? ? MASTER_HOST='10.168.1.44',
? ? MASTER_USER='root',
? ? MASTER_PASSWORD='123456',
? ? MASTER_PORT=3306,
? ? MASTER_LOG_FILE='master_01.000008', ? ? //对应192.168.111.55的file名
? ? MASTER_LOG_POS=154, ? ? ? ? ? ? ? ? ?//对应192.168.111.55的position
? ? MASTER_CONNECT_RETRY=10; ? ? ? ?//192.168.111.55的server-id
上述命令执行完后,查看两个服务状态:执行命令:
?show slave status\G;
参数解释:
Slave_IO_Running: 指的就是从服务器上负责读取主服务器的线程工作状态。?
?从服务器用这个专门的线程链接到主服务器上,并把日志拷贝回来。
Slave_SQL_Running:指的就是专门执行 sql 的线程。
?它负责把复制回来的 Relaylog 执行到自己的数据库中。
?这两个参数必须都为Yes 才表明复制在正常工作。
只有两个进程参数都为 yes
?Slave_IO_Running: Yes
?Slave_SQL_Running: Yes
才是配置成功的;我的其中的一个值为 connecting 是就是因为有个服务器的防火墙忘关了,io数据通不了导致的;关闭防火墙后就都为yes了;
到这里,mysql 同步配置已完成,接下来就可以测试是否能正常实时同步。在两边的数据库内随意的创建表,增删改查,你会发现就会实时同步的;可以使用一个叫? navicat? 的数据库连接软件测试,比较方便;
可能出现的问题
1.查看 slave 状态时,会发现 Slave_IO_Running: Connecting
出现该问题主要有三个原因:
A.网络不通(互相 ping下试试看能否ping通)
B.密码不对:查看在配置 slave 时执行的命令中的密码是否正确
C.Position 不正确:配置 slave 时对应 position 未填为正确的position
2.查看 slave 状态时,会发现 Slave_SQL_Running: No
出现这个现象的原因主要就是两边数据库数据存在不同之处,也就是同步时没有相同的初态,
可以通过查看 mysql 日志定位具体哪块数据出现异常。
3.使用show master status;? 命令查看状态时,给出的值不是固定的,重启一下数据库就会导致file名和position的变动;所以配置的时候一定要确认好了;
4.在数据库中配置时的?MASTER_CONNECT_RETRY=20; 值都是对方的server-id值,所以两边的数据库是相互同步的;
如果改动了其中一个,比如说将192.168.111.55的MASTER_CONNECT_RETRY=20;改为MASTER_CONNECT_RETRY=10;
重启数据库后,就成了一主一从了,192.168.111.55是主,192.168.111.66是从;因为66会向55同步数据,但是55不会向66同步;
个人笔记,不喜勿喷;
标签:同步,slave,数据库,192.168,互备,MASTER,mysql,服务器,双机 来源: https://www.cnblogs.com/shujutongbugongju/p/11020064.html