如何在不使用 mysqldump 的情況下複製 MySql 伺服器的數據?
我有一個工作伺服器,上面有很多數據。我已經建立了一個更快的新伺服器。兩者都在 Debian Squeeze 上執行 x686 程式碼。
使用其中一個表進行的快速測試表明,載入一個簡單的 mysqldump dbname tablename > table.sql mysql dbname < table.sql 的輸出大約需要十天時間
因為我有很多包含大量數據的表,所以這行不通。直到聖誕節才能把它們全部裝滿。
有什麼方法可以將 mysqld 在第一台伺服器上使用的二進製文件複製到第二台伺服器上的磁碟上,然後在不轉儲/重新載入的情況下使用它們?
如果不是,轉儲或載入選項是否會讓我的速度提高兩個數量級?
一個典型的表有 1000 萬到 1 億條記錄。記錄長度從每條記錄 100 字節到 10K 字節不等。
讓舊的慢速伺服器成為新的快速伺服器的複制客戶端會很好,但我認為我必須先獲取數據。
謝謝
這個問題本質上等於這個問題:“什麼是 MySQL 的快速備份 + 恢復方法”。這是因為設置 MySQL 複製本質上是進行某種備份,然後在另一台機器上打開它(然後將 slave 與 master 同步,這是一個簡單的操作)。
所以歸結
mysqldump
為對你來說太慢了(有道理)。我剛剛在這裡回答了同樣的問題,但這裡是重點:
- Percona Xtrabackup 是一種常用且經過測試(且免費)的備份工具。如果您使用 InnoDB,您會很感興趣,因為它會對 InnoDB 表空間進行熱備份,對正在執行的伺服器影響很小。生成的備份反映了備份過程結束的時間,這意味著您的從站的初始延遲更短。
- 文件系統快照,通過 ZFS 等文件系統,或通過 LVM,或其他基於磁碟的快照,都是很好的解決方案。有些(尤其是 LVM)比其他的負載更大。
上述解決方案的共同點是它們用於二進製備份,而不是邏輯備份。
對於您的下一個問題 - 是的。您可以使用MyDumper,它可以進行多執行緒備份(由多執行緒 MyLoader 工具補充)。此備份是合乎邏輯的,並在
mysqldump
內部同時使用。它通常比標準快幾倍mysqldump
。
一般情況下我會建議設置並行mysqldumps(Mysql備份策略?)。但是,它對巨大的桌子無效。為什麼 ?
在 mysqldump 中重新創建一個表基本上就是這樣做的
- 創建表
- 鎖定表…寫入
- ALTER TABLE … DISABLE KEYS(僅適用於 MyISAM)
- 多個擴展 INSERT INTO
- ALTER TABLE …啟用鍵(僅適用於 MyISAM)
- 解鎖桌子
具有大量索引或具有大列索引的巨型 MyISAM 表成為整個重新載入的即時瓶頸,即使您轉儲每個單獨的表也是如此。
你能做什麼。好吧,我只推荐一件事。同步!rsync 有什麼可能的優勢?
**優勢 #1:**不會處理 SQL。您的嚴格重點只是複制(缺點:在任何給定的 rsync 期間,Master 上的磁碟 I/O 增加)
**優勢#2:**停機時間最短。您將需要關閉源伺服器上的 mysql,但您可以最大限度地減少停機時間。
這是基本思想:您可以在主伺服器上對 /var/lib/mysql 執行 rsync,然後將其複製到從伺服器上的 /var/lib/mysql。當然,您需要多次執行 rsync。在複製之前,請確保您使用所有二進制日誌並從頭開始。
注意:如果您沒有啟用二進制日誌記錄:在執行任何東西之前,請確保二進制日誌寫入主伺服器和從伺服器的 /var/lib/mysql 中,方法是在 /etc/my.cnf 中包含以下內容:
[mysqld] log-bin=mysql-bin
以下腳本將關閉 mysql 以進行最終的 rsync:
SOURCE_DATADIR=`mysql -u... -p... -ANe"SHOW VARIABLES LIKE 'datadir'" | awk '{print $2}'` TARGET_DATADIR=${SOURCE_DATADIR} mysql -u... -p... -e"RESET MASTER;" RSYNCSTOTRY=7 cd ${SOURCE_DATADIR} X=0 while [ ${X} -lt ${RSYNCSTOTRY} ] do X=`echo ${X}+1|bc` rsync -r * slaveserver:${TARGET_DATADIR}/. sleep 60 done service mysql stop rsync -r * slaveserver:${TARGET_DATADIR}/. service mysql start
這就是來自 master 的 rsync 部分的全部內容。奴隸呢???
在從屬伺服器上啟動 mysql 之前,您需要從主伺服器獲得日誌文件和日誌位置。您複製的二進制日誌有您需要,尤其是最後一個二進制日誌。以下是如何在從站上獲取它:
cd /var/lib/mysql (or the datadir for your OS) for X=`ls -l mysql-bin.0* | awk '{print $5}'` do LOGFIL=${X} done LOGPOS=`ls -l ${LOGFIL} | awk '{print $9}'` echo "Master Log File ${LOGFIL} Position ${LOGPOS}"
您可以信任這些數字,因為您親自從大師那裡複製了它們。現在您有了主日誌和位置,您可以在從屬上啟動 mysql 並使用剛剛報告的日誌文件和日誌位置設置複製。
CAVEAT #1:我不能對這種方法的性能做出任何承諾。這仍然是一個選擇。
CAVEAT #2 : 確保您正在復製到另一台執行相同版本 MySQL (5.0 - > 5.0,5.1 - > 5.1,5.5 - > 5.5) 的伺服器
CAVEAT #3:確保您正在復製到從伺服器上的相同 DATADIR。否則,將 TARGET_DATADIR 設置為您選擇的文件夾。