处理巨大的MySQL转储文件

6

如何以最简单的方式获取单个表的数据,删除单个表或将整个转储文件分解为包含各个表的文件?我通常会使用vi正则表达式进行大量操作,但我敢打赌使用awk/perl等工具可以更轻松地完成这些任务。谷歌搜索结果的第一页带回了一堆不起作用的perl脚本。

5个回答

12

如果我需要从一个sql dump中提取单个表格,我会使用grep、head和tail的组合。

例如:

grep -n "CREATE TABLE" dump.sql

这样就能为每个表给出行号,所以如果您的表在第200行,下一个表在第269行,则执行以下操作:

head -n 268 dump.sql > tophalf.sql
tail -n 69 tophalf.sql > yourtable.sql

我认为您可以延伸这些原则,编写一个脚本,将整个文件拆分为每个表一个文件。

有人想在这里尝试吗?

另一个可能有助于启动bash循环的代码段:

grep -n "CREATE TABLE " dump.sql  | tr ':`(' '  ' | awk '{print $1, $4}'

这将为您提供一个漂亮的行号和表名列表,例如:

200 FooTable
269 BarTable

head的输出可以直接管道传输到tail - 这不是一个坏主意。 - deadprogrammer
非常有趣的解决方案,但是maatkit可以做得更多:D - Xavier Maillard

9

如果可以的话,请使用mysqldump -T来避免很多麻烦。

根据文档

--tab=path,-T path

生成制表符分隔的数据文件。对于每个已备份的表,mysqldump将创建一个tbl_name.sql文件,其中包含创建该表的CREATE TABLE语句,以及一个包含其数据的tbl_name.txt文件。选项值是写入文件的目录。

默认情况下,.txt数据文件使用列值之间的制表符和每行末尾的换行符进行格式化。可以使用--fields-xxx和--lines-terminated-by选项明确指定格式。

注意
仅当mysqldump在与mysqld服务器相同的机器上运行时才应使用此选项。您必须拥有FILE特权,并且服务器必须具有在指定目录中写入文件的权限。


4

这个shell脚本可以获取你想要的表并将它们传递给splitted.sql

它能够理解正则表达式,因为我添加了一个sed -r选项。

MyDumpSplitter还可以将转储分割成单独的表转储。


2

1
这些工具已被弃用,不适合用于备份。 - Brad Mace

0

我有点晚才回复,但如果能帮到任何人的话,我不得不拆分一个巨大的SQL转储文件,以便将数据导入另一个Mysql服务器。 最终我使用系统命令来拆分转储文件。

split -l 1000 import.sql splited_file

以上命令将每1000行拆分一次SQL文件。

希望对某人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接