Mysql

如何在 MySQL 中報告長時間執行的事務的進度?

  • January 9, 2015

我在儲存過程中有這個事務:

...
START TRANSACTION;

WHILE @Codes > 0 DO

   EXECUTE qry_rand_stmt;
   EXECUTE qry_insert_stmt;

   SET @Codes = @Codes - ROW_COUNT();

END WHILE;

COMMIT;
...

這可以在任何地方插入多達 1M 的唯一行,最多需要 10 分鐘,這很好而且很花哨,但我需要一種方法來報告它的進度。

我通常會添加一個 if 語句,該語句將執行查詢以每 1000 次插入更新其進度的作業表,但因為這是在事務中,所以如果在外部查詢,則更新不會出現,直到整個事務完成,這違背了目的具有您只會在作業開始和完成時看到的狀態。

我什至考慮過每 1000 次插入送出一次,這樣我就可以報告進度,但是如果以後出現問題,或者作業在完成之前被取消,我將失去回滾所有插入的能力。

那麼,有沒有辦法在不成為事務的一部分並立即寫入表/行的事務中執行更新查詢?

如果沒有,您有任何解決方法嗎?

有一些警告適用於在同一查詢中混合事務和非事務表,但在這種情況下,您實際上是在這樣做,因為副作用是可取的……所以我認為以下建議沒有問題:

MEMORY儲存引擎似乎非常適合此應用程序。它是非事務性的,因此您的“狀態”插入/更新將立即對其他執行緒可見。

儲存在MEMORY表中的數據將持續存在,直到表被截斷或行被刪除,或者直到伺服器重新啟動。在複製環境中,重新啟動的主伺服器也會在主伺服器重新啟動時指示從伺服器清空其記憶體表副本,因為主伺服器的表將開始為空。

此外,如果您在複製環境中執行此操作,a binlog_formatof MIXEDorROW可能是最好的,因為這些格式允許更具確定性的複制,並且在使用事務和非事務表複製查詢時確定性變得更加棘手。

引用自:https://dba.stackexchange.com/questions/88975