PostHeaderIcon Резервное копирование базы данных mysql

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

Так как резерное копирование естественным образом должно выполняться автоматически, для начала сваяем простенький скрипт с именем dircreate.sh (не забываем потом сделать его исполняемым):
[cc lang=»bash»]DCR=`date ‘+%Y%m%d%H%M’`
mkdir /home/user/backups/bases/$DCR
/usr/local/bin/mysqldump —databases base1 base2 | /usr/bin/gzip -q > /home/user/backups/bases/$DCR/mybases.gz[/cc]

Что он делает: в первой строчке мы определяем значение переменной DCR равное текущей дате в формате ГГГГММДДЧЧММ (последние ММ — минуты :). Обратите на обратные одинарные кавычки, в которые заключена вся команда date вместе с аргументом: они дают указание шеллу сначала выполнить команду date, а потом присвоить ее вывод значению переменной.
Вторая строчка создает по указанному пути директорию с именем, равным значению переменной DCR, что позволяет нам отследить время создания бэкапа, и в дальнейшем облегчает поиски нужного архива. Путь, само собой, может быть любым, удобным для архивации.
Третья строчка — конвейер: последовательность команд, разделенных знаком «|». Такая конструкция обозначает, что вывод предыдущей команды подается на ввод следующей. Таким образом мы получаем текстовый дамп базы, сжимаем его с помощью gzip и помещаем в только что созданную директорию по именем mybases.gz.
Немного остановимся на формате вызова mysqldump. Во первых указан полный путь, так как в ином случае при запуске этого скрипта из крона, если в /etc/crontab не указаны нужные пути явно, программа не запустится. Ключ —databases говорит о том, что мы сохраняем несколько баз данных одновременно. Если будем сохранять только одну базу, этот ключ не нужен. base1 и base2 — имена баз данных, которые мы сохраняем.
Скрипт готов, теперь помещаем в /etc/crontab следующую строчку:

[cc lang=»bash»]15 23 * * * root /usr/home/user/dircreate.sh[/cc]

Теперь каждый день в 23:15 наш скрипт будет запускаться и делать резервное сохранение нужных нам баз данных. Cron при этом перезапускать не нужно.

4 комментария на “Резервное копирование базы данных mysql”

  • lizz says:

    «ГГГГММММДДЧЧММ» — эммм, это опечатка?

    А ещё бывают инкрементальный, дифференциальный бекапы и т.п.
    http://dev.mysql.com/doc/refman/5.1/en/backup-and-recovery.html — тут подробней, только на английском.

  • skiangel says:

    > lizz says:
    > ноября 18, 2009 в 19:33 (Edit)

    > “ГГГГММММДДЧЧММ” – эммм, это опечатка?

    Ну да, четыре цифры год, две -месяц, две день, и так далее. Сейчас поправлю. За ссылку спасибо, попробую перевести на досуге.

  • nekto says:

    С БД не особо работал, а как восстановить из такого бекапа после разархивирования?

  • skiangel says:

    Как говорит нам man mysql, вот так:

    shell> mysql db_name < text_file

    Если надо производить действие от конкретного пользователя, то

    $ mysql -u username -p db_name < text_file

    В данном случае перед загрузкой бэкапа попросит ввести верный пароль для username

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

PR-CY.ru