我有一个 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 文件。