在这篇博客中,我们将介绍如何编写一个简单的脚本来备份 PostgreSQL 数据库,并设置一个定时任务来每天运行该脚本。这个教程将分为几个步骤,包括创建备份目录、编写备份脚本、设置脚本权限、设置定时任务、以及解决常见的 Peer 认证问题。

步骤 1:创建目录

首先,创建一个目录来存放所有备份文件和日志文件:

mkdir -p /var/backups/oa/sql
mkdir -p /var/backups/oa/log

步骤 2:编写备份脚本

接下来,我们编写一个备份脚本,将其放在刚才创建的目录中。假设脚本名为 backup_db.sh

nano /var/backups/oa/backup_db.sh

在编辑器中输入以下内容:

#!/bin/bash

# 定义变量
BACKUP_DIR="/var/backups/oa"
DB_NAME="oa"
DB_USER="odoo14"
LOG_FILE="$BACKUP_DIR/log/backup_$(date +%Y%m%d_%H%M%S).log"
BACKUP_FILE="$BACKUP_DIR/sql/$DB_NAME_$(date +%Y%m%d_%H%M%S).sql"

# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR/sql $BACKUP_DIR/log

# 执行数据库备份并将日志写入文件
{
    echo "Starting database backup: $(date)"
    PGPASSWORD="your_password" pg_dump -U $DB_USER $DB_NAME > $BACKUP_FILE
    if [ $? -eq 0 ]; then
        echo "Database backup completed successfully: $(date)"
    else
        echo "Database backup failed: $(date)"
    fi
} 2>&1 | tee -a $LOG_FILE

# 删除超过7天的备份文件和日志文件
find $BACKUP_DIR/sql -type f -name "*.sql" -mtime +7 -exec rm {} \;
find $BACKUP_DIR/log -type f -name "*.log" -mtime +7 -exec rm {} \;

步骤 3:设置脚本权限

确保脚本具有执行权限:

chmod +x /var/backups/oa/backup_db.sh

步骤 4:设置定时任务

使用 cron 来设置每天定时运行备份脚本。编辑 cron 表,我这里比较习惯用vi编辑器:

EDITOR=vi crontab -e

添加以下行以每天凌晨2点运行备份脚本:

0 2 * * * /var/backups/oa/backup_db.sh

解释

  • BACKUP_DIR:存放备份文件和日志文件的目录。
  • LOG_FILE:日志文件路径,包含时间戳。
  • BACKUP_FILE:备份文件路径,包含时间戳。
  • mkdir -p $BACKUP_DIR/sql $BACKUP_DIR/log:确保备份目录存在。
  • PGPASSWORD="your_password" pg_dump -U $DB_USER $DB_NAME > $BACKUP_FILE:执行数据库备份。
  • 2>&1 | tee -a $LOG_FILE:将输出和错误消息同时写入日志文件和终端。
  • find $BACKUP_DIR/sql -type f -name "*.sql" -mtime +7 -exec rm {} \;:删除超过7天的备份文件。
  • find $BACKUP_DIR/log -type f -name "*.log" -mtime +7 -exec rm {} \;:删除超过7天的日志文件。

验证

运行脚本后,你会在 /var/backups/oa 目录中看到备份文件和日志文件。通过 cron 设置,脚本会每天定时运行,并且自动清理超过7天的备份和日志文件。

遇到问题:解决 Peer 认证问题

如果你遇到 Peer authentication failed 错误,通常是因为 PostgreSQL 期望使用 Peer 认证,但当前的 Linux 用户名和 PostgreSQL 用户名不匹配。解决方法包括:

  1. 修改 pg_hba.conf 文件
    将认证方法从 peer 改为 md5 或 password,以便使用密码进行认证。
  2. 创建同名用户
    在 PostgreSQL 中创建一个与当前 Linux 用户同名的用户,并授予其适当的权限。

假设你当前的 Linux 用户是 root,而你需要连接的 PostgreSQL 用户是 odoo14。你可以通过以下步骤解决认证问题:

  1. 修改 pg_hba.conf 文件
    找到并修改 pg_hba.conf 文件中的相关行,将 peer 改为 md5
sudo nano /etc/postgresql/12/main/pg_hba.conf

将以下行:

local   all             all                                     peer

改为:

local   all             all                                     md5

然后重新加载 PostgreSQL 配置:

sudo systemctl reload postgresql
  1. 使用密码连接
    在你的备份脚本中使用 PGPASSWORD 环境变量:
PGPASSWORD="your_password" pg_dump -U odoo14 $DB_NAME > $BACKUP_FILE

现在,你应该能够顺利运行你的备份脚本而不会遇到 Peer authentication failed 错误。

也可以手工运行该脚本:

bash /var/backups/oa/backup_db.sh