乐于分享
好东西不私藏

别再为定时任务发愁:PolarDB-O源码编译安装 pgAgent 全记录

别再为定时任务发愁:PolarDB-O源码编译安装 pgAgent 全记录

目录

一、 为什么选择 pgAgent?
3
二、 环境准备
3
三、 编译安装 wxWidgets
3
四、 编译安装 pgAgent
5
4.1 解压 pgAgent 压缩包
5
4.2 安装依赖
5
4.3 正式安装 pgAgent
7
五、 数据库初始化
7
六、PgAgent 使用
8
6.1 新建测试账户
8
6.2 创建自动任务
8
6.3 验证 pgAgent
9
01
为什么选择 pgAgent?

痛点描述:在从 Oracle 迁移到 PolarDB 的过程中,很多业务依赖定时任务(如自动报表、数据清理)。

解决方案:pgAgent 是 PostgreSQL 生态中功能最全、最稳定的任务调度引擎,完美适配 PolarDB-O(Oracle 兼容版)。

核心优势:支持多步骤(Step)任务、灵活的计划(Schedule)配置,且所有的管理逻辑都存储在数据库内部。

接下来我将一步步教大家如何在 PolarDB 中源码安装 pgAgent ,其中也包含我遇到的坑。

02
环境准备

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

03
编译安装wxWidgets

由于 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

04
编译安装pgAgent

完成基础库建设后,开始正式编译 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

05
数据库初始化
实操命令 / 输出记录

# 切换到 polardb 用户并进入 psql

[polardb@localhost ~]$ psql

# 在目标数据库(建议 postgres)中创建扩展

polardb=# \c postgres polardb

Postgres=# CREATE EXTENSION pgagent;

CREATE EXTENSION

06
PgAgent使用

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 = '定时任务测试';

往期推荐
RECOMMEND
AIDRX 技术连载合辑:从灾备单品到智能灾备一体化平台的技术跨越
基于 AIDRX 的 VMware 到信创云一站式迁移方案
喜报!赢禾科技获杭州市“好苗子”企业认定,以智能灾备助力数字经济韧性