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

时间:2010-10-14 17:41:52

标签: sql mysql linux scripting

我在mysql.sql文件中有一个产品表。我希望提取一个表并将其放在它自己的文件中。你会怎么做呢?

6 个答案:

答案 0 :(得分:20)

我找到this nice solution,您必须在服务器上下载this script并输入

$> ./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;

答案 1 :(得分:2)

前一段时间我遇到了这个问题并编写了一个Perl脚本。它工作得很好,但它是MySQL的旧版本。称之为:
extract.pl -table=TABLENAME mysqldumpfile.sql > recovered_table.sql

#!/usr/bin/perl -s -wnl
#extract a single table from a mysql dump
BEGIN {
    $table or warn
    "Usage: $0 -table=TABLE_TO_EXTRACT mysqldumpfile.sql"
    and exit 1;
}

/^DROP TABLE IF EXISTS `$table`/ .. /^UNLOCK TABLES;$/ and print;

答案 2 :(得分:2)

只需运行流编辑器即可过滤和转换文本命令,如下所示:

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

你可以简单地说出来。提取实际的表定义将更难,但它应该紧挨着数据行。暂时不能访问一个合适的shell,但是从我的头顶开始,这样的事情可能会起作用(伪代码):

# 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)`

请记住,我在这方面已经脱颖而出,所以它几乎可以保证不起作用,但应该足以让你开始。

答案 5 :(得分:0)

如果要提取数据库,可以使用:

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