Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

MySQL: как сделать backup (резервную копию) базы данных

Практика



Задача: сделать резервную копию базы данных или всех баз данных сервера 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 5.x+
создано: 2017-05-09
обновлено: 2021-03-13
133694



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

MySql (Maria DB)

Термины: MySql (Maria DB)