2012-03-30 51 views
0

我有一個1500萬行的表。在當天的某個時候,我運行一個查詢,刪除大約200萬行這些行。這需要大約30分鐘的時間來運行,因爲每個mysql管理員都在減慢整個實例的複製速度。MySQL - 使查詢複製友好

我想我可以將它轉換爲提交每1000行的存儲過程,但似乎複製仍然卡住,直到我的整個存儲過程完成。這將是可能的做外部的MySQL,但我真的想嘗試在MySQL內部做到這一點。這就是我的....有沒有辦法讓這個更復制友好。

BEGIN 
    DECLARE rowcount INT; 
    REPEAT 
     DELETE FROM tbl_sales_records WHERE salesFileNo = PassedInValue LIMIT 1000; 
     SELECT ROW_COUNT() INTO rowcount; 
     COMMIT; 
    UNTIL rowcount=0 
    END REPEAT; 
END$$ 
+0

您已經添加上'salesFileNo'的指數? – MichaelRushton 2012-03-30 15:29:56

+0

是的,這是索引..每次刪除後,我把它分成1000條記錄每個提交運行在主服務器上1到2秒的上衣。由於某些原因,即使提交完成複製滯後似乎與整個存儲過程完成所需的時間相匹配,也是如此。 – personalt 2012-03-30 15:37:17

回答

0

一個策略,我用了這樣的疑問是,讓他們出了二進制日誌,並分別在複製大師和複製從服務器(一個或多個)運行它們。這樣,他們不會阻止複製,假設刪除不會導致阻止其他語句的任何鎖定。

爲了做到這一點,您需要以具有SUPER權限的用戶身份運行這些命令,並且需要注意確保刪除主站和從站上完全相同的數據以避免不一致但它可能是一種非常有用的技術。

關鍵是要使用SQL_LOG_BIN設置來禁用運行刪除的會話的二進制日誌記錄。

例如:

SET SQL_LOG_BIN = 0; 
DELETE FROM tbl_sales_records WHERE salesFileNo = PassedInValue; 

或者,如果您使用的是存儲過程仍然可以禁用二進制日誌以同樣的方式:

SET SQL_LOG_BIN = 0; 
CALL your_delete_proc(); 
+0

謝謝..你似乎對MySQL複製的一些問題非常瞭解。沒辦法,我獲得超級用戶權限,如果它歸結爲,我很可能會重新編寫上傳之前解析這些文件的perl腳本。 您是否有任何關於爲什麼提交在主服務器上正常工作但不釋放日誌以便它可以複製的知識? – personalt 2012-03-30 15:54:28

+0

寫入二進制日誌的內容是調用存儲過程,而不是存儲過程中的單個DML語句。並且存儲的proc調用在完成執行之前不會寫入二進制日誌。 – 2012-03-30 18:36:37