如何将混合了 InnoDB 和 MyISAM 的 MySQL 数据库复制到同一台服务器上?

Eri*_* Xu 5 mysql innodb myisam mysqldump backup

因为mysqldump需要永远,我们决定只移动文件。因为 2 个数据库在同一台服务器上,所以 acp会很快。

问题是,从研究来看,MyISAM 可以完全移动,但 InnoDB 不是。

我读到了这个:http : //www.mysqlperformanceblog.com/2009/07/31/copying-innodb-tables-between-servers/

最后一个问题是,有没有办法一次移动整个数据库并确保 InnoDB 和 MyISAM 表都正常。

有任何想法吗?非常感谢!

Rol*_*DBA 4

在放弃 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
Run Code Online (Sandbox Code Playgroud)

如果您不想关闭主服务器上的 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};"
Run Code Online (Sandbox Code Playgroud)

在执行此操作时,我在缓存数据和索引页方面更加保守。就我个人而言,我更喜欢在几次 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
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

警告

如果您有任何 InnoDB 数据,您应该在尝试 rsync 之前大约 1 小时设置此值:

SET GLOBAL innodb_max_dirty_pages_pct = 0;
Run Code Online (Sandbox Code Playgroud)

这将导致 InnoDB 更快地从 InnoDB 缓冲池中调出未提交的数据。在 MySQL 5.5 中,这不再是必要的。