停止MySQL服務hang的問題簡單分析(一)

jeanron100發表於2017-11-08

停止MySQL服務hang的問題簡單分析(一)

寫第一篇,意味著還有第二篇的內容,這個也是自己今天偶然發現的問題。同事之前碰到了一個MySQL服務不斷重啟的問題,究其原因,其實倒還合理,今天的這個問題比較糾結,看起來好像沒有直接的聯絡,問題算是比較詭異。

我簡單復現下這個問題,我在5.7.19的版本中做了測試,可以復現。

首先搭建一主兩從的測試環境,使用sandbox或者是我自己寫的shell版本也可以,具體可以參考:https://github.com/jeanron100/mysql_slaves

我配置的環境如下,埠分別為10010和10020

10010 n1 Y

10020 n2 N

執行指令碼init.sh大概也就一分鐘就會搭建好了,引數檔案的設定如下,GTID是開啟的。

datadir=/U01/mysql_5.7_repl/n1

basedir=/usr/local/mysql_5.7

port=10010

socket=/U01/mysql_5.7_repl/n1/n1.sock

server_id=10010

gtid_mode=ON

enforce_gtid_consistency=ON

master_info_repository=TABLE

relay_log_info_repository=TABLE

binlog_checksum=NONE

log_slave_updates=ON

log_bin=binlog

binlog_format=ROW

主從的配置是差不多的,複製關係沒有問題。

然後我們停止從庫,把從庫的GTID設定從配置檔案刪除,即刪除引數。

gtid_mode=ON

enforce_gtid_consistency=ON

然後啟動之後,MySQL服務竟然能夠正常啟動,在5.7.16的版本中測試時會出現不斷重啟的問題。當然啟動之後,slave的執行緒是無法啟動的。

mysql> start slave;

ERROR 3112 (HY000): The replication receiver thread for channel '' cannot start in AUTO_POSITION mode: this server uses @@GLOBAL.GTID_MODE = OFF.

提示很明顯,是GTID的問題。

這個時候主庫端已經沒有了從庫的連線,因為IO_Thread還沒有建立關聯。

我們這個時候保留主庫GTID的配置,保留從庫的服務,停止主庫,使用mysqladmin shutdown 的方式。主庫的操作命令就會hang住了。

mysqld的服務沒了蹤影,但是mysqladmin的命令卡在了那裡。

停止MySQL服務hang的問題簡單分析(一)

魔性的一點是mysqld的服務已經停止了,我重啟還是能夠正常啟動,但是mysqladmin的程式一直掛在那裡。這個就有些不太合理了。

而問題的解決方法有兩個,一個是刪除主庫的GTID配置,另外一個是停止從庫(或者保留從庫GTID配置,暫且啟動)

這個問題的方向已經明確,和不規範的配置,不規範的操作有關,但是這個問題的結果還是有些出人意料。後續再來解讀。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2146959/,如需轉載,請註明出處,否則將追究法律責任。

相關文章