必须执行SELECT @@innodb_file_per_table;或SHOW VARIABLES LIKE 'innodb_file_per_table';确认返回1或ON,且配置已写入my.cnf的[mysqld]段并重启MySQL,否则即使显示ON也会因未持久化而失效。

确认当前是否已启用 innodb_file_per_table
别跳过这步——很多“优化失败”其实是因为变量显示为 ON,但重启后回退了。执行:SELECT @@innodb_file_per_table; 或 SHOW VARIABLES LIKE 'innodb_file_per_table';
返回 1 或 ON 才算真正生效。注意:MySQL 5.6 及更早版本不支持动态持久化,即使 SET GLOBAL innodb_file_per_table = ON; 成功,重启后仍会丢失。
在 [mysqld] 段中正确配置并重启
必须写进配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),且只能放在 [mysqld] 段下:innodb_file_per_table = ON
或旧版兼容写法:innodb_file_per_table = 1
改完必须重启 MySQL 实例:sudo systemctl restart mysql(或 mysqld,依系统而定)
不重启,新表仍会写入 ibdata1;写错段(比如塞进 [client])则完全无效。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
老表不会自动迁移,得手动重建
启用 innodb_file_per_table 后,所有新建表立即拥有独立 .ibd 文件,但已有表仍锁死在共享表空间 ibdata1 中,删表也不释放磁盘空间。要让老表“搬出去”,只有两个等效操作:
- ALTER TABLE <code>your_table ENGINE=InnoDB;
- OPTIMIZE TABLE <code>your_table;
两者都会重建表、生成新 .ibd 并清空原数据块。注意:操作期间表被锁,大表需避开业务高峰;执行前务必确认备份可用。
开启后要注意文件描述符和监控粒度变化
每张表一个 .ibd 文件,意味着打开的文件数直线上升。若业务有几百张 InnoDB 表,open_files_limit 得同步调高(建议 ≥ max_connections * 10)。另外,du -sh /var/lib/mysql/*/*.ibd 可直接看单表大小,但 ibdata1 不再增长不代表它没用——它仍存着元数据、undo log、doublewrite buffer 等关键内容,不能删。

















