
目录
痛点描述:在从 Oracle 迁移到 PolarDB 的过程中,很多业务依赖定时任务(如自动报表、数据清理)。
解决方案:pgAgent 是 PostgreSQL 生态中功能最全、最稳定的任务调度引擎,完美适配 PolarDB-O(Oracle 兼容版)。
核心优势:支持多步骤(Step)任务、灵活的计划(Schedule)配置,且所有的管理逻辑都存储在数据库内部。
接下来我将一步步教大家如何在 PolarDB 中源码安装 pgAgent ,其中也包含我遇到的坑。
pgAgent 的编译依赖于 wxWidgets(图形库,用于管理任务逻辑)和 Boost 库。在开始之前,请确保你的系统已安装基础开发工具。
操作系统:CentOS Linux release 7.6.1810 (Core)
数据库版本:PostgreSQL 11.9 (POLARDB Database Compatible with Oracle 11.9.18)
数据库安装路径:/usr/local/polardb_o_current/bin/psql
关键依赖:gtk2-devel, boost-devel, cmake
由于 pgAgent 需要 wxWidgets 的支持,我们采用静态编译的方式,以减少后续运行时的动态链接库报错。
# 解压并进入目录[root用户下进行]
[root@localhost ~]# unzip wxWidgets-3.0.5.zip
#提示:wxWidgets-3.0.5.zip下载地址
https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.5/wxWidgets-3.0.5.zip
[root@localhost ~]# cd wxWidgets-3.0.5
# 赋予执行权限
[root@localhost ~]# chmod a+x configure
# 安装必要的开发库(安装前需要先挂载镜像)
[root@localhost ~]# yum install -y gtk2-devel
[root@localhost ~]# yum install -y gcc-c++
# 很多同学可能会好奇,pgAgent作为一个数据库后台进程,为什么编译时需要安装图形开发包?
这是因为 pgAgent 强依赖于 wxWidgets 这个跨平台库。而在 Linux 环境下,wxWidgets 就像是一台需要特定燃料才能启动的机器,gtk2-devel 提供了编译它所需的头文件和底层接口规范。
如果缺少这个包,你在执行./configure 编译 wxWidgets 时,系统会因为找不到“建筑图纸(头文件)”而直接报错中断。
# 配置编译选项:建议开启静态编译(shared=no)和 Unicode 支持
[root@localhost wxWidgets-3.0.5]# ./configure # enable-shared=no # enable-unicode=yes # prefix=/usr/local/wxWidgets-3.0.5
# 输出如下

# 编译并安装(此过程较慢,请耐心等待)
[root@localhost wxWidgets-3.0.5]# make && make install

# 配置环境变量
[root@localhost ~]# vi ~/.bash_profile
#在环境变量文件末尾添加
export PATH=$PATH:/usr/local/wxWidgets-3.0.5/bin
export LD_LIBRARY_PATH=/usr/local/wxWidgets-3.0.5/lib:$LD_LIBRARY_PATH
# 更新一下环境变量
[root@localhost ~]# source ~/.bash_profile
完成基础库建设后,开始正式编译 pgAgent 插件。
4.1 解压 pgAgent 压缩包
# pgAgent源码下载地址:
https://ftp.postgresql.org/pub/pgadmin/pgagent/pgAgent-4.2.1-Source.tar.gz
[root@localhost ~]# tar -zxvf pgAgent-4.2.1-Source.tar.gz
[root@localhost ~]# cd pgAgent-4.2.1-Source/
# 设置 PolarDB 的二进制路径(需确认自己的polardb安装路径),确保 cmake 能找到 pg_config
[root@localhost pgAgent-4.2.1-Source]# export PATH=/usr/local/polardb_o_current/bin:$PATH
4.2 安装依赖
# 安装 Boost 开发库:引入“标准零件”
核心原因:pgAgent 的源代码并不是从零开始一行行写出来的,它使用了大量C++领域的“百科全书”——Boost库。Boost提供了处理线程、时间、连接池等复杂逻辑的成熟方案。为 pgAgent的构建准备必须的标准核心组件。
[root@localhost ~]# yum install -y boost-devel
# 使用 CMake生成 Makefile
# 注意:明确指定PostgreSQL的根目录和安装前缀
[root@localhost pgAgent-4.2.1-Source]# cmake ./ -DPostgreSQL_ROOT_DIR=/usr/local/polardb_o_current -DCMAKE_INSTALL_PREFIX=/usr/local/polardb_o_current
bash: cmake: command not found...
Similar command is: 'make'
安装过程中,碰到了一个非常典型的问题,报错信息bash: cmake: command not found提示:系统里还没有安装 CMake 工具。这就是我们常说的“环境不纯净”导致的报错。
在 root 用户下执行以下命令安装即可:
yum install -y cmake
[root@localhost pgAgent-4.2.1-Source]# cmake3 ./ -DPostgreSQL_ROOT_DIR=/usr/local/polardb_o_current -DCMAKE_INSTALL_PREFIX=/usr/local/polardb_o_current
# 发生了如下的报错

# 从报错信息 Policy "CMP0057" is not known 和 string does not recognize sub-command APPEND 可以断定:系统默认安装的 CMake(2.8.12.2) 版本太老了
pgAgent 4.2.1 的源码使用了较新的 CMake 语法(比如 IN_LIST 和 APPEND),这些语法至少需要 CMake 3.3 或更高版本才能识别。那我们现在需要安装一个CMake3版本
下载地址如下:
https://cmake.org/download/

如上图,下载名为cmake-3.31.12-linux-x86_64.tar.gz
下载完成上传服务器解压并使用
# 1. 解压到 /usr/local 目录(这是存放第三方软件的规范路径)
[root@localhost ~]# tar -zxvf cmake-3.31.12-linux-x86_64.tar.gz -C /usr/local/
# 2. 为了方便使用,创建一个软链接到 /usr/bin,并命名为 cmake3 # 这样系统在任何地方输入 cmake3 都能找到它
[root@localhost bin]#ln -s /usr/local/cmake-3.31.12-linux-x86_64/bin/cmake /usr/bin/cmake3
# 3. 验证是否安装成功
[root@localhost ~]# cmake3 -version
cmake version 3.31.12
4.3 正式安装 pgAgent
# 再次执行编译与安装
[root@localhost pgAgent-4.2.1-Source]# make && make install
[ 11%] Building CXX object CMakeFiles/pgagent.dir/connection.cpp.o
......
Install the project...
.......
/u01/polardb_o_current/share/postgresql/extension/pgagent# unpackaged# 4.2.sql
# 至此正式编译成功
# 启动守护进程并输出日志到 tmp
[polardb@localhost ~]$ /usr/local/polardb_o_current/bin/pgagent hostaddr=127.0.0.1 dbname=postgres user=polardb -l 1 -s /tmp/pgagent.log
# 切换到 polardb 用户并进入 psql
[polardb@localhost ~]$ psql
# 在目标数据库(建议 postgres)中创建扩展
polardb=# \c postgres polardb
Postgres=# CREATE EXTENSION pgagent;
CREATE EXTENSION
6.1 新建测试账户
# 创建测试用户 hzyh
CREATE USER hzyh WITH PASSWORD 'Hzyh_Test_2026';
GRANT CONNECT ON DATABASE postgres TO hzyh;
GRANT USAGE, CREATE ON SCHEMA public TO hzyh;
# 核心步骤:赋予 hzyh 对 pgagent 模式的管理权限
GRANT USAGE ON SCHEMA pgagent TO hzyh;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA pgagent TO hzyh;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA pgagent TO hzyh;
6.2 创建自动任务
# 切换到 hzyh 用户
polardb=# \c postgres hzyh
# 1. 创建 TABLE
postgres=> CREATE TABLE public.test_job_log (
id serial PRIMARY KEY,
log_time timestamp DEFAULT now()
);
# 2. 创建 Job(记得 jobjclid 要填查询得到的 ID,通常为 1)
postgres=> INSERT INTO pgagent.pga_job (
jobid, jobjclid, jobname, jobdesc, jobhostagent, jobenabled
) VALUES (
nextval('pgagent.pga_job_jobid_seq'), 1, '测试任务', '每分钟插入数据', '', true
);
# 3. 创建 Schedule(每分钟运行一次)
postgres=> INSERT INTO pgagent.pga_schedule (jscid,jscjobid,jscname,jscdesc, jscenabled,jscminutes,jschours,jscweekdays,jscmonthdays,jscmonths ) VALUES ( nextval('pgagent.pga_schedule_jscid_seq'), 1, '每分钟计划', '', true, '{t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t}', '{t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t}', '{t,t,t,t,t,t,t}', '{t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t}', '{t,t,t,t,t,t,t,t,t,t,t,t}' );
# 4. 创建 Step(具体执行的 SQL)
postgres=> INSERT INTO pgagent.pga_jobstep ( jstid, jstjobid, jstname, jstenabled, jstkind, jstconnstr, jstdbname, jstonerror, jstcode ) VALUES ( nextval('pgagent.pga_jobstep_jstid_seq'), 1, '执行插入', true, 's', '', 'postgres', 'f', 'INSERT INTO public.test_job_log (log_time) VALUES (now());' );
6.3 验证 pgAgent
# 检查数据是否自动蹦出来了
SELECT * FROM public.test_job_log;

# 查看 pgAgent 的官方运行日志表
SELECT * FROM pgagent.pga_joblog;

#测试完毕,停止任务
UPDATE pgagent.pga_job SET jobenabled = false WHERE jobname = '定时任务测试';
夜雨聆风