暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

Oracle DBA 应该掌握的 100 条命令(建议收藏)

原创 三笠丶 2026-07-21
313

前言

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 是 SID
  • 4567 是 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;

不要随意对 SYSTEMSYSAUX、当前 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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论