Рубрики
backup \ crontab \ tar \ zip \ архивация \ архиваторы

Резервное копирование \ backup \ find \ rsync \ dd \ dump \ restore \ tar \ script \ bash \ tar \ mysqldump \ cron \ dd \ ssh

0. Backup site, Mysql and files www

#!/bin/bash
#
#VARS
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc

# BACKUP
cd /root/backup

# Backup mysql
mysqldump --opt -c -e -Q -h$HOST -u$USER -p$PASSWORD $DBNAME > $DBNAME.sql
tar czpf $DUMP_PATH/$DBNAME.$TIMESTAMP.tar.gz $DBNAME.sql
rm -f $DBNAME.sql

# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz /var/www/html/name_site
tar cvzpf $BACK_PATH_ETC/etc.$TIMESTAMP.tar.gz /etc

# Clean DB
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;

# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql

0.1 experements

#!/bin/bash

#VAR
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc

# BACKUP
cd /root/backup
 
# Backup mysql
mysqldump --opt -c -e -Q -h${HOST} -u${USER} -p${PASSWORD} ${DBNAME} > ${DBNAME}.sql
tar czpf ${DUMP_PATH}/${DBNAME}.${TIMESTAMP}.tar.gz ${DBNAME}.sql
rm -f ${DBNAME}.sql
 
# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf ${BACK_PATH}/www.${TIMESTAMP}.tar.gz /var/www/html
tar cvzpf ${BACK_PATH_ETC}/etc.${TIMESTAMP}.tar.gz /etc

# CLEAN FOLDER BACKUP
#!!! выполняем команду ls если выведет больше 2 то выполнится команда  ls /etc/
#if (( `ls /home/ | wc -l` > 2)); then true ; else false ; fi && ls /etc/
# find /var/backup/www -name "*.tar.gz" -mtime +30 -delete - найти все файлы старше 30 дней и удалить
##### old cleaner
##for i in ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}; do
##     if (( `ls ${i} | wc -l` > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
##done
# Cleaner new
delfiles(){
for i in $1 $2 $3 $4 $5 $6; do
        calc=$(ls ${i} | wc -l) 
        if ((${calc} > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
done
}
delfiles ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}



#HINT
# SYSTEMCTL
# systemctl status wp-backup.service
# systemctl status wp-backup.timer
# Clean DB erase
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;
# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql
# RSYNC to remote server
# sync -avz /root/backup-wp user@YOU-server-IP-DNS:/home/user/backup-wp

0.2 Systemd + скрипт для бэкапа


0. Создаем каталоги:
mkdir -p /root/backup/{etc,www,sql}
1. Создаем скрипт для бэкапа и вносим изменения для переменных
cat > /root/backup/backup.sh << "EOF"
----------------------------
#!/bin/bash
#VAR
TIMESTAMP=`date +%m-%d-%y-%H%M`
HOST=localhost
DBNAME="dbname"
USER="dbuser"
PASSWORD="dbPassw0rd"
DUMP_PATH=/root/backup/sql
BACK_PATH=/root/backup/www
BACK_PATH_ETC=/root/backup/etc

# BACKUP
cd /root/backup
 
# Backup mysql
mysqldump --opt -c -e -Q -h${HOST} -u${USER} -p${PASSWORD} ${DBNAME} > ${DBNAME}.sql
tar czpf ${DUMP_PATH}/${DBNAME}.${TIMESTAMP}.tar.gz ${DBNAME}.sql
rm -f ${DBNAME}.sql
 
# Backing up files
#tar cvzpf $BACK_PATH/www.$TIMESTAMP.tar.gz --same-owner  --exclude=/var/www/site/gruzims/* /var/www
tar cvzpf ${BACK_PATH}/www.${TIMESTAMP}.tar.gz /var/www/html
tar cvzpf ${BACK_PATH_ETC}/etc.${TIMESTAMP}.tar.gz /etc

# CLEAN FOLDER BACKUP
# выполняем только если файлов в каталогах для бекапа больше двух 
delfiles(){
for i in $1 $2 $3 $4 $5 $6; do
        calc=$(ls ${i} | wc -l) 
        if ((${calc} > 2)); then true ; else false ; fi && find ${i} -name "*.tar.gz" -mtime +15 -delete
done
}
delfiles ${DUMP_PATH} ${BACK_PATH} ${BACK_PATH_ETC}
EOF


2. Создаем сервис в systemd
cat > /etc/systemd/system/backup-wp.service << "EOF"
[Unit]
Description=backup
 
[Service]
Type=oneshot
ExecStart=/root/backup/backup.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
EOF

3. Создаем таймер в systemd для будем бэкапить в 2 часа ночи
cat > /etc/systemd/system/backup.timer << "EOF"
[Unit]
Description=backup
 
[Timer]
OnCalendar=02:00:00
 
[Install]
WantedBy=timers.target
EOF

4. Активируем сервисы для бекапа
systemctl daemon-reload
systemctl enable backup-wp.service
systemctl enable backup-wp.timer 
systemctl status backup-wp.service
systemctl status backup-wp.timer 
systemctl list-timers backup-wp.timer 

5. Может пригодится:
#HINT
# SYSTEMCTL
# systemctl status backup-wp.service
# systemctl status backup-wp.timer
# Clean DB erase
# mysqldump -uuser -ppassword --add-drop-table --no-data databasename | grep ^DROP | mysql -uuser -ppassword databasename
# Clean not work
# drop databases mydatabasedump.sql;
# create databases mydatabasedump.sql;
# RESTORE
# mysql -u root -p -f mydatabase < /home/myname/mydatabasedump.sql
# RSYNC to remote server
# sync -avz /root/backup-wp user@YOU-server-IP-DNS:/home/user/backup-wp


1. BackUp MySQL

#!/bin/sh
mkdir -p ${BKPDIR}/MySQL 2>/dev/null
mysqldump --databases -uUSER -pDLINNIYPASSWORD mysql| gzip -f -9 - >"${BKPDIR}/MySQL/${DATEYMD}-mysql-MySQL.gzip"
mysqldump --databases -uUSER -pESCHEODINPASSWORD phpmyadmin| gzip -f -9 - >"${BKPDIR}/MySQL/${DATEYMD}-phpmyadmin-MySQL.gzip"

2. BackUp PostgreSQL

#!/bin/sh
mkdir -p ${BKPDIR}/PostgreSQL 2>/dev/null
(su - postgres -c "pg_dump postgres" <"${BKPDIR}/PostgreSQL/${DATEYMD}-postgres-PostgreSQL.gzip"
TUT_NUZNO_PISAT_PASSWORD_DLYA_BAZY
EOF

3. BackUp MBR

#!/bin/sh
mkdir -p ${BKPDIR}/MBR 2>/dev/null
dd if=/dev/sda of="${BKPDIR}/MBR/${DATEYMD}-sda-mbr.bin" bs=512 count=1

Для восстановления всей MBR надо запустить
dd if=sda-mbr.bin of=/dev/sdX bs=1

Для восстановления таблицы разделов нужно использовать
dd if= sda-mbr.bin of=/dev/sdX bs=1 count=64 skip=446 seek=446

Для восстановления только загрузчика запустите
dd if=sda-mbr.bin of=/dev/sdX bs=1 count=446

Показывать прогресс
dd status=progress if=NMA_YOU_IMAGE.img of=/dev/sdX

4. BackUp копирования файлов по маске

#!/bin/sh
find /www -name '*.php' -or -name '*.js' -or -name '*.pl' -or -name '*.ephtml' -or -name '.htaccess' -or -name 'htpasswd' -or -name 'htgroup'>${SCRIPTDIR}/www.bkp
cat ${SCRIPTDIR}/${MAPFILE}|grep "www">/dev/null
if [ "$?" -eq 1 ]; then echo "">>${SCRIPTDIR}/${MAPFILE}; echo www>>${SCRIPTDIR}/${MAPFILE}; fi

5. BackUp system easy (tar)

без даты
tar cvzpf /home/Backup.tgz --same-owner --exclude=/home/Backup.tgz --exclude=/home/error.log --exclude=/proc/* --exclude=/media/* --exclude=/dev/* --exclude=/mnt/* --exclude=/sys/* --exclude=/tmp/* / 2>/home/error.log

с датой
tar cvzpf /home/Backup_`date +%y_%m_%d`.tgz --same-owner --exclude=/home/Backup.tgz --exclude=/home/error.log --exclude=/proc/* --exclude=/media/* --exclude=/dev/* --exclude=/mnt/* --exclude=/sys/* --exclude=/tmp/* / 2>/home/error_`date +%y_%m_%d`.log

восстановление
tar xvzf /home/Backup.tgz -C /

6. ssh \ ssh-keygen \ ssh-copy

Создать пользователя "USRER_NAME" с домашним каталогом "/backup/USRER_CATALOG_BACKUP": 
adduser --home /backup/USRER_CATALOG_BACKUP --disabled-password borg USRER_NAME
Подключится пользователем 
sudo -i -u USRER_NAME

ssh - поддержка авторизация без пароля с помощью RSA ключей

Выполнять на клиенте с которого будем подключатся к серверу.
ssh-keygen - создаем пару ключей на сервере с которого будем подключатся.
ssh-copy-id sammy@IP_адрес_вашего_сервера - копирование открытого ключа

На сервере куда будем класть бэкапы, пользователю в домашнем каталоге добавляем публичные ключи:
.ssh/authorized_keys

Если нет каталога .ssh можно его создать
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

7. find

find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 - поиск всех файлов, заканчивающихся на ".log" в директории /var/log, и упаковка их в bzip-архив

find /home/user -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents - поиск в директории /home/user файлов, имена которых оканчиваются на ".txt", и копирование их в другую директорию

find /var/backup/www -name "*.tar.gz" -mtime +30 |xargs /bin/rm -f {}; - найти все файлы старше 30 дней и удалить

find /var/backup/www -name "*.tar.gz" -mtime +30 -delete - найти все файлы старше 30 дней и удалить

8. rsync

rsync [опции] источник [приемник]

rsync ключи:
-p  сохранить разрешения
-A  сохранить ACL
-a  режим архива
-v  подробный режим
-z  сжать данные файла во время передачи
--exclude={'dir_name','file_name'} исключаем каталоги dir_name и файлы file_name
--rsync-path="sudo rsync" подымаем rsync права до root
--bwlimit=2048 ограничить скорость передачи

rsync -avzpA --exclude={'proc','dev','lost+found','tmp','run','sys'} --rsync-path="sudo rsync" Имя_хоста_которыйбэкапим:/ /куда.бэкапим



rsync -a /dir1/dir2 /dir3 - будет создана иерархия /dir3/dir2/файлы
rsync -a /dir1/dir2/ /dir3 - будет создана иерархия /dir3/файлы
rsync -a $srv/ $srv:src
rsync -av --delete -e /dir/откуда/ /dir/куда/ - зеркалирование (v-вывод действий)
 
rsync -avz --rsync-path="sudo rsync" user@host:/tmp/file /tmp - копируем user@host:/tmp/file в каталог /tmp, а параметр "sudo rsync" позволит выполнить от root (пользователь user должен быть в sudo)
 
rsync --rsync-path="echo  | sudo -Sv && sudo rsync" --archive --acls --xattrs --one-file-system -e "ssh -T -c arcfour -o Compression=no -x" --exclude=".*" --size-only --log-file=/home/backup/rsync.log  

!!! Если удалять файлы, исчезнувшие в исходном каталоге, но присутствующие в целевом, не нужно — ключ --delete убрать.
rsync -rogpav --delete /home /tmp - синхронизировать директории /tmp и /home
rsync -az -e ssh --delete ip_addr:/home/public /home/local - синхронизировать локальную и удаленную директории через ssh туннель используя сжатие
rsync -rogpav -e ssh --delete /home ip_address:/tmp - синхронизация через SSH туннель
rsync -az -e ssh --delete /home/local ip_addr:/home/public - синхронизировать удалённую директорию с локальной используя ssh туннель со сжатием

cсинхронизация каталогов ssh+rsync:
rsync -avz --delete -e ssh логин@удалённый.хост:путь/откуда/ путь/куда   - изменяется удалённый каталог, копируем его на локальную машину
rsync -avz --delete -e ssh путь/откуда/ логин@удалённый.хост:путь/куда   - изменяется локальный каталог, копируем его на удаленную машину


9. dd

dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' - создать "слепок" локального диска в файл на удалённом сервере используя ssh туннель
dd if=/dev/hda of=/dev/fd0 bs=512 count=1 - создание копии MBR ( Master Boot Record ) с /dev/hda на флоппи-диск
dd if=/dev/sda of=/tmp/backup - создание резервной копии содержимого жесткого диска в файл backup
dd if=/dev/fd0 of=/dev/hda bs=512 count=1 - восстановить MBR с флоппи-диска на /dev/hda

9.1 dd \ как узнать о ходе выполнения процесса

!!! на случай если не указали ключик status=progress 
Как узнать о ходе процесса копирования командой dd?
1.Для примера: можно заставить dd копировать случайно генерируемые числа 
в "черную дыру" ≈ действие абсолютно бесполезное, зато наглядное.
dd if=/dev/random of=/dev/null bs=1K count=100  ( понадобится второй терминал)
dd if=/dev/random of=/dev/null bs=1K count=100 & ( или запустить в фоне)

2.
Узнаем PID процесса
pgrep -l '^dd$'
pgrep -l dd
ps uax |grep dd

3. Узнаем чем занят процесс
kill -USR1  PID

4. А вот так поставим на наблюдение (каждые 10 сек).
watch -n 10 kill -USR1 PID 

9.1.1 dd \ Показывать прогресс выполнения status=progress:


dd status=progress if=NMA_YOU_IMAGE.img of=/dev/sdX

9.2 dd \ клонирование

 
dd if=/dev/sda of=/dev/sdb bs=16M (if что of куда bs размер блока count сколько раз записывать)
dd if=/dev/sda of=/zxc/mbr.back bs=512 count=1 (backup mbr)
dd if=/zxc/mbr.back of=/dev/sda bs=512 count=1 (восстановления из backup)
______________________________________________________________
Сколько времени осталось
pgrep -l '^dd$'
watch -n 10 kill -USR1 PID 

9.3 dd Производительность дисков

 
time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000 
time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file - Читаем и пишем 1GB в /home (/dev/ad4s3c)
hdparm -tT /dev/hda - протестировать производительность чтения данных с жесткого диска

9.4 dd \ прочитать

10. dump \ restore

dump -0aj -f /tmp/home0.bak /home - создать полную резервную копию директории /home в файл /tmp/home0.bak
dump -1aj -f /tmp/home0.bak /home - создать инкрементную резервную копию директории /home в файл /tmp/home0.bak

restore -if /tmp/home0.bak - восстановить данные из резервной копии /tmp/home0.bak

9.5 dd \ делаем архив

 
umount /dev/hda1
dd if=/dev/hdal | gzip > bootpart.gz

9.6 dd \ читаем сырые данные диска \ вывод команды fdisk -l

dd if=/dev/sda bs=1 skip=446 count=16 | hexdump -C


Порядок байтов:
Порядок от младшего к старшему: англ. little-endian — с малого конца

11. tar

tar cvzpf /home/Backup-etc`date +%y_%m_%d`.tgz /etc 2>/home/error.log - создание архива каталога с временной меткой
tar -cvf archive.tar file1 file2 dir1 - создать tar архив archive.tar, упаковав в него файлы file1, file2 и директорию dir1
tar -cvf archive.tar file - упаковать в tar-архив archive.tar, файл file
tar -cvzf archive.tar.gz dir1 - создать tar архив и сжать его с помощью программы gzip
tar -cvjf archive.tar.bz2 dir1 - создать архив и сжать его с помощью bzip2 ( ключ -j работает не во всех *nix системах )
 
tar -tf archive.tar - вывести содержимое tar архива
tar tfv viruses-2010-05-18.tar.bz2 1>zxcvirus.txt - просмотр архива и запись в файл описания
 
 
 
tar -xvzf archive.tar.gz - разжать tar архив gz и распаковать его
tar -xvjf archive.tar.bz2 - разжать архив bz и распаковать его ( ключ -j работает не во всех *nix системах )
tar -xvf archive.tar - распаковать tar архив в текущей директории ( в принципе указывать метод сжатия не обязательно, tar сам разберется) 
tar -xvf archive.tar -C /tmp - распаковать архив в /tmp


tar -Puf backup.tar /home/user - создать инкрементную резервную копию директории /home/user в файл backup.tar сохраняя права доступа

( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' - упаковка в архив и копирование содержимого /tmp/local в директорию /home/share/ удалённого сервера, используя ssh туннель

( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' - упаковка в архив и копирование содержимого /home в директорию /home/backup-home удалённого сервера, используя ssh туннель

tar cf - . | (cd /tmp/backup ; tar xf - ) - упаковка в архив и копирование одной директории в другую с сохранением прав доступа и ссылок


11. SSH + TAR

#!/bin/sh
CMD="/bin/tar"
RCMD="ssh b14esh@linux"
DIRS="zxc3/"
DIRSN="zxc3"
DATEYMD=`date "+%Y-%m-%dv%k-%M"`
HOSTN=`hostname`
echo Backup $DIRSN $DATEYMD
cd /home/b14esh; $CMD -cjf - $DIRS | $RCMD "cat > $HOSTN.$DIRSN.$DATEYMD.tbz"

12. borg

borgbackup / backup / borg debian 10 / без шифрования репозитория

12. rsnapshot

rsnapshot - создание  снимков системы и файлов (backup)
apt-get install rssnapshot sshfs - установка