本手册是Oracle数据库支持工程师的实战参考指南,涵盖33个常见故障排查场景的诊断脚本和处理方法。无论是内存泄漏、数据库挂起、性能问题还是备份恢复,都能在这里找到相应的诊断命令和解决思路。

使用说明:本手册中的脚本可直接在SQL*Plus或命令行中执行。建议收藏备用,遇到问题时快速定位相关章节。


目录

  • 一、内存诊断:PGA/SGA内存问题、ORA-4030
  • 二、对象与组件:无效对象、JVM状态
  • 三、挂起与锁:Hanganalyze、Systemstate
  • 四、跟踪与调试:10046、Errorstack、Oradebug
  • 五、性能诊断:Redo生成、会话分析、AWR/Statspack
  • 六、空间管理:ORA-1652、表空间扩展
  • 七、网络诊断:SQL*Net跟踪、监听器
  • 八、备份恢复:恢复诊断脚本
  • 九、系统管理:Scheduler、Resource Manager
  • 十、实用工具:CSSCAN、DBMS_METADATA

一、内存诊断

1.1 PGA内存使用分析

当遇到内存使用过高或ORA-4030错误时,使用以下脚本诊断:

-- =============================================
-- PGA内存诊断脚本
-- =============================================
SET PAGESIZE 999
SET LINESIZE 200
COLUMN memory FORMAT A30
COLUMN program FORMAT A40
COLUMN spid FORMAT A10

SPOOL pga_analysis.log

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') AS current_time FROM dual;

PROMPT
PROMPT ========== 各会话PGA内存使用 ==========
SELECT p.spid, 
       s.sid,
       SUBSTR(n.name,1,25) AS memory_type, 
       ROUND(s.value/1024/1024,2) AS mb
FROM v$sesstat s, v$statname n, v$process p, v$session vs
WHERE s.statistic# = n.statistic#
  AND n.name LIKE '%pga memory%' 
  AND s.sid = vs.sid
  AND vs.paddr = p.addr
ORDER BY s.value DESC;

PROMPT
PROMPT ========== PGA分配最大的进程 ==========
SELECT pid, spid, 
       SUBSTR(username,1,20) AS db_user,
       SUBSTR(program,1,40) AS program,
       ROUND(pga_used_mem/1024/1024,2) AS used_mb,
       ROUND(pga_alloc_mem/1024/1024,2) AS alloc_mb,
       ROUND(pga_freeable_mem/1024/1024,2) AS freeable_mb,
       ROUND(pga_max_mem/1024/1024,2) AS max_mb
FROM v$process 
WHERE pga_alloc_mem = (SELECT MAX(pga_alloc_mem) FROM v$process WHERE program NOT LIKE '%LGWR%');

PROMPT
PROMPT ========== PGA总使用量 ==========
SELECT ROUND(SUM(pga_alloc_mem)/1024/1024,2) AS total_pga_mb FROM v$process;

PROMPT
PROMPT ========== 进程PGA排名TOP 20 ==========
SELECT * FROM (
    SELECT spid, 
           SUBSTR(program,1,40) AS program,
           ROUND(pga_alloc_mem/1024/1024,2) AS pga_mb
    FROM v$process
    ORDER BY pga_alloc_mem DESC
) WHERE ROWNUM <= 20;

PROMPT
PROMPT ========== PGA统计信息 ==========
SELECT SUBSTR(name,1,40) AS name, value, unit FROM v$pgastat;

SPOOL OFF

1.2 Oracle总内存使用

-- 计算Oracle实例总内存使用(SGA + 所有会话PGA)
SELECT ROUND(SUM(bytes)/1024/1024,2) AS total_memory_mb 
FROM (
    SELECT bytes FROM v$sgastat
    UNION ALL
    SELECT value AS bytes 
    FROM v$sesstat s, v$statname n 
    WHERE n.statistic# = s.statistic# 
      AND n.name = 'session pga memory'
);

1.3 指定会话的内存详情

-- 查看特定会话的PGA使用
SELECT spid, 
       ROUND(pga_used_mem/1024/1024,2) AS used_mb,
       ROUND(pga_alloc_mem/1024/1024,2) AS alloc_mb
FROM v$process 
WHERE addr = (SELECT paddr FROM v$session WHERE sid = &sid AND serial# = &serial);

1.4 生成Heapdump(内存泄漏诊断)

-- 对特定进程生成堆转储
ORADEBUG SETOSPID <pid>
ORADEBUG DUMP HEAPDUMP 536870917
ORADEBUG TRACEFILE_NAME

相关文档:NOTE.233869.1 - Diagnosing and Resolving ORA-4030 error


二、对象与组件诊断

2.1 无效对象检查

-- =============================================
-- 无效对象诊断脚本
-- =============================================
SET PAGESIZE 1000
SET LINESIZE 150
COLUMN owner FORMAT A20
COLUMN object_name FORMAT A35
COLUMN object_type FORMAT A20
COLUMN comp_name FORMAT A40

SPOOL invalid_objects_report.log

PROMPT ========== 数据库名称 ==========
SELECT SYS_CONTEXT('USERENV','DB_NAME') AS db_name FROM dual;

PROMPT ========== 无效对象总数 ==========
SELECT COUNT(*) AS invalid_count FROM dba_objects WHERE status = 'INVALID';

PROMPT ========== 按类型和属主分组统计 ==========
SELECT owner, object_type, COUNT(*) AS cnt
FROM dba_objects 
WHERE status = 'INVALID' 
GROUP BY owner, object_type
ORDER BY owner, object_type;

PROMPT ========== 组件注册状态 ==========
SELECT comp_id, comp_name, version, status FROM dba_registry;

PROMPT ========== 无效对象详细列表 ==========
SELECT owner, object_name, object_type
FROM dba_objects 
WHERE status = 'INVALID'
ORDER BY owner, object_type, object_name;

SPOOL OFF

2.2 重新编译无效对象

-- 重新编译所有无效对象
@$ORACLE_HOME/rdbms/admin/utlrp.sql

-- 或手动重新编译
EXEC DBMS_UTILITY.COMPILE_SCHEMA(schema => 'SCHEMA_NAME');

相关文档:NOTE.300056.1 - Debug and Validate Invalid Objects

2.3 JVM状态检查

-- =============================================
-- Oracle JVM状态诊断脚本
-- =============================================
SET SERVEROUTPUT ON
SET PAGESIZE 500
SET LINESIZE 150
COLUMN comp_name FORMAT A40
COLUMN object_name FORMAT A50

SPOOL jvm_status.log

PROMPT ========== 组件状态 ==========
SELECT comp_name, version, status FROM dba_registry;

PROMPT ========== JAVA对象统计 ==========
SELECT owner, status, COUNT(*) AS cnt
FROM all_objects
WHERE object_type LIKE '%JAVA%' 
GROUP BY owner, status;

PROMPT ========== 无效JAVA对象 ==========
SELECT owner, object_type, COUNT(*) AS cnt
FROM all_objects
WHERE object_type LIKE '%JAVA%' 
  AND status <> 'VALID' 
GROUP BY owner, object_type;

PROMPT ========== DBMS_JAVA状态 ==========
SELECT owner, status, object_type, object_name 
FROM all_objects
WHERE object_name LIKE '%DBMS_JAVA%';

PROMPT ========== JAVA Pool使用 ==========
SELECT * FROM v$sgastat WHERE pool = 'java pool' OR name = 'free memory';

SHOW PARAMETER pool_size
SHOW PARAMETER sga

SPOOL OFF

相关文档:Note 842449.1 - Troubleshooting Oracle JVM


三、挂起与死锁诊断

3.1 Hanganalyze(挂起分析)

数据库挂起时,首先收集Hanganalyze:

-- 方法1:通过SQL*Plus
$ sqlplus / as sysdba

ORADEBUG SETMYPID
ORADEBUG UNLIMIT
ORADEBUG HANGANALYZE 3

-- 等待90秒后再次收集
-- (等待90秒)

ORADEBUG HANGANALYZE 3
ORADEBUG TRACEFILE_NAME

EXIT

3.2 Systemstate Dump

-- 收集Systemstate(建议收集3次,每次间隔90秒)
$ sqlplus / as sysdba

ORADEBUG SETMYPID
ORADEBUG UNLIMIT

ORADEBUG DUMP SYSTEMSTATE 10
-- 等待90秒
ORADEBUG DUMP SYSTEMSTATE 10
-- 等待90秒
ORADEBUG DUMP SYSTEMSTATE 10

ORADEBUG TRACEFILE_NAME

EXIT

提示:对于RAC环境,使用level 266可以收集集群范围的信息:ORADEBUG DUMP SYSTEMSTATE 266

3.3 Hanganalyze级别说明

级别 说明
1-2 仅显示挂起的会话
3 显示所有会话状态(推荐)
4 显示所有会话 + 堆栈信息
5+ 增加更多详细信息

相关文档

  • Note 61552.1 - Diagnosing Database Hanging Issues
  • Note 215858.1 - Interpreting HANGANALYZE trace files
  • Note 423153.1 - Understanding and Reading Systemstates

四、跟踪与调试

4.1 10046 SQL跟踪

会话级跟踪(当前会话)

-- 启用10046跟踪
ALTER SESSION SET TRACEFILE_IDENTIFIER = '10046_trace';
ALTER SESSION SET TIMED_STATISTICS = TRUE;
ALTER SESSION SET STATISTICS_LEVEL = ALL;
ALTER SESSION SET MAX_DUMP_FILE_SIZE = UNLIMITED;
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';

-- 执行需要跟踪的SQL
SELECT * FROM your_table WHERE ...;

-- 关闭跟踪
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';

跟踪其他会话

-- 1. 找到目标会话的进程信息
SELECT p.pid AS ora_pid, p.spid AS os_pid, s.sid
FROM v$process p, v$session s
WHERE s.paddr = p.addr
  AND s.sid = &session_id;

-- 2. 使用ORADEBUG跟踪(通过OS PID)
CONNECT / AS SYSDBA
ORADEBUG SETOSPID <os_pid>
ORADEBUG UNLIMIT
ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12

-- 3. 关闭跟踪
ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF
ORADEBUG TRACEFILE_NAME

系统级跟踪(谨慎使用)

-- 启用(影响所有会话)
ALTER SYSTEM SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';

-- 关闭
ALTER SYSTEM SET EVENTS '10046 TRACE NAME CONTEXT OFF';

4.2 10046跟踪级别

级别 内容
1 标准SQL跟踪
4 + 绑定变量值
8 + 等待事件
12 + 绑定变量 + 等待事件(推荐)

4.3 Errorstack(错误堆栈)

-- 系统级:捕获特定错误的堆栈
-- 示例:捕获ORA-30926
ALTER SYSTEM SET EVENTS '30926 TRACE NAME ERRORSTACK LEVEL 3';

-- 等待错误发生后关闭
ALTER SYSTEM SET EVENTS '30926 TRACE NAME ERRORSTACK OFF';

-- 会话级
ALTER SESSION SET EVENTS '30926 TRACE NAME ERRORSTACK LEVEL 3';
ALTER SESSION SET EVENTS '30926 TRACE NAME ERRORSTACK OFF';

4.4 进程函数堆栈

-- 用户进程
SELECT p.pid AS ora_pid, p.spid AS os_pid 
FROM v$session s, v$process p
WHERE s.paddr = p.addr AND s.sid = &sid;

ORADEBUG SETORAPID <ora_pid>
ORADEBUG DUMP ERRORSTACK 3
ORADEBUG TRACEFILE_NAME

-- 后台进程(如SMON)
SELECT p.spid FROM v$process p, v$bgprocess b
WHERE p.addr = b.paddr AND b.name = 'SMON';

ORADEBUG SETOSPID <smon_os_pid>
ORADEBUG DUMP ERRORSTACK 3
ORADEBUG TRACEFILE_NAME

4.5 操作系统级跟踪

操作系统 跟踪命令
Linux strace -fo /tmp/trace.out -p <pid>
Solaris truss -aefo /tmp/trace.out -p <pid>
AIX truss -aefo /tmp/trace.out -p <pid>
HP-UX tusc -afpo /tmp/trace.out <pid>

五、性能诊断

5.1 高Redo生成会话

-- 按块变化量排序
SELECT s.sid, s.serial#, s.username, 
       SUBSTR(s.program,1,30) AS program,
       i.block_changes
FROM v$session s, v$sess_io i
WHERE s.sid = i.sid
ORDER BY i.block_changes DESC;

-- 按Undo使用量排序
SELECT s.sid, s.serial#, s.username, 
       SUBSTR(s.program,1,30) AS program,
       t.used_ublk AS undo_blocks, 
       t.used_urec AS undo_records
FROM v$session s, v$transaction t
WHERE s.taddr = t.addr
ORDER BY t.used_ublk DESC, t.used_urec DESC;

相关文档:NOTE.167492.1 - How to Find Sessions Generating Lots of Redo

5.2 会话等待事件分析

-- 当前会话等待
SELECT sid, event, seq#, p1, p2, p3, wait_time, seconds_in_wait
FROM v$session_wait
WHERE sid = &sid
ORDER BY sid;

-- 活动等待事件
SELECT sid, event, seq#, p1, p2, p3 
FROM v$session_wait 
WHERE wait_time = 0 
  AND event NOT LIKE '%message%';

-- 会话状态统计
SELECT status, COUNT(*) FROM v$session GROUP BY status;

5.3 会话执行的SQL

-- 查看会话正在执行的SQL
SELECT s.sid, s.status, q.sql_text
FROM v$session s, v$sqltext q
WHERE s.sql_hash_value = q.hash_value
  AND s.sql_address = q.address
  AND s.sid = &sid
ORDER BY q.piece;

-- 通过OS PID查找会话
SELECT s.sid, s.serial#, s.username, s.status, s.program
FROM v$session s, v$process p
WHERE s.paddr = p.addr
  AND p.spid = '&os_pid';

5.4 AWR报告

-- 生成AWR报告(交互式)
@$ORACLE_HOME/rdbms/admin/awrrpt.sql

-- 生成特定时间段的AWR报告
@$ORACLE_HOME/rdbms/admin/awrrpti.sql

5.5 Statspack报告

-- 手动创建快照
CONNECT perfstat/perfstat
EXECUTE statspack.snap;

-- 生成报告
@$ORACLE_HOME/rdbms/admin/spreport.sql

六、空间管理

6.1 ORA-1652 临时表空间诊断

-- 查看临时段使用情况(10g+)
SELECT a.username, a.sid, a.serial#, a.osuser, 
       b.tablespace, b.blocks,
       ROUND(b.blocks * 8 / 1024, 2) AS mb,
       c.sql_text
FROM v$session a, v$tempseg_usage b, v$sqlarea c
WHERE a.saddr = b.session_addr
  AND c.address = a.sql_address
  AND c.hash_value = a.sql_hash_value
ORDER BY b.blocks DESC;

-- 查看临时段统计
SELECT tablespace_name, extent_size, total_extents, 
       used_extents, free_extents, max_used_size
FROM v$sort_segment;

-- 设置事件捕获ORA-1652
ALTER SYSTEM SET EVENTS '1652 TRACE NAME ERRORSTACK LEVEL 3';
-- 错误发生后关闭
ALTER SYSTEM SET EVENTS '1652 TRACE NAME ERRORSTACK OFF';

相关文档:Note 793380.1 - ORA-1652 Error Troubleshooting

6.2 表空间扩展错误诊断

-- 查看表空间最大连续空间
SELECT MAX(bytes)/1024/1024 AS max_free_mb 
FROM dba_free_space 
WHERE tablespace_name = '&tablespace_name';

-- 查看段的NEXT_EXTENT大小
SELECT segment_name, segment_type, owner,
       next_extent/1024/1024 AS next_extent_mb,
       pct_increase
FROM dba_segments 
WHERE segment_name = '&segment_name';

-- 检查表空间管理类型
SELECT tablespace_name, extent_management, segment_space_management
FROM dba_tablespaces 
WHERE tablespace_name = '&tablespace_name';

-- 检查数据文件自动扩展状态
SELECT file_name, 
       ROUND(bytes/1024/1024,2) AS size_mb,
       autoextensible,
       ROUND(maxbytes/1024/1024,2) AS max_mb
FROM dba_data_files 
WHERE tablespace_name = '&tablespace_name';

-- 检查临时文件
SELECT file_name, 
       ROUND(bytes/1024/1024,2) AS size_mb,
       autoextensible,
       ROUND(maxbytes/1024/1024,2) AS max_mb
FROM dba_temp_files 
WHERE tablespace_name = '&tablespace_name';

6.3 表空间告警阈值

-- 查看当前告警
SELECT reason, metric_value, message_type,
       TO_CHAR(creation_time,'YYYY-MM-DD HH24:MI:SS') AS creation_time
FROM dba_outstanding_alerts;

-- 查看表空间阈值设置
SELECT metrics_name, 
       warning_operator, warning_value,
       critical_operator, critical_value,
       object_type, object_name, status
FROM dba_thresholds
WHERE metrics_name LIKE '%Tablespace%';

-- 查看表空间使用率
SELECT tablespace_name, 
       used_space,
       tablespace_size,
       ROUND(used_percent,2) AS used_pct
FROM dba_tablespace_usage_metrics
ORDER BY used_percent DESC;

七、网络诊断

7.1 客户端SQL*Net跟踪

在客户端sqlnet.ora中添加(位于%TNS_ADMIN%$ORACLE_HOME/network/admin):

# 客户端跟踪配置
TRACE_LEVEL_CLIENT = 16
TRACE_FILE_CLIENT = client_trace
TRACE_DIRECTORY_CLIENT = /tmp/oracle_trace
TRACE_TIMESTAMP_CLIENT = ON
TRACE_UNIQUE_CLIENT = ON

# 11g客户端需要添加
DIAG_ADR_ENABLED = OFF

7.2 服务器端SQL*Net跟踪

在服务器sqlnet.ora中添加:

# 服务器端跟踪配置
TRACE_LEVEL_SERVER = 16
TRACE_FILE_SERVER = server_trace
TRACE_DIRECTORY_SERVER = /tmp/oracle_trace
TRACE_TIMESTAMP_SERVER = ON

# 循环跟踪(用于长时间或间歇性问题)
TRACE_FILELEN_SERVER = 10240    # KB
TRACE_FILENO_SERVER = 5         # 文件数量

# 11g服务器需要添加
DIAG_ADR_ENABLED = OFF

7.3 监听器跟踪

listener.ora中添加(将LISTENER替换为实际监听器名称):

# 监听器跟踪配置
TRACE_FILE_LISTENER = listener_trace
TRACE_LEVEL_LISTENER = SUPPORT
TRACE_TIMESTAMP_LISTENER = TRUE
TRACE_DIRECTORY_LISTENER = /tmp/oracle_trace

# 循环跟踪
TRACE_FILELEN_LISTENER = 10240
TRACE_FILENO_LISTENER = 5

# 11g监听器
DIAG_ADR_ENABLED_LISTENER = OFF

相关文档:Note 395525.1 - How to Enable Oracle SQLNet Tracing


八、备份恢复诊断

8.1 恢复状态检查脚本

-- =============================================
-- 备份恢复诊断脚本
-- =============================================
SET PAGESIZE 200
SET LINESIZE 200
COLUMN name FORMAT A60
COLUMN status FORMAT A10
COLUMN recover FORMAT A10
COLUMN fuzzy FORMAT A5

SPOOL recovery_diag.log

SHOW PARAMETER pfile;
ARCHIVE LOG LIST;

PROMPT ========== 备份状态 ==========
SELECT * FROM v$backup;

PROMPT ========== 数据文件状态 ==========
SELECT file#, status, SUBSTR(name,1,60) AS name FROM v$datafile;

PROMPT ========== 检查点一致性 ==========
SELECT DISTINCT checkpoint_change# FROM v$datafile_header;

PROMPT ========== 数据文件头详情 ==========
SELECT status, resetlogs_change#, resetlogs_time,
       checkpoint_change#,
       TO_CHAR(checkpoint_time,'YYYY-MM-DD HH24:MI:SS') AS checkpoint_time,
       COUNT(*) AS file_count
FROM v$datafile_header
GROUP BY status, resetlogs_change#, resetlogs_time, 
         checkpoint_change#, checkpoint_time
ORDER BY checkpoint_change#;

PROMPT ========== 恢复状态 ==========
SELECT SUBSTR(name,1,50) AS name, recover, fuzzy, 
       checkpoint_change#, resetlogs_change#
FROM v$datafile_header;

PROMPT ========== 数据库状态 ==========
SELECT name, open_mode, checkpoint_change#, archive_change# FROM v$database;

PROMPT ========== Redo日志组 ==========
SELECT group#, thread#, sequence#, members, archived, status, first_change#
FROM v$log;

PROMPT ========== Redo日志成员 ==========
SELECT group#, SUBSTR(member,1,60) AS member FROM v$logfile;

PROMPT ========== 需要恢复的文件 ==========
SELECT * FROM v$recover_file;

PROMPT ========== 需要的归档日志 ==========
SELECT * FROM v$recovery_log;

SPOOL OFF

8.2 数据文件头信息(X$表)

-- 详细的文件头信息
SELECT hxfil AS file_no,
       SUBSTR(hxfnm,1,50) AS file_name,
       fhtyp AS type,
       hxerr AS validity,
       fhscn AS scn,
       fhtnm AS tablespace_name,
       fhsta AS status,
       fhrba_seq AS sequence
FROM x$kcvfh;

九、系统管理

9.1 Scheduler诊断

-- =============================================
-- 调度器诊断脚本
-- =============================================
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'YYYY-MM-DD HH24:MI:SS TZR';
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

-- 调度窗口
SELECT window_name, window_priority, enabled, resource_plan,
       next_start_date, duration
FROM dba_scheduler_windows;

-- 窗口运行历史
SELECT log_date, window_name, req_start_date, actual_start_date,
       window_duration, actual_duration
FROM dba_scheduler_window_details
WHERE ROWNUM < 20
ORDER BY log_date DESC;

-- 作业运行历史
SELECT log_date, owner, job_name, status, error#,
       req_start_date, actual_start_date
FROM dba_scheduler_job_run_details
WHERE log_date > SYSDATE - 7
ORDER BY log_date DESC;

SHOW PARAMETER job_queue_processes;

相关文档:Note 783357.1 - Troubleshooting DBMS_SCHEDULER and DBMS_JOB

9.2 Resource Manager

-- 当前活动计划
SELECT * FROM v$rsrc_plan;

-- 所有资源计划
SELECT plan, comments, status FROM dba_rsrc_plans;

-- 消费者组
SELECT consumer_group, comments, status FROM dba_rsrc_consumer_groups;

-- 计划指令
SELECT plan, group_or_subplan, type, 
       cpu_p1, cpu_p2, cpu_p3, cpu_p4,
       parallel_degree_limit_p1, status
FROM dba_rsrc_plan_directives;

9.3 会话管理

-- 按用户统计会话
SELECT username, COUNT(*) AS sessions FROM v$session GROUP BY username ORDER BY 2 DESC;

-- 按机器统计
SELECT machine, COUNT(*) AS sessions FROM v$session GROUP BY machine ORDER BY 2 DESC;

-- 按程序统计
SELECT program, COUNT(*) AS sessions FROM v$session GROUP BY program ORDER BY 2 DESC;

-- 按状态统计
SELECT status, COUNT(*) AS sessions FROM v$session GROUP BY status;

-- 孤立进程
SELECT COUNT(*) AS orphan_processes 
FROM v$process 
WHERE addr NOT IN (SELECT paddr FROM v$session);

-- 不活动会话
SELECT username, program, sid, serial# 
FROM v$session 
WHERE status = 'INACTIVE';

9.4 共享内存和信号量

# 查看共享内存段
ipcs -m

# 删除共享内存段
ipcrm -m <shmid>

# 查看信号量
ipcs -s

# 删除信号量
ipcrm -s <semid>

# 查看Oracle拥有的资源
ipcs -a | grep oracle

十、实用工具与参考

10.1 DBMS_METADATA导出DDL

-- 获取表DDL
SET LONG 2000000
SELECT DBMS_METADATA.GET_DDL('TABLE', '&table_name', '&owner') FROM dual;

-- 获取表空间DDL
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', '&tablespace_name') FROM dual;

-- 获取索引DDL
SELECT DBMS_METADATA.GET_DDL('INDEX', '&index_name', '&owner') FROM dual;

10.2 隐藏参数查询

-- 查询隐藏参数值
SELECT a.ksppinm AS parameter,
       b.ksppstvl AS session_value,
       c.ksppstvl AS instance_value,
       a.ksppdesc AS description
FROM x$ksppi a, x$ksppcv b, x$ksppsv c
WHERE a.indx = b.indx 
  AND a.indx = c.indx
  AND a.ksppinm LIKE '%&parameter_name%';

10.3 用户默认表空间

SELECT username, user_id, default_tablespace, temporary_tablespace
FROM dba_users
WHERE username IN ('&user1', '&user2');

10.4 Shutdown Immediate挂起诊断

-- 设置跟踪后执行shutdown
CONNECT / AS SYSDBA
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
ALTER SESSION SET EVENTS '10400 TRACE NAME CONTEXT FOREVER, LEVEL 1';  -- 每5分钟dump systemstate
SHUTDOWN IMMEDIATE;

相关文档

  • Note 164504.1 - How to Check Why Shutdown Immediate Hangs
  • Note 375935.1 - What To Do When 'shutdown immediate' Hangs

10.5 重要事件参数

事件 用途 设置方法
10046 SQL跟踪 event="10046 trace name context forever, level 12"
10500 SMON跟踪 event="10500 trace name context forever, level 5"
10513 禁用事务恢复 event="10513 trace name context forever, level 2"

10.6 操作系统日志位置

操作系统 系统日志位置 查看命令
Linux /var/log/messages dmesg
Solaris /var/adm/messages -
AIX /var/adm/ras/errlog /bin/errpt -a
HP-UX /var/adm/syslog/syslog.log /usr/sbin/dmesg
Windows 事件查看器 导出日志列表

10.7 Catalog/Catproc重建

CONNECT / AS SYSDBA
STARTUP MIGRATE

@$ORACLE_HOME/rdbms/admin/catalog.sql
@$ORACLE_HOME/rdbms/admin/catproc.sql

SHUTDOWN IMMEDIATE
STARTUP

@$ORACLE_HOME/rdbms/admin/utlrp.sql

快速参考卡

常用诊断命令速查

场景 命令/脚本
数据库挂起 ORADEBUG HANGANALYZE 3
详细会话状态 ORADEBUG DUMP SYSTEMSTATE 10
SQL性能跟踪 ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12'
捕获特定错误 ALTER SYSTEM SET EVENTS '<error> TRACE NAME ERRORSTACK LEVEL 3'
进程堆转储 ORADEBUG DUMP HEAPDUMP 536870917
AWR报告 @$ORACLE_HOME/rdbms/admin/awrrpt.sql
无效对象编译 @$ORACLE_HOME/rdbms/admin/utlrp.sql