2012-03-01 3 views
4

Иногда мне нужно скопировать базу данных MySQL (db1) в другую базу данных (db2). Я нашел эту команду, чтобы быть кратким и эффективным:Piping mysqldump to mysql

mysqldump --opt db1 | mysql db2 

Он работал отлично, но теперь он порывает с следующей ошибкой:

ERROR 1064 (42000) at line 1586: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysqldump: Couldn't execute 'SHOW TRIGGERS LIKE 'some_table_name'': MySQL server ' at line 1

Первое, что приходит на ум, что база данных слишком велик (несжатый SQL-дамп> 1G, 1090526011 байт на данный момент, если быть точным) для его прокладки таким образом. Когда я делаю mysqldump > file, а затем mysql < file, он отлично работает, никаких ошибок. Таблица, указанная в сообщении об ошибке (some_table_name), не является большой или специальной.

Вторая идея исходит от впечатления, что сообщение об ошибке может быть усечен, и что он говорит

"...MySQL server has gone away"

Краткое исследование, которое говорит, что это возможно, что максимальное количество открытых файлов (для MySQL и/или системы) является достиг. Поэтому я попытался добавить --skip-lock-table в mysqldump и поднял open-files-limit, но не повезло, такая же ошибка.

Очевидное решение состоит в том, чтобы делать дамп, а затем импортировать (как хорошо работает), но трубопровод кажется мне лучше и чище (дайте мне знать, если я ошибаюсь), плюс мне любопытно узнать, какие причины Эта проблема. Я попал в какой-то предел, влияющий на командный трубопровод?

Я делал это на сервере хостинга, используя MySQL 5.1.60 в Linux и на моей машине dev - MySQL 5.1.58 на Linux. Последнее дает несколько иную ошибку:

mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table other_table_name at row: 7197


UPDATE: Проблема решается делать отдельный дамп и импорт, без трубы. Хотя я чувствую, что это не совсем ответ на мой вопрос, предложения ssmusoke были наиболее точными, что привело к принятому ответу.

ответ

2

Проблема может заключаться в том, что нагрузка на серверы становится слишком высокой, одновременно выполняя как сброс, так и загрузку. Это также означает, что вы теряете некоторые оптимизации, такие как расширенные вставки, возможность отключать внешние ключи, которые могут быть достигнуты при выгрузке файла, а затем импортировать его.

Я бы рекомендовал вам использовать mysqldump для создания резервной копии, а затем загрузить его с помощью mysql. Таким образом, нагрузка на ваш сервер уменьшается, и, как вы сказали, он всегда работает. Вы можете даже автоматизировать его в сценарий bash, чтобы сделать так, чтобы вам не нужно было выполнять команды mysqldump и загрузки.

+0

Я сомневаюсь, что нагрузка настолько высока, что соединение падает. Даже если это так, мне было бы странно, что он всегда терпит неудачу в одном и том же месте (та же таблица), верно? Во всяком случае, этот процесс был написан по сценарию, но когда он начал терпеть неудачу, мне пришлось вытащить его и начать анализировать «вручную», и теперь это (я надеюсь, что временно) работает через файл. Тем не менее, я хотел бы знать, в чем причина этого. Спасибо за предложения. – parserr

2

Вам нужно перенаправить поток stderr, а также stdout из mysqldump? Сообщения об ошибках могут чередоваться с выводом дампа. Попробуйте

mysqldump --opt db1 | mysql db2

+0

Я действительно этого не делаю, но это осталось, было испытание без него, извините за неправильное обращение, я отредактирую вопрос. – parserr

2

Проблема в том, что вы перенаправляете stderr на stdout, поэтому любые ошибки интерпретируются как SQL. Удалить 2> & 1. Тогда появится реальная ошибка.

+0

Собственно, это перенаправление осталось, я тестировал без него, извините. В любом случае, когда я перенаправляю дамп в файл, он идет без ошибок, так что с трубой, правильно? – parserr

+0

Я предполагаю, что две базы данных находятся на одном сервере. В исходной базе данных mysqldump блокирует таблицы для генерации запроса, который использует больше ресурсов, чем обычно. В базе данных назначения выполняется каждая инструкция SQL - обновлены индексы, создаются журналы и т. Д., Которые также используют много ресурсов. С другой стороны, sql-скрипт содержит некоторые оптимизации, такие как ограничения внешнего ключа, которые не проверяются для каждой вставленной строки, расширенные вставки, которые выгружаются –

3

«Сервер MySQL ушел» является симптомом максимальной ошибки пакета. http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

Измените свою команду, чтобы указать большее значение для max_allowed_packet.

mysqldump --opt db1 | mysql --max_allowed_packet=32M db2 

По умолчанию 1M. Для получения правильного значения может потребоваться пробная версия и ошибка. http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet

0

Возможно, что резервная копия набирает ограничения времени ожидания MySQL.

переменные могут быть изменены в my.cnf

net_read_timeout = 120 net_write_timeout = 900

Если вы хотите изменить эти параметры без необходимости перезагрузки MySQL вы можете сделать это с помощью следующих операторов SQL:

set global net_read_timeout = 120; set global net_write_timeout = 900;

^вам может потребоваться супер-привилегия