【pgsql】Ubuntu备份和清理数据库postgresql

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

使用宝塔面板配置(可视化方法)

  1. 添加备份任务
    • 任务类型:Shell脚本
    • 执行周期:每天 02:00
    • 脚本内容/usr/local/bin/pg_backup.sh
  2. 添加清理任务
    • 任务类型: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 文件。

通过以上步骤,你就拥有了一套完整的、自动化的数据库备份与清理方案,再也不用担心数据丢失或磁盘爆满的问题了。

相关推荐
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神2 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据3 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡3 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧3 天前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon3 天前
SQL学习指南——视图
数据库·sql
活宝小娜3 天前
mysql详细安装教程
数据库·mysql·adb