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