ERROR 1146 (42S02): Table 'test._mgc_new' doesn't exist

測試時發現一個有趣的問題,更新表A,確報表B不存在。這是爲什麼呢?

【實驗】
MariaDB [test]> update  test.mgc set c1='xxx1' where id=4; 
ERROR 1146 (42S02): Table 'test._mgc_new' doesn't exist
檢查發現_mgc_new表確實不存在。
MariaDB [test]> show tables like '%mgc%';
+------------------------+
| Tables_in_test (%mgc%) |
+------------------------+
| mgc                    |
+------------------------+
1 row in set (0.00 sec)

會不會是觸發器搗的鬼呢?檢查發現mgc表上果然有三個觸發器。
MariaDB [test]> select concat(TRIGGER_SCHEMA,'.',TRIGGER_NAME)   from information_schema.TRIGGERS where  EVENT_OBJECT_TABLE  like '%mgc%';
+-----------------------------------------+
| concat(TRIGGER_SCHEMA,'.',TRIGGER_NAME) |
+-----------------------------------------+
| test.pt_osc_test_mgc_ins                |
| test.pt_osc_test_mgc_upd                |
| test.pt_osc_test_mgc_del                |
+-----------------------------------------+
3 rows in set (0.00 sec)

檢查了這三個觸發器的內容,發現並不是開發創建的。刪除這三個觸發器後,update能正常進行。
MMariaDB [test]> select concat('DROP TRIGGER  ',TRIGGER_SCHEMA,'.',TRIGGER_NAME,' ;')   from information_schema.TRIGGERS where  EVENT_OBJECT_TABLE  like '%mgc%';
+---------------------------------------------------------------+
| concat('DROP TRIGGER  ',TRIGGER_SCHEMA,'.',TRIGGER_NAME,' ;') |
+---------------------------------------------------------------+
| DROP TRIGGER  test.pt_osc_test_mgc_ins ;                      |
| DROP TRIGGER  test.pt_osc_test_mgc_upd ;                      |
| DROP TRIGGER  test.pt_osc_test_mgc_del ;                      |
+---------------------------------------------------------------+

MariaDB [test]> DROP TRIGGER  test.pt_osc_test_mgc_ins ; 

MariaDB [test]> DROP TRIGGER  test.pt_osc_test_mgc_upd ;

MariaDB [test]> DROP TRIGGER  test.pt_osc_test_mgc_del ;  

MariaDB [test]> update  test.mgc set c1='xxx1' where id=4; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
至此不能update的問題已經解決。


那麼mgc表上的三個觸發器是怎麼來的呢?

從觸發器的名字的前綴來看,發現三個觸發器都是以pt_osc_開始的,使用過pt-online-schema-change的都知道,這是pt-online-schema-change在做DDL時要創建的insert,update,delete觸發器。正常情況下這三個觸發器在pt-online-schema-change完成了DDL操作時,會刪除這三個觸發器的。如果pt-online-schema-change異常退出,這三個觸發器沒有被正常刪除,就會出現上述情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章