Innodb

如何有效地轉儲一個巨大的 MySQL innodb 數據庫?

  • November 7, 2012

我有一個 Ubuntu 10.04 生產 MySQL 數據庫伺服器,其中數據庫的總大小為 260 GB,而根分區的大小本身為 300 GB,其中儲存了 DB,基本上意味著大約 96% 的 / 已滿,並且沒有空間用於儲存轉儲/備份等等。到目前為止,沒有其他磁碟連接到伺服器。

我的任務是將此數據庫遷移到位於不同數據中心的其他伺服器。問題是如何以最少的停機時間有效地做到這一點?

我的想法是:

  • 請求將額外的驅動器附加到伺服器並在該驅動器中進行轉儲。$$ EDIT: It’s not possible now. $$
  • 將轉儲轉移到新伺服器,恢復它並使新伺服器成為現有伺服器的從屬伺服器以保持數據同步
  • 當需要遷移時,中斷複製,更新從屬配置以接受讀/寫請求並使舊伺服器只讀,這樣它就不會接受任何寫請求,並告訴應用程序開發人員使用新的 IP 地址更新那裡的配置。

你有什麼建議來改進這項任務或任何其他更好的方法來完成這項任務?

如果您正在考慮遷移到具有完全相同版本 MySQL 的另一台數據庫伺服器,您可能希望rsyncdatadir舊伺服器遷移到新伺服器。

無論 InnoDB 文件佈局如何,甚至是否存在 MyISAM 表,這都將起作用。

  1. 在 ServerB 上安裝與 ServerA 相同版本的 mysql
  2. 在 ServerA 上,執行RESET MASTER;以擦除 rsycn 程序之前的所有二進制日誌。如果未啟用二進制日誌記錄,則可以跳過此步驟。
  3. 在 ServerA 上,SET GLOBAL innodb_max_dirty_pages_pct = 0;從 mysql 執行大約 10 分鐘(這會從 InnoDB 緩衝池中清除臟頁。它還有助於更快地執行 mysql 關閉)如果您的數據庫都是 MyISAM,您可以跳過這一步。
  4. rsync ServerA 的 /var/lib/mysql 到 ServerB 上的 /var/lib/mysql
  5. 重複步驟 3,直到 rsync 花費不到 1 分鐘
  6. service mysql stop在伺服器 A 上
  7. 再執行一次 rsync
  8. scp ServerA:/etc/my.cnf 到 ServerB:/etc/。
  9. service mysql start在伺服器 B 上
  10. service mysql start在 ServerA 上(可選)

本質上,這就是這樣的腳本想要的

mysql -u... -p... -e"RESET MASTER;"
mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0;"
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
   X=`echo ${X}+1|bc`
   rsync -r * targetserver:/var/lib/mysql/.
   sleep 60
done
service mysql stop
rsync -r * targetserver:/var/lib/mysql/.
service mysql start

DBA StackExchange 的一位成員說我應該遠離FLUSH TABLES WITH READ LOCK;mysqlperformanceblog.com 中的一些內容

我通讀並了解到,針對 a 中間的 InnoDB 表的 SELECTFLUSH TABLES WITH READ LOCK;仍然可以允許以某種方式發生寫入。正如Arlukin在評論中指出的那樣,LVM 可以FLUSH TABLES WITH READ LOCK在 InnoDB 上正常工作(他的評論 +1)。

對於所有非 LVM 使用者,您可以使用全 MyISAM 數據庫與FLUSH TABLES WITH READ LOCK;. 對於 InnoDB,請堅持--single-tranaction在 mysqldumps 中使用。

引用自:https://serverfault.com/questions/445489