表结构存储在.frm文件和InnoDB数据字典中。有时,通常在数据恢复问题中,我们需要恢复这些结构,以便能够找到丢失的数据或只是重建表。
有不同的操作方式,我们已经在博客中已经写过。例如,我们可以使用数据恢复工具从InnoDB字典恢复表结构,或使用MySQL服务器从.frm文件恢复。本文将是后者的更新。我会告诉你如何轻松从.frm文件恢复结构,在某些情况下,甚至不需要使用MySQL服务器。这将使过程更快,编写脚本更轻松。
MySQL 工具和mysqlfrm
MySQL工具是由Oracle发布的一组脚本,帮助我们更简单地执行常见的DBA任务。它是用Python编写的,它唯一的依赖是Python连接器。在各种工具的名单中,我们将使用mysqlfrm工具来帮助我们恢复结构。
像往常一样,图像胜过千言万语。我们恢复一些表结构:
这是我们的表:
CREATE TABLE `new_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `age` tinyint(4) NOT NULL, PRIMARY KEY (`id`), KEY `name_idx` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
现在我们尝试从.frm文件恢复该信息,看看结果:
$ mysqlfrm --diagnostic /usr/local/mysql/data/test/new_table.frm # WARNING: Cannot generate character set or collation names without the --server option. [...] CREATE TABLE `test`.`new_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `age` tinyint(4) NOT NULL, PRIMARY KEY `PRIMARY` (`id`), KEY `name_idx` (`name`) ) ENGINE=InnoDB;
结果挺不错
要注意的是这个工具有两种方法进行恢复。
- 第一个是生成一个新的MySQL实例,并在那里运行结构恢复,类似于PeterZ在他的博客中解释的。你需要使用-server或-basedir目录以及-port。恢复完成后,它会关闭生成的实例。
- 第二个与-diagnostic使用,读取.frm文件的每个字节来恢复所有可能的信息,但不需要MySQL实例。因此,这种方法可用于从损坏的.frm文件恢复所有可能的,甚至连MySQL都不能读取的信息。
正如我们在上一个例子的警告中看到的,并非所有信息可以通过第二种方法恢复。例如字符集和归类不能没有-server选项(第一种方法)进行恢复。我们看看如何使用生成的服务器来恢复.frm的信息:
$ mysqlfrm --server=root@127.0.0.1 --port 3307 ./new_table.frm # Source on 127.0.0.1: ... connected. # Starting the spawned server on port 3307 ... done. # Reading .frm files # # Reading the new_table.frm file. # # CREATE statement for ./new_table.frm: # CREATE TABLE `new_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `age` tinyint(4) NOT NULL, PRIMARY KEY (`id`), KEY `name_idx` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
该工具连接到MySQL服务器,获得它需要的所有信息(basedir等),并在端口3307生成新实例。然后它使用新的实例来恢复.frm文件的信息。方便快捷:)
值得一提的是,不是所有需要的信息都存储在这些.frm文件。有一些信息是无法恢复的,例如FK约束和AI数字序列。
结论
MySQL工具是一个非常有用的工具集。在特定情况下,mysqlfrm可以用来从它们的.frm文件恢复一长列的表结构,使过程快速且易于编写脚本。
Comment