数据库在运行的job kill掉进程后又自动启动?

本文介绍如何通过SQL查询检查正在运行的Job及其SPID,使用操作系统命令确认并kill进程,以及如何重新创建已删除的Job。涉及的关键步骤包括:查询正在运行的Job,查找对应的SPID,使用ps和kill命令管理进程,备份与重建Job。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据以下语句检查 当前正在跑的SQL,找到对应job的spid

select * from dba_job_running;
SELECT distinct d.spid,a.sid,e.event,b.status,c.sql_id,C.SQL_TEXT,B.USERNAME,B.OSUSER,B.MACHINE,B.PROGRAM
FROM V$SESS_IO A,V$SESSION B,V$SQL C,V$PROCESS D,v$session_wait e
WHERE A.SID=B.SID AND B.SQL_HASH_VALUE=C.HASH_VALUE and B.sid=E.sid 
AND B.PADDR=D.ADDR and b.status='ACTIVE' order by sql_text;

在主机上ps -ef|grep spid确认名称为ora_jxxx格式进程号

此时kill -9 spid后,执行上述查询语句,发现job有启动新的进程。

这时需先备份原先创建job的脚本,可通过pl/sql查看代码获取,也可以用其它办法。

备份后,删除该job,

再在操作系统上kill -9 spid

最后检查job已经被kill掉。

根据之前备份的脚本重新创建job即可。

<think>我们正在讨论GBase数据库监控长时间运行会话的方法。根据引用[1]和引用[2],我们知道GBase 8c和GBase 8s都有监控会话的需求。引用[4]提到了在GBase 8c中如何终止长时间运行的查询。引用[2]则详细说明了GBase 8s中监控会话连接信息的方法。 用户的问题:如何监控GBase数据库中长时间运行的会话? 我们需要针对GBase的不同版本(8s, 8a, 8c)分别说明。由于引用中提到了8c和8s,以及8a(引用[3]),所以我们要覆盖这三个版本。 根据引用[2](GBase 8s): - 使用`sysmaster:syssessions`系统表可以获取会话的连接信息,包括客户端IP、连接时间、空闲时间等。 根据引用[4](GBase 8c): - 通过查询系统表`pg_stat_activity`可以查看正在运行的查询,并且可以使用`PG_TERMINATE_BACKEND`函数终止会话。 对于GBase 8a(引用[3]提到),我们可以使用`information_schema.processlist`表。 因此,我们分版本来写: 1. **GBase 8s**: - 查询`sysmaster:syssessions`表,其中`connected`字段表示连接时间(秒),`pidle`表示空闲时间(秒)。我们可以通过条件`connected > 3600`来筛选连接时间超过1小时的会话,或者通过`pidle`来筛选长时间空闲的会话(可能是连接池中未使用的连接)。 - 示例: ```sql SELECT sid, username, hostname, connected, pidle FROM sysmaster:syssessions WHERE connected > 3600; -- 超过1小时 ``` 2. **GBase 8a**: - 查询`information_schema.processlist`表,其中`TIME`字段表示该会话当前状态持续的时间(秒)。我们可以通过`TIME`字段来筛选执行时间过长的会话。 - 示例: ```sql SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.processlist WHERE TIME > 3600; -- 执行时间超过1小时 ``` 3. **GBase 8c**: - 根据引用[4],查询`pg_stat_activity`视图,其中`state`字段表示会话状态,`query_start`表示查询开始时间,`backend_start`表示连接开始时间。我们可以通过计算当前时间与`backend_start`或`query_start`的时间差来找到长时间运行的会话。 - 示例(查找执行时间超过1小时的查询): ```sql SELECT pid, usename, application_name, client_addr, state, now() - query_start AS duration, query FROM pg_stat_activity WHERE state <> 'idle' AND (now() - query_start) > interval '1 hour'; ``` 或者查找连接时间超过1小时的会话: ```sql SELECT pid, usename, application_name, client_addr, state, now() - backend_start AS duration FROM pg_stat_activity WHERE (now() - backend_start) > interval '1 hour'; ``` 另外,我们还可以设置定时任务(如cron)定期执行这些查询,并将结果输出到日志文件或告警系统。 对于监控,我们可以结合数据库自带的监控工具(如果有)或使用第三方监控工具(如Zabbix、Prometheus等)来定期采集这些数据,并设置阈值告警。 最后,生成相关问题。 注意:在回答中,我们引用了用户提供的引用,需要在末尾添加引用标识,如[^1]、[^2]等。但注意,引用[1]是关于8c的故障分析,引用[2]是关于8s的监控,引用[3]是关于8a的解决方案,引用[4]是关于8c的查询终止。因此,在回答中,我们提到8c时引用[1]和[4],8s时引用[2],8a时引用[3]。 由于用户要求“参考站内引用”,我们在回答中要适当标注引用。 现在,我们组织答案:</think>### GBase数据库监控长时间运行会话的方法 针对GBase不同版本,监控长时间运行会话的解决方案如下: #### 一、GBase 8s(事务型数据库)监控方案 1. **基础会话监控** ```sql SELECT sid AS 会话ID, username AS 用户名, hostname AS 客户端IP, connected AS 连接时长(秒), pidle AS 空闲时长(秒), logintime AS 登录时间 FROM sysmaster:syssessions WHERE connected > 3600; -- 筛选连接超过1小时的会话[^2] ``` 2. **深度资源分析** ```sql SELECT s.sid, s.username, r.memused AS 内存使用(KB), r.nopens AS 打开文件数, r.lockreqs AS 锁请求数 FROM sysmaster:syssessions s JOIN sysmaster:sysrstcb r ON s.sid = r.sid WHERE s.connected > 7200; -- 超过2小时的会话 ``` 3. **自动告警设置(结合cron)** ```bash # 每天8点检查长时间会话 0 8 * * * dbaccess dbname - <<EOF OUTPUT TO "/logs/long_sessions.txt" WITHOUT HEADINGS; SELECT sid,username,connected/3600 FROM sysmaster:syssessions WHERE connected > 10800; -- 3小时以上会话 EOF ``` #### 二、GBase 8a(分析型数据库)监控方案 1. **实时运行会话监控** ```sql SELECT ID AS 会话ID, USER AS 用户, HOST AS 客户端, TIME AS 执行时长(秒), STATE AS 状态, LEFT(INFO, 50) AS 当前SQL片段 FROM information_schema.processlist WHERE TIME > 600 -- 超过10分钟[^3] AND COMMAND NOT IN ('Sleep'); ``` 2. **历史会话分析** ```sql -- 启用审计功能(需DBA权限) SET GLOBAL general_log = 'ON'; -- 查询历史长事务 SELECT * FROM mysql.general_log WHERE event_time > NOW() - INTERVAL 1 DAY AND command_type = 'Query' AND argument LIKE 'SELECT%' -- 示例筛选条件 AND elapsed_time > 300; -- 超过5分钟 ``` #### 三、GBase 8c(分布式数据库)监控方案 1. **分布式会话跟踪** ```sql SELECT pid AS 进程ID, usename AS 用户, application_name AS 应用名称, client_addr AS 客户端IP, now() - query_start AS 执行时长, query AS 当前SQL FROM pg_stat_activity WHERE state <> 'idle' AND (now() - query_start) > interval '5 min' -- 超过5分钟[^4] AND backend_type = 'client backend'; ``` 2. **自动终止机制** ```sql -- 创建自动终止长时间会话的存储过程 CREATE OR REPLACE PROCEDURE kill_long_sessions(max_minutes INT) AS $$ DECLARE rec RECORD; BEGIN FOR rec IN SELECT pid FROM pg_stat_activity WHERE (now() - query_start) > (max_minutes * interval '1 minute') LOOP PERFORM pg_terminate_backend(rec.pid); -- 终止会话[^4] INSERT INTO session_kill_log VALUES (rec.pid, now()); END LOOP; END; $$ LANGUAGE plpgsql; ``` #### 四、统一监控最佳实践 1. **监控指标阈值建议** | 严重级别 | 连接时长 | 空闲时长 | 处理措施 | |----------|----------|----------|------------------------| | 警告 | >1小时 | >30分钟 | 记录日志 | | 严重 | >3小时 | >2小时 | 邮件告警 | | 致命 | >12小时 | >6小时 | 自动终止并通知DBA | 2. **集成监控工具** - 使用Prometheus+Grafana配置监控看板,关键指标: ```yaml # Prometheus配置示例 - job_name: 'gbase_sessions' metrics_path: '/metrics' static_configs: - targets: ['dbserver:8080'] params: query: ['gbase_session_duration_seconds'] ``` - 告警规则示例: ```yaml ALERT LongRunningSession IF gbase_session_duration_seconds > 10800 FOR 5m LABELS { severity: "critical" } ANNOTATIONS { summary: "会话运行超过3小时", description: "会话 {{ $labels.sid }} 已运行 {{ $value }} 秒" } ``` > **生产环境建议**: > 1. 避免直接查询`sysmaster`表(实时采集影响性能),建议通过`gbasedbt`账户每小时采样[^2] > 2. 对ETL任务设置会话超时参数:`SET SESSION MAX_IDLE_TIME = 3600;` > 3. 使用连接池的`testOnBorrow`参数验证连接有效性[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值