【實驗】
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異常退出,這三個觸發器沒有被正常刪除,就會出現上述情況。