我有许多大型数据库,每个数据库都超过 350GB,每个数据库包含 100 多个表。它们主要是 MyISAM 表,还有一些 InnoDB 表。
平台:Linux、MySQL 5.1、MyISAM + InnoDB 表(启用 file_per_table 选项)
我需要在主服务器上复制这些数据库,并让复制正确反映在从属服务器上,但遇到了一些问题。
执行 mysqldump 然后恢复成功,但是速度非常慢,并且从属服务器需要很长时间才能赶上。
直接对数据文件进行磁盘复制似乎不起作用,因为 information_schema 不能准确反映复制的数据库 - 在某些情况下,表甚至似乎不存在于目标数据库中,即使 myisamchk 能够成功检查和修复索引。
有没有办法执行数据文件的磁盘复制,并让 information_schema 准确反映复制的数据库,还是我只需要将其合并并坚持使用转储/恢复选项?如果我可以用这种方式复制数据库,我可以在不破坏复制状态的情况下在从属服务器上执行相同的步骤吗?
提前致谢,戴夫
答案1
最安全的方法是关闭主数据库,将二进制数据库文件从主数据库复制到从属数据库,将它们都启动并开始复制。对于 350Gb 的表,我可以理解这可能是一个有问题的解决方案。您可以通过以最快的速度复制来节省一些时间,这通常意味着复制到主服务器上的另一组磁盘。然后,您可以重新启动主数据库,并慢慢地通过较慢的网络链接移动副本。
从 MySQL 下方复制 MyISAM 文件是可行的,或者至少我知道在 MySQL v3 和 v4 时代是可行的。(运行时请确保已关闭从属服务器myisamchk
。)但是,这对 InnoDB 文件不起作用。
有一种名为“MySqL Hot Backup”的工具或类似的工具也能以更聪明的方式完成所有这些工作。但问题是您可能需要付费,至少对于 InnoDB 支持而言。