На основе 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, и я ищу шаблон для разделения файла дампа, чтобы получить несколько файлов, таких как:
Вы также можете разделить дамп с awk-скриптом: cat dumpfile | gawk -f script.awk
cat dumpfile | gawk -f script.awk
(или ./script.awk < dumpfile
если вы сделаете его исполняемым). Он создаст пары файлов tablename.schema.sql
, tablename.data.sql
в текущем каталоге для каждой таблицы в mysqldump за один проход.
Предупреждение: в именах таблиц нет специальной обработки символов - они используются как имена файлов.
#!/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";
}
}
}
enter code hereenter code here
в строке 48. Ваш скрипт работает отлично. Спасибо Юрий Лачин !