这是更快的mysqldump /恢复或改变表?

我有InnoDB数据库,他们使用相同的ibdata文件,这个ibdata的大小是250G左右。 现在我有一个100G左右的数据库。 我的经理要求我把这个数据库移到另一台服务器上,并使用innodb_file_per_table。
现在我不能离开系统很长一段时间。 所以我需要你的build议,这是更快:

  • mysqldump -uusername -pmypassword –extended-insert –disable-keys –quick MyDb> Mydb.sql,然后在第二台服务器上mysql -uusername -ppass mydb
  • 或者将ibdata文件复制到我的另一台服务器上,然后遍历所有表格,然后执行以下操作:
    1. ALTER TABLE table_name DISABLE KEYS;
    2. ALTER TABLE table_name engine = myisam;
    3. ALTER TABLE table_name engine = innodb;
    4. ALTER TABLE table_name启用KEYS;

如果你有更好的想法,请与我们分享!
谢谢你的帮助

复制ibdata文件是充满危险的。 元数据的重要部分可以存储在其他文件中,例如ib_logfile0和ib_logfile1(这不是全面的列表),新服务器上的设置(例如这两个日志文件的大小)需要与旧服务器完全相同。 如果你得到这些东西错误或错过复制其中一个文件,新的服务器将不会启动,你将不得不在错误日志中处理MySQL有用的错误消息。

Xtrabackup为你处理所有这些。 在使用它来转储数据并“准备”之后,您可以直接将文件复制到新服务器,并使用新的ibdata文件启动它。 “准备”步骤需要相当长的时间。

但是,既然你提到你所移动的数据库只有100GB的250GB的ibdata文件,我猜想使用mysqldump方法会更快,因为它只需要传输100GB的数据而不是250GB。

你可以将mysqldump的输出直接input到mysql中,以避免将转储保存到磁盘上,如下所示:

mysqldump -uusername -pmypassword MyDB | mysql -h server2 -uusername -pmypassword MyDB

mysql客户端有一个-C选项,在两端都支持的情况下启用压缩。 把它放在-h选项之前。 通过networking传输可能是整个操作中最慢的部分。 如果你的服务器不支持压缩,你可以通过ssh使用-C选项来进行传输:

mysqldump -uusername -pmypassword MyDB | ssh -C server2 "mysql -uusername -pmypassword MyDB"

最后一个想法:除非你有一个10MB / s的networking,否则写这个的时间可能比两种方法都要长。 开始吧。 🙂

复制物理数据文件始终比导出/导入实际数据快; 前者只需要磁盘I / O,而后者则需要数据库引擎处理数据。

此外,导出的数据(文本格式)通常比二进制数据文件大很多,如果您通过networking传输数据文件,则需要更多时间(以及带宽)。