2012-03-28 54 views
9

我即將遷移我們的生產數據庫到另一臺服務器。它大約38GB,使用MYISAM表格。由於我沒有物理訪問新的服務器文件系統,我們只能使用mysqldump。mysqldump不中斷現場製作INSERT

我已經瀏覽過這個網站,看看mysqldump的在線備份是否會導致我們的生產網站。從這篇文章:Run MySQLDump without Locking Tables,它說顯然mysqldump會鎖定數據庫並防止插入。但經過幾次測試後,我很好奇,否則會發現它。

如果我使用

mysqldump -u root -ppassword --flush-logs testDB > /tmp/backup.sql 

mysqldump的最終將被默認做一個「--lock桌」,這是一個讀取本地鎖(refer to mysql 5.1 doc),其中併發插入仍然可用。我做了一個for循環,每秒鐘插入一個表,而mysqldump需要一分鐘才能完成。在此期間,每秒都會插入記錄。這意味着,mysqldump不會中斷生產服務器和INSERT仍然可以繼續

有沒有人有不同的經驗?我想確保這一點,然後再繼續到我的生產服務器,所以很高興知道我是否做了任何錯誤的事情,導致我的測試不正確。

[我的MySQL服務器的版本是52年5月1日,和mysqldump的是10.13]

+0

您應該獲得訪問新服務器** FIRST **,並可能尋找mysql複製來解決遷移問題。 **請記住:**您可以轉儲並安裝到新服務器,**但是**轉儲數據後,會有**更多**新寫入,如何將新寫入同步到新服務器? – ajreal 2012-03-30 22:18:15

+0

對於後續的新數據寫入,我們將通過使用mysqlbinlog來解決它,這應該很好的照顧。現在我主要關心的是第一次使用mysqldump進行備份。我只是想確定mysqldump是否會阻止INSERT。從我的測試來看,它沒有表現出來。只是想確保其他經驗如何。 – sylye 2012-04-02 11:40:13

回答

0

的mysqldump默認情況下不添加--lock桌。嘗試使用 - 鎖表 讓我知道它是否有幫助

順便說一句 - 你還應該使用加鎖,這將使您的導入速度更快!

+1

嗨,我再次測試,並確認默認mysqldump將發出 - 鎖表。兩點來證明。首先, 'mysqldump --help | grep lock' 會顯示'lock-tables'爲TRUE。 二,在mysqldump發生時,使用 'mysql>顯示打開的表;' ','In_use'列表示1,另一個mysql INSERT不會使它變爲2,這樣就表明它是一個LOCK READ LOCAL。 所以我的問題是,有沒有其他人有他們的mysqldump鎖定表,並防止插入?因爲我沒有。 – sylye 2012-03-30 10:56:58

1

我從來沒有做過,但你可以在傾銷時嘗試--skip-add-locks

雖然可能需要更長的時間,但您可以轉儲多個修補程序,每個修補程序都需要很少的時間才能完成。添加--skip--add-drop-table將允許您將這些多個較小的轉儲上載到同一個表中,而無需重新創建它。使用--extended-insert會使sql文件更小以啓動。

可能嘗試類似mysqldump -u -p${password} --skip-add-drop-table --extended-insert --where='id between 0 and 20000' test_db test_table > test.sql。您將需要轉儲表結構,並將其上傳一是爲了做這種方式,或刪除--skip-分插表的第一個轉儲

+0

嗨,謝謝你的建議。但目前我主要關心的並不是要減少mysqldump時間,因爲數據太多。我的意圖是找出,mysqldump'是否會在運行時阻止INSERT。尋找以前做過這些的人。 – sylye 2012-04-02 11:47:25

1

1)--opt使用的是相同的如指定--add-drop-table,--add-locks,--create-options,--disable-keys,--extended-insert,--lock-tables--quick--set-charset--opt代表的所有選項默認也處於打開狀態,因爲--opt默認處於打開狀態。

2) mysqldump可以逐行檢索並轉儲表內容,也可以從表中檢索整個內容並在轉儲之前將其緩存在內存中。如果您傾銷大型表格,內存中的緩衝可能會成爲問題。要逐行轉儲表,請使用--quick選項(或--opt,該選項啓用--quick)。 --opt選項(因此--quick)默認啓用,因此要啓用內存緩衝,請使用--skip-quick

3)--single-transaction此選項從服務器轉儲數據(事務表InnoDB)前發出BEGIN SQL聲明。

如果你的模式是既InnoDBMyISAM的組合,下面的例子將幫助您:

mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=512M db > db.sql 
2

現在,你可能有間斷表的數據庫或數據倉庫 - 這裏的一切是不是規範化(完全),以及表之間沒有鏈接的地方。在這種情況下,任何轉儲都可以工作。

我假設一個包含38G數據的生產數據庫包含某種形式的圖形(BLOB's),然後 - 很容易地 - 你有來自其他表的鏈接。對?因此,您可以 - 據我所知 - 可能會失去表之間的嚴重鏈接(通常是主鍵/外鍵對),因此,您可以在更新/插入點時捕獲一個表,而它的依賴(使用該表作爲其主要來源)尚未更新。因此,你將失去數據庫的所謂完整性。

通常,由於系統使用/生成/維護數據庫系統並未作爲面向事務處理的系統,因此恢復完整性非常麻煩,因此數據庫中的關係不能成爲除了通過主/外關鍵關係追蹤外。因此,你可能肯定會逃避複製你的桌子而沒有鎖和上面的許多其他建議 - 但是你有可能燒着你的手指,並且取決於系統的操作有多敏感 - 你可能會嚴重燒傷自己或者只是表面劃傷。例如:如果您的數據庫是關鍵任務數據庫系統,包含ICU生命支持設備的建議心率,則在進行遷移之前,我會考慮兩次以上。

但是,如果數據庫包含來自Facebook或類似網站的圖片=您可能能夠忍受從0到129,388丟失的鏈接:-)的任何後果。

現在 - 這麼多的分析。解決方案:

你必須創建一個軟件,它爲你完全完整地完成轉儲,由表設置,由元組元組。您需要識別可從當前在線24/7/365基地複製到新基地的數據集羣,然後執行該操作,然後標記該數據已被複制。

IFFF現在發生了對已經複製的記錄的更改,您將需要對這些記錄進行後續複製。這樣做可能是一件棘手的事情。

IFFF您正在運行更先進的MYSQL版本 - 您實際上可以創建另一個站點和/或副本或分佈式數據庫 - 然後通過這種方式逃脫。

IFFF你有一個可以說10分鐘的窗口,如果你需要它可以創建,那麼你也可以複製位於驅動器上的物理文件。我正在談論.stm .std - 等等 - 文件 - 然後您可以關閉服務器幾分鐘,然後複製。

我們一個基數問題:

你需要做你的機器維修不時。你的系統沒有獲得這種操作的空間嗎?如果不是,那麼當硬盤崩潰時,你會怎麼做。注意'何時' - 而不是'如果'。

+0

38 GB數據庫大小如何暗示圖形或BLOB內容? – MattBianco 2013-12-17 13:11:54