3 марта 2009 г. FreeBSD FTP MySQL Pyha Бэкап

FreeBSD. Резервирование данных при помощи fsbackup

safe
После истории с rm -rf / я озаботился всетаки каждодневным бэкапом данных, сначала планировал написть свой shell-скриптик, но потом всетаки решил поискать готовое решение...

Цель

  • Резервное копирование файлов проектов
  • Дамп базы данных проектов (MySQL)
  • Выгрузка дампов на удаленный FTP сервер

Средства

В качестве средства для резвного копирования был выбран fsbackup, в силу того, что отвечал нашим целям.

Система fsbackup была создана для обеспечения резервного копирования серверов разного масштаба на специально отведенном сервере бэкапа.

Установка

cd /usr/ports/sysutils/fsbackup
make install

Более подробно о работе с Портами и пакетами во FreeBSD, а так же о обновлении дерева портов и установленных пакетов.

Настройка

cd /usr/local/fsbackup

Создаем директорию для архивов

mkdir ./archive

Сделаем резервную копию и отредактируем конфигурационный файл

cp cfg_example server_backup.conf
vi server_backup.conf

Там все просто, да еще и на русском :)
Теперь укажите используемый конфигурационный файл в create_backup.sh

config_files="server_backup.conf"

Настройки для FTP

Файл server_backup.conf

# Тип хранилища
$cfg_type = "remote_ftp";

# Сервер на который будет копироваться бэкап.
$cfg_remote_host = "server.remote.ru:21";

# Логин под которым будет сохранятся бэкап.
$cfg_remote_login = "backup_login";

# Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
$cfg_remote_path = "/home/backup_login/backup";

# пароль для входа по ftp.
$cfg_remote_password = "backup_password";

Указываем директории и файлы для бэкапа

Доходим до $cfg_root_path и указываем корневую директорию, относительно которой описаны пути для помещения файлов (См. __DATA__).

Указываем директории и файлы для бэкапа (директива __DATA__)

__DATA__

# Fsbackup
/usr/local/fsbackup
!/usr/local/fsbackup/cache
f!.core$
f!^core$
f!.o$
f!.log$

# BSD
/var/db/pkg
/usr/src/sys/i386/conf

# Users and PROJECT's
/home
/root
!/home/ftp
=!.netscape/cache/
=!.mozilla/.*/Cache/
=!.mozilla/.*/NewCache/
=!.mozilla/.*/News/
f!.*.avi$
f!.*.mpeg$
f!.*.mpg$
f!.*.mp3$

# System configuration
/etc
/var/cron/tabs
/var/spool/cron
/usr/local/etc

MySQL бэкап

Для бэкапа MySQL надо отредактировать ./scripts/mysql_backup.sh

Указываем логин, пароль, указываем какие БД нам дампить.

А также необходимо отредактировать стартовый файл ./create_backup.sh и указать что нам нужен бэкап MySQL!

backup_mysql=1

Далее, добавляем в крон запись

crontab -e
0 4 * * * /usr/local/fsbackup/create_backup.sh| mail -s"`uname -n` backup report" root

Краткая справка по крону и шпаргалка.

Секурность!

По поводу шифрования бэкапа смотрите http://www.opennet.ru/dev/fsbackup/#shi

Восстановление данных

Для полного восстановления данных из инкрементального бэкапа может использоваться скрипт ./scripts/fsrestore.sh, для восстановления просто отредактируйте пути внутри скрипта и запустите его.

Комментарии

rf -rf / ==> rm -rf /

Cпасибо, поправил!

а чем бэкапить NDBКластер? :)

Ну, во первых fsbackup делает mysqldump, может тем же самым и дампить?)

Как добавить число копий бэкапа в папке old?

А зачем вам OLD? Можете вообще от него отказаться.
$cfg_save_old_backup = 0;

Или по всей видимости надо переписывать скрипт...

Так ведь если я уберу old то тогда у меня будет только один бэкап сделанный прошлым днем и все. а мне хотелось бы что хотя бы бэкапов пять прошлых дней оставались. там к примеру 01.02.09 02.02.09 ...05.02.09 ну а уж потом 01.02.09 заменяется на 06.02.09 Такое как осуществить

тогда у меня будет только один бэкап сделанный прошлым днем

Тут укажите сколько вы хотите промежуточных бекапов
$cfg_increment_level = 5;

$cfg_increment_level = 5;
Не работает. все прошлым днем.

Ну а сколько раз вы на дню делаете бекапов?

1 раз в день. То есть бэкап каждый день

При $cfg_increment_level = 5 и бекапе раз в сутки, у вас получится 5 промежуточных бекапов (инкрементных) за 5 дней.

Потом все эти промежуточные бекапы объединятся в один архив и поместятся в OLD.

Так? Более подробно опишите все пожалуйста.

adw0rd -
Совершенно верно!!!
Но хотелось бы чтобы просто делался ежедневный полный бэкап отдельной базой, Необходимо так
(а мне хотелось бы что хотя бы бэкапов пять прошлых дней оставались. там к примеру 01.02.09 02.02.09 …05.02.09 ну а уж потом 01.02.09 заменяется на 06.02.09 Такое как осуществить)

joni, если полный бекап, то делайте full_backup и просто в OLD будут все ваши каждодневные полные бекапы.

А потом от ненужных избавляйтесь если хотите, пару строк в sh и проблема решена...

Александр 17 апреля 2009 г. 21:54

Как делать бекап С Удалённого FTP-сервера ?

Александр, соединяться по ФТП и сливать каталоги, вроде fsbackup не предусмотрена к этому.
Кстати, рекомендую покопаться в сторону монтирования удаленного ФТП как ФС.

Александр 9 июня 2009 г. 17:40

Я нашёл способ делать backup ftp:
wget -r ftp://user:pass@domain_name

adw0rd В олд ложится только один бэкам прошлого дня, хочу 5ть. как сделать?

Александр, да, тоже вариант, спасибо! :)

joni, думаю переписать скрипт... Вы читали ман http://www.opennet.ru/dev/fsbackup/ ?

конечно читал. но для меня переписать скрипт действительно сложно. похожих готовых решений нет?

joni, я не встечал... Можете как вариант попробовать Subversion, но там тоже надо будет писать какой-то контроллер для управления бекапом.

у меня при копирование выдает ошибку. WARNING: Nothing to backup.

при копировании "чего"?

уже разобрался спс

спасибо, друг. на мотанге наконецто переделал все нахнах :)

неплохая утилита в бекапе, надеюсь не увидим на что она способна при восстановлении :-! ..

плохо что нет версии для печати !!!

int, а что, фигово выглядит при печати? Я тут посмотрел "предварительный просмотр" в браузере... Если не распечатывать камменты - то нормально выглядит

Creating remote_ftp full_backup: all
Can't login to ftp server.

Хотя с указаными данными в конфиге create_backup.sh легко захожу на ftp:
$cfg_remote_host = "ftp.nextmail.ru:21";
$cfg_remote_login = "zaibizzz@nextmail.ru";
$cfg_remote_path = "/var/backup/fsbackup";
$cfg_remote_password = "*";

чего бы ето?

Единственное что меня смущает - ваш логин. Может надо только "zaibizzz" оставить?

Нет логин именно такой, проверено.Мне кажется что в срипте стоит короткое время ожидание ответа от сервера.А сервер кстати долго разчихляется.Может ето где то можно подправить

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

Тогда еще вопросик.Мне нужно одновременно делать бекап и на локадьную машину, и на ftp. Как ето настроить, чтобы два раза не архивировалось все, а лиш один раз: сначала все забекапило, положоло в локальный каталог, апотом ето же передало по ftp ?

не знаю, я бы после выполнения скрипта сам запускал копирование по ftp/sftp (через свой скрипт)

Я что то не понял.
Что без переписания скрипт mysql_backup оно лить не будет на remote_ftp?

Просто по скрипту видно что оно жмет и на этом exit.=)

Он бекап БД кладет в /usr/local/fsbackup/archive
А потом все в куче отправляет в хранилище
Т.е. да, mysql_backup сам никуда ничего не отправляет, он только делает архив

Все я понял. спасибо.
Просто я указал только те папки которые нужно мне для бэйкапа. просто создал два скрипта один для системы другой для веб сервера.
а нужно было еще добавить /usr/local/fsbackup/archive
просто с начало происходит выполнение скриптов а потом main скрипта так сказать
это я так вдруг у кого то будет подобное=)

вот тут товарищ joni говорил что в папку old пишется только один бэкап. да это так.
мне нужно было тоже самое. для этого я закомментировал 4 строчки и папка OLD чиститься не будет.
строчки 462-465 в файле fsbackup.pl

написал комментарии что вообще эти строки делают


# $ftp->cwd("$cfg_remote_path/OLD"); //переходим в директорию OLD
# foreach $cur_dir ($ftp->ls()){ //ищем любые файлы (цикл)
# $ftp->delete($cur_dir); // удаляем найденный файл
# } //конец цикла

и теперь выставляем:
$cfg_backup_style = "backup";
сохранять копии. число промежуточных бэкапов 1.
если поставить $cfg_backup_style = "full_backup"; у меня получаются имена файлов backup-0.tar.gz тоесть он время не ставить а значит файл будет заменяться.

следующим комментарием найду как сделать что бы при full_backup ставилась дата.

Добрый день,коллеги! Настроил сие чудо,всё отлично работает, но есть проблема не бэкапит ко мне на ftp большое количество данных (120ГБ),точнее бэкапит,но срывается где-то на 25ГБ, в связи с этим начал искать лог программы дабы выяснить причину. Проблема как раз в том что не смог найти лога, где он хранится и создается ли вобще ? Заранее спасибо за ответ!

P.S. в ./var и /usr/local/fsbackup смотрел

Уважаемый Tommy, а вы случаем не разобрались еще с тем как сделать что бы при full_backup ставилась дата?
очень нужно! спасибо.

panser, символ @ нужно экранированть, должно получиться так test\@example.com :) сам только что пробовал, получилось :)

Мишка, а почему от написания собственного скрипта отказался?)

Да наверное не хотел тратить время, в этом и смысл использовать сторонний софт :)

А столько искал способ для бекапа сайтов... так и не нашел оптимальный и простой)), в итоге написал простой скрипт, пока работает норм, вот даже статью напаисал http://www.artcom-ufa.ru/posts/2011/07/12/rezervnoe-kopirovanie-na-veb-servere.

А чего fsbackup не использовал?
И для подобных строк:

tar cpzf $BU_WWW_DIR\-saturn.tgz /www/saturn/ >/dev/null 2>&1 

надо использовать словари или кортежи/списки

ну тебе, как python программисту легко говорить ;-)

Creating full backup of all MySQL databases.
mysqldump: ambiguous option '--all' (all-databases, allow-keywords)
mysqldump: ambiguous option '--all' (all-databases, allow-keywords)
Creating remote_ftp backup: server1
Current increment number: 0
FTP error, Can't GET .hash
....ng /usr/local/fsbackup
done
....ng /var/db/pkg
done
....ng /usr/src/sys/i386/conf
done
....ng /etc
done
....ng /var/cron/tabs
done
....ng /var/spool/cron
done
....ng /usr/local/etc
done
....ng /usr/local/bin
done
....ng /usr/local/include
done
....ng /usr/local/lib
done
....ng /usr/local/libdata
done
....ng /usr/local/libexec
done
....ng /usr/local/sbin
done
....ng /usr/local/share
done
....ng /usr/local/etc/nginx
done
....ng /usr/local/etc/apache22
done
....ng /usr/local/www
done
....ng /usr/local/mysql/bin
done
....ng /usr/local/mysql/include
done
....ng /usr/local/mysql/lib
done
....ng /usr/local/mysql/libexec
done
....ng /usr/local/mysql/var/mysql
done
WARNING: Nothing to backup.

вот такая фигня. 3 тий день мучаюсь. помогите. OC FreeBSD 9.1

Какие версии ПО стоят? Выполните:

pkg_info |grep -iE "fsbackup|mysql"

fsbackup-1.2.1_1 File system backup and synchronization utility
mysql-client-5.5.31 Multithreaded SQL database (client)
mysql-server-5.5.31 Multithreaded SQL database (server)
php53-mysql-5.3.24 The mysql shared extension for php
php53-mysqli-5.3.24 The mysqli shared extension for php
php53-pdo_mysql-5.3.24 The pdo_mysql shared extension for php
phpMyAdmin-4.0.0 A set of PHP-sсripts to manage MySQL over the web

проблему с созданием архивов решил. а вот mysqldump: ambiguous option '--all' (all-databases, allow-keywords)
mysqldump: ambiguous option '--all' (all-databases, allow-keywords)

осталась. помогите

Исправьте файл mysql_backup.sh, там есть секция:

if [ "_$backup_method" = "_full" ]; then
    echo "Creating full backup of all MySQL databases."
    ${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
    ${backup_progdump_path}mysqldump --all-databases --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz
    exit
fi

Так вот, уберит "--all", так как эта опция не валидна. И так по всему файлу.

if [ "_$backup_method" = "_full" ]; then
echo "Creating full backup of all MySQL databases."
${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
${backup_progdump_path}mysqldump -databases --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz
exit
fi

так правильно?

create_backup.sh: ./sсripts/mysql_backup.sh: not found
Creating remote_ftp backup: server1
Current increment number: 1

backup_name="slimserver1"
backup_method="full"
backup_db_list="aspseek trash:cache_table1 trash:cache_table2 mnogosearch"
backup_mysqluser="мой логин"
backup_mysqlpassword="мой пароль"
backup_path="/usr/local/fsbackup/sys_backup"
backup_progdump_path="/usr/local/bin"
extra_mysqldump_flag="--complete-insert"

if [ -n "$backup_progdump_path" ]; then
backup_progdump_path="$backup_progdump_path/"
fi

if [ "_$backup_method" = "_full" ]; then
echo "Creating full backup of all MySQL databases."
${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
${backup_progdump_path}mysqldump -databases --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz
exit
fi

if [ "_$backup_method" = "_full" ]; then
echo "Creating full backup of all MySQL databases."
${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
${backup_progdump_path}mysqldump -databases --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz
exit
fi

if [ "_$backup_method" = "_notdb" ]; then
echo "Creating full backup of all MySQL databases except databases $backup_db_list."
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
cat /dev/null > $backup_path/$backup_name-mysql

for cur_db in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser| tr -d ' |'|grep -v -E '^Databases$|^\+\-\-\-'`; do

grep_flag=`echo " $backup_db_list"| grep " $cur_db:"`
if [ -n "$grep_flag" ]; then

    for cur_db_table in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db| tr -d ' |'|grep -v -E '^Tables$|^Database\:|^\+\-\-\-'`; do

    flag=1
    for cur_ignore in $backup_db_list; do
        if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then
        flag=0
        fi
        done

    if [ $flag -gt 0 ]; then
        echo "Dumping $cur_db:$cur_db_table..."
        ${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db $cur_db_table >> $backup_path/$backup_name-mysql

    else
        echo "Skiping $cur_db:$cur_db_table..."
    fi
    done
else

    flag=1
    for cur_ignore in $backup_db_list; do
    if [ "_$cur_ignore" = "_$cur_db" ]; then
        flag=0
    fi
    done

    if [ $flag -gt 0 ]; then
    echo "Dumping $cur_db..."
    ${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql
    else
    echo "Skiping $cur_db..."
    fi
fi
done
gzip -f $backup_path/$backup_name-mysql
exit

fi

echo "Configuration error. Not valid parameters in backup_method or backup_sqltype."

что нужно поправить?

Оставьте свой комментарий

Markdown