Linux для всех

индекс
247,20

Не можешь найти то, что нужно? Сделай сам

Так получилось, что мне было необходимо настроить резервное копирование баз данных MySQL и PostgreSQL. Хотелось вполне определенного, а именно:
  • Простота решения
  • Каждая БД в отдельном файле
  • Имя в формате «bdname.YYYY-MM-DD-HH:mm:ss.sql.gz»
  • Для каждой БД хранится определенное число архивов
  • Набор архивов БД находится в ротации
  • Решение определенных проблем с указанием пароля для pg_dump
  • и т.п.
Готовых скриптов я в сети не нашел, но подобрал и объединил несколько решений, получив искомое.

Общий алгоритм скриптов таков, что выбирается список баз данных, и по нему сохраняются архивы. Устаревшие удаляются. В скриптах имеется возможность и необходимость настройки: указание количества копий архива для ротации, логин/пароль для СУБД и папка для хранения результатов работы.

MySQL:
#!/bin/bash

# user & password
USER=root
PASS=pass

# number of backups to be saved
KEEP=14

# dir to backup
DIR=/var/backups/mysql

NOW=$(date +"%Y-%m-%d")
DBS="$(mysql -u $USER -p$PASS -Bse 'show databases')"

for db in $DBS
do

  BACKUPS=`find $DIR -name "$db.*.gz" | wc -l | sed 's/\ //g'`
  while [ $BACKUPS -ge $KEEP ]
  do
    ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
    BACKUPS=`expr $BACKUPS - 1`
  done
  
  FILE=$DIR/$db.$NOW-$(date +"%T").sql.gz
  mysqldump -u $USER -p$PASS $db | gzip -9 > $FILE

done

exit 0


* This source code was highlighted with Source Code Highlighter.

С PostgreSQL я долго возился по причине того, что никак не мог передать пароль, но решение нашлось.

PostgreSQL:
#!/bin/bash

# user & password
USER=postgres
PASS=pass

# number of backups to be saved
KEEP=14

# dir to backup
DIR=/var/backups/pgsql

PGPASSWORD=$PASS
export PGPASSWORD

NOW=$(date +"%Y-%m-%d")
DBS="$(psql -U $USER -lt |awk '{ print $1}' |grep -vE '^-|^List|^Name|template[0|1]')"

for db in $DBS
do

  BACKUPS=`find $DIR -name "$db.*.gz" | wc -l | sed 's/\ //g'`
  while [ $BACKUPS -ge $KEEP ]
  do
    ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
    BACKUPS=`expr $BACKUPS - 1`
  done
  
  FILE=$DIR/$db.$NOW-$(date +"%T").sql.gz

  pg_dump -U $USER $db | gzip -c > $FILE

done

PGPASSWORD=
export PGPASSWORD

exit 0


* This source code was highlighted with Source Code Highlighter.

Эти замечательные скрипты давно и успешно работают на машинке под управлением Debian. Просто добавь воды в крон.
+18
28 января 2010, 01:57
66

комментарии (14)

+5
dymdym #
github.com/astrails/safe

Вот универсальное решение для быстрого создания бекапов
+2
develop7 #
Кстати, заголовок топика с минимальными исправлениями вполне годится на роль девиза:
Не можешь найти то, что нужно? Сделай, @#$%, сам!
0
alexeym #
вот может кому-то ещё такое в жизни пригодится
dmesg.org.ua/2009/12/mysql-backup/
+1
pwlnw #
Плохой скрипт. Там важно добавить FLUSH TABLES WITH READ LOCK, потом сделать снапшот, а потом UNLOCK TABLES и только потом копировать. Иначе однажды получите разрушенные таблицы.
Но и этот автор тоже поленился поискать.
0
alexeym #
век живи — век учись
спасибо за подсказку
0
sapun #
–1
pwlnw #
Не можешь найти решение свои тривиальных потребностей? — Ищи, а не засирай общий блог.
Вот первом же комментарии вам и нашли.
0
Chumicheff #
Вообще это девиз *nix-ов. Главное, что всегда есть альтернатива.
+1
Vooon #
Я бы заменил gzip на lzma -1
0
or10n #
для полноценности желательно сделать массив с исключениями (т.е. с таблицамим бекап которых роедко нужен, например information_schema)
еще когда делал похожий скрипт появилась мысль, удалять не все старые, на пример каждые 6/7 последних. т.е. мы делаем бекапы каждую ночь, и храним за последнию неделю все, а за предыдущие по одному на неделю. но что то както забылось это :(
0
DorBer #
Я дополнительно делаю полный бекап сайта с файлами и с базой раз в месяц.
0
soloweb #
# export PGPASSWORD

Это нехорошее решение!!!

Резервное копирование занимает некоторое время в течении которого можно перехватить пароль пользователя PostgreSQL!!!
Альтернетивное решение данной проблемы — разрешить доступ без пароля с определенного ip адреса средствами PostgreSQL.

Вот так и взламываются серверы потом :-)
0
DorBer #
Согласен, это хорошее решение.
0
ITLav #
Такие скрипты давно реализованы в рамках backupninja, там можно задать создание дампов и их инкрементный бэкап. Для последнего используется rdiff-backup.

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