如何使用mysqlfrm工具从.frm文件中恢复表结构

表结构存储在.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

*

沪ICP备14014813号

沪公网安备 31010802001379号