如何將混合了 InnoDB 和 MyISAM 的 MySQL 數據庫複製到同一台伺服器?
因為
mysqldump
需要很長時間,我們決定只移動文件。因為 2 個數據庫在同一台伺服器上,所以 acp
會很快。問題是,根據研究,MyISAM 可以完全遷移,但 InnoDB 不行。
我讀到了這個:http ://www.mysqlperformanceblog.com/2009/07/31/copying-innodb-tables-between-servers/
最後一個問題是,有沒有辦法一次移動整個數據庫並確保 InnoDB 和 MyISAM 表都很好。
有任何想法嗎?非常感謝!
在你放棄 mysqldump 之前,你有沒有考慮過執行並行 mysqldump?
我寫了一個關於如何做到這一點的腳本:How can I optimize a mysqldump of a large database?
回到您的問題,只要目標數據庫伺服器具有與源數據庫伺服器完全相同的 MySQL 版本,您就可以訴諸實時伺服器的 rsync。
只需在主伺服器上對 /var/lib/mysql 執行 rsync 並將其複製到目標伺服器上的 /var/lib/mysql 即可。當然,我會多次執行 rsync。在最終的 rsync 之前,您應該執行
FLUSH TABLES WITH READ LOCK
. 在複製之前,請確保您使用所有二進制日誌並從頭開始。如果您希望目標伺服器具有二進制日誌記錄,請在 /etc/my.cnf 中設置如下內容:
[mysqld] log-bin=mysql-bin
如果您不想在主伺服器上關閉 MySQL,請嘗試執行此腳本:
RSYNCSTOTRY=10 cd /var/lib/mysql X=0 while [ ${X} -lt ${RSYNCSTOTRY} ] do X=`echo ${X}+1|bc` rsync -r * slaveserver:/var/lib/mysql/. sleep 60 done mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400);" sleep 60 SLEEPID=`mysql -u... -p... -e"SHOW PROCESSLIST;" | grep "SELECT SLEEP(86400)" | awk '{print $1}'` rsync -r * slaveserver:/var/lib/mysql/. mysql -u... -p... -e"KILL ${SLEEPID};"
在執行此操作時,我在記憶體數據和索引頁面方面更加保守。就個人而言,我更喜歡在幾次 rsync 之後關閉 mysql 而不是
FLUSH TABLES WITH READ LOCK
. 此腳本的另一種替代方法是以下腳本,它會關閉 mysql 以進行最終的 rsync:mysql -u... -p... -e"RESET MASTER;" RSYNCSTOTRY=10 cd /var/lib/mysql X=0 while [ ${X} -lt ${RSYNCSTOTRY} ] do X=`echo ${X}+1|bc` rsync -r * slaveserver:/var/lib/mysql/. sleep 60 done service mysql stop rsync -r * slaveserver:/var/lib/mysql/. service mysql start
試一試 !!!
警告
如果你有任何 InnoDB 數據,你應該在嘗試 rsync 之前大約 1 小時進行設置:
SET GLOBAL innodb_max_dirty_pages_pct = 0;
這將導致 InnoDB 更快地從 InnoDB 緩衝池中分頁出未送出的數據。在 MySQL 5.5 中,這不再是必需的。
另請查看 Percona 的 XtraBackup。InnoDB 表的停機時間基本上為零;MyISAM 表的一些鎖定時間。