九月星空

已埋半截……

Mysql主从复制遇到的问题备忘

杂烩 0 评

年纪大了,以后处理问题都得记录下来,不然必忘!

店里GSP软件数据库是一直实时同步到VPS上的。最近从搬瓦工换回了阿里云(香港)的轻应用服务器上,把所有数据做了迁移。
GSP软件数据库要重新做主从复制设置。先停掉老的从服务器上的同步,然后给新从服务器上的mysql做id设置

[mysqld]节加入
log-bin=mysql-bin #开启二进制日志
server-id=3 #设置server-id(需要和主服务器不同)

重启从服务器上的mysql服务。

对主服务器相关数据库进行备份,然后对数据库进行锁定或者不要进行对数据库有任何写入的操作。备份的数据导入到从服务器同名数据库里是主从服务器里相关数据库数据一致。(在phpmyadmin或者其它web面板中导入大文件可能会失败,
最好在Mysql会话中use相关对应库使用source xx.sql;进行导入操作。)
打开mysql会话,输入

mysql> CHANGE MASTER TO
->     MASTER_HOST='ip', //因为店里没有固定IP,用花生壳地址折中一下
->     MASTER_USER='user',
->     MASTER_PASSWORD='pws',
->     MASTER_LOG_FILE='mysql-bin.000001',
->     MASTER_LOG_POS=37;

如果主服务器Mysql端口不是默认端口,还需要加MASTER_PORT=端口号。另外MASTER_LOG_FILE和MASTER_LOG_POS可在主服务器mysql会话中使用show master statusG查看。

下一步从服务器打开同步

mysql> start slave;

然后可以使用以下命令查看是否同步成功,如回显消息Slave_IO_Running和Slave_SQL_Running均为Yes则为同步成功。

mysql> show slave status\G;

此后从服务器会实时同步数据。正常情况下按以上操作都是没什么问题的。但这次重新部署却出现了问题。
刚部署好是同步状态是正常的,然后只要店里打开软件进行任何SQL插入或更新相关操作。从服务器复制状态就开始报错。
报错消息error: 1146: Table 'xxx.xxxxx' doesn't exist。但在从服务器上的phpmyadmin面板里查看报错不存在的表确实存在。(中间多次导出导入数据库重复部署都老样子),后来一次部署后没打开GSP软件,直接在店里的电脑(主服务器)装了个xampp,登入主服务器上的phpmyadmin对相关数据库随意进行操作了一下,发现从服务器同步了数据并且主从复制未报错。

现在问题定位在软件上。但是细想之前的从服务器确实没有这种情况,然后对比三台机器上的mysql配置文件。发现主服务器和老的从服务器default_storage_engine = InnoDB 而新从服务器default_storage_engine = MyISAM,数据库引擎不一样导致?
网上搜索了一下发现确实有主从服务器数据库引擎不同而同步失败的案例。于是把新从服务器改为InnoDB,重新部署,结果还是不行。后来静下心来看日志终于发现了可能的问题所在,报错消息error: 1146中的报错语句中的那些被报不存在的表名是大小写混写的(实际上表明都是小写的,软件程序员在软件操作时语句是大小写混写,因为软件环境是Windows,而windows中的mysql又不区分大小写,当从服务器从主服务器复制新的语句时因为linux下mysql表名区分大小写的原因导致语句执行失败而无法同步)。
最后在从/etc/my.cnf的[mysqld]节中加入

lower_case_table_names=1 \\表名不区分大小写

终于把问题给解决了。
而之前的从服务器的配置并没有此句,应该是在编译的时候已经做了相关配置。

发表评论
撰写评论