|
数据库性能基础
在性能不正常的时候,以oracle用户,使用sqlplus “/ as sysdba”登陆到数据库后,执行下面的命令:
set pagesize 100
set linesize 150
col event format a60
select event,total_waits,time_waited from v$session_wait order by 2 desc;
求等待事件及其对应的latch
col event format a32
col name format a32
select sid,event,p1 as file_id, p2 as "block_id/latch", p3 as blocks,l.name
from v$session_wait sw,v$latch l
where event not like '%SQL%' and event not like '%rdbms%'
and event not like '%mon%' and sw.p2 = l.latch#(+);
求等待事件及其热点对象
col owner format a18
col segment_name format a32
col segment_type format a32
select owner,segment_name,segment_type
from dba_extents
where file_id = &file_id and &block_id between block_id
and block_id + &blocks - 1;
使用SQL_TRACE/10046事件进行诊断
使用前注意事项:
1.初始化参数timed_statistics
参数最好设置为true,否则一些重要信息不会被收集。
2.设置max_dump_file_size
该参数设置跟踪文件的大小限制,可以以操作系统块为单位设置;也可以以KB或MB为单位设置;如果跟踪的信息比较多,可以干脆设置为unlimited。
Alter session set max_dump_file_size=unlimited;
跟踪用户的进程
1.首先:通过查询v$session可以获得session相关的信息sid,serial#
Selet sid,serial#,username from v$session where username is not null;
2.然后调用过程,开始跟踪:
Execute dbms_system.set_sql_trace_in_session(9,399,true);
3.等待用户执行相关的SQL语句,然后再执行:
Execute dbms_system.set_sql_trace_in_session(9,399,false);
查找生成的TRACE文件
此过程将生成一个相关的跟踪文件,然后利用下面的SQL语句查找跟踪文件(红色字体表示SID):
select d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||p.spid || '.trc' trace_file_name
from (select p.SPID
from v$session s, v$process p
where p.ADDR = s.PADDR
and s.SID=1054) p,
(select t.instance
from v$thread t, v$parameter v$
where v$.Name = 'thread'
and (v$.VALUE = 0 or t.THREAD# = to_number(v$.VALUE))) i,
(select value from v$parameter where name = 'user_dump_dest') d;
最后用tkprof生成报告:
tkprof inomc_ora_6939.trc kk.txt explain=ly_nye/oracle aggregate=yes sys=no
利用AWR工具收集数据库信息
AWR简介
AWR 实质上是一个 Oracle 的内置工具,它采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题。与 Statspack 不同,快照由一个称为 MMON 的新的后台进程及其从进程自动地每小时采集一次。为了节省空间,采集的数据在 7 天后自动清除。快照频率和保留时间都可以由用户修改。要查看当前的设置,您可以使用下面的语句:
select snap_interval, retention from dba_hist_wr_control;
SNAP_INTERVAL RETENTION
------------------- -------------------
+00000 01:00:00.0 +00007 00:00:00.0
修改收集方法
begin
dbms_workload_repository.modify_snapshot_settings (
interval => 20,
retention => 2*24*60
);
end;
手动收集快照
begin
dbms_workload_repository.create_snapshot;
end;
生成awr报告
以Oracle用户身份,使用sqlplus “/ as sysdba”登陆到数据库,然后执行:
sqlplus / as sysdba
SQL>@?/rdbms/admin/awrrpt.sql
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
1028932844 INOMC 1 inomc
Specify the Report Type
~~~~~~~~~~~~~~~~~~~~~~~
Would you like an HTML report, or a plain text report?
Enter 'html' for an HTML report, or 'text' for plain text
Defaults to 'html'
Enter value for report_type: --这里输入将输出的报告的格式,有text和html两种格式,根据个人习惯选择报告类型,默认是html类型,我这里选择html或者直接回车
Type Specified: html
Instances in this Workload Repository schema
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DB Id Inst Num DB Name Instance Host
------------ -------- ------------ ------------ ------------
* 1028932844 1 INOMC inomc i2ksvr
Enter value for num_days: --这里输入要显示几天以内的快照,默认最多显示七天
Listing the last day's Completed Snapshots
Snap
Instance DB Name Snap Id Snap Started Level
------------ ------------ --------- ------------------ -----
inomc INOMC 30 22 Jun 2010 00:00 1
31 22 Jun 2010 01:00 1
32 22 Jun 2010 02:00 1
Specify the Begin and End Snapshot Ids
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Enter value for begin_snap: --这里输入开始快照的ID,根据需要填写,一般填写性能出出现问题时的快照ID,可以根据ID所对应的时间决定
Begin Snapshot Id specified: 34
Enter value for end_snap: --这里输入结束快照的ID,根据需要填写,基本原则是与开始快照之间不能有太在的跨度,且开始快照和结束快照之间,数据库不能关闭。上述两种情况,都会导致收集到的数据失真,收集则无实际意义。
End Snapshot Id specified: 35
Specify the Report Name
~~~~~~~~~~~~~~~~~~~~~~~
The default report file name is awrrpt_1_34_35.html. To use this name,
press to continue, otherwise enter an alternative.
Enter value for report_name: --这里输入产生报告的名称,如果不指定名称,则默认根据快照的开始ID和结束ID,生成如上述报告产生的awrrpt_1_34_35.html
Report written to awrrpt_1_34_35.html
SQL>exit
退出之后,会在当前的目录下找到报告文件。
oracle@i2ksvr:~> ls
awrrpt_1_34_35.html
管理跟踪日志
rdbms跟踪文件路径
$ORACLE_BASE/diag/rdbms/db_unique_name/instance_name/trace/alert_sid.log
$ORACLE_BASE/diag/rdbms/db_unique_name/instance_name/alert/log.xml
注:另外该目录下还有问题的更详细的跟踪记录,当alert_sid.log文件所示的问题不确切时,可以查看更为详细的trace文件。
Listener默认日志文件路径(如果已经修改路径,请实际情况确定)
$ORACLE_BASE/diag/tnslsnr/hostname/listener/trace/listener.log
$ORACLE_BASE/diag/tnslsnr/hostname/listener/alert/log.xml
注:I2000因为连接池原因,会产生大量的日志文件,但是这些跟踪文件可以删除,或者是直接将日志功能关闭,关闭方法为在listener.ora文件中配置相应的参数,然后重新启动监听文件:
LOGGING_LISTENER=OFF
lsnrctl stop listener_name
lsnrctl start listener_name
错误原因查找
Oracle提供了一个小工具oerr用以解析常见的oracle错误原因及解决方法,其用法如下:
当出现错误时,如:ora-08103,则使用如下语句查看错误原因及解决方法
oerr ora 08103
如:TNS-12537,则使用如下语句查看错误原因以及解决方法
oerr tns 12537
常见问题处理
一.如何跟踪CPU高的进程
1、现象、问题描述
有时发现某个Oracle进程CPU高,甚至高到100%,希望有一个方法可以知道该进程在执行什么操作。
2、关键过程、根本原因分析
1. 通过操作系统的工具获得高CPU的进程号(可以使用top,topas之类的工具)
2. Sqlplus "/ as sysdba"
3. SQL> oradebug setospid pid -----这里的pid就是第一步操作中看到的那个进程号。
4. SQL> oradebug Event 10046 trace name context forever, level 12
5. 运行你的应用程序。
6. 过一段时间,如5分钟或10分钟,SQL>oradebug Event 10046 trace name context off
7. show parameter user_dump_dest
8. 在操作系统上到第7步显示的目录中找到 **_pid*.trc 这个trace文件。 -----pid是第一步得到的操作系统进程号。
9. tkprof fanu10_ora_15308.trc report.txt sys=no sort= prscpu ---这里sort的方式可以有多种,参考下面的说明。生成一个叫report.txt的文本。
5. 删除有坏块的表
drop table corrupt_table;
6. 使用alter table rename命令重命名新表为原来的表
alter table corrupt_table_bak rename to corrupt_table;
7. 如果表上存在索引,则要重建表上的索引
删除数据库
首先停止oracle的一切进程,如:
lsnrctl stop listener_name
shutdown immediate
emctl stop dbconsole
查看是否还存在oracle进程
ps –ef |grep oracle
如果还存在进程,根据实际情况,关闭相应的进程
确保所有的oracle进程已经关闭,然后执行如下语句删除oracle
rm -rf /opt/oracle
rm -rf /etc/ora*
rm -rf /usr/local/bin/*oraenv
rm -rf /usr/local/bin/dbhome
rm -rf /var/tmp/.oracle
rm -rf /tmp/.oracle
rm -rf /tmp/*oracle*
rm -rf /tmp/Oracle*
rm -rf /tmp/*OraInstall*
userdel oracle
groupdel oinstall
groupdel dba
rm -rf /home/oracle |
|