Как бороться с огромными длинами линий, созданных mysqldump
Я использую mysqldump в задании cron для резервного копирования базы данных с более чем 2 миллионами строк.
Он создает текстовый файл, который может быть использован для восстановления данных из командной строки.
Я подумал, что было бы полезно отредактировать дамп перед восстановлением как быстрая способ изменения значений и имен таблиц или столбцов - по крайней мере, пока я не узнаю больше и не стану уверенным в том, что делаю это с помощью ALTER и UPDATE.
редактирование больших текстовых файлов не выполняется беспокоило меня, но я был удивлен, обнаружив, что в 250 мегабайт дамп моей базы данных, там было всего около 300 строк. Каждая строка была длиной около 800 тыс. символов.
есть ли другой способ создания дампов с большим контролем над длиной линии?
или я должен пост-обрабатывать дамп с помощью таких инструментов, как sed или Perl?
6 ответов:
по умолчанию
mysqldump
генерирует только одинINSERT
команда в таблице, что приводит к одной (очень длинной) строке вставленных данных для каждой таблицы, которая была сброшена. Это по существу потому, что" пакетные " вставки намного быстрее, чем если бы он сгенерировал отдельныйINSERT
запрос для каждой записи в каждой таблице.значит, дело не в этом
mysqldump
создал произвольно длинные линии, и вы можете просто наложить некоторую другую длину среза. Линии для причина.если это действительно важно, чтобы получить
INSERT
s разбиты на несколько строк, вы можете указать, что с:mysqldump --extended-insert=FALSE --complete-insert=TRUE ...
обратите внимание, однако, что восстановление таблиц займет больше времени в этом формате.
Я просматривал исходный код MySQL, ища решение этой проблемы сегодня. Максимальная длина строки обеспечивается переменной opt_net_buffer_length, которая должна соответствовать размеру буфера сервера MySQL. Он до смешного велик.
но в любом случае, это вариант, так что просто сделайте это:
mysqldump --net_buffer_length=5000 ...
минимальное значение 4096.
я наткнулся на ответ на форумах MySQL, который окончательно показывает, что добавление '\n ' после каждой группы вставки невозможно использовать только mysqldump, не изменяя источник:
расширенный формат не может быть правильно проанализирован на 100% на основе запятой или скобки, вы бы подсчитали поля. Лучшее решение, исправить mysqldump к linebreak на выходе.
очень незначительное изменение: в строке 3506 вы можете увидеть, где заканчивается строка запятая-это выход:
fputc(',',md_result_file); /* Always row break */
просто вставьте эту строку сразу после строки 3506:
fputc('\n',md_result_file); /* Lon Binder says wrap that line! */
повторная компиляция и готово.
@см.http://forums.mysql.com/read.php?28,420002, 426110#msg-426110
Спасибо Лон Б!
(я включил контент с форума MySQL на всякий случай, если форум исчезнет.)
использование регулярного выражения для разделения строк недостаточно, вам нужен парсер, который будет правильно понимать кавычки и экранирующие символы.
Я просто написал парсер, так как я не мог найти его:http://blog.lavoie.sl/2014/06/split-mysqldump-extended-inserts.html
после обработки файла дампа с помощью python. Вы можете быть счастливее, чем perl или sed.
Если вы работаете на Linux,вы уже установили его. Если вы работаете на Windows, программа установки безболезненна.
перед этим, однако, научитесь использовать обновление SQL и SQL ALTER. Вы будете счастливы делать все правильно.