Организация бекапа на серверах

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

Условие — сторонние скрипты не юзать, идти путем самурая, т.е. все делать подручными средствами сервака, благо их хватает.
Скрипт мне любезно предоставил камрад Вебкоде, но все равно там нужно переделывать под себя.

Кратко, что нужно сделать.

  1. Создать папку в корне с текущей датой в имени.
  2. Сделать туда дамп всех БД.
  3. Заархивировать дампы
  4. Скопировать туда содержимое папки /home
  5. Заархивировать сайты и юзеров.
  6. Заархивировать саму папку с бекапами.
  7. Залить на другой сервак.

Серваков у меня три. Точнее, четыре. На одном стоит панель, она сама бекапит. На четвертом ничего особо ценного нет, если пропадет — плакать не буду. Т.е. нужно с сервера А слить бекапы на сервер Б, а с сервера Б на сервер А.

Лирические отступления.
Итак по пунктам. Первый очень просто сделать, в скрипте будет все.

Второй. Дампы.
Если дампов фиксированное число, то можно просто перечислить имена и куда сливать.

mysqldump --databases database1 [database2 ...] > my_databases.sql

Если базы постоянно создаются новые, как у меня, то просто можно их все слить.

mysqldump --all-databases > all_databases.sql

Полезные ключи для дампа:

  • —add-drop-table Добавить команду DROP TABLE перед каждой командой CREATE TABLE.
  • —add-locks Добавить команды LOCK TABLES перед выполнением и UNLOCK TABLE после выполнения каждого дампа таблицы (для ускорения доступа к MySQL).
  • -A, —all-databases Произвести дамп всех баз данных. Аналогично опции —databases с указанием всех баз данных.
  • -c, —complete-insert Использовать полные команды INSERT (с именами столбцов).
  • —skip-comments Не писать коментариив дамп

Маны — номер раз и номер два.

mysqldump -uuser -ppass —add-drop-table —add-locks —complete-insert —skip-comments —all-databases | gzip -9 > ${BACKUPDIR}/`date +%Y-%m-%d`.sql.gz

На выходе получается один большой архив с дампом всех БД.

Далее копировать папку /home/* в папку с бекапами. Копировать ее даже незачем. Сразу архивировать.

tar -czf ${BACKUPDIR}/home-`date +%Y-%m-%d`.tar.gz /home/*

Далее залив на удаленный сервер.

Варианты:

  1. FTP
  2. Rsync
  3. Curl
  4. Scp

FTP(демон) может не стоять, так что отпадает. Rsync и  curl потом как нить рассмотрю.

Scp вроде по дефолту стоит на всех. Команда выглядит примерно так:

scp -C *.txt user@remote.server.com:/home/user/

-C значит компресс. Беда в том, что спрашивает пароль.

Решение из тырнета на буржуйском. Генерация RSA ключа. Так кстати можно и простую авторизацию через ssh логин скинуть.

# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):  #тут не надо ничего вводить, а то будет спрашивать заместо пароля
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
f0:71:ec:ec:82:83:ee:46:8f:0b:40:d5:b6:89:41:37 root@h3

Публичный ключ лежит тут /root/.ssh/id_rsa.pub.  Далее он добавляется на все хосты в файл /root/.ssh/authorized_keys, (если выбран рут) и вводить пасс больше не надо. Добавлять вот так

cat id_rsa.pub >> /root/.ssh/authorized_keys

Теперь вводить пароль не надо.

В итоге получился вот такой скрипт.

!/bin/bash

BACKUPDATE=`date +%Y-%m-%d`;
REMOTESERVER=server.ru
HOSTNAME=`hostname`
BACKUPDIR=/backup/${HOSTNAME}_${BACKUPDATE}

mkdir -p ${BACKUPDIR}

mysqldump -uuser -ppass —add-drop-table —add-locks —complete-insert —skip-comments —all-databases | gzip -9 > ${BACKUPDIR}/`date +%Y-%m-%d`.sql.gz
tar -czf ${BACKUPDIR}/home-`date +%Y-%m-%d`.tar.gz /home/*
scp -Cr /backup root@${REMOTESERVER}:/

Осталось только поставить на крон:

#crontab -e

* * */1 * * nice -n 20 sh ${HOME}/backup.sh

0.00 avg. rating (0% score) - 0 votes

One Comment

css.php