如何监控Oracle数据库中长时间运行的进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何监控Oracle数据库中长时间运行的进程相关的知识,希望对你有一定的参考价值。

监控Oracle 数据库中长时间运行进程的两种方式,通过这些方 法,我们可以监控单条语句的 长时间操作,监控存储过程的运行进度,甚至自己\'生成\'进度信息. 关键词:监控进度V$SESSION_LONGOPS 当Oracle 存储过程运行时间较长时,我们希望客 户端能了解到它在后台执行的状况或者进度信息(类 似WINDOWS 安装软件时的进度条信息),这样可以知 道运行在后台的应用进程是否终止或者休眠,更近一 步要求,最好能知道进行到哪一步骤,还有多少时间才 能完成. 简单到一条SQL 语句的情况,如果执行时间较长, 我们如何得到它的运行状况?是否后台还在运行?虽 然可以查看SQL 的执行计划了解它的执行步骤,但如 何知道它运行到哪一个步骤了呢?如何才能估计出它 的合理的较为精确的执行时间呢? Oracle 数据库前端发出执行命令后,进程在后台 执行,普通开发人员一般无法了解到后台在做什么,一 般采用的方法是用DBMSOUTPUT.PUT_LINE 来打印出 来,但DBMS—OUTPUT.PUT—LINE 打印的信息受缓冲区 大小限制,如果信息较多就容易溢出,而且如果存储过 程执行时间较长,只有在其执行完后,这些信息才会打 印出来,这就增加了调试周期,影响了调试效果.有的 开发人员在存储过程中通过写日志表的形式来记录进 度,但需要COMMIT 后其他进程才能看到这些日志信 息,而在某些控制结构中(如游标CURSOR 循环)COM— MIT,则很容易引起ORA 一01555 错误,造成程序出错. 下面介绍两种监控方法. 如何监控单条长语句从ORACLE8 开始,出现一个新的动态视图:V $SESSION_LONGOPS,从这个视图可以获知一些操作 (如全表扫描,并行查询,RMAN,排序等)的执行进度, 我们先来了解一下V$SESSION—LONGOPS 视图的一些 重要字段: 列说明 sID 会话标识 5ERIAL#会话序列号 OPfE 操作的简短描述 TARG 盯操作的对象,如xx TAR~_DESC目标描述 SOFAR 目前已执行单位数目 ToTAIWORK 总单位数目 UNlTS 单位 START_TIME 开始执行时间 LAST_ UPDATE_TIME 统计数据最后更新时间 TIME_ REMAINING 估计剩余时间c ELAPSED_SECONDS 已执行时间(秒) MEsSAGE 统计数据汇总信息 USERA^^E 用户名 ~L_ADDRES5 语句的地址,,用于和V$sql_text 等关联 语句的hash 地址,用于和V$sql_texlSQLHASH VALUE等关联 这个动态视图显示各个运行时间超过6 程.这些进程包含许多备份和恢复功能,统计数据收集,查询等. 执行以下语句就可以得到数据库中各个长时间操 作的进程信息: select\'Icfromv$sesslon_ longopswheretime_ re- malnlng>0 我们也可以用图形化工具查看,如TOAD,OEM中 均可查看长操作进程进度信息. Oracle 自带的管理工具OracleEnterpriseManager (OEM)提供了图形化查看长操作的功能,如: 计算机系统应用2007 Quest公司的数据库管理工具TOAD 也可以看到 长操作信息,如: 表的统计信息. 长时问运行的SQL 语句可以用V$SESSION—LON? 为了能监控到查询进程执行的进度,必需使用 CBO 优化器并且: 设置TlMED—STATISTICS或者SQL—TRACE 用ANALYZE语句或者DBMS—STAT 包收集相关 108 实践经验P 帕cficalExpen GOPS来监控.实际上,长时间运行的存储过程也可以 监控.那是否任何操作都可以通过这个视图来监控进 度呢?很遗憾,V$SESSION—LONGOPS 只会报告它认为 耗时长的操作.对于NEsTEDLOOP/UNIQUEINDEX READS/INDEXRANGEScANS 等执行速度很快的操作, 2007 期计算机系统应用由于它们执行一般不超过6 秒,因此将不会出现在V $SESSION—LONGOPS 如何监控自定义存储过程单条长语句可以用上面的方法监控,Oracle 动生成V$SE.SSION— LONGOPS 记录.那么存储过程中 有许多小操作,如何监控进度呢?其实,我们也可以手 工生成V$SESSION—LONGOPS 记录,方法是调用DBMS APPLICATION—INFO 包来生成自定义进度信息. 从Oracle7.2 开始,提供了DBMS—APPLICATION— INFo 包,通过调用这个包,应用可以将自己的名字和 动作填写到V$SESSION 和V$SQLAREA 的MODULE ACTION列中.V$SESSION 列出每个会话的用户名,操 作系统机器名,终端名,程序名等. 应用可以在执行模块时设置模块名和动作名,模 块名一般是甩户自定义的.而动作名一般描述模块中 的当前执行的事务的名字. DBMSAPPLICATION_INFO 包包含以下过程 SET_ MODULE 设置当前运行程序的模块名 SET__AEl\'ION 设置当前模块的当前动作名 SESSION—LON-在V$SESSIONLONGOPS视图中 GoPS 插入一行进度信息 SETMODULE过程设置模块名和动作名: createorreplaceproceduredel—cust(v_cust—Id varchar2) begindbms—— application—— info.set— module(module—— name=>"delcust". actlon_name=>"deletetablecust)i deletefromcustwherecustld=v_ cusLId; dbms_appllcatlon— Info.seLmodule(,); end;以上设置的模块名和动作名可以通过查询V $sqlarea 获取. 如:selectsql—text,module,actionfromv $sqlareawheremodule="del_cust: sql_textmoduleadion Deletefr0mcustdel_ custdeletetableoust 1rowselected. SET_SESSION—LONGOPS 过程用于在V$session— longops 中插入一行,开发人员可以调用此过程设置长 时间操作的状态信息,这样,任何其他其他会话都可以 看到这个进度信息.如下例所示: declare nohlntnumberdefaultdbmsapplicatlon_info.set_ session— Iongops_ nohint; IdndexnumberdefaultInohlnt: slnonumber;begin forlIn1..8888888888 loop update....; dbms_ appllcaflon— Info.setsesslon_ longops (rlndex=>l_rlndex, slno=>I_slno. op_name=>"updateahugetable. target=>126, target_desc=>\'.msgdescription context=>0.sOfar=>j. totalwork=>8888888888. units=>loops endloop;end; 然后,从另一个会话来执行以下语句selectfromv$sesslon_ longopswheretlmere? malnlng>0; 也可以用图形化工具TOAD 或OEM来查看. 因此,采用本文说明的方法,Oracle 开发人员可以 比较方便的监控长操作进程的进度信息,也可以自己 设置监控信息,来了解后台存储过程的运行效率.甚 至,可以在存储过程或SQL 语句提交执行后马上观察 其执行进度,如果比较缓慢,则可以中断其执行,进行 调优,从而缩短调试周期,提高开发效率. 参考技术A q000 并行处理进程 SMON 系统监控进程 CKPT 检查点进程 LGWR 写日志进程 PMON 程序监控进程 ARCH 归档日志进程 DBW0 数据写进程 如果你说要是查看的话可以试试这个命令 ps -ef|group ora_

Electron 主进程中长时间的 IO 操作会阻塞 UI

【中文标题】Electron 主进程中长时间的 IO 操作会阻塞 UI【英文标题】:Does long time IO operation in Electron main process block the UI 【发布时间】:2019-09-15 05:52:49 【问题描述】:

我知道主进程中的 CPU 密集型工作会阻塞 UI 进程。我还有一个问题,主进程中长时间的 IO 操作会阻塞 UI。 最近用electron开发了一个文件管理的桌面应用。

第 1 步:

我的 UI 进程使用异步 IPC(由 Electron 提供)告诉主进程从网络中获取文件列表的数据,(仅获取文件的元数据,不包含文件内容)

第 2 步:

主进程从网络中获取文件列表的数据,然后将文件列表存储到sqlite中(我使用TypeORM),然后从sqlite中选择部分文件列表,并将它们返回给UI进程


有时step2需要几十秒(比如我从网络获取10000条文件数据),我的UI会变慢。

所以,我有两个问题: + 主进程中长时间的 IO 操作会阻塞 UI 吗? + 在电子应用中进行 IO 操作(数据库或本地文件)的最佳方式是什么?

【问题讨论】:

在主进程和渲染进程之间移动大块数据可能会减慢 Electron。你如何“让他们回复 UI 流程”? 我使用 ipc 异步,只是转换纯 json 字符串 @PelayoMéndez 现在我尝试将我的数据管理器逻辑从主进程移动到另一个进程 是的,尝试这样做。阻塞主进程不是一个好主意。为了使操作真正异步,它应该在它的进程上运行。检查这篇文章是否包含在一个真实世界示例中关于这个问题的一个很好的解释:medium.com/actualbudget/… 【参考方案1】:

I/O 可能会阻塞您的应用程序。 Node 提供阻塞和非阻塞 I/O 操作。您需要使用非阻塞变体。

Node 文档有一个关于blocking vs non-blocking I/O 的部分。该页面的两个代码示例,一个阻塞,一个非阻塞:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
const fs = require('fs');
fs.readFile('/file.md', (err, data) => 
    if (err) throw err;
);

【讨论】:

请注意,即使 OP 在 Node 中使用阻塞 I/O 操作,它仍然不应该阻塞电子 UI 线程。 @BenjaminGruenbaum 我使用异步 IO 操作,但我不知道为什么当 IO 操作花费数十秒时我的 ui 线程仍然变慢。而且我的 sqlite 操作也是异步方式,正如这里提到的 typeorm.io/# 我建议您阅读 devtools 文档并使用分析器,这是天赐之物,它可以准确地告诉您程序在哪里花费时间:]【参考方案2】:

第二个问题(“最好的方法是什么?”)是固执己见的题外话,所以我将专注于第一个问题:

主进程中长时间的 IO 操作会阻塞 UI 吗?

不,它没有。 electron 中的 I/O 发生在 Chromium 端或 Node.js 端——在这两种情况下,JavaScript 的 I/O 执行模型都使用事件循环。该操作被排队,然后在后台的线程池上执行(例如 dns 查询)或使用本机操作系统异步非阻塞 I/O 设施(例如套接字写入)。

需要注意的是,浏览器确实提供了一些(较旧的)阻塞 API(如同步 XMLHttpRequest),但您可能不会使用这些。

更多详情请见our event loop and timers tutorial。

【讨论】:

以上是关于如何监控Oracle数据库中长时间运行的进程的主要内容,如果未能解决你的问题,请参考以下文章

ora10,4oracle后台进程介绍:

如何在Linux中查看所有正在运行的进程

处理 ASP.NET 中长时间运行的进程

Oracle 监控:ORA-12519TNS:no appropriate service handler found 解决

在 Oracle 内存缓存中长时间存储 PLSQL 存储过程值

oracle 数据库ora-01408是啥错误