在这篇博客中,我们将介绍如何编写一个简单的脚本来备份 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 用户名不匹配。解决方法包括:
- 修改
pg_hba.conf
文件:
将认证方法从peer
改为md5
或password
,以便使用密码进行认证。 - 创建同名用户:
在 PostgreSQL 中创建一个与当前 Linux 用户同名的用户,并授予其适当的权限。
假设你当前的 Linux 用户是 root
,而你需要连接的 PostgreSQL 用户是 odoo14
。你可以通过以下步骤解决认证问题:
- 修改
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
- 使用密码连接:
在你的备份脚本中使用PGPASSWORD
环境变量:
PGPASSWORD="your_password" pg_dump -U odoo14 $DB_NAME > $BACKUP_FILE
现在,你应该能够顺利运行你的备份脚本而不会遇到 Peer authentication failed
错误。
也可以手工运行该脚本:
bash /var/backups/oa/backup_db.sh