![将 .frm(SQL 数据文件)转换为文本文件](https://linux22.com/image/1338120/%E5%B0%86%20.frm%EF%BC%88SQL%20%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%EF%BC%89%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6.png)
我正在尝试将 .frm(sql 数据文件)转换为文本文件,这样做的原因是我想看看 sql 引擎如何在“后台”存储数据,例如:当使用“ENUM”时,sql 存储一个名为“INDEX”的“INTEGER”,所以如果有人知道将 .frm 转换为 .txt 的软件或方法,谢谢大家,祝你有美好的一天。
答案1
本文提供了一种行之有效的方法:
如何做到这一点的基本原理并不难理解,但细节却很棘手。这个问题的第一部分是如何从 .frm 文件中提取表定义。我将在另一篇文章中介绍问题的第二部分。您可以编写一个程序来读取和解析 .frm 文件并输出表定义,但这需要大量工作 — 尤其是当您可以欺骗 MySQL 为您完成这项工作时。以下是您对文件 foo.frm 执行此操作的方法。
mysql> CREATE TABLE `test`.`foo` (id int) ENGINE=InnoDB;
我们创建了一个名为 foo 的 InnoDB 表。MySQL 在 $datadir/test 中写入了一个 foo.frm 和一个 foo.ibd 文件。它还在数据字典中记录了该表。
mysql> FLUSH TABLES;
这会导致 MySQL 关闭所有打开的表并刷新查询缓存。这样做的目的是强制 MySQL 忘记我们刚刚创建的表“foo”。
bash# cp foo.frm /var/lib/mysql/test;
我们只是重写了 test.foo 的表定义。我们在 MySQL 仍在运行时热完成了此操作。
mysql> SHOW CREATE TABLE `test`.`foo`;
这将输出我们刚刚复制到测试目录中的 foo.frm 文件的表定义。MySQL 可能会有点困惑,因为 .frm 文件中的信息可能与系统表空间中的信息不匹配。您可能会在错误日志中看到这样的消息:
[错误] 表 ./test/foo 在 InnoDB 数据字典中没有主键,但在 MySQL 中却有!如果您使用 MySQL 版本 < 3.23.54 创建表,并且未定义主键,但定义了具有所有非 NULL 列的唯一键,则 MySQL 内部会将该键视为主键。您可以通过转储 + DROP + CREATE + 重新导入表来修复此错误。
没关系,只要清理一下就可以了。
mysql> DROP TABLE `test`.`foo`;
为了避免对几百张表进行这样的操作带来的烦恼,请使用以下提供的脚本:bluegecko 文章。你应该被分类。Chagbert。