Автор Ангел Куликов | Рубрики Archевод, Bash-скриптинг, Интернет, Программирование | Опубликовано 23-07-2011
Web-сервера — дело ненадёжное. Сайты часто взламывают, засоряют скриптами с последующим уничтожением/повреждением информации. В большинстве случаев у хостера есть возможность создавать бекапы сайта, но если ваш хостинг не даёт вам возможности создавать бекап — можно эту возможность сделать самому.. Скрипт, который я вам покажу — будет полезен многим, ведь когда у вас есть локальная копия, в смысле у себя на машине (компьютер, ноутбук, свой сервер) .. Зачастую так безопаснее и, как говорится, можно спокойно спать. Ну а теперь, разобравшись с проблемой, начнём со скрипта:
Вот он, собственно:
#!/bin/bash
MyUSER="пользователь базы данных" # USERNAME
MyPASS="пароль для базы данных" # PASSWORD
MyHOST="хост для базы данных" # Hostname
FTPHOST="хост ftp"
FTPUSER="пользователь ftp"
FTPPASS="пароль к ftp"
# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="sudo $(which mysql) -w --reconnect"
MYSQLDUMP="sudo $(which mysqldump) -v --force --single-transaction --dump-date --create-options --quick --extended-insert --debug-info --debug-check --skip-lock-tables --set-charset --allow-keywords --max-allowed-packet=64M"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
# Backup Dest directory, change this if you have someother location
DEST="путь к месту синхронизации"
# Main directory where backup will be stored
MBD="$DEST/mysql/" # Здесь сохраняются бекапы для базы данных
TMP="$DEST/tmp" # Здесб сохраняются бекапы для фтп
# Get hostname
HOST="$MyHOST"
# Get data in dd-mm-yyyy format
NOW="$(date +"%Y.%m.%d")"
# File to store current backup file
FILE=""
# Store list of databases
DBS=""
# Не синхронизировать эти бд (через запятую..)
IGGY=" information_schema, databases, --------------, show, information_schema"
[ ! -d $MBD ] && mkdir -p $MBD || :
[ ! -d $TMP ] && mkdir -p $TMP || :
[ ! -d "$DEST/ftp/" ] && mkdir -p "$DEST/ftp/" || :
# Only root can access it!
$CHOWN -hR $DEST
$CHMOD 0644 $DEST
# Get all database list first
DBS="$($MYSQL --user=$MyUSER --host=$MyHOST --password=$MyPASS -Bse 'show databases')"
for db in $DBS
do
skipdb=-1
if [ "$IGGY" != "" ];
then
for i in $IGGY
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$TMP/$db.$MyHOST.$NOW.$(date +%s).gz"
# do all inone job in pipe,
# connect to mysql using mysqldump for select mysql database
# and pipe it out to gz file in backup dir
$MYSQLDUMP --user=$MyUSER --host=$MyHOST --password=$MyPASS $db | $GZIP -9 > $FILE
fi
done
CT=$NOW.$(date +%s);
tar -C $TMP/ -czpvf - . | cat > $TMP/../db_backup_$CT.tgz
rm -r $TMP/* --interactive=never
mv $TMP/../db_backup_$CT.tgz $MBD/
rm -r $TMP
progressfilt ()
{
local flag=false c count cr=$'\r' nl=$'\n'
while IFS='' read -d '' -rn 1 c
do
if $flag
then
printf '%c' "$c"
else
if [[ $c != $cr && $c != $nl ]]
then
count=0
else
((count++))
if ((count > 1))
then
flag=true
fi
fi
fi
done
}
cd $DEST
wget --progress=bar:force -m --no-passive-ftp --ftp-user=$FTPUSER --ftp-password=$FTPPASS ftp://$FTPHOST -c 2>&1 | progressfilt
tar -C $DEST/$FTPHOST/ -czpvf - . | cat > $DEST/ftp_backup_$CT.tgz | mv $DEST/ftp_backup_$CT.tgz "$DEST/ftp/"
rm -r $DEST/$FTPHOST/
Надеюсь, вам пригодится данный скрипт. Себе же я поставил его на так называемый «сервер». В CRONTAB выставляем следующее:
@daily /путь/к/скрипту/<имя скрипта>
Таким образом синхронизация (создание локального бекапа) будет проводится ежедневно в 00:00.
С ув. Ангел Куликов
[...] ранее писал об этой проблеме. Знания были не высоки, [...]