Mysqldump в несколько гигабайт: различия между версиями
imported>Supportadmin (Новая страница: «Источник: http://ru-shell.livejournal.com/31675.html Недавно мне пришлось восстанавливать из бекапа дамп my…») |
imported>Supportadmin Нет описания правки |
||
Строка 10: | Строка 10: | ||
Для разбивки одного дампа базы на дампы таблиц можно использовать вот такой скрипт: | Для разбивки одного дампа базы на дампы таблиц можно использовать вот такой скрипт: | ||
cat dump.sql | awk 'BEGIN { | <nowiki>cat dump.sql | awk 'BEGIN { | ||
output = "comments"; } $data ~ /^CREATE TABLE/ { | output = "comments"; } $data ~ /^CREATE TABLE/ { | ||
close(output); | close(output); | ||
output = substr($3,2,length($3)-2); } | output = substr($3,2,length($3)-2); } | ||
{ print $data >> output }' | { print $data >> output }' | ||
</nowiki> | |||
На выходе получим по одному файлу на каждую таблицу. Для разбивки такого файла по инсертам можно использовать вот такой скрипт: | На выходе получим по одному файлу на каждую таблицу. Для разбивки такого файла по инсертам можно использовать вот такой скрипт: | ||
awk '/INSERT/{if (n) close(output); output= f n++} n {print >> output }' f=prefix tbl.dump.sql | <nowiki>awk '/INSERT/{if (n) close(output); output= f n++} n {print >> output }' f=prefix tbl.dump.sql | ||
</nowiki> | |||
Затем я запустил for i in prefix*; do mysql --password=****** --database=mydb < $i; echo "$i done"; done | Затем я запустил | ||
<nowiki>for i in prefix*; do mysql --password=****** --database=mydb < $i; echo "$i done"; done</nowiki> | |||
Может быть я слишком плохо знаком с консольными утилитами для работы с mysql, может быть есть какой-то более простой способ следить за заливкой дампа в базу? | Может быть я слишком плохо знаком с консольными утилитами для работы с mysql, может быть есть какой-то более простой способ следить за заливкой дампа в базу? |
Текущая версия от 15:27, 17 ноября 2015
Источник: http://ru-shell.livejournal.com/31675.html
Недавно мне пришлось восстанавливать из бекапа дамп 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, может быть есть какой-то более простой способ следить за заливкой дампа в базу?