show slave hosts的一个问题
今天早上来公司,查看一个5.5版本的MySQL主从复制的架构的时候,发现一个问题,这个问题之前在5.7版本的MySQL版本中没有遇到过,这里记录一下,以供大家参考。
这里假设我们有两台机器,IP地址分别是:
server 1: 192.168.124.61 主库
server 2: 192.168.124.62 从库
端口:4306
首先,我们在server 1上面使用show slave hosts的方法查看了一下从节点的情况,如下:
mysql:(none) ::>>show slave hosts;
+-----------+------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+------+------+-----------+
| | | | |
+-----------+------+------+-----------+
row in set (0.00 sec)
上面的信息中可以发现port是3306,但是这里并没有显示IP地址,于是我用show processlist看了一眼,发现IP地址是192.168.124.62。
此时,连接到从库,使用show slave status来查看复制状态,结果如下:
mysql:(none) ::>>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.124.61
Master_User: dba_repl
Master_Port:
Connect_Retry:
Master_Log_File: mysqlbin.000123
Read_Master_Log_Pos:
Relay_Log_File: mysql-relay-bin.000173
Relay_Log_Pos:
Relay_Master_Log_File: mysqlbin.000123
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql:(none) ::>>select @@port;
+--------+
| @@port |
+--------+
| |
+--------+
row in set (0.00 sec)
可以看到,从库上面配置的master_port是4306,而且从库的端口也是4306。
也就是说 ,主库上面show slave hosts看到的从库端口信息和从库实际的端口信息不符。
查了查,应该是某些参数导致的,具体来讲,主库上面使用show slave hosts看到的结果是从从库上面的report-host等参数的值获取的,于是我使用show variables查看了一眼从库上参数的具体值,结果如下:
(从库端)
mysql:(none) ::>>show variables like '%report%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| report_host | |
| report_password | |
| report_port | |
| report_user | |
+-----------------+-------+
rows in set (0.00 sec)
可以看到这些信息和上面主库中看到的信息是符合的,也就是说,主库端的信息是从这里发出去的,于是我查看了一下官方手册,得到了如下的结果:
The host name or IP address of the slave to be reported to
the master during slave registration. This value appears
in the output of SHOW SLAVE HOSTS on the master server.
Leave the value unset if you do not want the slave to
register itself with the master.
也就更加印证了刚才的想法,这些值确实是传递给master的信息,也就是在主库上show slave hosts的信息,这样,也就确定了问题。
解决问题过程:
1、直接手动修改该参数:
mysql:(none) ::>>set global report_host='10.21.130.62';
ERROR (HY000): Variable 'report_host' is a read only variable
mysql:(none) ::>>
可以发现,这个参数是不允许直接修改的,会报错。
2.修改配置文件 vim /data/mysql_4306/my.cnf
report-host=192.168.124.62
report-port= 4306
重启,然后再次在从库上查看,结果如下:
(从库端)
mysql:(none) ::>>show variables like '%report%';
+-----------------+----------------+
| Variable_name | Value |
+-----------------+----------------+
| report_host | 192.168.124.62 |
| report_password | |
| report_port | |
| report_user | |
+-----------------+----------------+
rows in set (0.00 sec)
可以看到,从库的内容已经修改过来了,这个时候开启主从复制,在主库端使用show slave hosts查看结果:
mysql:(none) ::>>show slave hosts;
+-----------+----------------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+----------------+------+-----------+
| | 192.168.124.62 | | |
+-----------+----------------+------+-----------+
row in set (0.00 sec)
结论: