【问题标题】:How Do I Backup My PostgreSQL Database with Cron?如何使用 Cron 备份我的 PostgreSQL 数据库?
【发布时间】:2010-10-25 15:33:48
【问题描述】:

我可以在脚本中运行诸如 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 到 root 时,这些在 Redhat 的命令行上运行,然后正如你在上面的命令中看到的那样,我对 postgres 执行 sudo -u。

但是当我尝试从 cron 启动它时,我在所有文件中得到零字节——这意味着它没有正常运行。而且我在日志中没有得到任何线索我可以看到。

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

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

是的,/etc/db_backup.cron 是 chmod ug+x,归 root 所有,文件顶部显示“#!/bin/bash”(减去双引号)。

有谁知道是什么给的?

【问题讨论】:

标签: bash postgresql cron backup


【解决方案1】:

由于您似乎拥有超级用户权限,您可以将这些命令放入 postgres 用户的 crontab 中,如下所示:

sudo su postgres
crontab -e

然后将 pg_dump/vacuumdb 命令放在那里。

【讨论】:

  • 这就是我最终要做的事情,只有当我 chown postgres.root /opt/postgresql (文件所在的位置)时它才能正常工作。
  • ''sudo su postgres'' 太疯狂了!尝试“sudo -u postgres”。设置一个 sudo 规范,它更安全。
  • 由于pam配置,您(postgres)不允许访问(crontab)。
【解决方案2】:

我有一个备份服务器上所有数据库的动态 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

【讨论】:

  • 您也可以在 /usr/bin/vacuumdb 命令中添加“--analyze”来执行分析。
  • 这是另一个不错的脚本:wiki.postgresql.org/wiki/Automated_Backup_on_Linux
  • @Imraan Parker 您如何设法跳过使用密码?我想备份为数据库的管理员帐户而不是 root 用户 postgres 我该怎么做?
【解决方案3】:

我已经这样设置了我的 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

对不起,我的英语不好!

【讨论】:

    【解决方案4】:

    您的环境变量可能未在 cron 中设置。

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

    PG_PORT
    PG_HOST
    PG_DATABASE
    PG_USERNAME
    PG_PASSWORD
    

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

    【讨论】:

    • 我需要比我想的更多的帮助。我在命令之前和 #!/bin/bash 之后将 'env' 放在那里,它所做的只是将环境转储到日志文件中(因为我现在在运行时将输出转储到日志文件中)。
    • 设置这些变量的方法是'export PG_PORT=5432'等
    • 这些并不是 pg_dump 和 Vacuumdb 使用的变量。您可以在此处查看完整列表:postgresql.org/docs/8.4/static/libpq-envars.html
    • @bilitgates 不错!!谢谢你。我今天学到了一些东西:-)
    【解决方案5】:

    您的 pg_hba.conf 中可能为您的 postgres 用户提供了“ident”身份验证。 在这种情况下,选项“-u postgres”会失败。 在备份脚本中将用户更改为 postgres 或配置不同的身份验证方法。

    【讨论】:

      【解决方案6】:

      而不是以下命令: 数据库=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 '^$'

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

      第二个更干净。

      【讨论】:

        【解决方案7】:

        数据库=psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

        【讨论】:

          【解决方案8】:

          获取数据库列表的另一个版本:
          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 | 
          

          【讨论】:

            猜你喜欢
            • 2019-07-17
            • 2019-05-29
            • 2019-01-10
            • 1970-01-01
            • 1970-01-01
            • 2015-06-29
            • 1970-01-01
            • 2017-02-11
            • 2011-09-28
            相关资源
            最近更新 更多