将 .frm(SQL 数据文件)转换为文本文件

将 .frm(SQL 数据文件)转换为文本文件

我正在尝试将 .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。

相关内容