2014-12-02 65 views
0

我發現文章指出運行「mysqldump -u user -p password --single-transaction schema> file.sql」是轉儲數據庫而不是鎖定表的正確方法,並確保一致的狀態。mysqldump對單事務參數的影響

因此,當我們的應用程序支持它時,我傾向於傾銷我們的100GB INNODB數據庫,這對我們應用程序的性能影響很小。但事實並非如此。我們的應用程序的日誌表明,mysql活動被阻止了20分鐘(轉儲需要大約90分鐘,所以只是其中的一個子集)。不幸的是,我不確切知道當時在做什麼。

另外,「單事務」是如何工作的?它如何不鎖定表格,並捕捉特定時刻?

回答

1

這個問題可能是dba.stackexchange.com更適合,但是...

簡單地說,MySQL的轉儲--single-transaction避免通過啓動設置爲REPEATABLE READ隔離級別的事務使用表鎖。

此讀取是一種一致性讀取(即在同一事務中的其他讀取將看到原始行,即使其他人已更改它們)。從交易中再次查詢相同的數據將會看到原始快照。 MySQL使用非常傳統的MVCC來實現這個快照。這可以確保您在轉儲數據庫時具有一致的狀態(轉儲事務不會看到新的更改)。

實際上有些情況下仍然使用全表鎖(--flush logs,--master-data),但假設您的示例命令具有代表性,那麼您並未使用它們。

拋開--single-transaction的解釋,如果您的查詢是真正鎖定的,我們需要更多信息。如果您知道您的查詢何時被阻止,那麼在當時運行SHOW FULL PROCESSLISTSHOW ENGINE INNODB STATUS以幫助您縮小正在發生的事件。