【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 文件。

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

相关推荐
m0_741481782 小时前
CSS如何实现单选按钮自定义样式_利用伪元素隐藏默认UI
jvm·数据库·python
yexuhgu2 小时前
CSS如何解决Bootstrap表格溢出问题_利用table-responsive容器
jvm·数据库·python
2301_787312432 小时前
SQL视图与存储过程有何区别_架构设计中的选择策略
jvm·数据库·python
a7963lin2 小时前
C# 文件系统Filter Hook C#能否在用户模式下拦截文件系统调用
jvm·数据库·python
a7963lin2 小时前
如何在 Tkinter 网格中动态增删行
jvm·数据库·python
运气好好的2 小时前
CSS如何实现响应式表单项对齐_利用Flexbox按比例分配宽度
jvm·数据库·python
2501_901006472 小时前
Python大屏展示怎么做_Dash与Streamlit框架快速构建Web版数据看板
jvm·数据库·python
2401_850491652 小时前
怎么限制用户使用的最大查询数 MAX_QUERIES_PER_HOUR设置
jvm·数据库·python
ChoSeitaku2 小时前
9.MySQL表的内连和外连|内连接|外连接|左外连接|右外连接
数据库·mysql