从mysql.sql转储文件中提取表

我有一个mysql.sql文件中的产品表。 我想提取一个表,并把它放在它自己的文件中。 你怎么去做这个?

我发现这个很好的解决方案 ,你必须在你的服务器上下载这个脚本并输入

$> ./MyDumpSplitter.sh yourfile.sql your_table_name 

这会将您的表提取到your_table_name.sql中


Optionnal

现在你可以使用这种类型的命令来重命名它

 $> sed -i 's/`your_table_name`/`your_table_name2`/g' your_table_name.sql 

并重新注入

 mysql> source your_table_name.sql; 

我刚才遇到这个问题,写了一个Perl脚本。 它运行良好,但它是MySQL的一个老版本。 像这样称呼它:
extract.pl -table=TABLENAME mysqldumpfile.sql > recovered_table.sql

 #!/ usr / bin / perl -s -wnl
 #从一个mysql转储中提取一个表
开始 {
     $表或警告
     “用法:$ 0 -table = TABLE_TO_EXTRACT mysqldumpfile.sql”
    和1号出口;
 }

 / ^ DROP TABLE如果存在`$ table` / .. / ^ UNLOCK TABLES; $ /和print;

只要你可以运行流编辑器来过滤和转换文本命令,如下所示:

 $ sed -n -e'/ CREATE TABLE。* products /,/ CREATE TABLE / p'mysql.sql> products.sql

我知道没有工具来解析原始mySQL转储文件这种方式。

复制+粘贴(可能很麻烦)或将其导入到临时数据库,删除其他所有内容,然后将表格转储回文件。

如果转储是使用扩展插入语法完成的,则实际的表数据将在转储文件中作为一行完成:

 INSERT INTO tablename (field, ...) VALUES (data, ...), (data, ...), (etc..) 

你可以简单地grep出来。 提取实际的表格定义会比较困难,尽管它应该在数据行的上方。 目前没有机会获得合适的外壳,但是我的头顶上,这样的东西可能会诀窍(在伪代码中):

 # retrieve line # that data insertion for the wanted table occurs on DATALINE=`grep -l 'INSERT INTO tablename' dumpfile.sql` # limiting ourselves to the part of the file up to the data line, find the line number # of the last CREATE TABLE, which SHOULD be the one creating the table for the data CREATELINE=`head -$DATALINE|grep -l 'CREATE TABLE'|tail -1|awk '{"print $1"}'` 

你可以提取明智的头/尾和我们刚才检索的行号创建DDL:

 CREATE=`head -$CREATELINE dumpfile.sql|tail -$($CREATELINE - $DATALINE - 1)` 

请记住,我在这个问题上头脑发热,所以几乎可以保证不能工作,但应该足以让你开始。

如果你想提取一个数据库,你可以使用:

 sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' dumpfile > dbname.sql 2>error 

例如:

 sed -n '/^-- Current Database: `blogs`/,/^-- Current Database: `/p' dump.sql > blogs.sql 2>error