我有 InnoDB 数据库,它们使用相同的 ibdata 文件,这个 ibdata 的大小约为 250G。现在我有一个大约 100G 的数据库。我的经理让我将这个数据库移动到另一台服务器并使用 innodb_file_per_table。
现在我不能让系统长时间关闭。所以我需要你的建议,哪个更快:
- mysqldump -uusername -pmypassword ––extended-insert ––disable-keys ––quick MyDb>Mydb.sql,然后在第二台服务器上mysql -u用户名-ppass mydb
- 或者将 ibdata 文件复制到我的另一台服务器并检查所有表并执行以下操作:
- 更改表表名禁用键;
- 更改表表名引擎=myisam;
- 更改表表名引擎=innodb;
- ALTER TABLE 表名启用 KEYS;
如果你有更好的想法,请与我们分享!
谢谢你的帮助
答案1
复制 ibdata 文件非常危险。重要的元数据可以存储在其他文件中,例如 ib_logfile0 和 ib_logfile1(这不是完整的列表),新服务器上的设置(例如这两个日志文件的大小)需要与旧服务器完全相同。如果您弄错了其中任何内容或忘记复制其中一个文件,新服务器将无法启动,您将不得不处理错误日志中 MySQL 的有用错误消息。
备份软件为您处理所有这些。使用它转储数据并“准备”数据后,您可以直接将文件复制到新服务器,并使用新的 ibdata 文件启动它。“准备”步骤需要大量时间。
但是,由于您提到要移动的数据库只是 250GB ibdata 文件中的 100GB,我认为使用 mysqldump 方法会更快,因为它只需要传输 100GB 数据而不是 250GB。
您可以将 mysqldump 的输出直接导入到 mysql 中,以避免必须将转储保存到磁盘,如下所示:
mysqldump -uusername -pmypassword MyDB | mysql -h server2 -uusername -pmypassword MyDB
mysql 客户端有一个 -C 选项,如果两端都支持压缩,则启用压缩。只需将其放在 -h 选项之前即可。通过网络传输可能是整个操作中最慢的部分。如果您的服务器不支持压缩,您可以使用 -C 选项通过 ssh 进行传输:
mysqldump -uusername -pmypassword MyDB | ssh -C server2 "mysql -uusername -pmypassword MyDB"
最后的想法:除非您的网络速度达到 10MB/s,否则我编写这篇文章所花的时间可能比两种方法加起来还要长。开始吧。:-)
答案2
复制物理数据文件是总是比导出/导入实际数据更快;前者只需要磁盘I/O,而后者还需要数据库引擎处理数据。
此外,导出的数据(文本格式)通常比二进制数据文件大很多,将它们传输到新服务器将需要更多时间(如果通过网络进行传输,则需要更多带宽)。