Mysql

如何將混合了 InnoDB 和 MyISAM 的 MySQL 數據庫複製到同一台伺服器?

  • September 3, 2019

因為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 表的一些鎖定時間。

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