如何拆分一个大的 mysqldump 文件以分别获取每个结构和数据?
How to split a big mysqldump file for get each structure and data separately?
基于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 [=10=] DUMP_FILE [TABLE]"
exit
fi
if [ $# -ge 2 ] ; then
csplit -s -ftable "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
csplit -s -ftable "/-- 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 文件以分别获取每个 table 结构和 table 数据。
我不是 bash 脚本方面的专家,我搜索了分割转储文件的模式以获取多个文件,例如:
- table_one_structure.sql
- table_one_data.sql
- table_two_structure.sql
- table_two_data.sql
- 等..
您还可以使用 awk 脚本拆分转储:
cat dumpfile | gawk -f script.awk
(或者 ./script.awk < dumpfile
如果你让它执行 table)。
它将一次性在 mysqldump 中为每个 table 在当前目录中创建成对的 tablename.schema.sql
、tablename.data.sql
文件。
警告:table 名称中的字符没有特殊处理 - 它们在文件名中按原样使用。
#!/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]= [=10=]; i++; }
}
/^-- Table structure for table/ {
is_struct=1; is_header=0; i=0; is_data=0;
tname=substr(,2,length()-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(,2,length()-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 [=10=] >> tname".schema.sql"} }
{ if (is_data) { print [=10=] >> 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[[=10=]]=1;
}
}
END {
# append footer to files
for (t in tables) {
for (f in footer) {
print f >> t".schema.sql";
print f >> t".data.sql";
}
}
}
基于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 [=10=] DUMP_FILE [TABLE]"
exit
fi
if [ $# -ge 2 ] ; then
csplit -s -ftable "/-- Table structure for table/" "%-- Table structure for table \`\`%" "/-- Table structure for table/" "%40103 SET TIME_ZONE=@OLD_TIME_ZONE%1"
else
csplit -s -ftable "/-- 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 文件以分别获取每个 table 结构和 table 数据。
我不是 bash 脚本方面的专家,我搜索了分割转储文件的模式以获取多个文件,例如:
- table_one_structure.sql
- table_one_data.sql
- table_two_structure.sql
- table_two_data.sql
- 等..
您还可以使用 awk 脚本拆分转储:
cat dumpfile | gawk -f script.awk
(或者 ./script.awk < dumpfile
如果你让它执行 table)。
它将一次性在 mysqldump 中为每个 table 在当前目录中创建成对的 tablename.schema.sql
、tablename.data.sql
文件。
警告:table 名称中的字符没有特殊处理 - 它们在文件名中按原样使用。
#!/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]= [=10=]; i++; }
}
/^-- Table structure for table/ {
is_struct=1; is_header=0; i=0; is_data=0;
tname=substr(,2,length()-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(,2,length()-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 [=10=] >> tname".schema.sql"} }
{ if (is_data) { print [=10=] >> 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[[=10=]]=1;
}
}
END {
# append footer to files
for (t in tables) {
for (f in footer) {
print f >> t".schema.sql";
print f >> t".data.sql";
}
}
}