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

正规官方授权
更专业・更权威

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

转自:DBA学习之路
作者:三笠(Lucifer)前言

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_modeFROM v$database;

10. 查看数据库数据文件总大小

SELECT ROUND(SUM(bytes) / 1024 / 1024 / 1024, 2) AS datafile_gbFROM 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 nameFROM 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_textFROM v$sqltext_with_newlinesWHERE 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 FORSELECT *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 USERSADD 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_DATADATAFILE ‘/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_DATAINCLUDING CONTENTSAND 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_gbFROM 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_userIDENTIFIED 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_userQUOTA 20G ON app_data;

授予无限配额:

ALTER USER app_userQUOTA 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_userIDENTIFIED 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 TEMPADD 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 统计信息

BEGINDBMS_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. 收集指定表的统计信息

BEGINDBMS_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 BACKUPSETDATABASEPLUS ARCHIVELOG;

是否使用压缩备份集,应根据 CPU 资源、备份窗口和存储空间综合判断。

77. 备份归档日志并删除已备份文件

BACKUP ARCHIVELOG ALL DELETE INPUT;

Data Guard 环境中必须结合归档日志删除策略,避免归档日志尚未传输或应用就被删除。

78. 删除超过保留策略的备份

REPORT OBSOLETE;DELETE NOPROMPT OBSOLETE;

执行删除前,建议先运行 REPORT OBSOLETE 检查即将删除的备份范围。

79. 校验数据库和归档日志

BACKUP VALIDATE CHECK LOGICALDATABASEARCHIVELOG 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 DATABASEUSING CURRENT LOGFILEDISCONNECT 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 作业

BEGINDBMS_SCHEDULER.RUN_JOB(job_name            => ‘APP_USER.JOB_SYNC_DATA’,

use_current_session => FALSE

);

END;

/

设置为 FALSE 时,作业在后台运行;设置为 TRUE 时,当前会话会等待作业执行完成。

93. 强制停止 Scheduler 作业

BEGINDBMS_SCHEDULER.STOP_JOB(job_name => ‘APP_USER.JOB_SYNC_DATA’,

force    => TRUE

);

END;

/

强制停止作业可能导致业务事务中断,应先确认作业当前正在执行的内容。

94. 创建 Data Pump 目录

首先在操作系统中创建目录:

mkdir -p /backup/dumpchown oracle:oinstall /backup/dumpchmod 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 startlsnrctl 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 的核心能力。

 

版权申明:内容来源网络,版权归原创者所有,如有侵权请联系删除

想了解更多干货,可通过下方扫码关注

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

未经允许不得转载:17认证网 » Oracle DBA 应该掌握的 100 条命令(建议收藏)
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师