gpt4 book ai didi

oracle - 相当于 Oracle 10g 的 SQL Server 跟踪?

转载 作者:行者123 更新时间:2023-12-01 12:59:29 25 4
gpt4 key购买 nike

我遇到了一个糟糕的代码重复问题,我们无法判断正在使用哪个版本的包/过程。即我有不同的程序包和同名程序,我需要确定哪些程序包实际上没有被调用。

我正在尝试删除不再被调用的同名过程/包。我想运行几周的跟踪,组合数据并查询元数据,并找到进一步调查和停用的候选对象。

我正在寻找 SQL Server 的 sp_trace_create 和 sp_trace_setevent 42 的等效项来跟踪 SP:Starting 事件 - 这将允许我查看所有被调用的存储过程,然后将其与整个存储过程 list 进行比较以查看应首先调查哪些已过时。我已经使用 DBMS_MONITOR.DATABASE_TRACE_ENABLE 来生成跟踪文件,但我还没有找到任何解释如何使用 TKPROF 来解析这些文件的东西,除了性能——我什至不关心语句本身,只关心正在使用哪些例程。

最佳答案

不要认为 ILO 会有所帮助(它不仅仅是设置模块和操作并在某处记录时间吗?)因为 Cade Roux 将不得不修改数据库中的每个包和函数。

一个选项是在数据库中打开跟踪,

 ALTER SYSTEM SET sql_trace = true SCOPE=MEMORY;

并使用脚本命令获取所有已执行包名称的唯一列表,尽管警告 - 这将生成大量输出并非常迅速地填满磁盘空间 - 你可能想要创建一个每天运行的过程文件,然后删除 trc 文件,然后将所有结果组合在一起以确定使用了哪些。

此外,您还需要确保跟踪文件大小没有限制,这可能会阻止它记录所有内容,并确保您有足够的磁盘空间,并且由于您对运行时不感兴趣,您还可以关闭 timed_statistics 以减少日志记录量。

 alter system set max_dump_file_size=unlimited;
alter system set timed_statistics=false;

如果我查看从 Oracle 跟踪创建的原始跟踪文件,每个应用程序特定的程序包调用过程调用显示如下

=====================
PARSING IN CURSOR #2 len=69 dep=0 uid=102 oct=47 lid=102 tim=1316845390611021 hv=273704950
ad='b0d4c728' sqlid='01qnrr4850tzq'
BEGIN REIM_MATCH_SQL.INIT_SUMMARY_MATCH(:1, :2, :3, :4, :5, :6); END;
END OF STMT
PARSE #2:c=0,e=0,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,plh=0,tim=1316845390611021

因此您可以在目录中像这样在 grep 中查找包调用列表(如果 tkprof 输出不同,您可能需要根据您使用的操作系统稍微调整输出)

find . -name "*.trc" -exec grep "BEGIN " {} \; | cut -d" " -f4 | cut -d"(" -f1 | sort -u > ~/called_procedures.txt

这不适用于函数,因为它们可以在 SQL 语句中间调用,但我认为对于过程,它应该没问题。这将在您的主目录中生成一个文件,其中包含自您打开跟踪以来运行的过程调用的唯一列表。

我在一个包含 9818 个跟踪文件的目录上运行了这个,总计 19GB 的磁盘空间,并且在运行 Oracle 企业 Linux 5 的测试箱上用了 10 分钟,具有 2 个内核和 12GB 内存 - 这些跟踪文件只是来自重复测试运行一个程序,因此您可以想象如果您在生产机器中为所有内容生成,那么创建这些程序的速度有多快。

然后您可以从 sqlplus 中为您感兴趣的特定模式获取数据库中所有包/过程的列表

set heading off
set trimspool on
set pagesize 0
set feedback off
spool all_procedures.txt
SELECT DISTINCT p.object_name||'.'||p.procedure_name
FROM all_procedures p
JOIN all_objects o ON (o.owner = p.owner AND o.object_name = p.object_name AND o.object_type =
where p.owner='&owner'
order by 1
spool off

最后对两者进行比较以获得候选列表

diff all_procedures.txt called_procedures.txt

完成后不要忘记关闭跟踪

ALTER SYSTEM SET sql_trace = false SCOPE=MEMORY;

此外,您需要注意可能仅在特定时间段(如月末或年末)运行的程序 - 它们可能看起来没有被使用,但您无法确定,除非每个业务流程都在您的时间内完成正在监控。

希望对您有所帮助。

关于oracle - 相当于 Oracle 10g 的 SQL Server 跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7440387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com