前言
Oracle DBA 的日常工作并不是简单地执行几条 SQL。数据库启动失败、会话阻塞、表空间告警、UNDO 异常、SQL 性能下降、归档堆积、备份失效、Data Guard 延迟,这些问题最终都需要通过命令和动态性能视图定位。
本文整理了 Oracle DBA 工作中使用频率较高的 100 条命令,覆盖实例管理、参数配置、会话排查、锁分析、SQL 性能、表空间、用户权限、UNDO、临时表空间、RMAN、Data Guard、RAC、Data Pump 和操作系统诊断等场景。

文中的用户名、路径、SID、SQL_ID、表空间名称和数据文件编号均为示例,执行时需要根据实际环境替换。涉及删除、恢复、强制终止会话等操作时,应先确认影响范围,避免直接在生产环境中照搬执行。
一、实例与数据库管理
1. 以 SYSDBA 身份登录数据库
sqlplus / as sysdba
远程登录可以使用:
sqlplus sys@orcl as sysdba
2. 启动数据库
STARTUP;
该命令依次完成实例启动、控制文件加载和数据库打开。
3. 启动数据库到 MOUNT 状态
STARTUP MOUNT;
MOUNT 状态通常用于数据库恢复、启用归档模式、修改数据文件路径等操作。
4. 启动数据库到 NOMOUNT 状态
STARTUP NOMOUNT;
NOMOUNT 状态通常用于创建数据库、重建控制文件或恢复控制文件。
5. 将数据库从 MOUNT 状态打开
ALTER DATABASE OPEN;
如果需要以只读方式打开:
ALTER DATABASE OPEN READ ONLY;
6. 正常关闭数据库
SHUTDOWN IMMEDIATE;
生产环境通常优先使用 IMMEDIATE,它会回滚未提交事务并断开用户连接,不需要等待所有会话主动退出。
7. 查看实例状态
SELECT instance_name,
host_name,
version,
status,
database_status,
startup_time
FROM v$instance;
8. 查看数据库状态和角色
SELECT name,
open_mode,
database_role,
log_mode,
protection_mode,
switchover_status
FROM v$database;
9. 查看数据库是否启用归档模式
ARCHIVE LOG LIST;
也可以执行:
SELECT log_mode
FROM v$database;
10. 查看数据库数据文件总大小
SELECT ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS datafile_gb
FROM dba_data_files;
该结果只统计永久数据文件,不包括临时文件、控制文件、联机重做日志和归档日志。
二、参数、控制文件和重做日志
11. 查看数据库参数
SHOW PARAMETER processes;
也可以查询动态性能视图:
SELECT name,
value,
isdefault,
issys_modifiable
FROM v$parameter
WHERE name = 'processes';
12. 在线修改数据库参数
ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH SID='*';
常用的 SCOPE 取值:
MEMORY:只修改当前实例,重启后失效SPFILE:只修改参数文件,重启后生效BOTH:同时修改内存和 SPFILE
13. 从 SPFILE 中删除参数
ALTER SYSTEM RESET open_cursors SCOPE=SPFILE SID='*';
删除静态参数后通常需要重启实例。
14. 根据 SPFILE 创建 PFILE
CREATE PFILE='/tmp/initorcl.ora' FROM SPFILE;
该命令常用于备份当前实例参数或修改无法正常启动的 SPFILE。
15. 根据 PFILE 创建 SPFILE
CREATE SPFILE FROM PFILE='/tmp/initorcl.ora';
RAC 环境应确认 SPFILE 是否位于 ASM 或共享存储中,不能直接覆盖正在使用的错误位置。
16. 查看控制文件位置
SHOW PARAMETER control_files;
也可以执行:
SELECT name
FROM v$controlfile;
17. 查看联机重做日志组和成员
SELECT l.group#,
l.thread#,
l.sequence#,
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. 手工切换联机重做日志
ALTER SYSTEM SWITCH LOGFILE;
该操作会结束当前日志组的写入,并切换到下一个可用日志组。
19. 手工执行检查点
ALTER SYSTEM CHECKPOINT;
检查点会推进控制文件和数据文件头中的检查点信息,但不等于将所有脏块立即写完。
20. 归档当前重做日志
ALTER SYSTEM ARCHIVE LOG CURRENT;
与 SWITCH LOGFILE 相比,该命令会等待当前日志完成归档,在备份和 Data Guard 运维中使用较多。
三、会话、事务和锁排查
21. 查看当前活动会话
SELECT sid,
serial#,
username,
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. 查看指定会话的详细信息
SELECT sid,
serial#,
username,
osuser,
machine,
program,
module,
action,
status,
event,
wait_class,
sql_id,
prev_sql_id,
logon_time
FROM v$session
WHERE sid = 123;
23. 按用户和程序统计连接数
SELECT username,
machine,
program,
status,
COUNT(*) AS session_count
FROM v$session
WHERE type = 'USER'
GROUP BY username, machine, program, status
ORDER BY session_count DESC;
该命令适合排查连接池连接泄漏、异常程序连接增长和数据库进程数不足。
24. 查看长时间运行的操作
SELECT sid,
serial#,
opname,
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. 查看被阻塞的会话
SELECT sid,
serial#,
username,
blocking_session,
event,
seconds_in_wait,
sql_id
FROM v$session
WHERE blocking_session IS NOT NULL
ORDER BY seconds_in_wait DESC;
26. 查看锁等待关系
SELECT a.sid AS blocker_sid,
b.sid AS waiter_sid,
a.id1,
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. 查看被锁定的对象
SELECT s.sid,
s.serial#,
s.username,
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. 强制终止会话
ALTER SYSTEM KILL SESSION '123,4567' IMMEDIATE;
其中:
123是 SID4567是 SERIAL#
RAC 环境中可以指定实例:
ALTER SYSTEM KILL SESSION '123,4567,@2' IMMEDIATE;
29. 断开数据库会话
ALTER SYSTEM DISCONNECT SESSION '123,4567' IMMEDIATE;
如果希望等待当前事务完成后再断开:
ALTER SYSTEM DISCONNECT SESSION '123,4567' POST_TRANSACTION;
30. 查看正在使用 UNDO 的事务
SELECT s.sid,
s.serial#,
s.username,
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;
四、SQL 性能诊断
31. 查看指定会话正在执行的 SQL
SELECT s.sid,
s.serial#,
s.sql_id,
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 文本
SELECT sql_text
FROM v$sqltext_with_newlines
WHERE sql_id = '&sql_id'
ORDER BY piece;
33. 查看累计执行时间最高的 SQL
SELECT *
FROM (
SELECT sql_id,
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
SELECT *
FROM (
SELECT sql_id,
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
SELECT *
FROM (
SELECT sql_id,
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
SELECT *
FROM (
SELECT sql_id,
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 查看执行计划
EXPLAIN PLAN FOR
SELECT *
FROM app_user.orders
WHERE order_id = 10001;
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY);
EXPLAIN PLAN 展示的是优化器预估执行计划,不一定等于 SQL 实际运行时使用的计划。
38. 查看 SQL 实际执行计划
SELECT *
FROM TABLE(
DBMS_XPLAN.DISPLAY_CURSOR(
sql_id => '&sql_id',
cursor_child_no => NULL,
format => 'ALLSTATS LAST +PEEKED_BINDS +OUTLINE'
)
);
要查看准确的每一步实际行数,SQL 执行时需要开启行源统计,例如使用:
SELECT /*+ GATHER_PLAN_STATISTICS */ ...
39. 查看 SQL 捕获到的绑定变量
SELECT sql_id,
child_number,
name,
position,
datatype_string,
value_string,
last_captured
FROM v$sql_bind_capture
WHERE sql_id = '&sql_id'
ORDER BY child_number, position;
绑定变量不会在每次执行时都被捕获,因此该视图中的值可能为空或不是最新值。
40. 查看指定会话累计等待事件
SELECT *
FROM (
SELECT event,
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. 查看永久表空间使用率,并计算自动扩展上限
SELECT d.tablespace_name,
ROUND(d.bytes / 1024 / 1024 / 1024, 2) AS current_gb,
ROUND(
(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. 查看数据文件信息
SELECT file_id,
tablespace_name,
file_name,
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. 查看临时文件信息
SELECT file_id,
tablespace_name,
file_name,
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. 为表空间增加数据文件
ALTER TABLESPACE USERS
ADD DATAFILE '/u01/oradata/ORCL/users02.dbf'
SIZE 10G
AUTOEXTEND ON NEXT 1G
MAXSIZE 40G;
执行前应确认文件系统剩余空间、Oracle 用户权限、数据库块大小和数据文件最大块数限制。
45. 调整数据文件大小
ALTER DATABASE DATAFILE
'/u01/oradata/ORCL/users02.dbf'
RESIZE 20G;
缩小数据文件时,如果目标位置之后仍存在已使用数据块,会返回 ORA-03297。
46. 开启数据文件自动扩展
ALTER DATABASE DATAFILE
'/u01/oradata/ORCL/users02.dbf'
AUTOEXTEND ON NEXT 1G MAXSIZE 40G;
不建议无规划地设置为 MAXSIZE UNLIMITED,尤其是在文件系统空间有限的环境中。
47. 将表空间设置为只读
ALTER TABLESPACE ARCHIVE_DATA READ ONLY;
恢复读写状态:
ALTER TABLESPACE ARCHIVE_DATA READ WRITE;
48. 将表空间脱机或联机
ALTER TABLESPACE APP_DATA OFFLINE IMMEDIATE;
恢复联机:
ALTER TABLESPACE APP_DATA ONLINE;
不要随意对 SYSTEM、SYSAUX、当前 UNDO 和当前默认临时表空间执行脱机操作。
49. 创建表空间
CREATE TABLESPACE APP_DATA
DATAFILE '/u01/oradata/ORCL/app_data01.dbf'
SIZE 20G
AUTOEXTEND ON NEXT 1G
MAXSIZE 100G
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
50. 删除表空间及其数据文件
DROP TABLESPACE APP_DATA
INCLUDING CONTENTS
AND DATAFILES;
这是不可逆的高风险操作。执行前必须确认对象归属、备份状态和业务影响。
六、段、对象、用户和权限
51. 查看数据库中最大的段
SELECT *
FROM (
SELECT owner,
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 占用空间
SELECT owner,
ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb
FROM dba_segments
GROUP BY owner
ORDER BY size_gb DESC;
53. 查看指定表段的大小
SELECT owner,
segment_name,
segment_type,
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. 查看索引状态
SELECT owner,
index_name,
table_name,
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. 查看失效对象
SELECT owner,
object_type,
object_name,
status
FROM dba_objects
WHERE status = 'INVALID'
ORDER BY owner, object_type, object_name;
56. 编译指定 Schema 下的失效对象
EXEC DBMS_UTILITY.COMPILE_SCHEMA( schema => 'APP_USER', compile_all => FALSE );
数据库升级或批量变更后,也可以执行 Oracle 自带脚本:
@?/rdbms/admin/utlrp.sql
57. 创建数据库用户
CREATE USER app_user
IDENTIFIED BY "StrongPassword_2026"
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp
PROFILE default;
在 Oracle 12c 及以上 CDB 环境中,应先确认当前容器,避免在 CDB 根容器中错误创建本地用户。
58. 授予用户登录权限
GRANT CREATE SESSION TO app_user;
根据业务需要再授予对象创建权限,不建议直接授予 DBA 角色。
例如:
GRANT CREATE TABLE,
CREATE VIEW,
CREATE PROCEDURE,
CREATE SEQUENCE
TO app_user;
59. 分配表空间配额
ALTER USER app_user
QUOTA 20G ON app_data;
授予无限配额:
ALTER USER app_user
QUOTA UNLIMITED ON app_data;
60. 锁定、解锁或强制用户修改密码
锁定用户:
ALTER USER app_user ACCOUNT LOCK;
解锁用户:
ALTER USER app_user ACCOUNT UNLOCK;
强制下次登录修改密码:
ALTER USER app_user PASSWORD EXPIRE;
修改密码并解锁:
ALTER USER app_user
IDENTIFIED BY "NewPassword_2026"
ACCOUNT UNLOCK;
七、临时表空间、UNDO 和统计信息
61. 查看临时表空间使用情况
SELECT tablespace_name,
ROUND(SUM(bytes_used) / 1024 / 1024 / 1024, 2) AS used_gb,
ROUND(SUM(bytes_free) / 1024 / 1024 / 1024, 2) AS free_gb,
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. 查看占用临时空间最多的会话
SELECT s.sid,
s.serial#,
s.username,
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. 查看临时段整体使用情况
SELECT tablespace_name,
current_users,
used_blocks,
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. 增加临时文件
ALTER TABLESPACE TEMP
ADD TEMPFILE '/u01/oradata/ORCL/temp02.dbf'
SIZE 20G
AUTOEXTEND ON NEXT 1G
MAXSIZE 50G;
65. 调整临时文件大小
ALTER DATABASE TEMPFILE
'/u01/oradata/ORCL/temp02.dbf'
RESIZE 30G;
缩小临时文件前,应确认当前临时段高水位和正在使用临时空间的会话。
66. 查看 UNDO 区间状态
SELECT tablespace_name,
status,
ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS size_gb
FROM dba_undo_extents
GROUP BY tablespace_name, status
ORDER BY tablespace_name, status;
UNDO 区间常见状态:
ACTIVE:正在被事务使用UNEXPIRED:事务已结束,但仍在保留期内EXPIRED:可以被重新使用
67. 查看占用 UNDO 最多的活动事务
SELECT s.sid,
s.serial#,
s.username,
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
SHOW PARAMETER undo_retention;
修改保留时间为 3600 秒:
ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;
UNDO_RETENTION 并不意味着所有 UNDO 一定会保留指定时间。当 UNDO 空间不足且未启用 RETENTION GUARANTEE 时,未过期区间仍可能被覆盖。
69. 收集 Schema 统计信息
BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(
ownname => 'APP_USER',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE AUTO',
degree => DBMS_STATS.AUTO_DEGREE,
cascade => TRUE
);
END;
/
70. 收集指定表的统计信息
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'APP_USER',
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 备份和恢复
以下命令在 RMAN 中执行。
71. 登录 RMAN
rman target /
远程连接示例:
rman target sys@orcl
72. 查看 RMAN 当前配置
SHOW ALL;
重点检查:
- 保留策略
- 控制文件自动备份
- 备份设备类型
- 备份并行度
- 归档日志删除策略
73. 查看数据库文件结构
REPORT SCHEMA;
该命令可以查看数据文件编号、数据文件大小和所属表空间,恢复单个数据文件时经常使用。
74. 查看备份摘要
LIST BACKUP SUMMARY;
查看更详细的数据库备份:
LIST BACKUP OF DATABASE;
75. 校验备份记录并清理失效记录
CROSSCHECK BACKUP;
DELETE NOPROMPT EXPIRED BACKUP;
EXPIRED 表示 RMAN 仓库中有记录,但实际备份文件无法找到,不等于备份已经超过保留策略。
76. 备份数据库和归档日志
BACKUP AS COMPRESSED BACKUPSET
DATABASE
PLUS ARCHIVELOG;
是否使用压缩备份集,应根据 CPU 资源、备份窗口和存储空间综合判断。
77. 备份归档日志并删除已备份文件
BACKUP ARCHIVELOG ALL DELETE INPUT;
Data Guard 环境中必须结合归档日志删除策略,避免归档日志尚未传输或应用就被删除。
78. 删除超过保留策略的备份
REPORT OBSOLETE;
DELETE NOPROMPT OBSOLETE;
执行删除前,建议先运行 REPORT OBSOLETE 检查即将删除的备份范围。
79. 校验数据库和归档日志
BACKUP VALIDATE CHECK LOGICAL
DATABASE
ARCHIVELOG ALL;
也可以验证现有备份是否能够被读取:
RESTORE DATABASE VALIDATE;
VALIDATE 不会真正恢复数据文件,但可以检查备份片可读性和部分物理、逻辑损坏。
80. 恢复单个数据文件
假设需要恢复 7 号数据文件:
RUN {
SQL 'ALTER DATABASE DATAFILE 7 OFFLINE';
RESTORE DATAFILE 7;
RECOVER DATAFILE 7;
SQL 'ALTER DATABASE DATAFILE 7 ONLINE';
}
SYSTEM、当前 UNDO、控制文件和数据库非归档模式下的数据文件恢复,处理流程可能不同,不能直接套用该命令。
九、Data Guard、RAC 和 PDB
81. 查看 Data Guard 数据库角色和保护模式
SELECT name,
database_role,
open_mode,
protection_mode,
protection_level,
switchover_status
FROM v$database;
82. 查看归档目标状态
SELECT dest_id,
status,
destination,
target,
archiver,
process,
transmit_mode,
error
FROM v$archive_dest_status
WHERE status <> 'INACTIVE'
ORDER BY dest_id;
如果 ERROR 列有内容,应进一步检查网络、服务名、归档路径、密码文件和备库状态。
83. 查看 Data Guard 日志缺口
SELECT thread#,
low_sequence#,
high_sequence#
FROM v$archive_gap;
该视图通常一次只显示当前需要处理的一个日志缺口,修复后可能还会显示后续缺口。
84. 查看备库日志应用进程
SELECT process,
status,
thread#,
sequence#,
block#,
blocks
FROM v$managed_standby
ORDER BY process;
常见进程包括:
RFS:接收主库日志MRP0:日志应用协调进程ARCH:归档进程
85. 启动备库实时日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE
USING CURRENT LOGFILE
DISCONNECT FROM SESSION;
较新版本中,即使不显式指定 USING CURRENT LOGFILE,也可能默认使用实时应用,但在不同版本环境中应以实际行为为准。
86. 停止备库日志应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
进行备库维护、切换或恢复操作前,经常需要先停止 MRP。
87. 查看备库最后接收和应用的日志序列
SELECT thread#,
MAX(sequence#) AS last_received,
MAX(
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 各实例状态
SELECT inst_id,
instance_name,
host_name,
version,
status,
database_status,
startup_time
FROM gv$instance
ORDER BY inst_id;
89. 统计 RAC 各实例会话数
SELECT inst_id,
username,
status,
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 及以上版本可以执行:
SHOW PDBS;
打开全部 PDB:
ALTER PLUGGABLE DATABASE ALL OPEN;
保存 PDB 打开状态:
ALTER PLUGGABLE DATABASE ALL SAVE STATE;
查看当前容器:
SHOW CON_NAME;
十、Scheduler、Data Pump、监听和操作系统诊断
91. 查看 Scheduler 作业状态
SELECT owner,
job_name,
enabled,
state,
last_start_date,
last_run_duration,
next_run_date,
failure_count
FROM dba_scheduler_jobs
ORDER BY owner, job_name;
92. 手工运行 Scheduler 作业
BEGIN
DBMS_SCHEDULER.RUN_JOB(
job_name => 'APP_USER.JOB_SYNC_DATA',
use_current_session => FALSE
);
END;
/
设置为 FALSE 时,作业在后台运行;设置为 TRUE 时,当前会话会等待作业执行完成。
93. 强制停止 Scheduler 作业
BEGIN
DBMS_SCHEDULER.STOP_JOB(
job_name => 'APP_USER.JOB_SYNC_DATA',
force => TRUE
);
END;
/
强制停止作业可能导致业务事务中断,应先确认作业当前正在执行的内容。
94. 创建 Data Pump 目录
首先在操作系统中创建目录:
mkdir -p /backup/dump chown oracle:oinstall /backup/dump chmod 750 /backup/dump
然后在数据库中创建目录对象:
CREATE OR REPLACE DIRECTORY DUMP_DIR AS '/backup/dump';
GRANT READ, WRITE ON DIRECTORY DUMP_DIR TO app_user;
Oracle 数据库不会自动创建操作系统目录。
95. 使用 expdp 导出 Schema
expdp system@orcl \ schemas=APP_USER \ directory=DUMP_DIR \ dumpfile=app_user_%U.dmp \ logfile=app_user_exp.log \ parallel=4 \ filesize=20G \ compression=all
多文件并行导出时,DUMPFILE 中应包含 %U。
96. 使用 impdp 导入并映射 Schema
impdp system@orcl \ directory=DUMP_DIR \ dumpfile=app_user_%U.dmp \ logfile=app_user_imp.log \ remap_schema=APP_USER:APP_USER_TEST \ remap_tablespace=APP_DATA:APP_DATA_TEST \ parallel=4
如果目标用户不存在,应根据导出内容和导入方式确认是否需要提前创建用户、表空间和配额。
97. 查看监听状态
lsnrctl status
查看监听支持的服务:
lsnrctl services
启动和停止监听:
lsnrctl start lsnrctl stop
98. 测试 Oracle 网络服务名
tnsping orcl
tnsping 只能验证客户端能否解析服务名并访问监听地址,不能证明数据库用户一定可以成功登录。
真正测试数据库连接应使用:
sqlplus app_user@orcl
99. 使用 ADRCI 查看告警日志
查看诊断目录:
adrci exec="show homes"
查看最近 100 行告警日志:
adrci exec="set homepath diag/rdbms/orcl/orcl; show alert -tail 100 -term"
持续跟踪告警日志:
adrci exec="set homepath diag/rdbms/orcl/orcl; show alert -tail -f"
其中 homepath 需要根据 show homes 的实际结果修改。
100. 在操作系统中查找 Oracle 实例和高 CPU 进程
查看服务器上的 Oracle 实例:
ps -ef | grep '[o]ra_pmon'
查看 CPU 使用率最高的 Oracle 进程:
ps -eo pid,ppid,%cpu,%mem,etime,args \
--sort=-%cpu | grep '[o]ra_' | head -20
拿到操作系统进程号后,可以在数据库中反查会话:
SELECT p.spid,
s.sid,
s.serial#,
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 的核心能力。
更多 Oracle、MySQL、PostgreSQL、SQL Server 数据库实战内容,可以访问 DBA 学习平台:ora100.com




