Как разделить большой файл mysqldump для получения каждой структуры и данных отдельно?

0

На основе 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, и я ищу шаблон для разделения файла дампа, чтобы получить несколько файлов, таких как:

  • table_one_structure.sql
  • table_one_data.sql
  • table_two_structure.sql
  • table_two_data.sql
  • так далее..
  • 0
    Если вы хотите указать имя файла как table_name, то я думаю, что вам нужно написать сценарий оболочки в соответствии с моим exp, или для каждой таблицы он создает отдельный файл, но это будет динамическое имя файла
  • 0
    скрипт разделяет большой файл mysqldump, чтобы получить table_one.sql, table_two.sql и т. д. Здесь я хочу разделить данные и структуру.
Теги:
csplit

1 ответ

1
Лучший ответ

Вы также можете разделить дамп с 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";
        }
    }
}
  • 0
    без enter code hereenter code here в строке 48. Ваш скрипт работает отлично. Спасибо Юрий Лачин !
  • 0
    :-) Осталась строка комментария слева. Сожалею.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню