記一次一波三折的Mysql故障處理

chenoracle發表於2021-10-28

環境:

Mysql 8.0.24 雙主+keepalived

問題現象:

同事反饋某套mysql資料庫連線失敗,嘗試重啟資料庫無法啟動。

問題分析:

遠端登入伺服器,嘗試檢查error日誌,發現cd無法進入到mysql目錄,ls和df命令無返回結果,卡住不動。

檢查歷史命令,發現近期有調整過本地路由。

問題原因:

由於mysql目錄是透過nas儲存掛載到本地,由於本地路由的調整,

導致資料庫伺服器和NAS網路不通,

最終導致mysql目錄掛載失敗,無法讀取到mysql對應檔案。

解決方案:

聯絡同事改回原路由配置,並同時重啟了伺服器。

問題再起:

同事重啟伺服器後反饋資料庫可以連線了,但是沒資料了,庫也沒了?

遠端登入到資料庫伺服器,發現當前啟動的mysqld程式,

不是手動安裝的mysql,而是系統自帶的mysql,應該啟動的是手動安裝的mysql。

ps -ef|grep mysql

檢查當前mysql狀態

systemctl status mysqld.service

停止系統自帶mysql服務

systemctl stop mysqld.service

禁用開機自啟動

systemctl disable mysqld.service 

手動啟動mysql

###mysqld --defaults-file=/etc/my.cnf --user=mysql &

啟動keepalived

systemctl start keepalived.service

同事反饋可以正常使用了。

問題再再起:

過了一週後,同事反饋從庫資料不對,少了很多新資料。

登入伺服器檢查發現slave程式居然沒啟動。

mysql> show slave status \G;

之前記得mysql啟動時會自動啟動salve程式的,難道8.0.24版本預設是不啟動slave程式?

由於對應系統之前還沒有上線,之前在啟動資料庫後也沒有仔細檢查主從同步情況。

檢查my.cnf配置,發現設定了skip_slave_start,不自動啟動slave。

cat /etc/my.cnf|grep skip

skip-slave-start=1


mysql -uroot -p

Enter password: 

mysql> show variables like '%skip_slave_start%';

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| skip_slave_start | ON    |

+------------------+-------+

1 row in set (0.01 sec)

資料庫架構是雙主架構,兩臺mysql均沒有啟動slave。


解決過程如下:

雖然當前是雙主架構,但vip只存在一個節點上,也就是隻有一個節點對外提供服務,

使用雙主+keepalived的架構主要是為了故障自動切換功能。

所以兩套mysql還是區分主從的。

1.檢查主從資料庫binlog保留時間。

2.檢查需要的binglog是否存在。

3.先恢復從庫slave。

4.待從庫slave正常後,在恢復主庫的slave。


1.檢查主從資料庫binlog保留時間。

檢視binlog過期時間為30天。

mysql> show variables like 'binlog_expire_logs_seconds';

+----------------------------+---------+

| Variable_name              | Value   |

+----------------------------+---------+

| binlog_expire_logs_seconds | 2592000 |

+----------------------------+---------+

1 row in set (0.01 sec)


2.檢查需要的binglog是否存在。

主從都需要檢查。

需要mysql-bin.000007開始的binlog日誌。

mysql> show slave status\G;

...

Master_Log_File: mysql-bin.000007

檢查binlog日誌無丟失

ls -lrth mysql-bin.*

-rw-r----- 1 mysql mysql 129K Oct 19 09:39 mysql-bin.000007

-rw-r----- 1 mysql mysql  259 Oct 19 09:51 mysql-bin.000008

-rw-r----- 1 mysql mysql  259 Oct 19 09:53 mysql-bin.000009

-rw-r----- 1 mysql mysql  283 Oct 19 09:54 mysql-bin.000010

-rw-r----- 1 mysql mysql  259 Oct 19 09:54 mysql-bin.000011

-rw-r----- 1 mysql mysql  270 Oct 19 09:54 mysql-bin.index

-rw-r----- 1 mysql mysql 225M Oct 28 09:55 mysql-bin.000012


3.先恢復從庫slave。

mysql> start slave;

mysql> show slave status\G;

觀察Slave_IO_Running和Slave_SQL_Running均由No變為Yes。

並且Seconds_Behind_Master值逐漸變小。


4.待從庫slave正常後,在恢復主庫的slave。

待從庫Seconds_Behind_Master值變為0後,開始啟動主庫slave。

mysql> start slave;

mysql> show slave status\G;

由於之前從庫資料已經同步完成,此時主庫同步速度很快就完成了。

#####chenjuchao 20211028 12:50#####


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

相關文章