操纵巨大的MySQL转储文件

时间:2008-11-12 17:24:30

标签: mysql linux backup restore

获取单个表的数据,删除单个表或将整个转储文件拆分为每个包含单个表的文件的最简单方法是什么?我通常最终会做很多vi正则表达式,但我敢打赌用awk / perl等方法可以更简单地处理这些事情.Google结果的第一页会带回一堆非工作的perl脚本。

5 个答案:

答案 0 :(得分:11)

当我需要从sql转储中提取单个表时,我使用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

答案 1 :(得分:9)

如果可以的话,为自己省去很多麻烦并使用mysqldump -T

来自documentation

  

- tab = path,-T path

     

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

     

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

     

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

答案 2 :(得分:4)

This shell script会抓取您想要的表格并将其传递给splitted.sql

当我添加sed -r选项时,它能够理解正则表达式。

此外,MyDumpSplitter可以将转储拆分为单个表转储。

答案 3 :(得分:2)

使用Maatkitmk-parallel-dump

mk-parallel-restore似乎非常合适。

答案 4 :(得分:0)

我在那个上有点晚了,但如果它可以帮助任何人,我不得不拆分一个巨大的SQL转储文件,以便将数据导入另一个Mysql服务器。 我最终做的是使用system命令拆分转储文件。

split -l 1000 import.sql splited_file

以上将每1000行拆分一次sql文件。

希望这有助于某人