Даниил Подрабинек (grohman) wrote in ru_shell,
Даниил Подрабинек
grohman
ru_shell

mysqldump в несколько гигабайт

Недавно мне пришлось восстанавливать из бекапа дамп mysql-базы размером в пару гигов. Оставив mysql -p --database xxx < dump.sql на ночь я был чертовски огорчен на следующий день, поскольку
1) восстановление из дампа не было закончено;
2) не было понятно в каком именно месте оно затупило.
Было решено разбить дамп на кучу файлов по одной таблице на файл, а их в свою очередь (если они всё равно получаются слишком большие) разбить на кучу файлов по одному insert на файл (mysqldump, которым делался бекап, пишет ограниченное количество данных на один инсерт).
Погуглив и успешно выполнив эту задачу, на всякий случай опишу используемые инструменты под катом.

Для разбивки одного дампа базы на дампы таблиц можно использовать вот такой скрипт:

cat dump.sql | awk 'BEGIN {
output = "comments"; } $data ~ /^CREATE TABLE/ {
close(output);
output = substr($3,2,length($3)-2); }
{ print $data >> output }'

На выходе получим по одному файлу на каждую таблицу. Для разбивки такого файла по инсертам можно использовать вот такой скрипт:
awk '/INSERT/{if (n) close(output); output= f n++} n {print >> output }' f=prefix tbl.dump.sql

Затем я запустил for i in prefix*; do mysql --password=****** --database=mydb < $i; echo "$i done"; done

Может быть я слишком плохо знаком с консольными утилитами для работы с mysql, может быть есть какой-то более простой способ следить за заливкой дампа в базу?
Tags: bash, mysql
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 2 comments
Спасибо, очень помогло.
Очень полезный скрипт. Правда не вникнув в код запустил у себя и охренел от тучи файлов без расширения. Благо все именованы не так, как файлы лежавшие до этого в текущей директории :)