n年前,看过
eygle的文章,知道了在客户端获取跟踪日志文件的方法。
取得文件后,该文件却无法正常通过tkprof解析出格式化后的文件,估计是缺少一些内容,当时也没有深究原因,还是只好从服务器上去获取。
但是,经常有用户不方便从服务器上去取跟踪文件,例如:linux或unix系统中,一般通过ftp去获取,可能当前操作人员不知道ftp的密码。
今天,经过一番分析,终于发现了原因,并找到了解决办法。
1.通过前文所述的方法查询出文件内容,存为文本文件,跟原trace文件进行比较
2.结果发现,凡是有逗号的行,逗号及后面的内容没有查询出来。
例如:10G环境中第6行(11G中第3行):With the Partitioning
完整的内容是:With the Partitioning, OLAP, Data Mining and Real Application Testing options
3.外部表的定义中,并没有加字段的格式化:FIELDS TERMINATED BY ','
4.说明不加FIELDS关键字时,缺省按逗号作为了字段分隔符,验证了10.2.0.3和11.2.0.4都是这样的。
5.既然是这样,就加上一个字段分隔符(6个空格):FIELDS TERMINATED BY ' '
或者指定字段的长度:FIELDS (text (1:4000) CHAR)
6.这样重新定义外部表之后,就可以查询出完整的内容了。
获取跟踪日志的主要脚本:
1.获取当前会话产生的跟踪日志文件名
Select d.Value || '\' || Lower(RTrim(i.Instance, Chr(0))) || '_ora_' || p.Spid || '.trc' Trace_File_Name
From (Select p.Spid
From Sys.V$mystat M, Sys.V$session S, Sys.V$process P
Where m.Statistic# = 1 And s.Sid = m.Sid And p.Addr = s.Paddr) P,
(Select t.Instance
From Sys.V$thread T, Sys.V$parameter V
Where v.Name = 'thread' And (v.Value = 0 Or t.Thread# = To_Number(v.Value))) I,
(Select Value From Sys.V$parameter Where Name = 'user_dump_dest') D
2.按跟踪日志位置创建目录对象
Select Value From V$parameter Where Name = 'user_dump_dest'
create directory zltracefile as 'C:\ORACLE\PRODUCT\10.2.0\DB_1\ADMIN\DYYY\UDUMP';
3.根据1的文件名和2的目录对象名,创建外部表
create table tracefile
(TEXT varchar2(4000))
organization external (
type oracle_loader
default directory zltracefile
access parameters (
records delimited by newline
nobadfile
nodiscardfile
nologfile
FIELDS (text (1:4000) CHAR)
)
location('dyyy_ora_4732.trc')
) reject limit Unlimited;
4.查询跟踪日志的内容,可拷贝出来存为文本文件,然后用tkprof来格式化和排序
select * from tracefile;
取得文件后,该文件却无法正常通过tkprof解析出格式化后的文件,估计是缺少一些内容,当时也没有深究原因,还是只好从服务器上去获取。
但是,经常有用户不方便从服务器上去取跟踪文件,例如:linux或unix系统中,一般通过ftp去获取,可能当前操作人员不知道ftp的密码。
今天,经过一番分析,终于发现了原因,并找到了解决办法。
1.通过前文所述的方法查询出文件内容,存为文本文件,跟原trace文件进行比较
2.结果发现,凡是有逗号的行,逗号及后面的内容没有查询出来。
例如:10G环境中第6行(11G中第3行):With the Partitioning
完整的内容是:With the Partitioning, OLAP, Data Mining and Real Application Testing options
3.外部表的定义中,并没有加字段的格式化:FIELDS TERMINATED BY ','
4.说明不加FIELDS关键字时,缺省按逗号作为了字段分隔符,验证了10.2.0.3和11.2.0.4都是这样的。
5.既然是这样,就加上一个字段分隔符(6个空格):FIELDS TERMINATED BY ' '
或者指定字段的长度:FIELDS (text (1:4000) CHAR)
6.这样重新定义外部表之后,就可以查询出完整的内容了。
获取跟踪日志的主要脚本:
1.获取当前会话产生的跟踪日志文件名
Select d.Value || '\' || Lower(RTrim(i.Instance, Chr(0))) || '_ora_' || p.Spid || '.trc' Trace_File_Name
From (Select p.Spid
From Sys.V$mystat M, Sys.V$session S, Sys.V$process P
Where m.Statistic# = 1 And s.Sid = m.Sid And p.Addr = s.Paddr) P,
(Select t.Instance
From Sys.V$thread T, Sys.V$parameter V
Where v.Name = 'thread' And (v.Value = 0 Or t.Thread# = To_Number(v.Value))) I,
(Select Value From Sys.V$parameter Where Name = 'user_dump_dest') D
2.按跟踪日志位置创建目录对象
Select Value From V$parameter Where Name = 'user_dump_dest'
create directory zltracefile as 'C:\ORACLE\PRODUCT\10.2.0\DB_1\ADMIN\DYYY\UDUMP';
3.根据1的文件名和2的目录对象名,创建外部表
create table tracefile
(TEXT varchar2(4000))
organization external (
type oracle_loader
default directory zltracefile
access parameters (
records delimited by newline
nobadfile
nodiscardfile
nologfile
FIELDS (text (1:4000) CHAR)
)
location('dyyy_ora_4732.trc')
) reject limit Unlimited;
4.查询跟踪日志的内容,可拷贝出来存为文本文件,然后用tkprof来格式化和排序
select * from tracefile;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/117319/viewspace-2138312/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/117319/viewspace-2138312/