Mysqldump добавить drop table?

22 авг. 2012 г., 17:02:14
Просмотры: 47.4K
Голосов: 12

Я заметил в Codex, что для резервного копирования базы данных отображается опция --add-drop-table. Прежде чем я что-нибудь испорчу, означает ли это, что когда резервная копия будет импортирована, таблицы будут перезаписаны, если они существуют в целевой базе данных?

Я не хочу удалять таблицы при их резервном копировании!

user@linux:~/files/blog> mysqldump --add-drop-table -h mysqlhostserver
 -u mysqlusername -p databasename (tablename tablename tablename) | bzip2
 -c > blog.bak.sql.bz2

Enter password: (введите ваш пароль mysql)
user@linux~/files/blog>

http://codex.wordpress.org/Backing_Up_Your_Database#Using_Straight_MySQL_Commands

0
Все ответы на вопрос 4
1
12

Это влияет только на вывод дампа MySQL в создаваемом файле.

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

Он добавляет эту строку перед оператором создания таблицы в файле дампа:

DROP TABLE IF EXISTS `tablename`;

Если вы планируете импортировать файл дампа в новую базу данных, это не имеет значения.

23 авг. 2012 г. 04:17:58
Комментарии

Знаете, что интересно? Даже если я использую дамп без опции add-drop-table на существующей базе данных WP, всё равно всё работает нормально.

AlxVallejo AlxVallejo
22 сент. 2012 г. 20:33:11
0

Это происходит потому, что общий синтаксис выглядит примерно так:

mysql>mysqldump --opt --all-databses > all.sql

Параметр --opt включён по умолчанию (что подразумевает использование --add-drop-table), как упоминается в документации MySQL.

14 апр. 2013 г. 01:57:27
0

При удалении параметра --add-drop-table в данном синтаксисе, --add-drop-table всё равно используется, потому что --opt включён по умолчанию (если только вы не используете --skip-opt), а --opt включает в себя --add-drop-table. Смотрите здесь: https://dev.mysql.com/doc/refman/5.6/en/mysqldump.html#option_mysqldump_opt

И, как указано выше, это не означает, что ваши таблицы будут удалены при создании резервной копии, но команды для удаления таблиц будут включены в SQL-файл, потому что именно это вам нужно для дампа, чтобы можно было импортировать дамп без ошибок о том, что таблицы уже существуют.

7 февр. 2018 г. 12:00:03
0

Да, это сделает именно то, что сказано, т.е. удалит таблицу, если она уже существует. Пожалуйста, помните, что вы создаёте дамп, который будет импортирован (в двух сценариях):

  1. Если создаётся новая база данных (или таблица), то операция DROP TABLE не имеет значения, потому что изначально нет таблицы для удаления.

  2. Но чтобы пропустить удаление уже созданной таблицы, используйте --skip-add-drop-table. (Также используйте --no-create-info вместе с --skip-add-drop-table, потому что вам также не нужен оператор CREATE TABLE), например:

    mysqldump --skip-add-drop-table --no-create-info -h mysqlhostserver -u mysqlusername -p databasename tablename | bzip2 -c > blog.bak.sql.bz2

К сведению: Вы не можете экспортировать более одной таблицы, используя (tablename, tablename, tablename). Либо экспортируйте все таблицы, не указывая имя таблицы после имени базы данных, либо укажите только одно имя таблицы.


Редактирование

Обратите внимание, что если ваша таблица очень большая, то разумно экспортировать её по частям. Т.е. создайте дамп-файлы по 80 тыс. (восемьдесят тысяч) записей (примерно равные 10 Мб), используя следующую команду: К сведению: Я разделил экспорт, используя WHERE в mysqldump.

mysqldump -h mysqlhostserver -u mysqlusername -p --add-drop-table --add-drop-trigger --skip-triggers --dump-date --single-transaction --where='1 limit 0,80000' databasename tablename > /home/blog1.bak.sql
mysqldump mysqlhostserver -u mysqlusername -p --skip-add-drop-table --no-create-info --dump-date --single-transaction --where='1 limit 80000,999999' databasename tablename > /home/blog2.bak.sql

Приведённая выше команда сначала создаёт файл с первыми 80К записями blog1.bak.sql (обратите внимание, что в этом дампе я пропустил триггеры. Я обнаружил это позже, потому что это сводило меня с ума — если в первом дампе были какие-либо связанные триггеры на INSERT или UPDATE, то при импорте этого первого файла:

  1. создаётся таблица
  2. вставляются записи в новую таблицу
  3. создаются триггеры, связанные с этой таблицей, и они применяются

Поэтому когда вы будете импортировать другие дамп-файлы после первого, триггеры будут применяться (пока нет способа отключить триггеры, кроме как переписать их и добавить сложный код для отключения триггеров при отладке или, в нашем случае, при импорте). Обычно триггеры содержат код с JOIN к другим таблицам, которые могут быть ещё не импортированы, что приведёт к ошибке импорта.

15 февр. 2021 г. 10:30:22