这篇文章是我的笔记,所以没有太多测试的图片供大家参考。而且测试环境也是新搭建的两台虚拟机,并不会受到其他因素的干扰,才一路顺风的搭建下来;
先说测试环境吧,【两台虚拟机】;
【一个是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同步;
个人笔记,不喜勿喷;