操纵巨大的MySQL转储文件

为单个表获取数据,删除单个表或将整个转储文件分解成每个包含单个表的文件最简单的方法是什么? 我通常最终做了大量的vi正则expression式,但我敢打赌有更简单的方法来用awk / perl等来做这些事情。谷歌search结果的第一页带回了一堆非工作的perl脚本。

当我需要从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 

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

从文档 :

–tab =路径,-T路径

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

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

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

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

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

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

对于mk-parallel-dump和mk-parallel-restore, Maatkit似乎相当合适。

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

split -l 1000 import.sql splited_file

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

希望这有助于某人