Mysql

無需停機即可將 MariaDB/MySQL 遷移到另一台伺服器

  • October 19, 2018

系統:MariaDB (MySQL 5.5)

參數:innodb_file_per_table=1

我現在擁有的數據庫正在接近其全部容量(現在 94% 已滿,6.4TB 中的 6.9TB)

我無法執行 OPTIMIZE TABLE 來回收空間,因為沒有足夠的空間來保存臨時表。

我準備了另一台新伺服器來遷移批量數據。但是,我不希望在此期間有任何停機時間。

因此,我嘗試執行以下操作:

1)在最常用和巨大的表中,我開始刪除舊的/不必要的記錄以承受傳入的插入(因為通過刪除記錄,MySQL 將重用空間)

  1. 通過執行查詢記錄並通過執行批量插入(每 5000 次)將它們插入新伺服器的腳本開始遷移數據。我執行腳本的原因是因為新伺服器中的數據庫架構不同(我對錶進行了分片)。

遇到的問題:

1)傳入記錄的插入速度快於刪除速度,這意味著我的.ibd表還在增長

2)批量插入遷移腳本還是太慢了,肯定不能在原數據庫伺服器滿之前及時完成(差不多要遷移4TB+數據)

我很可能可以並行執行更多的遷移腳本,看看是否可以以更快的速度刪除舊記錄。

但是,我可以採取任何替代方法或進行改進嗎?

編輯:應用程序目前指向舊伺服器和新伺服器,並且在每一批完整的記錄遷移之後,我將更新應用程序,使其連接到新伺服器。儲存不是 SAN,而是直接連接的。由於磁碟埠用完,我們無法向本地儲存添加更多。此外,我們沒有定期備份(這是我們最後的一個巨大錯誤)。

你在 Linux 伺服器上使用 LVM 嗎?在這種情況下,您可以獲得最少的停機時間解決方案:

將數據庫切換到主伺服器,停止伺服器幾秒鐘以製作 LVM 快照,再次啟動主伺服器,將快照掛載到臨時目錄中以將數據複製到新的(更大的)伺服器,然後配置一個從伺服器。然後你可以啟動slave,讓它與master同步直到更新,最後將slave提升為master。

詳細方法:https ://www.percona.com/blog/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

也許可以使用OPTIMIZE TABLE. 這是訣竅。按大小對錶格進行排序,OPTIMIZE最小的在前。如果幸運的話,您將在完成任務之前釋放足夠的空間。

如果您刪除了表的很大一部分,那麼OPTIMIZE將不需要與原始表一樣多的空間。

另一個技巧。這可能會完成這項工作。(我假設您使用的是 InnoDB?)而不是使用OPTIMIZE,使用ALTER TABLE ... ROW_FORMAT = COMPRESSED. 這可能會將表格縮小 2 倍。(但它在某些表格上的用處可能不會減少。)

引用自:https://dba.stackexchange.com/questions/220229