我有一个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