Mysqldump в несколько гигабайт: различия между версиями

Материал из support.qbpro.ru
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, может быть есть какой-то более простой способ следить за заливкой дампа в базу?