Можете ли вы автоматически создать файл mysqldump, в котором не применяются ограничения внешнего ключа?

Когда я запускаю команду mysqldump в своей базе данных, а затем пытаюсь ее импортировать, она терпит неудачу, поскольку пытается создать таблицы в алфавитном порядке, даже если у них может быть внешний ключ, который ссылается на таблицу позже в файле. В документации ничего нет, и я нашли такие ответы, как это, которые говорят об обновлении файла после его создания, чтобы включить:

set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;

Нет ли способа автоматически установить эти строки или экспортировать таблицы в необходимом порядке (без необходимости вручную указывать все имена таблиц, поскольку это может быть утомительно и подвержено ошибкам)? Я мог бы обернуть эти строки в скрипт, но мне было интересно, есть ли простой способ убедиться, что я могу создать дамп файла, а затем импортировать его, не обновляя его вручную.


person Tai Squared    schedule 12.03.2010    source источник


Ответы (5)


Команда mysqldump включена в MySQL, начиная с версии 4.1.1 по умолчанию создает сценарий, отключающий проверку внешнего ключа. Следующая строка включена в верхнюю часть файла дампа:

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

Синтаксис /*!40014 ... */ представляет собой условный комментарий, который будет выполняться в MySQL версии 4.0. .14 ​​и позже. Старая настройка проверки внешнего ключа восстанавливается ближе к концу файла дампа:

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

Обратите внимание, что условные комментарии интерпретируются клиентом (а не сервер). Если вы загрузите файл дампа с помощью клиента, который их не поддерживает, проверки внешнего ключа не будут отключены, и вы можете столкнуться с ошибками. Для достижения наилучших результатов я бы предложил загружать файлы дампа с помощью официального клиента командной строки mysql:

mysql -hserver -uuser -p database < dumpfile.sql

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

person Phil Ross    schedule 12.03.2010
comment
Да, я вижу это в файле. Другой человек, пытавшийся импортировать этот файл, получил ошибку в строке внешнего ключа и подумал, что это связано с порядком создания. - person Tai Squared; 12.03.2010
comment
Как это ответило на вопрос? Тай сказал, что он получает сообщение об ошибке С этими комментариями в файле, так как же проблема была решена? - person JoeTidee; 05.02.2016
comment
Как это принятый ответ? Это абсолютно не соответствует заданному вопросу :/ - person Pragyan; 10.05.2018

Остерегаться. По какой-то причине mysqldump не записывает FOREIGN_KEY_CHECKS=0, если используется параметр --compact.

Чао.

person edtruant    schedule 25.03.2013
comment
Причина в том, что --compact включает --skip-comments, поэтому вместо --compact следует использовать --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset - person iRonin; 05.05.2015
comment
На самом деле вы также можете --skip-comments. В руководстве сказано, что --compact включает опции --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys и --skip-set-charset. , но, по-видимому, --compact также удаляет некоторые другие выходные данные в дополнение к этому, например операторы FOREIGN_KEY_CHECKS. - person dpi; 01.04.2016

Если вы используете phpMyAdmin при экспорте SQL, выберите Пользовательский метод экспорта. Затем среди вариантов флажка нажмите «Отключить проверку внешнего ключа». Экспортированный оператор SQL будет включать и отключать проверки внешнего ключа в начале и в конце выходного файла соответственно.

Это не "автоматически", но вам не придется самостоятельно писать операторы для каждого экспорта.

person alds    schedule 04.10.2013
comment
Ух ты! Голосование против за предложение альтернативного решения, которое работает намного проще, чем то, что просили - person alds; 14.11.2013
comment
Это потому, что «намного проще» чрезвычайно субъективно (например, мне это совсем не полезно) и на самом деле не отвечает на вопрос. - person sehe; 28.03.2014
comment
+1 определенно полезно для пользователей PhpMyAdmin. Все остальные могут субъективно игнорировать это или крайне субъективно отрицать :) - person chim; 06.11.2014

Это может произойти, если вы используете --compact как одну из ваших mysqldump команд. --compact включает --skip-comments, поэтому вместо --compact следует использовать --skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

person iRonin    schedule 05.05.2015

Остерегайтесь своего клиента MySQL, который вы используете, с командой mysql проблем нет. Сброс:

% mysqldump -u ocp6 -pocp6 ocp6 --single-transaction --result-file=dump.sql 

Восстановление:

% mysql -u ocp6 -pocp6 ocp6 < dump.sql

Все в порядке.

С помощью другого клиента MySQL (mycli в моей ситуации) для восстановления файл дампа:

mysql ocp6@:(none)> \. dump.sql
[…]
(1005, 'Can\'t create table `ocp6`.`composition` (errno: 150 "Foreign key constraint is incorrectly formed")')

Я предполагаю, что mycli не понимает условные комментарии.

person freezed    schedule 16.07.2018