Задача: сделать резервную копию базы данных или всех баз данных сервера MySQL.
Мы можем пойти двумя путями:
- Остановить сервер MySQL и просто скопировать базы
- Сделать бекап на-лету (без остановки сервера MySQL)
Каждый метод, очевидно, имеет свои плюсы и минусы. Так, для выполнения бекапа "на-лету" требуется знать логин-пароль пользователя, имеющего права на резервное копирование базы данных и итоговый файл бекапа будет несколько больше, чем если просто базу скопировать.
С другой стороны, при копировании на-лету не нужно останавливать сервер MySQL (что, очевидно, создало бы отказ в обслуживании на время бекапа) и не нужно знать путь к базам данным на сервере. И еще один момент - не всегда название базы = название ее каталога в файловой системе!
Путь первый: грамотно сделаем бекап на-летуДля этого нам понадобится утилита "mysqldump". Она идет в комплекте с самим сервером MySQL. Вот пример вызова это утилиты:
$ mysqldump -u root -p mydatabase > mydatabase.bak
В этом примере мы используем утилиту под пользователем root (параметр -p указывает, что нужно запросить пароль для пользователя) для создания резервной копии базы данных под названием "mydatabase". Результат бекапа будет записан в виде дампа SQL в файл mydatabase.bak
Как видно - таким образом мы сделали бекап отдельно взятой базы данных. А в следующем примере сделаем бекап всех баз, находящихся на сервере. При этом имейте в виду, что:
- все базы данных будут вывалены в один файл, который, при их большом суммарном объеме, превратится просто в огромную глыбу дампа;
- нам нужно выполнять бекап из-под пользователя, который имеет право доступа ко всем базам данных - тобишь - из-под root или его аналога.
$ mysqldump -u root -p --all-databases > alldatabases.bak
В этом примере все базы будут вывалены в дамп под названием alldatabases.bak
А теперь сделаем бекап двух или более баз. В нашем примере две БД (mydatabase1 и mydatabase2) будут забекаплены в один файл mydatabases.bak
$ mysqldump -u root -p --databases mydatabase1 mydatabase2 > alldatabases.bak
Делаем бекап на-лету - все базы, но каждую базу в свой файлТехника не моя - взята с сайта itblog.su и подправлена.
Для этого пишем скриптик с вот таким содержанием:
#!/bin/sh
for i in `mysql -u root -pMysuperpassword -e'show databases;' | grep -v information_schema | grep -v Database`; do mysqldump -u root -pMysuperpassword $i > $i.bak; gzip -f $i.bak;done
Здесь вместо -pMysuperpassword подставьте правильный пароль root (-p<password>, т.е. -p и слитно - пароль).
Ключик -f в gzip заставляет его перезаписывать уже существующие файлы без вопроса "Вы уверены?".
Не забудьте сделать скрипт исполняемым.
В данном случае будет произведен бекап всех баз MySQL сервера, но по-отдельности и без остановки сервера. Каждая база будет положена в свой файл с называнием базы + расширение bak, а потом этот файл еще и будет сжат gzip ( + .gz).
Вот что мы получим (пример):
mydatabase1.bak.gz
mydatabase2.bak.gz
...
Где вместо mydatabase1 и т.д. будут имена баз данных (именно имена баз данных, а не имена каталогов, в которых эти базы хранятся).
Путь второй: тупо загасим MySQL и скопируемТеперь менее популярная метода - загасить работу MySQL сервера и банально скопировать базы. Дело в том, что все базы MySQL хранит просто в каталогах, в каждом из которых есть набор из файлов таблиц. Тобишь нам достаточно упаковать каталог нужной базы в tar-файл во время выключенного сервера MySQL - и дело в шляпе.
Итак, гасим сервер.
для Debian/ubuntu:
$ sudo /etc/init.d/mysql stop
для CentOS/redhat:
$ sudo /etc/init.d/mysqld stop
для FreeBSD:
$ sudo /usr/local/etc/rc.d/mysql-server stop
Копируем. Переходим в каталог с базами данных MySQL и создаем файл tar для нужной базы.
# tar -cf mydatabase.bak.tar mydatabase
В данном примере предполагается, что база данных назвается mydatabase. Вам нужно указывать название каталога той базы, которую Вы бекапите. Ну и результат появится в виде одного файла mydatabase.bak.tar
И стартуем сервер MySQL обратно.
для Debian/ubuntu:
$ sudo /etc/init.d/mysql start
для CentOS/redhat:
$ sudo /etc/init.d/mysqld start
для FreeBSD:
$ sudo /usr/local/etc/rc.d/mysql-server start
Гыы, а я сделал бекап копированием без остановки MySQL и у меня получилосьЭто не "гыы", это "ай-ай-ай", ибо все хорошо, пока эти базы не меняются часто. При интенсивном использовании Вы можете угадать так, что файл будет копироваться во время изменения и... короче, можете этот бекап потом выкинуть, причем о том, что он косячный Вы, скорее всего, не узнаете до самого момента "ой".
Комментарии
Оставить комментарий
Базы данных - MySql (Maria DB)
Термины: Базы данных - MySql (Maria DB)