基于https://gist.github.com/jasny/1608062#file-mysql_splitdump-sh
#!/bin/bash
####
# Split MySQL dump SQL file into one file per table
# based on http://blog.tty.nl/2011/12/28/splitting-a-database-dump
####
if [ $# -lt 1 ] ; then
echo "USAGE $0 DUMP_FILE [TABLE]"
exit
fi
if [ $# -ge 2 ] ; then
csplit -s -ftable $1 "/-- Table structure for table/" "%-- Table structure for table \`$2\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
csplit -s -ftable $1 "/-- Table structure for table/" {*}
fi
[ $? -eq 0 ] || exit
mv table00 head
FILE=`ls -1 table* | tail -n 1`
if [ $# -ge 2 ] ; then
mv $FILE foot
else
csplit -b '%d' -s -f$FILE $FILE "/40103 SET TIME_ZONE=@OLD_TIME_ZONE/" {*}
mv ${FILE}1 foot
fi
for FILE in `ls -1 table*`; do
NAME=`head -n1 $FILE | cut -d$'\x60' -f2`
cat head $FILE foot > "$NAME.sql"
done
rm head foot table*
我想拆分我的大mysqldump文件,分别获取每个表结构和表数据。
我不是bash脚本的专家,我搜索模式以拆分转储文件以获取以下几个文件:
答案 0 :(得分:1)
您还可以使用awk脚本拆分转储:
cat dumpfile | gawk -f script.awk
(如果您将其设为可执行文件,则为./script.awk < dumpfile
)。
它会在当前目录中为mysqldump中的每个表创建一对tablename.schema.sql
,tablename.data.sql
个文件。
警告:表名中的字符没有特殊处理 - 它们在文件名中用作 。
#!/usr/bin/gawk -f
BEGIN {
is_data=0; is_struct=0; is_header=1; is_footer=0; i=0; tname="UNKNOWN_TABLE";
}
/^($|-- |\/\*\!)/ && !/^-- Table struct/ {
# accumulate header lines
if (is_header && !is_struct) { header[i]= $0; i++; }
}
/^-- Table structure for table/ {
is_struct=1; is_header=0; i=0; is_data=0;
tname=substr($6,2,length($6)-2);
tables[tname]=1;
print "--" > tname".schema.sql"
for (i in header) print header[i] >> tname".schema.sql";
###print "STRUCT:", tname;
}
/^-- Dumping data for table/ {
is_data=1; is_header=0; is_struct=0;
tname=substr($6,2,length($6)-2);
print "--" > tname".data.sql"
for (i in header) print header[i] >> tname".data.sql";
###print "DATA_START for table ",tname;
i=0
}
{ if (is_struct) { print $0 >> tname".schema.sql"} }
{ if (is_data) { print $0 >> tname".data.sql" } }
/^UNLOCK TABLES/ {
is_data=0; is_struct=0;
###print "DATA_END for table ",$tname;
}
/^(--|\/\*.40[0-9]{3} SET .+\*\/;$)/ {
if (!(is_header || is_struct || is_data)) {
# accumulate footer lines
is_footer=1;
footer[$0]=1;
}
}
END {
# append footer to files
for (t in tables) {
for (f in footer) {
print f >> t".schema.sql";
print f >> t".data.sql";
}
}
}