请解释下述PostgreSQL pgAgent创建数据库备份任务的SQL语句作用
代码逻辑整体说明
这段SQL是针对PostgreSQL的定时任务调度组件pgAgent编写的,作用是创建一个自动执行数据库备份的定时任务。
分模块拆解解释
1. 匿名块声明部分
DO $$ DECLARE jid integer; scid integer; BEGIN
- 这是PostgreSQL的匿名PL/pgSQL代码块结构,用来执行过程化逻辑
- 声明了两个整数变量:
jid用来存储新创建任务的ID,scid为未使用的冗余变量,属于模板残留
2. 新建pgAgent任务
-- Creating a new job INSERT INTO pgagent.pga_job( jobjclid, jobname, jobdesc, jobhostagent, jobenabled ) VALUES ( 1::integer, 'backup'::text, ''::text, ''::text, true ) RETURNING jobid INTO jid;
这段代码往pgAgent的任务主表pgagent.pga_job插入一条新任务记录:
jobjclid:任务分类ID,值1对应pgAgent默认的常规任务分类jobname:任务名称设置为backupjobdesc:任务描述留空jobhostagent:指定运行任务的代理主机,留空代表允许任意可用的pgAgent代理执行该任务jobenabled:值true代表任务创建后直接启用- 最后通过
RETURNING jobid INTO jid把刚生成的任务ID存入变量,供后续创建任务步骤使用
3. 新增任务执行步骤
-- Steps -- Inserting a step (jobid: NULL) INSERT INTO pgagent.pga_jobstep ( jstjobid, jstname, jstenabled, jstkind, jstconnstr, jstdbname, jstonerror, jstcode, jstdesc ) VALUES ( jid, 'backup'::text, true, 'b'::character(1), ''::text, ''::name, 'f'::character(1), 'set PGPASSWORD=password pg_dump -h "localhost" -U "postgres" -f "D:\backup\backuppg_%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%" "postgres"'::text, ''::text ) ;
这段代码往pgAgent的任务步骤表pgagent.pga_jobstep插入一条执行步骤,关联刚才创建的备份任务:
jstjobid:关联之前创建的任务ID,即变量jid存储的值jstname:步骤名称设置为backupjstenabled:值true代表启用该步骤jstkind:值'b'代表该步骤是操作系统批处理命令,区别于SQL类型的步骤jstconnstr/jstdbname:数据库连接串、执行数据库留空,因为该步骤执行的是系统命令不需要额外连接数据库jstonerror:值'f'代表如果该步骤执行失败,直接标记整个任务失败,不再执行后续步骤jstcode:存储要执行的具体Windows批处理命令,其中的"是HTML转义的双引号,实际执行逻辑拆解如下:set PGPASSWORD=password:提前设置环境变量存储postgres用户的密码,避免备份工具执行时要求交互输入密码(注意明文存储密码存在安全风险)pg_dump是PostgreSQL自带的逻辑备份工具,执行参数说明:-h "localhost":连接本地运行的PostgreSQL服务-U "postgres":使用postgres用户身份执行备份操作-f "D:\backup\backuppg_xxx":指定备份文件输出路径,使用Windows系统内置的日期、时间变量自动生成带时间戳的文件名,避免旧备份被覆盖,最终生成的文件名格式类似backuppg_2024_05_20__14_30_22- 末尾的
"postgres"指定要备份的数据库名称,这里备份的是默认的postgres系统库
补充说明
这段代码仅完成了备份任务和执行步骤的创建,并未设置任务的执行调度规则(比如每天凌晨1点执行),如果需要定时自动执行,还需要额外往pgagent.pga_schedule表插入调度配置记录。
内容的提问来源于stack exchange,提问作者Rahul Mistry
相关产品推荐
相关产品推荐

