Как сделать резервную копию моей базы данных PostgreSQL с помощью Cron? - PullRequest
15 голосов
/ 12 мая 2009

Я могу отлично запускать такие команды, как вакуумные базы данных, pg_dump и psql, если буду вводить их так:

/usr/bin/sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/prevac.gz
/usr/bin/sudo -u postgres /usr/bin/vacuumdb --analyze mydatabase
/usr/bin/sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/postvac.gz
SCHEMA_BACKUP="/opt/postgresql/$(date +%w).db.schema"
sudo -u postgres /usr/bin/pg_dump -C -s mydatabase > $SCHEMA_BACKUP

Они запускаются в командной строке на Redhat, когда у меня есть sudo для root, а затем, как вы видите в приведенных выше командах, я делаю sudo -u для postgres.

Но когда я пытаюсь извлечь это из cron, Я получаю ноль байт во всех файлах - это значит, что он не работает должным образом. И я не понимаю в журналах, что Я вижу.

В моем файле / etc / crontab эта запись находится внизу

00 23 * * * root /etc/db_backup.cron

И да, /etc/db_backup.cron - это chmod ug + x, принадлежащий root, а в верхней части файла написано "#! / Bin / bash" (минус двойные кавычки).

Кто-нибудь знает, что дает?

Ответы [ 8 ]

13 голосов
/ 06 июня 2009

У меня есть динамический bash-скрипт, который выполняет резервное копирование всех баз данных на сервере. Он получает список всех баз данных и затем пылесосит каждую БД перед выполнением резервного копирования. Все журналы записываются в файл, а затем этот журнал отправляется мне по электронной почте. Это то, что вы можете использовать, если хотите.

Скопируйте приведенный ниже код в файл и добавьте файл в ваш crontab. Я настроил свой pg_hba.conf для доверия локальным соединениям.

#!/bin/bash
logfile="/backup/pgsql.log"
backup_dir="/backup"
touch $logfile
databases=`psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}`

echo "Starting backup of databases " >> $logfile
for i in $databases; do
        dateinfo=`date '+%Y-%m-%d %H:%M:%S'`
        timeslot=`date '+%Y%m%d%H%M'`
        /usr/bin/vacuumdb -z -h localhost -U postgres $i >/dev/null 2>&1
        /usr/bin/pg_dump -U postgres -i -F c -b $i -h 127.0.0.1 -f $backup_dir/$i-database-$timeslot.backup
        echo "Backup and Vacuum complete on $dateinfo for database: $i " >> $logfile
done
echo "Done backup of databases " >> $logfile

tail -15 /backup/pgsql.log | mailx youremail@domain.com
11 голосов
/ 12 мая 2009

Так как у вас все равно есть права суперпользователя, вы можете поместить эти команды в crontab пользователя postgres следующим образом:

sudo su postgres
crontab -e

и затем поместите туда команды pg_dump /uumdd.

6 голосов
/ 02 февраля 2016

Я установил свой хрон так. Каждые 59 минут с понедельника по пятницу

*/59 * * * 1-5 sh /home/my_user/scripts/back_my_bd.sh 

Сценарий для запуска резервного копирования находится внутри back_my_bd.sh файла и его содержимое:

pg_dump -U USERDATABASE DATABASENAME > /home/my_user/sql/mybackup.sql

И я создал файл .pgpass в домашнем каталоге, чтобы разрешить резервное копирование без указания пользователя и пароля

localhost:5432:DATABASENAME:USER:PASSWORD

Извините, мой английский не очень хорош!

4 голосов
/ 12 мая 2009

Возможно, переменная окружения не задана в cron.

В обычном сеансе вы, вероятно, определили следующие переменные:

PG_PORT
PG_HOST
PG_DATABASE
PG_USERNAME
PG_PASSWORD

Добавьте "env" в ваш скрипт.

1 голос
/ 19 июня 2011

в вашем файле pg_hba.conf для вашего пользователя postgres вы, вероятно, имеете «идент аутентификацию». Опция "-u postgres" не срабатывает, если это так. либо измените пользователя на postgres в вашем скрипте резервного копирования, либо настройте другой метод аутентификации.

0 голосов
/ 05 апреля 2013

Другая версия для получения списка баз данных:
psql -lqt | grep -vE '^ +(template[0-9]+|postgres)? *\|' | cut -d'|' -f1| sed -e 's/ //g' -e '/^$/d'

Как мой psql -lqt вывод:

 abcdefghij         | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres           | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0          | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                    |          |          |             |             | postgres=CTc/postgres
 template1          | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                    |          |          |             |             | postgres=CTc/postgres
 abc                | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
0 голосов
/ 15 марта 2013

базы данных = psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

0 голосов
/ 20 февраля 2013

Вместо следующей команды: базы данных = psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}

Вы можете использовать ниже: базы данных = psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

Первый возврат '|' для шаблонных баз и пустой строки.

Второй чище.

...