mysql-dump

Утилита mysqldump позволяет получить дамп содержимого базы данных или совокупности баз для создания резервной копии или пересылки данных на другой SQL-сервер (не обязательно MySQL-сервер). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц.

Так же mysqldump имеет возможность развертывания баз данных из созданного 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
Вывести справочную информацию и выйти из программы.

Еще пару слов о бекапе в MySQL

mysqlhotcopy для MyISAM

Для быстрого резервирования БД с типом таблиц ISAM и MyISAM можно использовать «mysqlhotcopy», которая скопирует файлы *.frm, *.MYD и *.MYI:

# mysqlhotcopy db_name /path/to/dir

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

xtrabackup для InnoDB

Для InnoDB есть xtrabackup, рекомендую посмотреть!
UPD: XtraBackup — резервное копирование для innoDB

Бин-лог и репликации

Для репликации «mysqldump» не предназначена, для этого есть бин-лог (--log-bin):

# mysqlbinlog binlog.[0-9]* | mysql

Для полной репликации необходимо вести бин-лог с самого начала работы БД, то есть еще до создания структур и данных.

Резервирование данныс в MySQL 6.x

С версии MySQL 6.x доступен online-backup, вот слайд объясняющий нововведения:

online_backup


Комментарии (24) на запись «Утилита mysqldump и шпаргалка по параметрам»

» Трекбеки скрыты, показать их?
  1. smackthat | 20.07.2009 в 16:25

    полезная статья!

  2. mra | 20.11.2009 в 16:18

    При попытке восстановления из скрипта содержащего только одну таблицу запрос не работает:

    mysqldump -uroot -h82.82.82.82 -p database < table.sql

    Видимо нужно использовать

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

    PS. см blog.tsheets.com/2008/tip...qldump-file.html

  3. adw0rd | 20.11.2009 в 16:44

    mra, да, вроде вы правы. Я просто такой метод (с перенаправлением потока) не использую, я все использую «source».

  4. adw0rd | 20.11.2009 в 16:50

    mra, спасибо, поправил с «mysqldump» на «mysql»

  5. Дмитрий | 21.03.2010 в 23:26

    adw0rd, еще раз спасибо :) полезные вещи публикуете.

  6. Andrew | 15.06.2010 в 16:44

    Реально помогло спасибо огромное

  7. Andrey | 26.10.2010 в 15:27

    Чтобы пароль не запрашивался, нужно писать его сразу после -p, то есть без пробелов.

  8. Tommy | 28.12.2010 в 13:53

    Я мануал почитал, но что получается противоречий много или мой кривой английский.

    скажем у нас есть база данных

    site //база данный
         posts //таблица
         users //таблица
         comment //таблица

    --lock-tables когда начнется дамп заблокируют всю базу «site» или будет по отдельности когда дампит таблицу «posts» блокирует ей -> потом разблокирует. и дальше тоже самое со всеми таблицами.

    просто в писалось что может быть рассинхронизация, что мол в пост мы записали. а в узер не успели.

    И да еще вопрос как бы посоветовал реализовать механизм. что когда начинается дамп на сайте пользователям выводилось сообщение: «Сайт заработает через несколько минут.»

  9. adw0rd | 28.12.2010 в 14:06

    При --lock-tables будет лочится только одна таблица и т.д. Обратите внимание на параметр:

    --lock-all-tables

    о которой тоже есть упоминание в статье

  10. adw0rd | 28.12.2010 в 14:13

    И да еще вопрос как бы посоветовал реализовать механизм. что когда начинается дамп на сайте пользователям выводилось сообщение: «Сайт заработает через несколько минут.»

    Ну делать надо дамп в часы минимальной нагрузки, ставить высокий приоритет процессу mysqldump (см. nice) и самое простое:

    * либо смотреть процессы (ps ax|grep mysqldump|grep -v grep)

    * либо при таймауте подключения к БД ловить эксепшен и выводить страничку

    Но вообще лучше юзать бинлоги или спец утилиты типа: mysqlhotcopy, xtrabackup и т.д.

  11. Tommy | 28.12.2010 в 14:24

    На тему --lock-all-tables

    mysqldump -uroot -h82.82.82.82 --lock-all-tables -p database > database.sql

    здесь будет заблокировано только database? просто написано при всех базах данных и блокировка всех.

    mysqlhotcopy тоже же придется то блокировать таблицу.

    Да я думаю уже в строну поднятия slave сервера. ибо там проблем не будет. просто не хотелось бы это крутить на одном сервера. а сервер для бэкапа слабый. боюсь что slave не будет успевать за master.

    за идейки спасибо.

  12. Курганский лис | 31.03.2011 в 13:20

    Я настроил ежедневный бэкап базы данных на 4 часа утра местного времени (в этот момент, меньше всего число посетителей). Но все равно, каждую ночь в логе mysql появляются сообщения о медленных запросах (sloq queries). Проанализировав ситуацию понял, что медленные запросы генерируются при запросах поисковых ботов.

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

    Какой вариант действий в такой ситуации?

  13. adw0rd | 31.03.2011 в 20:06

    Перевелите все таблицы в InnoDB и используйте --single-transaction, либо xtrabackup

    single-transaction will force running a backup within a transaction. This allows backing up of transactional tables without imposing a lock howerver will NOT properly backup non-transacitonal tables.

    Auto-detect will choose single-transaction unless Holland finds non-transactional tables in the backup-set.

    None will completely disable locking. This is generally only viable on a MySQL slave and only after traffic has been diverted, or slave ervices suspended.

  14. Курганский лис | 01.04.2011 в 07:11

    В обозримом будущем собираюсь прикрутить Sphinx к базе. Но перевести все таблицы в в InnoDB не получится — я использую полнотекстовый поиск. Пока ситуация именно такая.

    Надеялся что есть какой-то способ временного решиныя моей проблемы.

  15. adw0rd | 01.04.2011 в 12:44

    Используйте кеширование, например memcached, думаю вам это поможет

  16. Александр | 13.07.2011 в 16:40

    Если возможность при помощи mysqldump разбить данные одной таблицы на несколько дампов? Бывает нужно, когда файл большой.

  17. SkyAls | 25.07.2011 в 09:59

    Здравствуйте. Подскажите пожалуйста.

    Я сделал бэкап командой

    mysqldump -uroot -p --all-databases > dump.txt

    Как мне теперь развернуть базы данных на новом сервере.

    mysql -uroot -p database < dump.txt

    Что указать в параметре «database», когда восстанавливается вся структура?

    Заранее спасибо.

  18. adw0rd | 01.08.2011 в 18:41

    Название БД

  19. Suvoroff | 18.09.2011 в 22:18

    Переносил базу форума, кодировка utf, при развертывании весь русский текст исчезает, в чем проблема?

    Я то в конце концов дамп развернул — создал средствами phpmyadmin, а развернул через ssh, но на будущее хотелось бы узнать. Кто-нибудь подскажет?

  20. vasa_c | 18.02.2012 в 15:02

    Логотип сам рисовал?

  21. mysqldump: игнорирование данных в определённых таблицах | Блог ГО | 18.02.2012 в 15:10

    [...] mysqldump: игнорирование данных в определённых таблицах 18 февраля 2012; Рубрика: mysql; Теги: bash, mysql, mysqldump; (картинку увёл с adw0rd.ru) [...]

  22. adw0rd | 18.02.2012 в 15:43

    ага

  23. Резервное копирование баз MySQL Резервное копирование баз MySQL « Notes About Nothing | 21.02.2012 в 12:02

    [...] И очень хорошая статья о mysqldump [...]

  24. Резервное копирование баз MySQL Резервное копирование баз MySQL « Notes About Nothing | 07.04.2012 в 23:39

    [...] И очень хорошая статья о mysqldump Share this:TwitterFacebookLike this:НравитсяБудьте первым, кому понравился этот . By a1iante, on Февраль 21, 2012 at 11:19, under MySQL. Метки: Backup, MySQL. 1 комментарий Добавить комментарий или оставить обратную ссылку: URL обратной ссылки. « OTRS + LDAP OPM пакеты для OTRS 3 на CentOS. » [...]

Оставить комментарий