获取单个表的数据、删除单个表或将整个转储文件分解为每个包含单个表的文件的最简单方法是什么?我通常最终会做很多 vi 正则表达式修改,但我敢打赌,使用 awk/perl 等有更简单的方法来做这些事情。Google 结果的第一页带回了一堆不工作的 perl 脚本。
5 回答
当我需要从 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 也可以将转储拆分为单独的表转储。
我在那个方面有点晚了,但如果它可以帮助任何人,我不得不拆分一个巨大的 SQL 转储文件,以便将数据导入另一个 Mysql 服务器。我最终做的是使用系统命令拆分转储文件。
拆分 -l 1000 import.sql 拆分文件
以上将每1000行拆分sql文件。
希望这可以帮助某人