Ubuntu环境下PostgreSQL数据库备份与清理脚本全攻略
在服务器运维中,数据库的数据安全是重中之重。无论是为了防止硬件故障、人为误操作还是黑客攻击,定期备份数据库都是不可或缺的工作。本文将详细介绍如何在Ubuntu系统上编写一个健壮的PostgreSQL自动备份脚本,并配合清理策略,实现"备份+维护"的一站式自动化管理。
环境准备
在开始编写脚本之前,请确认你的环境信息。根据你的实际情况,我们已知:
- 操作系统:Ubuntu
- 数据库 :PostgreSQL(自定义安装在
/data/www/server/pgsql/) - 备份存储位置 :数据盘
/data/postgresql_backups
第一步:编写自动备份脚本
我们将创建一个名为 pg_backup.sh 的脚本,它负责导出数据库并生成带日期的备份文件。
创建脚本文件
使用以下命令创建并编辑脚本文件:
bash
sudo nano /usr/local/bin/pg_backup.sh
脚本内容详解
将以下代码复制到文件中。请注意,我已经根据你提供的路径信息预设了 pg_dump 的位置。
bash
#!/bin/bash
# ==========================================
# ⚙️ 配置区域
# ==========================================
# 1. 数据库连接信息
export PGHOST="127.0.0.1" # 数据库主机
export PGPORT="5432" # 数据库端口
export PGUSER="postgres" # 数据库用户名
export PGPASSWORD="your_password" # ⚠️ 注意:在此处填写你的数据库密码
export DBNAME="your_database" # 要备份的数据库名称
# 2. 路径配置
# 根据你的 find 结果,pg_dump 位于此处
PG_DUMP_PATH="/data/www/server/pgsql/bin/pg_dump"
# 备份文件存放目录(确保该目录已存在且有写权限)
BACKUP_DIR="/data/postgresql_backups"
# ==========================================
# 🚀 执行备份逻辑
# ==========================================
# 生成带时间戳的文件名,例如:backup_20231027.backup
TIMESTAMP=$(date +"%Y%m%d")
BACKUP_FILE="$BACKUP_DIR/backup_$TIMESTAMP.backup"
# 创建备份目录(如果不存在)
mkdir -p $BACKUP_DIR
echo "----------------------------------------"
echo "📅 备份开始时间: $(date)"
echo "💾 正在备份数据库: $DBNAME"
echo "📁 目标文件: $BACKUP_FILE"
# 执行 pg_dump 命令
# -F c: 自定义格式(压缩率高,恢复灵活)
# -b: 包含大对象
# -v: 详细模式
$PG_DUMP_PATH -h $PGHOST -p $PGPORT -U $PGUSER -F c -b -v -f "$BACKUP_FILE" $DBNAME
# 检查执行结果
if [ $? -eq 0 ]; then
echo "✅ 备份成功! 文件大小: $(du -h $BACKUP_FILE | cut -f1)"
exit 0
else
echo "❌ 备份失败! 请检查错误日志。"
exit 1
fi
赋予执行权限
脚本编写完成后,必须赋予它可执行权限:
bash
sudo chmod +x /usr/local/bin/pg_backup.sh
第二步:编写自动清理脚本
随着时间推移,备份文件会占用大量磁盘空间。我们需要一个脚本自动删除 N 天前的旧备份。
创建清理脚本
bash
sudo nano /usr/local/bin/pg_clean.sh
脚本内容
bash
#!/bin/bash
# ==========================================
# ⚙️ 配置区域
# ==========================================
# 备份目录路径(需与备份脚本一致)
BACKUP_DIR="/data/postgresql_backups"
# 保留天数(例如:7 表示只保留最近 7 天的备份)
RETENTION_DAYS=7
# ==========================================
# 🧹 执行清理逻辑
# ==========================================
echo "----------------------------------------"
echo "🧹 清理开始时间: $(date)"
echo "📂 扫描目录: $BACKUP_DIR"
echo "⏳ 保留策略: 最近 $RETENTION_DAYS 天"
# 使用 find 命令查找并删除旧文件
# -name "*.backup": 仅匹配备份文件
# -mtime +$RETENTION_DAYS: 修改时间在 N 天前
# -exec rm -f {} \;: 执行删除操作
find $BACKUP_DIR -type f -name "*.backup" -mtime +$RETENTION_DAYS -exec rm -f {} \;
echo "✅ 清理完成。"
同样,别忘了赋予权限:
bash
sudo chmod +x /usr/local/bin/pg_clean.sh
第三步:配置自动化任务
为了让这两个脚本每天自动运行,我们可以使用 Linux 原生的 crontab,或者使用宝塔面板的定时任务。
使用 Crontab 配置(通用方法)
在终端输入以下命令编辑定时任务:
bash
sudo crontab -e
在文件末尾添加以下两行(示例:每天凌晨 2 点备份,凌晨 3 点清理):
bash
# 每天凌晨 02:00 执行备份
0 2 * * * /usr/local/bin/pg_backup.sh >> /var/log/pg_backup.log 2>&1
# 每天凌晨 03:00 执行清理
0 3 * * * /usr/local/bin/pg_clean.sh >> /var/log/pg_clean.log 2>&1
使用宝塔面板配置(可视化方法)
- 添加备份任务 :
- 任务类型:Shell脚本
- 执行周期:每天 02:00
- 脚本内容 :
/usr/local/bin/pg_backup.sh
- 添加清理任务 :
- 任务类型:Shell脚本
- 执行周期:每天 03:00
- 脚本内容 :
/usr/local/bin/pg_clean.sh
常见问题排查
-
错误:
pg_dump: command not found- 原因:系统找不到 PostgreSQL 的命令工具。
- 解决 :确保在脚本中使用了
PG_DUMP_PATH变量指向绝对路径(如/data/www/server/pgsql/bin/pg_dump),而不是直接写pg_dump。或者使用sudo find / -name pg_dump命令找到有没有相关程序。
-
错误:
Permission denied- 原因:脚本没有执行权限,或者备份目录不可写。
- 解决 :运行
chmod +x赋予脚本权限;检查/data/postgresql_backups目录的所有者是否为运行脚本的用户(通常是 root 或 postgres)。
-
错误:
password authentication failed- 原因:密码错误或未配置免密。
- 解决 :在脚本中通过
export PGPASSWORD="your_password"显式指定密码,或者配置.pgpass文件。
通过以上步骤,你就拥有了一套完整的、自动化的数据库备份与清理方案,再也不用担心数据丢失或磁盘爆满的问题了。