一.检查活动状态
通过查询基本视图,确认数据库和实例处于正常运行状态,可以对外提供数据服务。
1.1实例状态
1
|
SELECT instance_name,status FROM v$instance;
|
查询返回实例名称、状态,正常状态应为Open。
1.2会话信息
1
2
|
SELECT
SESSIONS_CURRENT,SESSIONS_HIGHWATER FROM v$license;
|
辅助查询,实例当前会话数和启动最高连接会话数量。
1
2
|
SELECT inst_id,username,COUNT(*)
FROM gv$session GROUP BYinst_id,username;
|
查询数据库连接数以实例和用户分组。
1.3参数检查
1
2
|
SELECT value FROM v$parameter
WHERE name=
'open_cursors'
;
|
查询给定参数的设置值,示例参数缺省值为300,通常中等规模数据库推荐设置为1000。
1.4参数修改
1
|
ALTER SYSTEM SET undo_retention=3600 COMMENT=
'default 900'
SID=
'*'
SCOPE=both;
|
修改给定的初始化参数,RAC环境需要注意SID参数。
1.5隐含参数
1
|
ALTER SYSTEM SET
"_optimizer_use_feedback"
=FALSE SCOPE=spfile;
|
为了解决特殊问题,有时需要设置以下划线开头的隐含参数。
示例关闭了11.2版本中引入的Cardinality Feedback - 基数反馈特性。
1.6实例异常
当连接数据库实例出现缓慢、挂起等现象,需要进行诊断和分析,甚至可能需要重新启动数据库实例。
1.6.1信息采集
1
2
3
4
5
6
7
8
|
SQL>sqlplus -prelim / as sysdba
SQL>oradebug setmypid
SQL>oradebug unlimit
SQL>oradebug hanganalyze 3
SQL>oradebug dump systemstate 266
<间隔一定时间,如20秒,执行下一次数据采样. >
SQL>oradebug hanganalyze 3
SQL>oradebug dump systemstate 266
|
示范命令,通过采集系统的Hang信息、系统状态信息等,可以分析系统挂起的原因,间隔采样,可以用于对比变化,辅助分析。
1.6.2 跟踪
1
2
3
4
5
|
SQL>alter session set events
'10046 trace name context forever,level 12'
;
SQL>shutdown immedaite;
SQL>startup mount;
SQL>alter session set events
'10046 trace name context forever,level 12'
;
SQL>alter database open;
|
如果在数据库关闭、启动时遇到阻塞、挂起等,可以通过示范命令进行跟踪,获取跟踪文件进行分析。
1.6.3 安全停库
1
2
3
|
SQL>alter
system
checkpoint;
SQL>alter
system
archive
log
current;
SQL>shutdown immediate;
|
如果数据库出现异常需要重新启动,可以通过示范命令执行检查点、归档命令,然后尝试以立即方式关闭数据库。
1.6.4 强制停库
1
2
3
4
|
SQL>shutdown
abort
;
SQL>startup nomount;
SQL>alter database mount;
SQL>alter database open;
|
如果立即方式不能顺利关闭数据库,强制的关闭方式为abort。示范命令可以通过分步骤的方式执行数据库启动。
1.7连接异常
当连接数据库出现异常,需要检测包括网络连通性,监听器状态等信息。
1.7.1连通性
1
|
tnsping tns_name
|
在安装具有Oracle客户端的环境,可以通过tnsping工具测试配置的服务名称,观察网络是否连通以及响应时间。
1.7.2监听器
1
2
3
|
lsnrctl status LISTENER
lsnrctl status LISTENER_SCAN1
lsnrctl service
|
在数据库服务器上,可以通过lsnrctl工具检查监听状态和服务信息,具体的监听服务名称可以在最后定义修改。
1.7.3监听日志检查
1
|
adrci>showalert
|
在服务器上,可以通过adrci工具,显示各类告警文件,检查监听器日志,可以诊断监听问题。
二.检查日志信息
日志状态检查检查数据库各类日志信息,确认数据库实例、集群等是否出现错误、告警,如存在问题,则需要进一步分析和应对。
2.1告警日志
1
2
3
|
$ORACLE_BASE/diag/rdbms/<db_name>/$ORACLE_SID/
trace/alert_$ORACLE_SID.
log
SQL>show parameter background_dump_dest
|
根据示例找到告警日志,检查实例是否存在 ORA- 错误提示等。
2.2集群日志
11G:
1
2
|
$GRID_HOME/
log
/<nodename>/alert<nodename>.
log
$GRID_HOME/
log
/<nodename>/(crsd、cssd、evmd、ohasd)/
|
12C:
1
2
|
$GRID_BASE/diag/crs/dg2/crs/trace/alter||nodename.
log
$GRID_HOME/
log
/<nodename>/(crsd、cssd、evmd、ohasd)/
|
在相应路径找到RAC集群日志,检查是否存在错误提示信息等。
2.3ASM日志
1
|
$GRID_HOME/diag/asm/+asm/<ASM_instance_name>/trace/alert_<instance_name>.
log
|
在相应路径找到ASM日志,检查是否存在错误提示信息等。
2.4Trace文件
1
2
|
SQL>SELECT value FROM v$diag_info WHERE name=
'Default Trace File'
;
SQL>show parameter user_dump_dest
|
获取会话产生或全局转储位置,在诊断时需检查最近日期文件内容。
2.5集群状态
1
|
$crsctl status resource -t
|
确保资源状态显示在线。
2.6 errorstack分析
当遇到 ORA- 错误,而数据库的输出信息不足时,可以采用errorstack进行跟踪,采集更详细的转储信息。
1
2
3
4
|
SQL> alter
system
set events='600 trace name
errorstack forever, level 10';
SQL>alter
system
set events='600 trace name
errorstack off';
|
示例显示了对ORA-600错误设置跟踪,并关闭。
三.重做日志维护
Oracle REDO日志是数据库的核心组件,检查其状态,维护其成员,监控其归档,审核其性能,是DBA的重要工作。
3.1REDO组
1
|
SELECT group#,sequence#,archived,status FROM v$
log
;
|
查询日志组号、序号,是否归档完成和状态信息,如多组日志显示ACTIVE状态,则可能说明数据库存在IO方面的性能问题。
3.2REDO成员
SELECT group#,member FROM v$logfile;
查看日志组和成员信息。
3.3增加日志组或成员
1
2
3
4
|
SQL>ALTER DATABASE ADD LOGFILE GROUP 10
(
'/oracle/dbs/log1c.rdo'
,
'/oracle/dbs/log2c.rdo'
) SIZE 500M;
SQL>ALTER DATABASE ADD LOGFILE MEMBER
'/oracle/dbs/log3c.rdo'
TO GROUP 10;
|
在日志切换频繁时,可能需要增加日志组或者加大日志大小。
3.4切换日志
1
|
SQL>ALTER SYSTEM SWITCH LOGFILE;
|
切换日志组,开始写入下一个日志组。
3.5执行归档
1
|
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
|
对当前日志组执行归档,切换到下一个日志组,
在RAC会对所有实例执行归档,Thread参数指定归档实例。
3.6删除日志组或成员
1
2
|
SQL>ALTER DATABASE DROP LOGFILE GROUP 10;
SQL>ALTER DATABASE DROP LOGFILE MEMBER
'/oracle/dbs/redo03.log'
;
|
删除指定日志组或日志成员,注意只能对INACTIVE状态的日志执行删除操作。
3.7归档检查
1
|
SQL>archive
log
list;
|
检查数据库是否处于归档模式。
3.8归档状态变更
1
|
SQL>alter database archivelog | noarchivelog;
|
示例步骤在MOUNT状态改变归档模式,注意启动归档模式之后
务必制订备份归档的日常策略,防止磁盘空间被耗尽。
3.9调整归档路径
1
|
SQL>alter
system
set log_archive_dest_2=
'location=&path'
sid=
'&sid'
;
|
如果数据库因归档耗尽空间,可以指定另外的归档路径,以尽快归档日志,恢复数据库运行。
四.检查空间信息
确保数据存储空间可用,定期检查表空间余量,进行表空间和文件维护。
4.1 空间使用查询
1
|
SQL> SELECT * FROM sys.sm$ts_used;
|
查看数据库表空间的使用信息。
1
|
SQL> SELECT * FROM sys.sm$ts_free;
|
查看数据库表空间的剩余空间。
4.2 文件信息
1
|
SELECT tablespace_name,file_name FROM dba_data_files;
|
查看数据库表空间的数据文件信息。
4.3 文件维护
1
2
|
alter database datafile
'&path'
resize 900M;
alter tablespace &tbs_name add datafile
'&path'
size 900M;
|
对数据库的表空间容量进行扩容。
五.锁/闩信息检查
Lock/Latch是数据库控制并发的核心手段,检查相关信息可以监控数据库的事务和运行状况。
5.1锁信息
1
|
SQL>SELECT sid, type, lmode,
ctime
, block FROMv$lock WHERE type not in (
'MR'
,
'AE'
);
|
查看锁会话ID,类型,持有时间等,
注意如果block >1,可能意味着阻塞了其他会话。
5.2锁故障排查
在数据库出现锁竞争和阻塞时,需要排查和处理锁定,必要时通过Kill阻塞进程消除锁定。
5.2.1查询阻塞会话
1
|
SQL>SELECT sid,sql_id,status,blocking_session FROMv$session WHERE sid in(SELECT session_id FROM v$locked_object);
|
查询当前锁事物中阻塞会话与被阻塞会话的sid,sql_id和状态信息
5.2.2阻塞SQL文本
1
|
SQL> SELECT sql_id,sql_text FROMv$sqltext WHERE sql_id=
'&sql_id'
ORDER BY piece;
|
通过sql_id查询得到SQL文本,例如通过sql_id查询出阻塞的SQL语句。
5.2.3锁阻塞对象信息
1
2
|
SQL>SELECT owner,object_name,object_type FROM dba_objects
WHEREobject_id in (SELECT object_id FROM v$locked_object);
|
通过sid查询阻塞对象的详细信息如对象名称,所属用户等
5.2.4杀阻塞会话
1
|
SQL>altersystem kill session
'sid,serial#'
;
|
在Oracle实例内杀死阻塞的会话进程,其中sid,serial# 为中止会话对应信息,来自v$session。
5.2.5杀系统进程
1
2
3
4
|
SQL>SELECTpro.spid,pro.program
FROMv$session ses,v$process pro
WHEREses.sid=&sid and ses.paddr=pro.addr;
#kill -9 spid
|
有时对于活动进程,在系统层面中止更为快速安全,示例找到系统进程号,然后kill中止。
注意:无论何时,需要认真分析,并且避免误杀重要后台进程。
5.3闩检查
1
2
|
SELECTname,
gets
,misses,immediate_gets,spin_gets
FROMv$latch ORDER BY 2;
|
检查数据库闩的使用情况,misses、SPIN_GETS统计高的,需要关注。
5.3.1 闩使用检查
1
2
3
4
|
SQL>SELECT addr,
gets
FROM v$latch_children
WHEREname=
'cache buffers chains'
;
SQL>SELECT hladdr,file#,dbablk FROM x$bh
WHEREhladdr in (SELECT addr FROM v$latch_children WHERE addr=
'&addr'
);
|
仅供学习:通过获得Latch的地址,找到该Latch守护的X$BH中相关的Buffer。
六.等待和统计数据
Wait和Statistics数据分别代表了数据库的等待和运行数据,观察这些数据以了解数据库的等待瓶颈和健康程度。
6.1等待事件查询
1
2
|
SELECT sid,event,wait_time_micro
FROM v$session_wait ORDER BY 3;
|
通过等待事件和等待时间,了解数据库当前连接会话的等待情况。
注意,如果会话众多,需要限定查询输出行数。
6.2TOP10等待事件
1
2
3
4
|
SQL> SELECT * FROM (
SELECTEVENT,TOTAL_WAITS,AVERAGE_WAIT,TIME_WAITED
FROM v$system_event WHEREwait_class<>
'Idle'
ORDER BY time_waited desc) WHERE rownum<=10;
|
查看当前数据中TOP10等待事件信息,需要分析和关注非空闲的显著等待。
6.3会话统计数据
1
2
3
|
SQL>SELECT s.sid,s.statistic#,n.name,s.value
FROM v$sesstat s,v$statname n
WHERE s.statistic#=n.statistic# andn.name=
'redo size'
and sid=
'&sid'
;
|
查询数据库会话的统计信息数据,示例查询了Redo的大小,SID需要提供。
本文转自 张冲andy 博客园博客,原文链接:http://www.cnblogs.com/andy6/p/5840540.html ,如需转载请自行联系原作者