MySQL 砍不存在的 Table 造成 Replication 停擺解法

MySQL 於 Master 砍個不存在的 Table, Slave 沒有此 Table 的話, 就會造成 Replication 停擺, 會出現下述錯誤訊息: (有些不需要看到的訊息我先刪掉了)

Replicate_Wild_Ignore_Table:
Last_Errno: 1146
Last_Error: Error 'Table 'phpmyadmin.pma_table_info' doesn't exist' on query. Default database: ''. Query: 'DELETE FROM `phpmyadmin`.`pma_table_info` WHERE db_name  = 'test' AND table_name = 'item''
Skip_Counter: 1
Seconds_Behind_Master: NULL
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1146
Last_SQL_Error: Error 'Table 'phpmyadmin.pma_table_info' doesn't exist' on query. Default database: ''. Query: 'DELETE FROM `phpmyadmin`.`pma_table_info` WHERE db_name  = 'test' AND table_name = 'item''

上述發生的狀況是 Master 有 phpMyAdmin, Slave 沒有(所以 Slave 一開始同步也沒去建立 phpMyAdmin DB), 但是 phpMyAdmin 新版會建立自己的 DB, 於 phpMyAdmin 頁面上砍 Table 時, 他也要從自己的 pma_table_info 砍資料, 於是就造成 Replication 停擺, 就出現上述錯誤訊息.

MySQL 砍不存在的 Table 造成 Replication 停擺的修復方法

主要錯誤訊息是此行: Error 'Table 'phpmyadmin.pma_table_info' doesn't exist' on query. Default database: ''. Query: 'DELETE FROM `phpmyadmin`.`pma_table_info` WHERE db_name  = 'test' AND table_name = 'item''

看到錯誤訊息是 SQL 語法造成 MySQL Replication 停擺時, 就會想要將此 SQL 語法跳過, 看能不能就這樣子解決, 如下述:

  1. 以下命令都在 mysql> 執行.
  2. STOP SLAVE;
  3. SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
  4. START SLAVE;
  5. SHOW SLAVE STATUS \G
  6. 結果錯誤訊息一樣, 解決不了~

解法

MySQL 還是堅持要砍這個 Table, 所以, 最終解法就是建立這個 Table 讓他砍. XD

但是既然要建立 Table, 那不如乾脆把 Master 的 phpmyadmin 整個 sync 進來, 以防未來出事, 所以解法如下: (以下是因為 phpmyadmin 造成的, 其他 DB 造成的, 請替換成 Dump 出事的 DB)

  1. ssh MySQL-Master-Machine
  2. mysqldump -u root -p phpmyadmin > phpmyadmin.sql
  3. scp phpmyadmin.sql MySQL-SLAVE-Machine:
  4. ssh MySQL-Slave-Machine
  5. mysql -u root -p
  6. mysql> create database phpmyadmin;
  7. mysql> use phpmyadmin;
  8. mysql> source phpmyadmin.sql;
  9. mysql> stop slave;
  10. mysql> start slave; # 這樣 MySQL 會重新執行出問題的 SQL 語法, 可以執行通過就正常了.
  11. 到此就恢復運行, 等待 Master 與 Slave sync 即可.

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料