这篇文章是我的笔记,所以没有太多测试的图片供大家参考。而且测试环境也是新搭建的两台虚拟机,并不会受到其他因素的干扰,才一路顺风的搭建下来; 先说测试环境吧,【两台虚拟机】;           【一个是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;如我的是: ![](https://s4.51cto.com/images/blog/201808/31/e2b392f98e6f4801bea23bea7c3dec99.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 看完、确认好之后再执行命令:!!!!!    若 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; ![](https://s4.51cto.com/images/blog/201808/31/c21284a51c43b2be596ee165417a9c43.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) 参数解释: 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同步; 个人笔记,不喜勿喷;