Каковы оптимальные настройки mysqldump? [закрыто]

14

После некоторого поиска я получил следующие настройки:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Пока все хорошо, но у меня есть несколько вопросов, касающихся параметров, а также исполнения.

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

Что касается моего второго концерта, я хотел бы знать, как получить информацию, когда команда не работает и, если да, вывести исключение.

Есть идеи?

РЕДАКТИРОВАТЬ

Это моя обновленная команда mysqldump, основанная на отзывах RolandoMySQLDBA.

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql
user706838
источник
Прочитайте каждый аргумент и его преимущества и выберите то, что подойдет вам. Также ознакомьтесь со сценариями для запуска в случае сбоев.
Манной
Здорово. Но это не совсем отвечает на мой вопрос. Например, какой из них вы всегда используете?
user706838 28.12.14
Извините за невежество, этот вопрос не о рекомендации книги или веб-сайта. Поэтому я думаю, что это не должен быть вопрос, основанный на мнении. Тем не менее, некоторые ответы, безусловно, будут более качественными в зависимости от опыта и подтверждены тестами. На мой взгляд, вопрос прекрасно сформулирован с четко определенной целью.
user10089632

Ответы:

30

Вы найдете это шокирующим, но вам нужен только один важный вариант: --opt

Что такое --opt ?

Эта опция, включенная по умолчанию, является сокращением для комбинации --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick - set-charset . Это дает быструю операцию дампа и производит файл дампа, который может быть быстро перезагружен на сервер MySQL.

Поскольку опция - -opt включена по умолчанию , вы указываете только обратное, а --skip-opt отключает несколько настроек по умолчанию. См. Обсуждение групп опций mysqldump для информации о выборочном включении или отключении подмножества опций, на которые влияет --opt.

Поскольку --opt уже включен, вам не нужно указывать --opt . Несмотря на это, вам могут понадобиться некоторые необходимые опции, которые не включены.

Запустите этот запрос в вашей базе данных

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Если у вас есть все таблицы InnoDB, вам нужно указать --single -action . Это автоматически деактивирует --lock-tables и позволит вам сбросить все таблицы в один и тот же момент времени и позволит одновременно выполнять новые записи.

Если у вас есть одна или несколько таблиц MyISAM, вам нужно указать --lock-all-tables . Это автоматически деактивирует --lock-таблицы , деактивирует --single-транзакции , блокирует все таблицы во всех базах данных, а затем создает дамп. Запись в таблицы InnoDB все еще может происходить, но они будут просто поставлены в очередь до снятия блокировок. Любое соединение с БД, пытающееся выполнить запись в любые таблицы MyISAM, будет фактически приостановлено до снятия всех блокировок.

Запустите этот запрос: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Если Number_Of_Stored_Proceduresбольше нуля, используйте --routines .

Запустите этот запрос: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Если Number_Of_Triggersбольше нуля, используйте --triggers .

ПРЕДУПРЕЖДЕНИЕ . Пожалуйста, не используйте --order-by-primary для дампа всех баз данных, потому что это может сделать индексы BTREE довольно односторонними при перезагрузке. --order-by-primary следует использовать только при выгрузке отдельной таблицы, которая, как вы знаете, имеет целочисленный первичный ключ и будет иметь много сканирований диапазона из вашего приложения.

Если вам нужны более творческие типы резервных копий mysqldump, см. Мой старый пост. Как мне оптимизировать mysqldump для большой базы данных? ,

Пожалуйста, прочитайте все опции для mysqldump .

ОБНОВЛЕНИЕ 2014-12-29 09:44 EST

Я обновил свою команду mysqldump (см. Мое редактирование). У меня есть последний вопрос, хотя. Как вы думаете, стоило бы также использовать все следующие аргументы? --add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

Рассматривая ваш комментарий и последние изменения, давайте рассмотрим каждый из этих вариантов и посмотрим, нужен ли вам какой-либо из них.

  • --opt : я уже сказал, что вам не нужно указывать его, потому что он включен по умолчанию.
  • --delayed-insert : Я твердо держусь подальше от этой базы данных InnoDB. На самом деле, я непреклонно держусь подальше от этого ПЕРИОДА !!! , Так как 1) возможно, что INSERT DELAYED может потерять данные, 2) он преобразуется в INSERT для подчиненных MySQL Replication, 3) имеется открытый отчет об ошибке его использования с триггерами в MySQL 5.6 и не считается ошибкой , 4 ) он устарел в MySQL 5.6 и 5) Morgan Tocker (известный MySQL Guru) предвидел его устаревание еще в 2012 году , вы должны забыть, что эта опция когда-либо существовала. Никогда, никогда (бесконечность) не используйте это !!!
  • --complete-insert : будет использоваться INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ...вместо INSERT INTO tblname VALUES .... Это может привести к переполнению mysqldump, если в определении таблицы много столбцов и много строк в таблице. Не используйте это.
  • --add-drop-table : так как --opt включает его для вас, вам не нужно указывать его.
  • --add-drop-database : если вы удалите --add-drop-database , это просто сделает DROP TABLE IF EXISTS(что было добавлено --add-drop-table ) быстрее. Не использовать его просто позволяет DROP TABLE IF EXISTSпроисходить для каждой таблицы. Таким образом, использование --add-drop-database - дело личного выбора.
  • --tz-utc : если вы планируете восстанавливать данные на том же сервере, с которого выполняете резервное копирование, вам не нужен --tz-utc . Если вы восстановите данные в другом центре обработки данных в другом часовом поясе и ...
    • если вы хотите сохранить тот же часовой пояс, из которого вы делаете резервную копию, вам не нужен --tz-utc .
    • если вы хотите, чтобы данные использовали часовой пояс нового центра обработки данных, вам нужно --tz-utc .
    • ПРИМЕР: скажем, вы сделали резервную копию базы данных в Нью-Йорке. Это EST. Если у вас есть другой дата-центр в Сиэтле, это будет PST. Если вы хотите, чтобы резервная копия New York была восстановлена ​​в Сиэтле, и вы хотите, чтобы временные метки в базе данных по-прежнему представляли Нью-Йорк, вы не хотите использовать --tz-utc .
  • --default-символьный набор

Настройка вашего последнего редактирования, это то, что вам особенно нужно

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Опять же, я говорю, пожалуйста, прочитайте все варианты mysqldump .

RolandoMySQLDBA
источник
О --add-drop-database: разве это не гарантирует, что в вашей базе данных нет других случайных таблиц, которых нет в вашем дампе? Если кто-то вручную создаст таблицу случайных тестов в вашей базе данных, она все равно будет существовать после перезагрузки из дампа без этой опции. Таким образом, это зависит от того, хотите вы этого или нет. Правильно?
jschultz410
Как насчет --add-drop-trigger?
Ионикс