MySQL Backup
Простой бекап базы
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. Выполните её в консоли:
- 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=«[email protected]» ### 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