手动启动pgagent定时任务进程 # 手动启动pgagent服务 [hgadmin@highgo1 hgdb]$ /home/hgadmin/hgdb/bin/pgagent hostaddr=127.0.0.1 dbname=water user=system port=1521 -s /home/hgadmin/hgdb/bin/agent_water.log -t 1 [hgadmin@highgo1 hgdb]$ ps -ef | grep pgagent hgadmin 11105 1 0 10:54 ? 00:00:00 /home/hgadmin/hgdb/bin/pgagent hostaddr=127.0.0.1 dbname=water user=system port=1521 -s /home/hgadmin/hgdb/bin/agent_water.log -t 1
脚本启动pgagent定时任务进程
集群环境(每个节点配置)(只会在主节点启动pgagent进程,脚本每三分钟检查集群pgagent进程)
# 创建定时监控 [hgadmin@highgo1 hgdb]$ crontab -l */3 * * * * sh /home/hgadmin/hgdb/pgagent_mintor.sh
[hgadmin@highgo1 hgdb]$ vim /home/hgadmin/hgdb/pgagent_mintor.sh # !/bin/bash # 数据库Bin目录 bin_dir=/home/hgadmin/hgdb/bin # 数据库名称 dbname=water # pgagent 数据库集合 pgagent_dbname="water" # 端口号 port=1521 # 数据库用户名 username=system # 数据库用户密码 passwd=system # ip地址 host_ip=127.0.0.1 # pgagent数据库日志目录 agent_dir=/home/hgadmin/hgdb/bin # 网关 gate_way_ip=192.168.239.2 # 数据库VIP vip=192.168.239.130 # 监控脚本日志名称 mintor_log=/home/hgadmin/hgdb/hgdb_logpgagent_mintor.log
system用户为普通用户赋权 grant execute on package sys.dbms_job to wateruser;grant usage on schema pgagent to public;grant all on all sequences in schema pgagent to public;grant all on all tables in schema pgagent to public;
dbms_job
DECLARE jobno integer ; BEGIN DBMS_JOB.submit( jobno out binary_integer, what in varchar2, next_date in date default sysdate, interval in varchar2 default 'null' , no_parse in boolean default false , instance in binary_integer default 0 , force in boolean default false ); END ;
测试用例 用例一 准备数据 DROP TABLE wateruser.student;CREATE TABLE wateruser.student (id serial,name VARCHAR2(10 ));SELECT * FROM wateruser.student; insert INTO student values (1 ,'孙悟空' );CREATE OR REPLACE PROCEDURE wateruser.test_job()AUTHID DEFINER IS BEGIN INSERT INTO wateruser.student(name) values ('孙悟空' ); END test_job;
创建job DECLARE jobno integer ; BEGIN DBMS_JOB.SUBMIT( job = > jobno, what = > 'wateruser.test_job();' , next_date = > SYSDATE, interval = > 'SYSDATE + 1/1440' ); RAISE NOTICE 'Job number: %' , jobno; END ;CALL DBMS_JOB.SUBMIT('' ,'wateruser.test_job();' ,sysdate,'SYSDATE + 1/1440' )
查询job SELECT * FROM all_jobs;SELECT * FROM user_jobs;SELECT * FROM dba_jobs_running;SELECT * FROM pgagent.PGA_JOBSTEPLOG where jsljstid = 38 ;
修改job call dbms_job.remove(jobno);call dbms_job.remove(1 );call dbms_job.what(jobno,what);call dbms_job.what(1 ,'wateruser.test_job2();' );call dbms_job.next_date(jobno,next_date);call dbms_job.next_date(1 ,sysdate + 3 / 1440 );call dbms_job.interval(jobno, interval );call dbms_job.interval(1 , 'SYSDATE + 10/1440' );call dbms_job.run(jobno);call dbms_job.run(1 );call dbms_job.broken(jobno, broken, nextdate);call dbms_job.broken(41 ,true );
用例二 准备数据 CREATE OR REPLACE PROCEDURE wateruser.test_job()AUTHID current_user IS random_name int ; sqlstr VARCHAR2; BEGIN SELECT (RANDOM()* 1000 )::int INTO random_name; RAISE notice'random_name:%' ,random_name; sqlstr := 'CREATE TABLE wateruser.jod_' || random_name|| '(id int);' ; RAISE notice'sqlstr:%' ,sqlstr; EXECUTE sqlstr; END test_job;
创建job CALL DBMS_JOB.SUBMIT('' ,'set local session authorization wateruser; wateruser.test_job();' ,sysdate,'SYSDATE + 1/1440' )
注意
当存储过程中含有创建对象且被定义为authid invoker,或使用plpgsql语法时,在定时任务的what中需要添加set local session authorization user_name;否则定时任务创建的对象的属主将会是system用户,导致普通用户调用无权限。