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 語法跳過, 看能不能就這樣子解決, 如下述:
- 以下命令都在 mysql> 執行.
- STOP SLAVE;
- SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
- START SLAVE;
- SHOW SLAVE STATUS \G
- 結果錯誤訊息一樣, 解決不了~
解法
MySQL 還是堅持要砍這個 Table, 所以, 最終解法就是建立這個 Table 讓他砍. XD
但是既然要建立 Table, 那不如乾脆把 Master 的 phpmyadmin 整個 sync 進來, 以防未來出事, 所以解法如下: (以下是因為 phpmyadmin 造成的, 其他 DB 造成的, 請替換成 Dump 出事的 DB)
- ssh MySQL-Master-Machine
- mysqldump -u root -p phpmyadmin > phpmyadmin.sql
- scp phpmyadmin.sql MySQL-SLAVE-Machine:
- ssh MySQL-Slave-Machine
- mysql -u root -p
- mysql> create database phpmyadmin;
- mysql> use phpmyadmin;
- mysql> source phpmyadmin.sql;
- mysql> stop slave;
- mysql> start slave; # 這樣 MySQL 會重新執行出問題的 SQL 語法, 可以執行通過就正常了.
- 到此就恢復運行, 等待 Master 與 Slave sync 即可.