作者:三笠(Lucifer)前言
Oracle DBA 的日常工作并不是简单地执行几条 SQL。数据库启动失败、会话阻塞、表空间告警、UNDO 异常、SQL 性能下降、归档堆积、备份失效、Data Guard 延迟,这些问题最终都需要通过命令和动态性能视图定位。
本文整理了 Oracle DBA 工作中使用频率较高的 100 条命令,覆盖实例管理、参数配置、会话排查、锁分析、SQL 性能、表空间、用户权限、UNDO、临时表空间、RMAN、Data Guard、RAC、Data Pump 和操作系统诊断等场景。
文中的用户名、路径、SID、SQL_ID、表空间名称和数据文件编号均为示例,执行时需要根据实际环境替换。涉及删除、恢复、强制终止会话等操作时,应先确认影响范围,避免直接在生产环境中照搬执行。
1. 以 SYSDBA 身份登录数据库
远程登录可以使用:
2. 启动数据库
该命令依次完成实例启动、控制文件加载和数据库打开。
3. 启动数据库到 MOUNT 状态
MOUNT 状态通常用于数据库恢复、启用归档模式、修改数据文件路径等操作。
4. 启动数据库到 NOMOUNT 状态
NOMOUNT 状态通常用于创建数据库、重建控制文件或恢复控制文件。
5. 将数据库从 MOUNT 状态打开
如果需要以只读方式打开:
6. 正常关闭数据库
生产环境通常优先使用 IMMEDIATE,它会回滚未提交事务并断开用户连接,不需要等待所有会话主动退出。
7. 查看实例状态
status,
database_status,
startup_time
FROM v$instance;
8. 查看数据库状态和角色
log_mode,
protection_mode,
switchover_status
FROM v$database;
9. 查看数据库是否启用归档模式
也可以执行:
10. 查看数据库数据文件总大小
该结果只统计永久数据文件,不包括临时文件、控制文件、联机重做日志和归档日志。
11. 查看数据库参数
也可以查询动态性能视图:
issys_modifiable
FROM v$parameter
WHERE name = ‘processes’;
12. 在线修改数据库参数
常用的 SCOPE 取值:
13. 从 SPFILE 中删除参数
删除静态参数后通常需要重启实例。
14. 根据 SPFILE 创建 PFILE
该命令常用于备份当前实例参数或修改无法正常启动的 SPFILE。
15. 根据 PFILE 创建 SPFILE
RAC 环境应确认 SPFILE 是否位于 ASM 或共享存储中,不能直接覆盖正在使用的错误位置。
16. 查看控制文件位置
也可以执行:
17. 查看联机重做日志组和成员
l.bytes / 1024 / 1024 AS size_mb,
l.status,
l.archived,
f.member
FROM v$log l
JOIN v$logfile f
ON l.group# = f.group#
ORDER BY l.thread#, l.group#, f.member;
18. 手工切换联机重做日志
该操作会结束当前日志组的写入,并切换到下一个可用日志组。
19. 手工执行检查点
检查点会推进控制文件和数据文件头中的检查点信息,但不等于将所有脏块立即写完。
20. 归档当前重做日志
与 SWITCH LOGFILE 相比,该命令会等待当前日志完成归档,在备份和 Data Guard 运维中使用较多。
21. 查看当前活动会话
status,
machine,
program,
event,
sql_id,
last_call_et
FROM v$session
WHERE type = ‘USER’
AND status = ‘ACTIVE’
ORDER BY last_call_et DESC;
22. 查看指定会话的详细信息
osuser,
machine,
program,
module,
action,
status,
event,
wait_class,
sql_id,
prev_sql_id,
logon_time
FROM v$session
WHERE sid = 123;
23. 按用户和程序统计连接数
status,
COUNT(*) AS session_count
FROM v$session
WHERE type = ‘USER’
GROUP BY username, machine, program, status
ORDER BY session_count DESC;
该命令适合排查连接池连接泄漏、异常程序连接增长和数据库进程数不足。
24. 查看长时间运行的操作
target,
sofar,
totalwork,
units,
ROUND(sofar / NULLIF(totalwork, 0) * 100, 2) AS progress_pct,
elapsed_seconds,
time_remaining
FROM v$session_longops
WHERE sofar <> totalwork
ORDER BY start_time;
并不是所有 SQL 都会出现在 v$session_longops 中,通常大表扫描、备份恢复、统计信息收集等操作更容易被记录。
25. 查看被阻塞的会话
blocking_session,
event,
seconds_in_wait,
sql_id
FROM v$session
WHERE blocking_session IS NOT NULL
ORDER BY seconds_in_wait DESC;
26. 查看锁等待关系
a.id2,
b.request,
b.lmode
FROM v$lock a
JOIN v$lock b
ON a.id1 = b.id1
AND a.id2 = b.id2
WHERE a.block = 1
AND b.request > 0;
该查询可以快速找到持锁会话和等待会话之间的关系。
27. 查看被锁定的对象
o.owner,
o.object_name,
o.object_type,
l.locked_mode
FROM v$locked_object l
JOIN dba_objects o
ON l.object_id = o.object_id
JOIN v$session s
ON l.session_id = s.sid
ORDER BY s.sid;
28. 强制终止会话
其中:
RAC 环境中可以指定实例:
29. 断开数据库会话
如果希望等待当前事务完成后再断开:
30. 查看正在使用 UNDO 的事务
t.start_time,
t.used_ublk,
t.used_urec,
ROUND(
t.used_ublk *
TO_NUMBER((SELECT value
FROM v$parameter
WHERE name = ‘db_block_size’))
/ 1024 / 1024,
2
) AS undo_mb
FROM v$transaction t
JOIN v$session s
ON t.ses_addr = s.saddr
ORDER BY t.used_ublk DESC;
31. 查看指定会话正在执行的 SQL
q.sql_text
FROM v$session s
LEFT JOIN v$sql q
ON s.sql_id = q.sql_id
AND s.sql_child_number = q.child_number
WHERE s.sid = 123;
32. 根据 SQL_ID 查看完整 SQL 文本
ORDER BY piece;
33. 查看累计执行时间最高的 SQL
executions,
ROUND(elapsed_time / 1000000, 2) AS elapsed_seconds,
ROUND(
elapsed_time / NULLIF(executions, 0) / 1000000,
4
) AS avg_elapsed_seconds,
sql_text
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
)
WHERE ROWNUM <= 20;
34. 查看 CPU 消耗最高的 SQL
executions,
ROUND(cpu_time / 1000000, 2) AS cpu_seconds,
ROUND(
cpu_time / NULLIF(executions, 0) / 1000000,
4
) AS avg_cpu_seconds,
sql_text
FROM v$sql
WHERE executions > 0
ORDER BY cpu_time DESC
)
WHERE ROWNUM <= 20;
35. 查看逻辑读最高的 SQL
executions,
buffer_gets,
ROUND(
buffer_gets / NULLIF(executions, 0),
2
) AS gets_per_exec,
sql_text
FROM v$sql
WHERE executions > 0
ORDER BY buffer_gets DESC
)
WHERE ROWNUM <= 20;
36. 查看物理读最高的 SQL
executions,
disk_reads,
ROUND(
disk_reads / NULLIF(executions, 0),
2
) AS reads_per_exec,
sql_text
FROM v$sql
WHERE executions > 0
ORDER BY disk_reads DESC
)
WHERE ROWNUM <= 20;
37. 使用 EXPLAIN PLAN 查看执行计划
WHERE order_id = 10001;
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY);
EXPLAIN PLAN 展示的是优化器预估执行计划,不一定等于 SQL 实际运行时使用的计划。
38. 查看 SQL 实际执行计划
sql_id => ‘&sql_id’,
cursor_child_no => NULL,
format => ‘ALLSTATS LAST +PEEKED_BINDS +OUTLINE’
)
);
要查看准确的每一步实际行数,SQL 执行时需要开启行源统计,例如使用:
39. 查看 SQL 捕获到的绑定变量
position,
datatype_string,
value_string,
last_captured
FROM v$sql_bind_capture
WHERE sql_id = ‘&sql_id’
ORDER BY child_number, position;
绑定变量不会在每次执行时都被捕获,因此该视图中的值可能为空或不是最新值。
40. 查看指定会话累计等待事件
total_waits,
time_waited,
average_wait,
max_wait
FROM v$session_event
WHERE sid = 123
ORDER BY time_waited DESC
)
WHERE ROWNUM <= 20;
该结果是会话生命周期内的累计等待情况,不只是当前 SQL 的等待数据。
41. 查看永久表空间使用率,并计算自动扩展上限
(d.bytes – NVL(f.bytes, 0)) / 1024 / 1024 / 1024,
2
) AS used_gb,
ROUND(NVL(f.bytes, 0) / 1024 / 1024 / 1024, 2) AS free_gb,
ROUND(
(d.bytes – NVL(f.bytes, 0)) / d.bytes * 100,
2
) AS current_used_pct,
ROUND(d.maxbytes / 1024 / 1024 / 1024, 2) AS max_gb,
ROUND(
(d.maxbytes – d.bytes + NVL(f.bytes, 0))
/ 1024 / 1024 / 1024,
2
) AS remaining_to_max_gb
FROM (
SELECT tablespace_name,
SUM(bytes) AS bytes,
SUM(
CASE
WHEN autoextensible = ‘YES’ THEN maxbytes
ELSE bytes
END
) AS maxbytes
FROM dba_data_files
GROUP BY tablespace_name
) d
LEFT JOIN (
SELECT tablespace_name,
SUM(bytes) AS bytes
FROM dba_free_space
GROUP BY tablespace_name
) f
ON d.tablespace_name = f.tablespace_name
ORDER BY current_used_pct DESC;
42. 查看数据文件信息
ROUND(bytes / 1024 / 1024 / 1024, 2) AS current_gb,
autoextensible,
ROUND(maxbytes / 1024 / 1024 / 1024, 2) AS max_gb,
status
FROM dba_data_files
ORDER BY tablespace_name, file_id;
43. 查看临时文件信息
ROUND(bytes / 1024 / 1024 / 1024, 2) AS current_gb,
autoextensible,
ROUND(maxbytes / 1024 / 1024 / 1024, 2) AS max_gb,
status
FROM dba_temp_files
ORDER BY tablespace_name, file_id;
44. 为表空间增加数据文件
AUTOEXTEND ON NEXT 1G
MAXSIZE 40G;
执行前应确认文件系统剩余空间、Oracle 用户权限、数据库块大小和数据文件最大块数限制。
45. 调整数据文件大小
缩小数据文件时,如果目标位置之后仍存在已使用数据块,会返回 ORA-03297。
46. 开启数据文件自动扩展
不建议无规划地设置为 MAXSIZE UNLIMITED,尤其是在文件系统空间有限的环境中。
47. 将表空间设置为只读
恢复读写状态:
48. 将表空间脱机或联机
恢复联机:
不要随意对 SYSTEM、SYSAUX、当前 UNDO 和当前默认临时表空间执行脱机操作。
49. 创建表空间
AUTOEXTEND ON NEXT 1G
MAXSIZE 100G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
50. 删除表空间及其数据文件
这是不可逆的高风险操作。执行前必须确认对象归属、备份状态和业务影响。
51. 查看数据库中最大的段
segment_name,
partition_name,
segment_type,
tablespace_name,
ROUND(bytes / 1024 / 1024 / 1024, 2) AS size_gb
FROM dba_segments
ORDER BY bytes DESC
)
WHERE ROWNUM <= 30;
52. 查看各 Schema 占用空间
GROUP BY owner
ORDER BY size_gb DESC;
53. 查看指定表段的大小
ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb
FROM dba_segments
WHERE owner = ‘APP_USER’
AND segment_name = ‘ORDERS’
GROUP BY owner, segment_name, segment_type;
该查询只统计指定名称的段。如果表包含 LOB、分区和索引,还需要分别统计相关段。
54. 查看索引状态
index_type,
status,
visibility,
tablespace_name,
last_analyzed
FROM dba_indexes
WHERE owner = ‘APP_USER’
ORDER BY table_name, index_name;
Oracle 11g 中如果视图不存在 VISIBILITY 列,可以从查询中删除该列。
55. 查看失效对象
status
FROM dba_objects
WHERE status = ‘INVALID’
ORDER BY owner, object_type, object_name;
56. 编译指定 Schema 下的失效对象
);
数据库升级或批量变更后,也可以执行 Oracle 自带脚本:
57. 创建数据库用户
TEMPORARY TABLESPACE temp
PROFILE default;
在 Oracle 12c 及以上 CDB 环境中,应先确认当前容器,避免在 CDB 根容器中错误创建本地用户。
58. 授予用户登录权限
根据业务需要再授予对象创建权限,不建议直接授予 DBA 角色。
例如:
CREATE SEQUENCE
TO app_user;
59. 分配表空间配额
授予无限配额:
60. 锁定、解锁或强制用户修改密码
锁定用户:
解锁用户:
强制下次登录修改密码:
修改密码并解锁:
61. 查看临时表空间使用情况
ROUND(
SUM(bytes_used) /
NULLIF(SUM(bytes_used) + SUM(bytes_free), 0) * 100,
2
) AS used_pct
FROM v$temp_space_header
GROUP BY tablespace_name;
62. 查看占用临时空间最多的会话
s.sql_id,
u.tablespace,
u.segtype,
ROUND(
u.blocks * t.block_size / 1024 / 1024,
2
) AS temp_mb
FROM v$tempseg_usage u
JOIN v$session s
ON u.session_addr = s.saddr
JOIN dba_tablespaces t
ON u.tablespace = t.tablespace_name
ORDER BY temp_mb DESC;
63. 查看临时段整体使用情况
free_blocks,
ROUND(used_blocks * block_size / 1024 / 1024, 2) AS used_mb,
ROUND(free_blocks * block_size / 1024 / 1024, 2) AS free_mb
FROM v$sort_segment;
64. 增加临时文件
AUTOEXTEND ON NEXT 1G
MAXSIZE 50G;
65. 调整临时文件大小
缩小临时文件前,应确认当前临时段高水位和正在使用临时空间的会话。
66. 查看 UNDO 区间状态
FROM dba_undo_extents
GROUP BY tablespace_name, status
ORDER BY tablespace_name, status;
UNDO 区间常见状态:
67. 查看占用 UNDO 最多的活动事务
s.sql_id,
t.start_time,
t.used_ublk,
t.used_urec,
ROUND(
t.used_ublk *
TO_NUMBER((SELECT value
FROM v$parameter
WHERE name = ‘db_block_size’))
/ 1024 / 1024,
2
) AS undo_mb
FROM v$transaction t
JOIN v$session s
ON t.ses_addr = s.saddr
ORDER BY undo_mb DESC;
68. 查看和修改 UNDO_RETENTION
修改保留时间为 3600 秒:
UNDO_RETENTION 并不意味着所有 UNDO 一定会保留指定时间。当 UNDO 空间不足且未启用 RETENTION GUARANTEE 时,未过期区间仍可能被覆盖。
69. 收集 Schema 统计信息
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO’,
degree => DBMS_STATS.AUTO_DEGREE,
cascade => TRUE
);
END;
/
70. 收集指定表的统计信息
tabname => ‘ORDERS’,
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO’,
degree => DBMS_STATS.AUTO_DEGREE,
cascade => TRUE,
no_invalidate => FALSE
);
END;
/
生产环境收集大表统计信息时,需要评估并行度、采样比例、执行窗口和执行计划变化风险。
以下命令在 RMAN 中执行。
71. 登录 RMAN
远程连接示例:
72. 查看 RMAN 当前配置
重点检查:
73. 查看数据库文件结构
该命令可以查看数据文件编号、数据文件大小和所属表空间,恢复单个数据文件时经常使用。
74. 查看备份摘要
查看更详细的数据库备份:
75. 校验备份记录并清理失效记录
EXPIRED 表示 RMAN 仓库中有记录,但实际备份文件无法找到,不等于备份已经超过保留策略。
76. 备份数据库和归档日志
是否使用压缩备份集,应根据 CPU 资源、备份窗口和存储空间综合判断。
77. 备份归档日志并删除已备份文件
Data Guard 环境中必须结合归档日志删除策略,避免归档日志尚未传输或应用就被删除。
78. 删除超过保留策略的备份
执行删除前,建议先运行 REPORT OBSOLETE 检查即将删除的备份范围。
79. 校验数据库和归档日志
也可以验证现有备份是否能够被读取:
VALIDATE 不会真正恢复数据文件,但可以检查备份片可读性和部分物理、逻辑损坏。
80. 恢复单个数据文件
假设需要恢复 7 号数据文件:
RECOVER DATAFILE 7;
SQL ‘ALTER DATABASE DATAFILE 7 ONLINE’;
}
SYSTEM、当前 UNDO、控制文件和数据库非归档模式下的数据文件恢复,处理流程可能不同,不能直接套用该命令。
81. 查看 Data Guard 数据库角色和保护模式
protection_mode,
protection_level,
switchover_status
FROM v$database;
82. 查看归档目标状态
target,
archiver,
process,
transmit_mode,
error
FROM v$archive_dest_status
WHERE status <> ‘INACTIVE’
ORDER BY dest_id;
如果 ERROR 列有内容,应进一步检查网络、服务名、归档路径、密码文件和备库状态。
83. 查看 Data Guard 日志缺口
FROM v$archive_gap;
该视图通常一次只显示当前需要处理的一个日志缺口,修复后可能还会显示后续缺口。
84. 查看备库日志应用进程
sequence#,
block#,
blocks
FROM v$managed_standby
ORDER BY process;
常见进程包括:
85. 启动备库实时日志应用
较新版本中,即使不显式指定 USING CURRENT LOGFILE,也可能默认使用实时应用,但在不同版本环境中应以实际行为为准。
86. 停止备库日志应用
进行备库维护、切换或恢复操作前,经常需要先停止 MRP。
87. 查看备库最后接收和应用的日志序列
CASE
WHEN applied = ‘YES’ THEN sequence#
END
) AS last_applied
FROM v$archived_log
GROUP BY thread#
ORDER BY thread#;
仅比较日志序列号不能完整反映延迟时间,还应结合归档日志时间、v$dataguard_stats 和业务恢复点综合判断。
88. 查看 RAC 各实例状态
version,
status,
database_status,
startup_time
FROM gv$instance
ORDER BY inst_id;
89. 统计 RAC 各实例会话数
COUNT(*) AS session_count
FROM gv$session
WHERE type = ‘USER’
GROUP BY inst_id, username, status
ORDER BY inst_id, session_count DESC;
该命令可以检查业务连接是否均衡分布在 RAC 各节点。
90. 查看并打开 PDB
Oracle 12c 及以上版本可以执行:
打开全部 PDB:
保存 PDB 打开状态:
查看当前容器:
91. 查看 Scheduler 作业状态
state,
last_start_date,
last_run_duration,
next_run_date,
failure_count
FROM dba_scheduler_jobs
ORDER BY owner, job_name;
92. 手工运行 Scheduler 作业
use_current_session => FALSE
);
END;
/
设置为 FALSE 时,作业在后台运行;设置为 TRUE 时,当前会话会等待作业执行完成。
93. 强制停止 Scheduler 作业
force => TRUE
);
END;
/
强制停止作业可能导致业务事务中断,应先确认作业当前正在执行的内容。
94. 创建 Data Pump 目录
首先在操作系统中创建目录:
然后在数据库中创建目录对象:
Oracle 数据库不会自动创建操作系统目录。
95. 使用 expdp 导出 Schema
dumpfile=app_user_%U.dmp \
logfile=app_user_exp.log \
parallel=4 \
filesize=20G \
compression=all
多文件并行导出时,DUMPFILE 中应包含 %U。
96. 使用 impdp 导入并映射 Schema
logfile=app_user_imp.log \
remap_schema=APP_USER:APP_USER_TEST \
remap_tablespace=APP_DATA:APP_DATA_TEST \
parallel=4
如果目标用户不存在,应根据导出内容和导入方式确认是否需要提前创建用户、表空间和配额。
97. 查看监听状态
查看监听支持的服务:
启动和停止监听:
98. 测试 Oracle 网络服务名
tnsping 只能验证客户端能否解析服务名并访问监听地址,不能证明数据库用户一定可以成功登录。
真正测试数据库连接应使用:
99. 使用 ADRCI 查看告警日志
查看诊断目录:
查看最近 100 行告警日志:
持续跟踪告警日志:
其中 homepath 需要根据 show homes 的实际结果修改。
100. 在操作系统中查找 Oracle 实例和高 CPU 进程
查看服务器上的 Oracle 实例:
查看 CPU 使用率最高的 Oracle 进程:
拿到操作系统进程号后,可以在数据库中反查会话:
s.username,
s.status,
s.event,
s.sql_id,
s.machine,
s.program
FROM v$process p
JOIN v$session s
ON p.addr = s.paddr
WHERE p.spid = ‘&os_pid’;
Oracle DBA 真正需要掌握的并不是“记住多少条命令”,而是知道每条命令应该在什么场景下执行、查询结果说明了什么、下一步应该验证什么。
看到 CPU 高,不能只查高 CPU SQL,还要判断是 SQL 计算量大、解析频繁、并行失控,还是大量会话被唤醒后争抢 CPU;看到表空间使用率高,也不能立即增加数据文件,而应先区分真实业务增长、异常段膨胀、回收站占用、LOB 增长还是数据文件自动扩展配置不合理。
命令只是入口,判断路径才是 DBA 的核心能力。
版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除
想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

17认证网








