Crmgo Блог

mysqldump: робимо бекапи

mysqldump: робимо бекапи

Отримання дампів даних і структури таблиці Ця утиліта дозволяє отримати дамп («миттєвий знімок») вмісту бази даних або набору баз даних для створення резервної копії або пересилання даних на інший SQL-сервер баз даних (не обов’язково MySQL-сервер). Дамп міститиме набір SQL-команд…

mysqldump: робимо бекапи

Отримання дампів даних та структури таблиць

Ця утиліта дозволяє отримати дамп («миттєвий знімок») вмісту бази даних або набору баз даних для створення резервної копії або передачі даних на інший SQL-сервер баз даних (не обов’язково MySQL-сервер). Дамп міститиме набір SQL-команд для створення та/або заповнення таблиць.

Якщо ж резервна копія створюється на сервері, замість описуваної утиліти слід використовувати mysqlhotcopy. Див. розділ See Розділ 4.8.6, «mysqlhotcopy, Копіювання баз даних і таблиць MySQL».

shell> mysqldump [OPTIONS] database [tables]
или  mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
или  mysqldump [OPTIONS] --all-databases [OPTIONS]

Якщо не вказувати імена таблиць або використовувати параметри --databases або --all-databases, то буде отримано дамп бази даних загалом (відповідно — усіх баз даних).

Перелік опцій, підтримуваних вашою конкретною версією утиліти mysqldump, можна отримати, виконавши команду mysqldump --help.

Слід мати на увазі, що утиліта mysqldump, яка використовується без опцій --quick або --opt, перед тим як зробити дамп результату вибірки інформації, завантажить увесь результат у пам’ять. Це може створити проблеми при отриманні дампів великих баз даних.

Зверніть увагу, що не слід застосовувати параметри --opt або -e, якщо ви плануєте використовувати для отримання дампів нову копію програми mysqldump, а потім відтворювати їх на дуже старому MySQL-сервері.

Утиліта mysqldump підтримує наступні опції:

  • --add-locksДодати команди LOCK TABLES перед виконанням та UNLOCK TABLE після виконання кожного дампу таблиці (для прискорення доступу до MySQL).
  • --add-drop-tableДодати команду DROP TABLE перед кожною командою CREATE TABLE.
  • -A, --all-databasesВиконати дамп усіх баз даних. Аналогічно до опції --databases із зазначенням усіх баз даних.
  • -a, --allУвімкнути всі опції створення об'єктів, специфічні для MySQL.
  • --allow-keywordsДозволити створювати імена стовпців, які збігаються з ключовими словами. Відсутність конфліктів забезпечується додаванням імені таблиці як префікса до імені кожного стовпця.
  • -c, --complete-insertВикористовувати повні команди INSERT (з іменами стовпців).
  • -C, --compressВикористовувати стиснення всієї інформації між клієнтом і сервером, якщо обидва підтримують стиснення.
  • -B, --databasesВиконати дамп кількох баз даних. Зверніть увагу на різницю у використанні: у цьому випадку таблиці не вказуються. Усі імена аргументів розглядаються як імена баз даних. Оператор USE db_name; включається у вивід перед кожною новою базою даних.
  • --delayedВикористовувати команду INSERT DELAYED при вставці рядків.
  • -e, --extended-insertВикористовувати команду INSERT з новим багаторядковим синтаксисом (підвищує компактність та швидкодію операторів введення).
  • -#, --debug[=option_string]Відстежувати проходження програми (для налагодження).
  • --helpВивести довідкову інформацію та вийти з програми.
  • --fields-terminated-by=... , --fields-enclosed-by=... , --fields-optionally-enclosed-by=... , --fields-escaped-by=... , --lines-terminated-by=...Ці опції використовуються спільно з параметром -T і мають таке саме значення, що й відповідні оператори для LOAD DATA INFILE. Див. розділ See Розділ 6.4.9, «Синтаксис оператора LOAD DATA INFILE».
  • -F, --flush-logsЗаписати на диск дані системного журналу з буфера MySQL-сервера перед початком виконання дампу.
  • -f, --force,Продовжувати навіть при отриманні помилки SQL під час виконання дампу таблиці.
  • -h, --host=..Виконати дамп даних MySQL-сервера на вказаному хості. Значення хоста за замовчуванням - localhost.
  • -l, --lock-tables.Заблокувати всі таблиці перед початком виконання дампу. Таблиці блокуються оператором READ LOCAL, щоб дозволити паралельні записи для MyISAM-таблиць. Варто відзначити, що під час виконання дампу сукупності баз даних опція --lock-tables блокує таблиці кожної бази окремо. Таким чином, використання цього параметра не гарантує, що таблиці будуть логічно непротиворічливими в межах цих баз даних. У різних базах даних під час виконання дампу таблиці можуть перебувати у зовсім різних станах.
  • -K, --disable-keysДодає вираз /*!40000 ALTER TABLE tb_name DISABLE KEYS */; та /*!40000 ALTER TABLE tb_name ENABLE KEYS */; у виводі результату. Це прискорить завантаження даних на сервер MySQL 4.0, оскільки індекси створюються після внесення всіх даних.
  • -n, --no-create-dbУ виводі результату вираз CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name; буде відсутній. Цей рядок буде додано у будь-якому випадку при використанні опцій --databases або --all-databases.
  • -t, --no-create-infoНе записувати інформацію про створення таблиці (команда CREATE TABLE).
  • -d, --no-dataНе записувати інформацію з рядків таблиці. Це дуже корисно для отримання дампу структури таблиці!
  • --optТе саме, що й --quick --add-drop-table --add-locks --extended-insert --lock-tables. Повинно дати найшвидший дамп для читання на MySQL-сервері.
  • -pyour_pass, --password[=your_pass]Пароль, що використовується під час підключення до сервера. Якщо аргумент =your_pass не введено, mysqldump запропонує ввести пароль.
  • -P port_num, --port=port_numНомер порту TCP/IP, що використовується для підключення до хоста.
  • --protocol=(TCP | SOCKET | PIPE | MEMORY)Для вказівки протоколу з'єднання, який слід використовувати. Нововведення в MySQL 4.1.0.
  • -q, --quickВиводити дап безпосередньо на стандартний вивід stdout без буферизації запиту. Для цього використовується функція mysql_use_result().
  • -Q, --quote-namesВзяти в лапки імена таблиць і стовпців без символів '`'.
  • -r, --result-file=...Прямий вивід вказаного файлу. Цю опцію слід використовувати в MS DOS, оскільки вона запобігає перетворенню символу нового рядка '\n' на послідовність '\n\r' (новий рядок + повернення каретки).
  • --single-transactionЦя опція видає SQL-команду BEGIN перед виконанням дампу даних з сервера. Найчастіше використовується з InnoDB-таблицями та рівнем ізоляції транзакцій READ_COMMITTED, оскільки саме в цьому режимі можна отримати дамп з непротиворічливим станом бази даних після виконання команди BEGIN без блокування будь-яких додатків. Використовуючи цю опцію, необхідно пам'ятати, що під час виконання дампу лише транзакційні таблиці будуть перебувати в непротиворічливому стані, тобто деякі MyISAM- або HEAP-таблиці при використанні цієї опції можуть все ж змінити свій стан. Опція --single-transaction додана у версії 4.0.2. Вона є взаємовиключною по відношенню до опції --lock-tables, оскільки команда LOCK TABLES вже приймає відкриту транзакцію.
  • -S /path/to/socket, --socket=/path/to/socketФайл сокета для підключення до localhost (значення хоста за замовчуванням).
  • --tablesПерекриває параметр --databases (-B).
  • -T, --tab=path-to-some-directoryДля кожної заданої таблиці створює файл a table_name.sql, що містить SQL CREATE команду для створення таблиці, та файл table_name.txt з даними таблиці. Файл .txt має формат відповідно до параметрів --fields-xxx та --lines--xxx. Примітка: Цей параметр працює лише за умови, що утиліта mysqldump запущена на тому ж комп'ютері, що й демон mysqld, причому користувач/група, що запустили цей потік mysqld (зазвичай це користувач mysql і група mysql), повинні мати право створювати/записувати файл за вказаною адресою.
  • -u user_name, --user=user_nameІм'я користувача MySQL-сервера, що використовується під час підключення до сервера. Значенням за замовчуванням є ім'я користувача Unix.
  • -O var=option, --set-variable var=optionВстановити значення змінних. Доступні для використання змінні перелічені нижче. В MySQL 4.0 просто використовуйте --var=option.
  • -v, --verboseРозширений режим виводу. Вивід більш детальної інформації про роботу програми.
  • -V, --versionВивести інформацію про версію та вийти з програми.
  • -w, --where='where-condition'Виконати дамп лише вибраних записів. Зверніть увагу, що лапки обов'язкові.
    "--where=user='jimf'" "-wuserid>1" "-wuserid<1"

 

  • -X, --xmlПредставляє дамп бази даних у форматі XML.
  • -x, --first-slaveБлокує всі таблиці у всіх базах даних.
  • -O net_buffer_length=#, where # < 16MПри створенні багаторядкових операторів введення (як і у випадках використання параметрів --extended-insert або --opt) утиліта mysqldump буде створювати рядки довжиною до значення, вказаного в net_buffer_length. При збільшенні значення цієї змінної необхідно також переконатися, що в MySQL-сервері для змінної max_allowed_packet вказано значення більше, ніж величина net_buffer_length.
  • Найчастіше утиліта mysqldump використовується для отримання резервної копії всіх баз даних. Див. Розділ 4.4.1, «Резервне копіювання баз даних».

    mysqldump --opt database > backup-file.sql

    Можна, навпаки, прочитати цей файл на MySQL-сервері за допомогою команди:

    mysql database < backup-file.sql

    або

    mysql -e "source /patch-to-backup/backup-file.sql" database

     

    Ця утиліта досить часто використовується і для перенесення інформації з бази даних на інший MySQL-сервер:

    mysqldump --opt database | mysql --host=remote-host -C database

    Цілком можливо отримати дамп кількох баз даних за допомогою однієї команди:

    mysqldump --databases database1 [database2 ...] > my_databases.sql

    Якщо потрібен дамп усіх баз даних, можна використати:

    mysqldump --all-databases > all_databases.sql

    Розглянемо приклад найпростішого використання, зробимо дамп бази даних «database» за допомогою перенаправлення потоку у файл «database.sql»:

    mysqldump -uroot -h82.82.82.82 -p database > database.sql

    де:

    • -u або -–user=... — ім'я користувача
    • -h або --host=... — віддалений хост (для локального хоста можна опустити цей параметр)
    • -p або --password — запитувати пароль
    • database — ім'я бази даних
    • database.sql — файл для дамп

    Щоб зробити дамп кількох баз даних, необхідно використати параметр --databases (або скорочено -B), приклад:

    mysqldump -uroot -h82.82.82.82 -p -B database1 database2 database3 > databases.sql

    А щоб зробити дамп усіх баз даних, необхідно використати параметр --all-databases (або скорочено -A), приклад:

    mysqldump -uroot -h82.82.82.82 -p -A > all-databases.sql

    Розгортання дамп

    Перенаправляємо потік у зворотному напрямку і розгортаємо базу даних:

    mysql -uroot -h82.82.82.82 -p database < database.sql

    Або через mysql-console:

    mysql> use database; mysql> source database.sql

    Ну, а якщо у нас gz-архів, наприклад, то:

    zcat database.sql.gz | mysql -uroot -h82.82.82.82 -p database

    Приклад використання деяких параметрів

    Наприклад, нам потрібні дані з «продакшн версії бази» для «версії розробника», тобто нам потрібна «пісочниця». Обираємо не більше 100 записів:

    mysqldump -uroot -h82.82.82.82 -p --where="true limit 100" database > database.sql

    Або нам потрібна тільки структура, без даних:

    mysqldump -uroot -h82.82.82.82 -p --no-data database > database.sql

    Приклади натхненні дописом Олександра Макарова — http://rmcreative.ru/blog/post/ljogkiy-damp-mysql

    Створюємо дамп лише тригерів, процедур та подій:

    mysqldump --no-create-info --no-data --triggers --routines --events -uroot -p database | gzip > ~/database.sql.gz

    Шпаргалка по параметрах

    Наведу деякі параметри, які можуть знадобитися при роботі з утилітою mysqldump.

    --add-drop-database
    Додає оператор DROP DATABASE перед кожним оператором CREATE DATABASE.
    --add-drop-table
    Додає оператор DROP TABLE перед кожним оператором CREATE TABLE.
    --add-locks
    Додає оператор LOCK TABLES перед виконанням та UNLOCK TABLE після виконання кожного дампу таблиці (для прискорення доступу до MySQL).
    --all-databases, -A
    Зберігає всі таблиці з усіх баз даних, якими керує поточний сервер.
    --allow-keywords
    Дозволяє створювати імена стовпців, які збігаються з ключовими словами. Уникнення конфліктів забезпечується додаванням імені таблиці як префікса до імені кожного стовпця.
    --comments, -i
    Цей параметр дозволяє додати до дампу додаткову інформацію, таку як версія mysqldump, версія MySQL, ім'я хоста, на якому розташований сервер MySQL.
    --compact
    Цей параметр вимагає від mysqldump створити дамп, використовуючи максимально компактний формат. Параметр є протилежним до --comments.
    --compatible=name
    Параметр генерує вивід, який сумісний з іншими СУБД або старішими версіями MySQL. Замість ключового слова name можна використовувати: «ansi», «mysql323», «mysql40», «postgresql», «oracle», «mssql», «db2», «maxdb», «no_key_options», «no_table_options», «no_field_options». Можна використовувати кілька значень, розділивши їх комами.
    --complete-insert, -c
    Використовується повна форма оператора INSERT (з іменами стовпців).
    --create-options
    Додає додаткову інформацію в оператори CREATE TABLE. Це може бути тип таблиці, початкове значення AUTO_INCREMENT та інші параметри.
    --databases, -B
    Параметр дозволяє вказати імена кількох баз даних, для яких необхідно створити дамп.
    --delayed
    Використовувати команду INSERT DELAYED при вставці рядків.
    --delete-master-logs
    На головному сервері реплікації автоматично видаляються бінарні логи (logbin) після того, як дамп був успішно створений за допомогою mysqldump. Цей параметр автоматично включає параметр «--master-data».
    --disable-keys, -K
    Для кожної таблиці оточує оператор INSERT виразами /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; та /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; у виводі результату дампу. Це прискорить завантаження даних на сервер для таблиць типу MyISAM, оскільки індекси створюються після внесення всіх даних.
    --extended-insert, -e
    Використовувати команду INSERT з новим багаторядковим синтаксисом (підвищує компактність та швидкодію операторів введення).
    --flush-logs, -F
    Записати на диск дані системного журналу з буфера MySQL-сервера перед початком виконання дампу.
    --force, -f
    Продовжувати навіть якщо під час створення дампу сталася помилка.
    --hex-blob
    Параметр дозволяє представити бінарні дані в полях типу BINARY, VARBINARY, BLOB та BIT у шістнадцятковому форматі. Так послідовність «abc» буде замінена на 0×616263.
    --ignore-table=db_name.tbl_name
    Дозволяє ігнорувати таблицю tbl_name бази даних db_name під час створення дампу. Якщо з дампу необхідно виключити кілька таблиць, необхідно використати кілька параметрів «--ignore-table», вказуючи по одній таблиці в кожному з параметрів.
    --insert-ignore
    Додає ключове слово IGNORE в оператор INSERT.
    --lock-all-tables, -x
    Вказання цього параметра призводить до блокування всіх таблиць у всіх базах даних під час створення повного дампу всіх баз даних.
    --lock-tables, -l
    Вказання цього параметра призводить до блокування таблиць бази даних, для якої створюється дамп.
    --no-autocommit
    Вмикає всі оператори INSERT, що стосуються однієї таблиці, в одну транзакцію, що призводить до збільшення швидкості завантаження даних.
    --no-create-db, -n
    Пригнічує створення в дампі операторів CREATE DATABASE, які автоматично додаються при використанні параметрів --databases та --all-databases.
    --no-data, -d
    Пригнічує створення операторів INSERT в дампі, що може бути корисним при створенні дампу структури бази даних без самих даних.
    --opt
    Параметр призначений для оптимізації швидкості резервування даних і є скороченням, що включає наступні опції: --quick --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --set-charset. Починаючи з MySQL 4.1, параметр --opt використовується за замовчуванням, тобто всі вищезгадані параметри вмикаються за замовчуванням, навіть якщо вони не вказуються. Для того щоб виключити таку поведінку, необхідно скористатися параметром --skip-opt
    --order-by-primary
    Вказання параметра призводить до того, що кожна таблиця сортується за первинним ключем або першим унікальним індексом.
    --port, -P
    Номер TCP порту, що використовується для підключення до хоста.
    --protocol={TCP|SOCKET|PIPE|MEMORY}
    Параметр дозволяє задати протокол підключення до сервера.
    --quick, -q
    Дозволяє почати формування дампу, не чекаючи повного завантаження даних з сервера і економлячи тим самим пам'ять.
    --quote-names, -Q
    Поміщає імена баз даних, таблиць і стовпців у зворотні апострофи `. Починаючи з MySQL 4.1, цей параметр увімкнено за замовчуванням.
    --replace
    Додає ключове слово REPLACE в оператор INSERT. Цей параметр вперше з'явився в MySQL 5.1.3.
    --result-file=/path/to/file, -r /path/to/file
    Параметр спрямовує дамп у файл file. Цей параметр особливо зручний у Windows, без використання командного рядка, коли можна перенаправити результат у файл за допомогою послідовностей > та >>.
    --routines, -R
    Цей параметр створює дамп збережених процедур і функцій. Доступний з MySQL 5.1.2.
    --single-transaction
    Параметр створює дамп у вигляді однієї транзакції.
    --skip-comments
    Цей параметр дозволяє пригнічити вивід в дамп додаткової інформації.
    --socket=/path/to/socket, -S /path/to/socket
    Файл сокета для підключення до localhost.
    --tab=/path/, -T /path/
    При використанні цього параметра в каталозі path для кожної таблиці створюються два окремі файли: tbl_name.sql, що містить оператор CREATE TABLE, та tbl_name.txt, який містить дані таблиць, розділені символом табуляції. Формат даних може бути перевизначений явно за допомогою параметрів --fields-xxx та --lines-xxx.
    --tables
    Перекриває дії параметра --databases (-B). Всі аргументи, що йдуть після цього параметра, трактуються як імена таблиць.
    --triggers
    Створюється дамп тригерів. Цей параметр увімкнено за замовчуванням. Для його вимкнення слід використати параметр --skip-triggers.
    --events, -E
    Створюється дамп подій. Дивіться MySQL Event Scheduler або вбудований диспетчер подій в MySQL.
    --tz-utc
    При використанні цього параметра в дамп буде додано оператор виду SET TIME_ZONE='+00:00', що дозволить обмінюватися дампами в різних часових поясах.
    --verbose, -v
    Розширений режим виводу. Вивід більш детальної інформації про роботу програми.
    --version, -V
    Вивести інформацію про версію програми.
    --where='where-condition', -w 'where-condition'
    Виконати дамп лише вибраних записів. Зверніть увагу, що лапки є обов'язковими.
    --xml, -X
    Представляє дамп бази даних у вигляді XML.
    --first-slave, -x
    Блокує всі таблиці у всіх базах даних.
    --debug=..., -#
    Відстежувати проходження програми (для налагодження).
    --help
    Вивести довідкову інформацію і вийти з програми.

    Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.