我可以在脚本中运行像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
这些在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”(减去双引号)。
任何人都知道是什么给出了什么?
答案 0 :(得分:13)
我有一个动态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
答案 1 :(得分:11)
由于您似乎拥有超级用户权限,您可以将这些命令放入postgres用户的crontab中,如下所示:
sudo su postgres
crontab -e
然后将pg_dump / vacuumdb命令放在那里。
答案 2 :(得分:5)
我已经设置了这样的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
抱歉我的英语不好!
答案 3 :(得分:4)
您的环境变量可能未在cron中设置。
在正常会话中,您可能已经定义了以下变量:
PG_PORT
PG_HOST
PG_DATABASE
PG_USERNAME
PG_PASSWORD
在yout脚本中添加“env”。
答案 4 :(得分:1)
您的pg_hba.conf中可能已经为postgres用户进行了“ident”身份验证。 在这种情况下,选项“-u postgres”将失败。 要么在备份脚本中将用户更改为postgres,要么配置不同的身份验证方法。
答案 5 :(得分:0)
而不是以下命令:
数据库= 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 '^$'
第一个返回'|'用于模板数据库和空行。
第二个更干净。
答案 6 :(得分:0)
数据库= psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'
答案 7 :(得分:0)
获取数据库列表的另一个版本:
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 |