Які оптимальні налаштування 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

Поки що добре, але у мене є деякі питання щодо параметрів, а також виконання.

Щодо моєї першої турботи, я просто хочу переконатися, що всі вони потрібні та не викликають конфліктів при спільній роботі. Зрештою, я хотів би зробити дуже надійний і послідовний дамп-файл із мільйонами записів, який створює таблиці, бази даних та вставляє дані. Хороша річ у тому, що зробити базу даних деяким часом недоступною для мене. Моя єдина мета - створити надійний і послідовний дамп-файл.

Щодо мого другого концерту, я хотів би знати, як отримати інформацію, коли команда піде не так, і якщо так, викиньте виняток.

Будь-які ідеї?

EDIT

Це моя оновлена ​​команда 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

Прочитайте кожен аргумент та його переваги та виберіть, який би вам підходив. Також ознайомтеся з сценаріями, щоб викликати випадки невдач.
Mannoj

Класно. Але це насправді не відповідає на моє запитання. Наприклад, яким із них ви завжди користуєтесь?
user706838

Пробачте моє незнання, це питання не стосується того, щоб рекомендувати книгу чи веб-сайт. Тож я думаю, що це не повинно бути типовим питанням на основі думки. Як було сказано, деякі відповіді, безумовно, матимуть більш високу якість залежно від досвіду та підкріплених тестами. На мою думку, питання чудово викладено з чітко визначеною метою.
користувач10089632

Відповіді:


30

Ви знайдете це шокуюче, але вам потрібен лише один головний варіант: --opt

Що таке --опт ?

Цей параметр, включений за замовчуванням, - це скорочення для комбінації --add-drop table --add-locks --create-options --disable-keys - Extended-insert --lock- table --quick - комплект-шафа . Це дає операцію швидкого скидання та створює дамп-файл, який можна швидко перезавантажити на сервер MySQL.

Оскільки опція - -opt включена за замовчуванням , ви вказуєте лише її зворотну сторону, - -p -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-транзакцію . Це автоматично деактивує - блоки-таблиці та дозволить скинути всю таблицю в один і той же час та дозволить одночасно надходити нові записи.

Якщо у вас є одна або кілька таблиць MyISAM, вам потрібно вказати --lock-all-table . Це автоматично деактивує - блоки столів , деактивує --sele-транзакцію , заблокує всі таблиці у всіх базах даних, а потім створить дамп. Записи до таблиць InnoDB все ще можуть відбуватися, але вони просто стануть у черзі до тих пір, поки блокування не будуть звільнені. Будь-яке з'єднання БД, що намагається записати в будь-які таблиці MyISAM, буде фактично призупинено, поки не будуть звільнені всі блоки.

Запустіть цей запит: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Якщо Number_Of_Stored_Proceduresбільше нуля, використовуйте --програми .

Запустіть цей запит: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Якщо Number_Of_Triggersбільше нуля, використовуйте --тригери .

CAVEAT : Будь ласка, не використовуйте - порядок за основним для демпінгу всіх баз даних, оскільки це може потенційно зробити індекси BTREE досить односторонніми при перезавантаженні. - Порядок за основним слід використовувати лише під час завантаження окремої таблиці, яка, на вашу думку, має цілий первинний ключ і буде мати багато сканувань діапазону у вашій програмі.

Якщо вам потрібні більше креативних типів резервних копій mysqldump, перегляньте стару публікацію Як я можу оптимізувати mysqldump великої бази даних? .

Будь ласка , прочитайте всі варіанти туздИшпра .

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

Я оновив свою команду mysqldump (будь ласка, дивіться мою редагування). Однак у мене є останнє питання. Як ви вважаєте, чи варто також використовувати всі наведені нижче аргументи? --add-drop-база даних \ --add-drop-таблиця \ - завершення-вставка \ - відкладена вставка \ - tz-utc

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

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

Коригуючи останню редакцію, це саме те, що вам особливо потрібно

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

Знову кажу, будь ласка, прочитайте всі варіанти для mysqldump .


Про базу даних --add-drop: чи це також не гарантує, що у вашій базі немає жодних випадкових таблиць, які не знаходяться на вашому смітнику? Якщо хтось створив випадкову тестову таблицю у вашій базі даних, вона все одно існуватиме після перезавантаження з дампа без цієї опції. Отже, це залежить від того, хочете ви цього чи ні. Правильно?
jschultz410

Про що --add-drop-trigger?
lonix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.