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

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

我有一个 MySQL 数据库,其中的表基于 InnoDB 引擎。但是服务器配置为仅使用一个文件 ibdata0,没有参数 innodb_file_per_table。我想在不进行转储的情况下更改此设置,然后在重新配置的服务器上恢复它。所以我的计划是innodb_file_per_table在 my.cnf 中添加参数,重新启动服务器并强制ALTER TABLE重建所有 InnoDB 表。

执行此操作ALTER TABLE tablename ENGINE = InnoDB.idb为目录中的每个.frm文件创建文件/val/lib/mysql/mydatabase,并且确实创建了文件(我认为是从ibdata文件中移动数据)。但在我关闭服务器并删除旧的 ibdata 文件后,我看到了所有表(SHOW TABLES),但如果我SELECT在其中创建任何表,则会收到此错误:

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

因此我推测部分数据仍保留在旧的 ibdata 文件中。

我遗漏了什么吗? 有办法做我想做的事吗?

答案1

不,您必须进行转储并恢复。即使执行了此alter table engine操作,一些数据仍会保留在 ibdata1 文件中。

  • 将所有 innodb 表转储到外部文件
  • 删除所有 innodb 表
  • 关闭 mysql
  • 删除 ibdata1(以及任何日志文件,如果存在)
  • 启动mysql
  • 导入 SQL 转储文件

我自己也遇到过这个问题,转储所有表然后重新导入它们而不关闭 mysql 是行不通的。必须先删除所有 innodb 表,然后才能删除 ibdata1 文件。

相关内容