English 中文(简体)
如何备份我和Cron PostgreSQL数据库吗?
原标题:
  • 时间:2009-05-12 18:37:37
  •  标签:

我可以运行命令像vacuumdb、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

这些在命令行运行sudo Redhat时我是根,然后你可以看到在上面的命令中我做了sudo - u postgres。

但当我试着踢这个从cron,我得到零字节文件——这意味着它没有正常运行。我不知道日志中我可以看到。

我的/etc/crontab文件底部这个条目

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

是的,/etc/db_backup.cron是ug chmod + x,由根,顶部的文件说:“# !/bin/bash”(减去doublequotes)。

谁知道到底发生了什么事?

最佳回答

既然你似乎超级用户权限,你可以把这些命令的crontab postgres用户如下:

sudo su postgres
crontab -e

然后把pg_dump / vacuumdb命令。

问题回答

我有一个动态的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

我设置cron。从周一到周五每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

抱歉我的英文不是很好!

也许你的环境变量没有设置cron。

在你正常的会话,你可能已经定义这些变量:

PG_PORT
PG_HOST
PG_DATABASE
PG_USERNAME
PG_PASSWORD

添加一个“env”到你的脚本。

you probably have "ident" authentication in your pg_hba.conf for your postgres user. The option "-u postgres" fails when that is the case. either change user to postgres in your backup script or configure a different authentication method.

Instead of the following command: 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 }

You can use below: databases=psql -t -c "select datname from pg_database where datname not like template% ;" | grep -v ^$

第一个返回|模板数据库和一个空行。

第二个是清洁工。

数据库= psql - h localhost - u postgres q - x - t - c“l”| | grep名字sed / / / g | sed年代/名称| / / g

Another version to get the list of databases:
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 | 




相关问题
热门标签