佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案

磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案

熱門標(biāo)簽:呼叫中心市場需求 服務(wù)外包 Linux服務(wù)器 地方門戶網(wǎng)站 AI電銷 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) 百度競價排名

案例場景

      今天在線上發(fā)現(xiàn)一個問題,由于監(jiān)控沒有覆蓋到,某臺機器的磁盤被寫滿了,導(dǎo)致線上MySQL主從復(fù)制出現(xiàn)問題。問題如下:

localhost.(none)>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 10.xx.xx.xx
                  Master_User: replica
                  Master_Port: 5511
                Connect_Retry: 60
              Master_Log_File:
          Read_Master_Log_Pos: 4
               Relay_Log_File: relay-bin.001605
                Relay_Log_Pos: 9489761
        Relay_Master_Log_File:
             Slave_IO_Running: No
            Slave_SQL_Running: No
                   Last_Errno: 13121
                   Last_Error: Relay log read failure: Could not parse relay log event entry. 
The possible reasons are: the master's binary log is corrupted (you can check this by running 
'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by 
running 'mysqlbinlog' on the relay log), a network problem, the server was unable to fetch a
 keyring key required to open an encrypted relay log file, or a bug in the master's or 
slave's MySQL code. If you want to check the master's binary log or slave's relay log, 
you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.

于是查看error log,發(fā)現(xiàn)error log中的內(nèi)容如下:

2021-03-31T11:34:39.367173+08:00 11 [Warning] [MY-010897] [Repl] Storing MySQL user name or 
password information in the master info repository is not secure and is therefore not 
recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; 
see the 'START SLAVE Syntax' in the MySQL Manual for more information.

2021-03-31T11:34:39.368161+08:00 12 [ERROR] [MY-010596] [Repl] Error reading relay log 
event for channel '': binlog truncated in the middle of event; consider out of disk space

2021-03-31T11:34:39.368191+08:00 12 [ERROR] [MY-013121] [Repl] Slave SQL for channel '': Relay 
log read failure: Could not parse relay log event entry. The possible reasons are: the master's 
binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the 
slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log),
 a network problem, the server was unable to fetch a keyring key required to open an encrypted
 relay log file, or a bug in the master's or slave's MySQL code. If you want to check the 
master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW
 SLAVE STATUS' on this slave. Error_code: MY-013121

2021-03-31T11:34:39.368205+08:00 12 [ERROR] [MY-010586] [Repl] Error running query, slave SQL
 thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We 
stopped at log 'mysql-bin.000446' position 9489626

從描述中可以看到,error log是比較智能的,發(fā)現(xiàn)了磁盤問題,并提示我們需要"consider out of disk space"

解決問題

      登錄服務(wù)器,很快就發(fā)現(xiàn)是MySQL所在的服務(wù)器磁盤使用率達(dá)到100%了,問題原因跟error log中的內(nèi)容一致。

      現(xiàn)在就解決這個問題。基本的思路就是清理磁盤文件,然后重新搭建復(fù)制關(guān)系,這個過程似乎比較簡單,但是實際操作中,在搭建復(fù)制關(guān)系的時候出現(xiàn)了下面的報錯:

### 基于gtid的復(fù)制,想重新搭建復(fù)制關(guān)系
localhost.(none)>reset slave;
ERROR 1371 (HY000): Failed purging old relay logs: Failed during log reset

localhost.(none)>reset slave all;
ERROR 1371 (HY000): Failed purging old relay logs: Failed during log reset

第一步:因為復(fù)制是基于gtid進(jìn)行的,所以直接記錄show slave status的狀態(tài)后,就可以重新reset slave,并利用change master語句來重建復(fù)制關(guān)系了。

但是卻出現(xiàn)上面的報錯,從報錯信息看是mysql無法完成purge relay log的操作,這看起來不科學(xué)。好吧,既然你自己不能完成purge relay logs的操作,那就讓我來幫你吧。

第二步:手工rm -f 刪除所有的relay log,發(fā)現(xiàn)報錯變成了:

localhost.(none)>reset slave all;
ERROR 1374 (HY000): I/O error reading log index file

嗯,好吧,問題沒有得到解決。

然后思考了下,既然不能通過手工reset slave 來清理relay log,直接stop

slave 然后change master行不行呢?

第三步:直接stop slave,然后change master,不執(zhí)行reset slave all的語句,結(jié)果如下:

localhost.(none)>change master to master_host='10.13.224.31',
    -> master_user='replica',
    -> master_password='eHnNCaQE3ND',
    -> master_port=5510,
    -> master_auto_position=1;
ERROR 1371 (HY000): Failed purging old relay logs: Failed during log reset

得,問題依舊。

第四步:反正復(fù)制已經(jīng)報錯斷開了,執(zhí)行個start slave看看,結(jié)果戲劇性的一幕出現(xiàn)了:

localhost.(none)>start slave;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    262
Current database: *** NONE ***


Query OK, 0 rows affected (0.01 sec)


localhost.(none)>
[root@ ~]#

執(zhí)行start slave之后,實例直接掛了。

到這里,復(fù)制徹底斷開了,從庫實例已經(jīng)掛了。

第五步:看看實例還能不能重啟,嘗試重啟實例,發(fā)現(xiàn)實例還能起來。實例重新起來后,查看復(fù)制關(guān)系,結(jié)果如下:

localhost.(none)>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: 10.xx.xx.xx
                  Master_User: replica
                  Master_Port: 5511
                Connect_Retry: 60
              Master_Log_File: 
          Read_Master_Log_Pos: 4
               Relay_Log_File: relay-bin.001605
                Relay_Log_Pos: 9489761
        Relay_Master_Log_File:
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
                   Last_Errno: 13121
                   Last_Error: Relay log read failure: Could not parse relay log event entry.
 The possible reasons are: the master's binary log is corrupted (you can check this by running 
'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by 
running 'mysqlbinlog' on the relay log), a network problem, the server was unable to fetch a 
keyring key required to open an encrypted relay log file, or a bug in the master's or slave's 
MySQL code. If you want to check the master's binary log or slave's relay log, you will be able 
to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
                 Skip_Counter: 0

復(fù)制關(guān)系依舊報錯。

第六步:重新reset slave all看看,結(jié)果成功了。

localhost.(none)>stop slave;
Query OK, 0 rows affected (0.00 sec)


localhost.(none)>reset slave all;
Query OK, 0 rows affected (0.03 sec)

第七步:重新搭建復(fù)制關(guān)系并啟動復(fù)制

localhost.(none)>change master to master_host='10.xx.xx.xx',
    -> master_user='replica',
    -> master_password='xxxxx',
    -> master_port=5511,
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)


localhost.(none)>start slave;
Query OK, 0 rows affected (0.00 sec)


localhost.(none)>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.xx.xx.xx
                  Master_User: replica
                  Master_Port: 5511
                Connect_Retry: 60
                          ...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

發(fā)現(xiàn)實例的復(fù)制關(guān)系可以建立起來了。

一點總結(jié)

    當(dāng)磁盤寫滿的情況發(fā)生之后,mysql服務(wù)無法向元信息表中寫數(shù)據(jù),relay log也可能已經(jīng)不完整了,如果直接清理了服務(wù)器上的磁盤數(shù)據(jù),再去重新change master修改主從復(fù)制關(guān)系,可能會出現(xiàn)報錯,不能直接修復(fù),因為這不是一個正常的主從復(fù)制關(guān)系斷裂場景。

   所以,正確的做法應(yīng)該是:

1、清理服務(wù)器的磁盤

2、重啟復(fù)制關(guān)系斷開的那個從庫

3、重新reset slave all、change master來搭建主從復(fù)制關(guān)系即可

   如果有更好的方法,還請不吝賜教。

以上就是磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案的詳細(xì)內(nèi)容,更多關(guān)于MySQL復(fù)制失敗的解決方案的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySql主從復(fù)制機制全面解析
  • Mysql主從復(fù)制與讀寫分離圖文詳解
  • MySQL 復(fù)制表的方法
  • MySQL 8.0.23中復(fù)制架構(gòu)從節(jié)點自動故障轉(zhuǎn)移的問題
  • MYSQL數(shù)據(jù)庫GTID實現(xiàn)主從復(fù)制實現(xiàn)(超級方便)
  • MySql主從復(fù)制實現(xiàn)原理及配置
  • 淺析MySQL的WriteSet并行復(fù)制
  • MySQL主從復(fù)制原理以及需要注意的地方
  • mysql 如何動態(tài)修改復(fù)制過濾器
  • 淺析MySQL并行復(fù)制
  • MySQL復(fù)制問題的三個參數(shù)分析

標(biāo)簽:銅川 蘭州 湘潭 黃山 仙桃 崇左 衡水 湖南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《磁盤寫滿導(dǎo)致MySQL復(fù)制失敗的解決方案》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    常德市| 贵溪市| 宾川县| 沙湾县| 丹江口市| 北碚区| 湖州市| 石嘴山市| 临沭县| 清河县| 诸城市| 彰化县| 土默特右旗| 门头沟区| 佳木斯市| 即墨市| 得荣县| 淳化县| 富平县| 修文县| 开阳县| 和平县| 汉源县| 赤水市| 齐河县| 青冈县| 化隆| 忻城县| 乐东| 临高县| 泽州县| 三门峡市| 永新县| 石楼县| 宜城市| 虞城县| 勐海县| 黄龙县| 定边县| 潼南县| 长宁县|