在 Debian 上,pgAdmin 负责连接与管理数据库,本身不提供定时调度功能。常见做法有三种:使用操作系统的 cron、使用 systemd 定时器,或在数据库内使用 pgAgent/pg_cron 扩展由数据库自行调度。下面给出在 Debian 上的具体落地步骤与示例。
方案一 使用 Cron 调度 Shell 或 SQL 脚本
- 适用:简单、稳定的周期性任务(备份、清理、统计等)。
- 步骤:
- 安装并启动 cron
sudo apt-get update && sudo apt-get install -y cron
sudo systemctl enable --now cron
- 准备脚本(示例为清理日志)
cat > /usr/local/bin/clean_logs.sh <<‘EOF’
#!/usr/bin/env bash
set -e
export PGPASSWORD=‘YourStrongP@ssw0rd’
psql -h 127.0.0.1 -U dbuser -d mydb -c “DELETE FROM app_log WHERE ts < NOW() - INTERVAL ‘30 days’;”
EOF
chmod +x /usr/local/bin/clean_logs.sh
- 添加到当前用户的 crontab(cron 表达式含义:分 时 日 月 周)
crontab -e
每天 02:00 执行
0 2 * * * /usr/local/bin/clean_logs.sh >> /var/log/pg_cleanup.log 2>&1
- 排查要点
- 查看日志:tail -f /var/log/syslog | grep CRON
- 确保脚本可执行、路径使用绝对路径、数据库连接串正确。
方案二 使用 Systemd 定时器
- 适用:需要“错过执行后补跑”、依赖就绪、与 journald 日志深度集成等能力的任务。
- 步骤:
- 创建服务单元
sudo tee /etc/systemd/system/pg-clean.service >/dev/null <<‘EOF’
[Unit]
Description=Clean old logs in PostgreSQL
[Service]
Type=oneshot
Environment=PGPASSWORD=YourStrongP@ssw0rd
ExecStart=/usr/bin/psql -h 127.0.0.1 -U dbuser -d mydb -c “DELETE FROM app_log WHERE ts < NOW() - INTERVAL ‘30 days’;”
EOF
- 创建定时器单元
sudo tee /etc/systemd/system/pg-clean.timer >/dev/null <<‘EOF’
[Unit]
Description=Run pg-clean daily at 02:00
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
EOF
- 启用并启动
sudo systemctl daemon-reload
sudo systemctl enable --now pg-clean.timer
- 常用命令
systemctl list-timers --all
journalctl -u pg-clean.service
sudo systemctl status pg-clean.timer
方案三 在数据库内调度 pgAgent 或 pg_cron
- 适用:希望把任务与数据库对象一起管理、由数据库触发执行(跨库、复杂依赖等)。
- pgAgent(图形化在 pgAdmin 中配置)
- 安装 pgAgent(Debian 12 示例)
sudo apt-get install -y pgagent
- 在目标库(如 postgres)创建调度对象
psql -U postgres -d postgres -f /usr/share/pgagent/pgagent.sql
- 启动守护进程(建议本机运行;远程连接请用 .pgpass 管理凭据)
pgagent host=127.0.0.1 dbname=postgres user=postgres
- 打开 pgAdmin → 服务器 → 选择数据库 → pgAgent Jobs → 新建作业(步骤写 SQL,计划写调度)。
- pg_cron(PostgreSQL 扩展,SQL 级别定时)
- 在目标库启用扩展
CREATE EXTENSION IF NOT EXISTS pg_cron;
- 以超级用户添加任务(示例:每天 03:00 清理 90 天前日志)
SELECT cron.schedule(
‘clean-old-logs’, – 任务名
‘0 3 * * *’, – cron 表达式
$$DELETE FROM app_log WHERE ts < NOW() - INTERVAL ‘90 days’$$ – SQL
);
- 常用管理
SELECT cron.unschedule(‘clean-old-logs’);
SELECT * FROM cron.job;
- 安全建议:为数据库账户设置最小权限;远程连接凭据优先使用 .pgpass,避免出现在命令行历史或进程列表中。
如何选择
- 追求简单与通用:优先用 cron。
- 需要补跑、依赖管理、日志统一:选择 systemd 定时器。
- 希望把任务纳入数据库、用 SQL 管理:选择 pg_cron;需要可视化与复杂编排:选择 pgAgent。