MySQL Backup

Материал из Webko Wiki
Перейти к навигации Перейти к поиску

Простой бекап базы

mysqldump -uLOGIN -PPORT -hHOST -pPASS DBNAME | gzip -c > `date "+\%Y-\%m-\%d"`.gz


0  5  *  *  * root /var/sql_backup/pn_ua.sh
#!/bin/bash
mysqldump -u root  -pKw7To7H0rlP5 pn.ua | gzip -c > /var/sql_backup/pn.ua_`date "+%Y-%m-%d"`.gz

Полный бекап базы

#!/bin/bash
# Эти данные нужно сменить, если какой-либо из параметров поменяется. Например при плановой замене пароля.
export DB_BACKUP="/home/backups/mysql" #Указать каталог для баз
export DB_USER="root" # Указать пользователя, от которого будет идти бэкап. Лучше не root, а имеющий возможность только чтения
export DB_PASSWD="qweqwe" # Указать пароль этого пользователя
# название и версии бэкапов. Тут же - глубина бэкапов. Чем больше строк "mv $DB_BACK..." тем больше бэкапов сохранится. При каждом
# срабатывании скрипта бэкапы перемещаются в сл. папку, а последний - удаляется. То есть такая достаточно примитивная ротация,
# которая избавит от необходимости постоянно чистить диски от старых и уже ненужных бэкапов
echo "* Идет бэкап, можете покурить, попить чаю или поиграть в косынку :)"
rm -rf $DB_BACKUP/04
mv $DB_BACKUP/03 $DB_BACKUP/04
mv $DB_BACKUP/02 $DB_BACKUP/03
mv $DB_BACKUP/01 $DB_BACKUP/02
mkdir $DB_BACKUP/01
echo "* Самый ответственный, нужный и необходимый момент. Спорцменк и комсомолк mysqldump делает свое черное дело..."
echo "----------------------"
mysqldump --user=$DB_USER --password=$DB_PASSWD -R имя_базы >$DB_BACKUP/01/имя базы-wi-`date +%Y-%m-%d-%H-%M-%S`.sql
mysqldump --user=$DB_USER --password=$DB_PASSWD -R имя_еще одной базы >$DB_BACKUP/01/имя_еще_одной_базы-`date +%Y-%m-%d-%H-%M-%S`.sql
echo "ready!"
# строчку с ls я добавляю специально, чтобы в письме, которое мне придёт, можно было увидеть
# размер бэкапа. Если он меньше вчерашнего - есть повод призадуматься. Если вообще нулевой - бэкап не прошёл точно.
ls -lah $DB_BACKUP/01/
exit 0

Если необходимо сжать архив (а текстовые архивы жмутся действительно сильно), то просто нужно добавить

| gzip -9 -c

Например:

mysqldump --user=$DB_USER --password=$DB_PASSWD -R имя_базы | gzip -9 -c >$DB_BACKUP/01/имя базы-wi-`date +%Y-%m-%d-%H-%M-%S`.sql.gz

Сохраните данный скрипт в файл, например в backup.sh. Далее стоит сделать этот скрипт исполняемым:

chmod +x backup.sh

Имя дампа базы создается с датой и временем, чтобы можно было не только знать, когда сделан бэкап, но и сколько он делался. Если cron запустил выполнение в 4.00, а в имени файла 4.02 - значит 2 минуты бэкапилась база.

Бэкапа отдельных таблиц

mysqldump --user=$DB_USER --password=$DB_PASSWD имя_базы имя_таблицы >$DB_BACKUP/01/имя базы-имя_таблицы-wi-`date +%Y-%m-%d-%H-%M-%S`.sql

Полный бекап баз и заливка их по фтп

#!/bin/sh
# System + MySQL backup script
# # ---------------------------------------------------------------------

#########################
######TO BE MODIFIED#####

### System Setup ###
BACKUP=/root
PREFIX_BACKUP="sitename"

### Настройка Mysql ###
MUSER="DBUSER"
MPASS="DBPASSWORD"
MHOST="localhost"

### Настройки FTP ###
FTPD="/"
FTPU="FTPUSER"
FTPP="FTPPASSWORD"
FTPS="FTPADDRESS"

#########################################

### Binaries ###
TAR="$(which tar)"
GZIP="$(which gzip)"
FTP="$(which ftp)"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"

### Today + hour in 24h format ###
NOW=$(date +"%a%H")

### Create hourly dir ###

mkdir $BACKUP/$NOW

### Получаем имена всех баз Mysql ###
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do

### Создаем директории для каждой базы. Резервное копирование будет происходить в различные каталоги ###
 mkdir $BACKUP/$NOW/$db
 FILE=$BACKUP/$NOW/$db/$db.sql.gz
 echo $i; $MYSQLDUMP --add-drop-table --allow-keywords -q -c -u $MUSER -h $MHOST -p$MPASS $db $i | $GZIP -9 > $FILE
done

### Создаем один большой файл для его последующей закачки ###

DUMPFILE=$PREFIX_BACKUP-$NOW.tar.gz

ARCHIVE=$BACKUP/$DUMPFILE
ARCHIVED=$BACKUP/$NOW

$TAR -zcvf $ARCHIVE $ARCHIVED

### Закачиваем на FTP ###
cd $BACKUP
$FTP -n $FTPS <<END_SCRIPT
quote USER $FTPU
quote PASS $FTPP
cd $FTPD
mput $DUMPFILE
quit
END_SCRIPT

### Подчищаем за собой ###

rm -rf $ARCHIVED

Полный бекап + инкриментный

Инкрементальный бэкап с помощью утилиты tar

Вы можете создавать резервные копии на магнитной ленте или стриммере (или работать с любым файлом как со стриммером или лентой). Но в наше время это решение утрачивает функциональность. Утилита GNU tar позволяет вам создавать инкрементальные резервные копии с помощью ключевого параметра -g. В нижеследующем примере команда tar создаст инкрементальные копии каталогов /var/www/html, /home, and /etc. Выполните её в консоли:

  1. tar -g /var/log/tar-incremental.log -zcvf /backup/today.tar.gz /var/www/html /home /etc

Здесь ключ -g создаёт/выводит/извлекает новую (инкрементальную) информацию из резервной копии и помещает её в файл /var/log/tar-incremental.log.

Создание резервных копий баз данных MySQL

Клиентское приложение mysqldump предназначено для дампа или резервного копирования баз данных (БД), таблиц и отдельных данных MySQL. Например, следующая команда покажет список баз данных в конкретной СУБД: $ mysql -u root -h localhost -p -Bse 'show databases' Результат вывода (приведён для примера): brutelog cake faqs mysql phpads snews test tmp van wp Теперь можно создать резервную копию каждой из БД с помощью команды mysqldump; например, для базы данных faqs команда может иметь следующий вид:

$ mysqldump -u root -h localhost -pmypassword faqs | gzip -9 > faqs-db.sql.gz

Создание простой схемы резервного копирования для вашего проекта

Принципиальное преимущество использования удалённого сетевого хранилища (FTP или NAS) для хранения резервных копий заключается в дополнительной защите от потери данных. Для пересылки резервных копий вы можете использовать несколько протоколов: FTP SSH RSYNC Разнообразные коммерческие решения

Я хочу описать здесь только решение, предназначенное для резервного копирования по FTP. Идея стратегии бэкапа, лежащая в основе этого решения, такова: Создание полной резервной копии нашей базы данных около полуночи каждого воскресенья (то есть, по воскресеньям воссоздаётся резервная копия всего содержимого СУБД); В течение недели резервному копированию подвергаются только изменённые данные (инкрементальное копирование). Цикл резервного копирования повторяется каждые 7 дней.


Параметры нашей тестовой конфигурации

Наш сервер ===> ftp/nas server IP:202.54.1.10 ===> 208.111.2.5 Предположим для теста следующую детальную информацию о нашем аккаунте FTP: IP-адрес сервера FTP: 208.111.2.5 Имя аккаунта FTP: nixcraft Пароль к аккаунту FTP: somepassword Каталог FTP: /home/nixcraft (или /)

Места, куда мы будем размещать резервные копии: => /home/nixcraft/full/dd-mm-yy/files — полные; => /home/nixcraft/incremental/dd-mm-yy/files — инкрементальные. Здесь dd-mm-yy — даты создания резервных копий.

Автоматическое резервное копирование с использованием утилиты tar

Теперь вы знаете, как создавать резервные копии файлов и баз данных MySQL с помощью команд tar и mysqldump. Самое время автоматизировать раз навсегда всю процедуру, связав эти команды в единый скрипт. Для начала наш скрипт собирает все данные как с сервера MySQL, так и из файловой системы, во временный каталог под названием /backup. Для этого используется команда tar. Далее скрипт подключается к вашему серверу хранения данных через FTP и создаёт структуру каталогов, о которой было рассказано выше. Скрипт сбрасывает файлы из каталога /backup на сервер FTP. Из каталога /backup убираются врменные файлы. Если резервное копирование на FTP по каким-либо причинам прервано или оказывается неуспешным, скрипт уведомляет вас об этом по E-mail.

Для корректного использования скрипта у вас должны быть установлены следующие пакеты (в качестве FTP-клиента используется утилита ncftp): ncftp mysqldump GNU tar

Листинг нашего примера, названного ftpbackup.sh, приведён ниже:

#!/bin/sh
# System + MySQL backup script
# Full backup day — Sun (rest of the day do incremental backup)
# Copyright © 2005-2006 nixCraft <www.cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# Automatically generated by bash.cyberciti.biz/backup/wizard-ftp-script.php

### System Setup ###
DIRS="/home /etc /var/www"
BACKUP=/tmp/backup.$$
NOW=$(date +"%d-%m-%Y")
INCFILE="/root/tar-inc-backup.dat"
DAY=$(date +"%a")
FULLBACKUP=«Sun»
### MySQL Setup ###
MUSER=«admin»
MPASS=«mysqladminpassword»
MHOST=«localhost»
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
### FTP server Setup ###
FTPD="/home/vivek/incremental"
FTPU=«vivek»
FTPP=«ftppassword»
FTPS=«208.111.11.2»
NCFTP="$(which ncftpput)"
### Other stuff ###
EMAILID=«admin@theos.in»
### Start Backup for file system ###
[! -d $BACKUP ] && mkdir -p $BACKUP ||:
### See if we want to make a full backup ###
if [ "$DAY" == "$FULLBACKUP" ]; then
FTPD="/home/vivek/full"
FILE=«fs-full-$NOW.tar.gz»
tar -zcvf $BACKUP/$FILE $DIRS
else
i=$(date +"%Hh%Mm%Ss")
FILE=«fs-i-$NOW-$i.tar.gz»
tar -g $INCFILE -zcvf $BACKUP/$FILE $DIRS
fi
### Start MySQL Backup ###
# Get all databases name
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"
for db in $DBS
do
FILE=$BACKUP/mysql-$db.$NOW-$(date +"%T").gz
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
done
### Dump backup using FTP ###
#Start FTP backup using ncftp
ncftp -u"$FTPU" -p"$FTPP" $FTPS<<EOF
mkdir $FTPD
mkdir $FTPD/$NOW
cd $FTPD/$NOW
lcd $BACKUP
mput *
quit
EOF
### Find out if ftp backup failed or not ###
if [ "$?" == «0» ]; then
rm -f $BACKUP/*
else
T=/tmp/backup.fail
echo «Date: $(date)»>$T
echo «Hostname: $(hostname)» >>$T
echo «Backup failed» >>$T
mail -s «BACKUP FAILED» "$EMAILID" <$T
rm -f $T
fi

Как установить автоматическое периодическое выполнение скрипта резервного копирования с помощью утилиты cron?

Просто добавьте задачу cron с требуемыми вам параметрами времени и периодичности:

13 0 * * * /home/admin/bin/ftpbackup.sh >/dev/null 2>&1