如何以最简单的方式获取单个表的数据,删除单个表或将整个转储文件分解为包含各个表的文件?我通常会使用vi正则表达式进行大量操作,但我敢打赌使用awk/perl等工具可以更轻松地完成这些任务。谷歌搜索结果的第一页带回了一堆不起作用的perl脚本。
如果我需要从一个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
如果可以的话,请使用mysqldump -T
来避免很多麻烦。
根据文档:
--tab=path,-T path
生成制表符分隔的数据文件。对于每个已备份的表,mysqldump将创建一个tbl_name.sql文件,其中包含创建该表的CREATE TABLE语句,以及一个包含其数据的tbl_name.txt文件。选项值是写入文件的目录。
默认情况下,.txt数据文件使用列值之间的制表符和每行末尾的换行符进行格式化。可以使用--fields-xxx和--lines-terminated-by选项明确指定格式。
注意
仅当mysqldump在与mysqld服务器相同的机器上运行时才应使用此选项。您必须拥有FILE特权,并且服务器必须具有在指定目录中写入文件的权限。
我有点晚才回复,但如果能帮到任何人的话,我不得不拆分一个巨大的SQL转储文件,以便将数据导入另一个Mysql服务器。 最终我使用系统命令来拆分转储文件。
split -l 1000 import.sql splited_file
以上命令将每1000行拆分一次SQL文件。
希望对某人有所帮助。