Вот полная информация о скрипте, как это сделать для postgres.
Создание резервного пользователя
Скрипты предполагают существование пользователя с именем 'backup', который имеет доступ ко всем (суперпользователю) или конкретной базе данных. Учетные данные хранятся в файле .pgpass в домашнем каталоге. Этот файл выглядит следующим образом (предполагается, что пароль «секретный»).
~ / .pgpass
*:*:*:backup:secret
Убедитесь, что вы установили правильную защиту на .pgpass, иначе она будет проигнорирована
chmod 0600 ~/.pgpass
Резервное копирование одной базы данных
Выводит конкретную базу данных.
backup.sh
pg_dump dbname -U backup > backup.sql
git add .
git commit -m "backup"
git push origin master
Примечание: вы, вероятно, не хотите использовать какие-либо опции разделения файлов для дампа БД, поскольку любая вставка / удаление вызовет эффект 'домино' и изменит все файлы, создавая больше дельт / изменений в git.
Резервное копирование всех баз данных на этом компьютере
Этот скрипт выведет весь кластер базы данных (все базы данных):
pg_dumpall -U backup > backup.sql
git add .
git commit -m "backup"
git push origin master
Примечание: вы, вероятно, не хотите использовать какие-либо опции разделения файлов для дампа БД, поскольку любая вставка / удаление вызовет эффект 'домино' и изменит все файлы, создавая больше дельт / изменений в git.
Запланировать запуск
Последний шаг - добавить это в задание cron. Итак, crontab -e, а затем добавьте что-то вроде следующего (запускается каждый день в полночь)
# m h dom mon dow command
# run postgres backup to git
0 0 * * * /home/ubuntu/backupdbtogit/backup.sh
Восстановление
Если вам нужно восстановить базу данных, вы извлечете версию, которую хотите восстановить, а затем перейдите к pg. (подробнее об этом здесь http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP-RESTORE)
для одной базы данных:
psql dbname < infile
для всего кластера
psql -f infile postgres
Ничего из этого не было особенно сложным, но всегда утомительно искать все части.
Сбой на сервере с ограниченной оперативной памятью
У меня возникла проблема с неудачным завершением работы git. Это произошло из-за того, что git использовал много памяти - несколько коммитов были зарезервированы. Я решил проблему, смонтировав git-репозиторий на своей локальной машине (на которой много оперативной памяти). Я смонтировал диск сервера с помощью sshfs, а затем зафиксировал его с моей рабочей станции. После того, как я это сделал, сервер с низкой памятью возобновил фиксацию без проблем.
Лучшей альтернативой является ограничение использования памяти git во время пакета (из Есть ли способ ограничить объем памяти, который использует "git gc"? ).
git config --global pack.windowMemory "100m"
git config --global pack.packSizeLimit "100m"
git config --global pack.threads "1"
Примечание: я еще не пытался установить ограничение памяти, так как у меня больше не было проблемы сбоя push.