Помогите собрать код резервного копирования на bash

Автор Tesla, 07 февраля 2015, 22:50:30

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Tesla

Добрый вечер!
Помогите пожалуйста собрать код резервного копирования на bash.

Логика:
1. Делаем dump базы данных
2. Через tar упаковываем файлы сайта
3. Эти два архива упаковываем в один применяя метод  gzip

Если по частям:
1. mysqldump -uadmin --lock-all-tables databaseName > databaseName.sql
2. tar -cf files.tar /var/www/siteName/
3. tar -czf backUp.tag.gz databaseName.sql files.tar

В результате в архиве есть: databaseName.sql (база данных, все верно) и архив files.tar, который при розпаковци создает просто файл без без расширения.

Если пропустить второй пункт, а третий пункт сделать так  tar -czf backUp.tag.gz databaseName.sql /var/www/siteName/ - тогда у архиве есть databaseName.sql (база данных, все верно) и папки /var/www/siteName/ и здесь все файлы (кроме скрытых, например .htaccess).
Вопрос:
1. Почему когда делаю первый вариант то не, так как хотелось и планировалось, делает?
2. Как собрать в архив скрытые файлы?

qupl


mysqldump -uadmin --lock-all-tables databaseName > databaseName.sql
shopt -s dotglob
tar -cf files.tar /var/www/siteName/
tar -czf backUp.tag.gz databaseName.sql files.tar
shopt -u dotglob

Tesla


Leo

#3
shopt — встроенная команда оболочки, управляет опциями. Изменяет значение внутренних конфигурационных параметров оболочки.

и оттуда же:

dotglob — если опция выставлена - bash будет включать в список файлов файлы, начинающиеся с точки ( .bashrc ) в результат glob-а.

Tesla

#4
Объясните пожалуйста зачем она здесь, и что именно она здесь делает

Сообщение объединено: 08 Февраль 2015, 14:03:41

И еще вопрос, когда делаю так:
mysqldump -uadmin --lock-all-tables databaseName > databaseName.sql
gzip -c databaseName.sql > databaseName.gz 

Все работает нормально, а когда так:
# gzip -c $(mysqldump -uadmin --lock-all-tables ouruniverse.biz) > 1.sql
-bash: /bin/gzip: Слишком длинный список аргументов

То видает ошибку, почему? База одна и та же

ogost

Цитата: Tesla от 08 февраля 2015, 14:00:04Объясните пожалуйста зачем она здесь, и что именно она здесь делает
Цитата: Leo от 08 февраля 2015, 12:41:05shopt — встроенная команда оболочки, управляет опциями.
dotglob — если опция выставлена - bash будет включать в список файлов файлы, начинающиеся с точки ( .bashrc ) в результат glob-а.
следите за руками:
shopt -s dotglob
дана команда башу обрабатывать все файлы, включая и скрытые (как вы и хотели).
далее произведя нужные действия:
shopt -u dotglob
здесь возвращаем первоначальное значение, то бишь не обрабатывать скрытые файлы. Не знаю как понятней объяснить, гугл у вас работает? ну или яндекс на крайняк?

во втором вопросе вы пытаетесь скормить gzip-у весь дамп не в виде файла, а в виде каши, которую выдаст mysqldump (вы же не указали в скобках в какой файл писать дамп), которую gzip принимает за аргументы. поэтому и вЫдает ошибку.

Tesla

Извините, действительно что-то не подумал поискать.
Спасибо, Вы понятно объяснили.

Га счет второго вопроса верно будет это выполнить так mysqldump -uadmin --lock-all-tables databaseName | gzip -c > backUp.sql.gz ?

ogost

усложняете себе жизнь.
что мешает в две команды выполнить указанный бэкап?

Tesla

При упаковке в архиве лежат папки с путем  /var/www/siteName/, подскажите как сделать так чтобы в архиве были только файлы в папки siteName ?

Сообщение объединено: 08 февраля 2015, 17:24:20

Цитата: ogost от 08 февраля 2015, 17:23:45
усложняете себе жизнь.
что мешает в две команды выполнить указанный бэкап?
Подскажите как


Tesla

Объясните пожалуйста что такое "gzip -9", то что в скобках, я так понимаю нужно подставить свои название и значения ? Если я верно понял то этот код делает dump базы данных и сохраняет в архив. Но это я уже знаю как сделать

Leo

#11
-9 - наилучшая степень сжатия, можно опустить...

Цитата: Tesla от 08 февраля 2015, 17:24:00При упаковке в архиве лежат папки с путем  /var/www/siteName/, подскажите как сделать так чтобы в архиве были только файлы в папки siteName ?

использовать tar опцию

     -C, --directory DIR
           change to directory DIR


либо сначала использовать cd, а затем tar
cd /var/www/siteName

ogost

приведу скрипт бэкапа, которым пользуюсь я:
#!/bin/bash
#
# Directory where logs are kept:
LOGBASE=/root/backup/log

# Directories to backup
BACKUP_ROOT_DIR="srv/samba home/vmail"

# Get todays day name, eg Mon, Tue and so on
NOW=$(date +"%a")

# Tape device name
TAPE="/dev/st0"

# Exclude file
TAR_ARGS=""
EXCLUDE_CONF="/root/backup.exclude.conf"

#Backup logfile
LOGFILE=$LOGBASE/$NOW.backup.log

# Path to binaries
TAR=/bin/tar
MT=/bin/mt
MKDIR=/bin/mkdir

# ------------------------------------------------------------------------
# Excluding files when using tar
# Create a file called $EXCLUDE_CONF using a text editor
# Add files matching patterns such as follows (regex allowed):
# home/vivek/iso
# home/vivek/*.cpp~
# ------------------------------------------------------------------------
[ -f $EXCLUDE_CONF ] && TAR_ARGS="-X $EXCLUDE_CONF"

##### Different backup methods
# Make full backup
full_backup(){
local old=$(pwd)
cd /
$TAR $TAR_ARGS -cvpf $TAPE $BACKUP_ROOT_DIR
$MT -f $TAPE rewind
$MT -f $TAPE offline
cd $old
}

# Make partial backup
partial_backup(){
local old=$(pwd)
cd /
$TAR $TAR_ARGS -cvpf $TAPE -N "$(date -d '2 days ago')" $BACKUP_ROOT_DIR
$MT -f $TAPE rewind
$MT -f $TAPE offline
cd $old
}

# Make sure all dirs exists
verify_backup_dirs(){
local s=0
for d in $BACKUP_ROOT_DIR
do
if [ ! -d /$d ];
then
echo "Error : /$d directory does not exists"
s=1
fi
done
# if not; just die
[ $s -eq 1 ] && exit 1
}

#### Main logic ####

# Make sure log dir exists
[ ! -d $LOGBASE ] && $MKDIR -p $LOGBASE

# Verify dirs
verify_backup_dirs

# Actual backup starts here
# Fullbackup on weekends
# Partial backup on Mon, Wed, Fri
case $NOW in
Sun) full_backup;;
Mon|Tue|Wed|Thu|Fri) partial_backup;;
*) ;;
esac > $LOGFILE 2>&1

нашел его в интернетах и пользуюсь фактически в неизменном виде. разве что здесь бэкап записывается на пленку (/dev/st0 и /bin/mt), а вам наверняка этого не нужно.
я думаю, с минимальными изменениями вы сможете адаптировать его под свои нужды.

Tesla

Цитата: Leo от 08 февраля 2015, 19:23:27
-9 - наилучшая степень сжатия, можно опустить...

Цитата: Tesla от 08 февраля 2015, 17:24:00При упаковке в архиве лежат папки с путем  /var/www/siteName/, подскажите как сделать так чтобы в архиве были только файлы в папки siteName ?

использовать tar опцию

     -C, --directory DIR
           change to directory DIR


либо сначала использовать cd, а затем tar
cd /var/www/siteName


С переходом в конкретную папку понятно.

На счет
" -C, --directory DIR
change to directory DIR"
Напишите пожалуйста в контексте кода

Leo

Цитата: Tesla от 08 февраля 2015, 19:57:47Напишите пожалуйста в контексте кода
вероятно tar -C /var/www/siteName -czf backUp.tag.gz databaseName.sql files.tar или как там у вас...