从一个InnoDB(ibdata)文件到每个表的innodb文件的安全转换

我有InnoDB引擎上的MySQL数据库。 但服务器configuration为只使用一个文件ibdata0,而不使用参数innodb_file_per_table。 我想改变这个没有转储,并在重新configuration的服务器上恢复它。 所以我的计划是在my.cnf重启服务器上添加参数innodb_file_per_table ,并用ALTER TABLE强制重build所有的InnoDB表。

ALTER TABLE tablename ENGINE = InnoDB应该为我的/val/lib/mysql/mydatabase目录中的每个.frm文件创build.idb文件,它确实(我想从ibdata文件移动数据)。 但是,当我closures服务器,并删除旧ibdata文件,我看到所有的表( SHOW TABLES ),但如果我在他们做任何SELECT我得到这个错误:

 ERROR 1146 (42S02): Table 'mytable' doesn't exist 

所以我想有一些数据保留在旧的ibdata文件中。

我省略了什么? 有没有办法做我想做的事情?

不,你将不得不做一个转储和恢复。 即使在执行alter table engine技巧之后,一些数据仍将保留在ibdata1文件中。

  • 将所有innodb表转储到外部文件
  • 放下所有innodb表
  • closuresmysql
  • 删除ibdata1(以及任何日志文件,如果它们存在的话)
  • 启动mysql
  • 导入sql转储文件

我自己遇到这个问题,并倾销所有表,然后重新导入它们,而不closuresMySQL不起作用。 在删除ibdata1文件之前,所有的innodb表必须已经删除。