3. Oracle实例与数据库状态监控
在Oracle运维体系中,实例与数据库的状态监控是所有后续诊断工作的起点。一个实例是否正常启动、数据库是否已打开、归档模式是否开启、当前角色是主库还是备库,这些信息决定了我们能否连接、能否备份、能否切换,也决定了后续性能分析是否有意义。Oracle提供了三个核心动态性能视图来回答这些问题:V$INSTANCE、V$DATABASE和V$DIAG_INFO。本节围绕这三个视图,讲清楚它们各自回答什么问题、关键字段如何解读,以及如何组合成一次完整的实例与数据库状态巡检。
一、V$INSTANCE:实例层面的启动状态
V$INSTANCE描述的是当前连接的实例本身,它回答的是“实例处于什么阶段”。最关键的字段是STATUS,常见取值包括STARTED、MOUNTED、OPEN和OPEN MIGRATE。其中STARTED表示实例已分配内存并启动后台进程,但尚未挂载控制文件;MOUNTED表示已读取控制文件、知道数据文件和日志文件的位置,但数据文件尚未打开;OPEN才是正常对外提供服务的状态。运维中如果发现STATUS长期停留在MOUNTED,通常意味着数据库处于归档模式切换、恢复或维护窗口,需要结合告警日志确认。
除状态外,V$INSTANCE还提供INSTANCE_NAME、HOST_NAME、VERSION、STARTUP_TIME、DATABASE_STATUS和ACTIVE_STATE等字段。STARTUP_TIME用于判断实例是否发生过意外重启——如果它比预期时间新,说明实例可能因故障或人为操作重启过。ACTIVE_STATE在RAC环境中尤为重要,取值NORMAL表示实例正常参与集群,QUIESCING或QUIESCED表示实例被静默,此时只有DBA会话可以操作,普通业务连接会被挂起。日常巡检中,一条典型查询如下:
SELECT instance_name, host_name, status, database_status,
startup_time, active_state
FROM v$instance;
如果返回的STATUS为OPEN、DATABASE_STATUS为ACTIVE、ACTIVE_STATE为NORMAL,说明实例处于健康状态。若DATABASE_STATUS显示SUSPENDED,则说明数据库被挂起,I/O被冻结,常见于某些存储维护或人为执行ALTER SYSTEM SUSPEND之后,必须尽快恢复。
二、V$DATABASE:数据库层面的打开模式与角色
V$DATABASE描述的是数据库整体,它回答的是“数据库以什么方式打开、承担什么角色”。核心字段包括OPEN_MODE、LOG_MODE、DATABASE_ROLE、PROTECTION_MODE、SWITCHOVER_STATUS和FLASHBACK_ON。
OPEN_MODE常见取值有READ WRITE、READ ONLY、MOUNTED和READ ONLY WITH APPLY。生产主库应为READ WRITE;READ ONLY多用于报表库或只读备库;READ ONLY WITH APPLY是Active Data Guard备库的典型状态,表示备库在只读打开的同时持续应用主库传来的日志。LOG_MODE只有ARCHIVELOG和NOARCHIVELOG两种,生产库必须为ARCHIVELOG,否则无法做在线备份,也无法支撑Data Guard。DATABASE_ROLE取值为PRIMARY、PHYSICAL STANDBY或LOGICAL STANDBY,是判断主备关系最直接的依据。
在Data Guard环境中,SWITCHOVER_STATUS用于判断当前是否具备切换条件。主库上若显示TO STANDBY或SESSIONS ACTIVE,说明可以执行切换;若显示NOT ALLOWED,则说明存在未同步的日志或配置问题,需要先排查。PROTECTION_MODE则反映保护级别,如MAXIMUM PERFORMANCE、MAXIMUM AVAILABILITY、MAXIMUM PROTECTION,它决定了主库提交事务时对备库日志写入的等待策略。巡检查询可写为:
SELECT name, db_unique_name, open_mode, log_mode,
database_role, protection_mode, switchover_status
FROM v$database;
把V$INSTANCE与V$DATABASE结合,就能形成“实例是否打开 + 数据库以何种模式打开 + 承担什么角色”的完整判断。例如STATUS=OPEN且OPEN_MODE=READ WRITE且DATABASE_ROLE=PRIMARY,是主库正常服务的标准组合;而STATUS=OPEN、OPEN_MODE=READ ONLY WITH APPLY、DATABASE_ROLE=PHYSICAL STANDBY,则是Active Data Guard备库的正常组合。
三、V$DIAG_INFO:诊断基础设施的落点
V$DIAG_INFO不直接反映实例启停,但它告诉我们诊断文件写到了哪里,是排障时定位告警日志、跟踪文件和健康检查报告的入口。关键条目包括Default Trace File、Diag Trace、Diag Alert、ADR Base和ADR Home。Diag Alert指向alert.log所在目录,实例启动、关闭、归档切换、ORA-错误都会记录在这里;Default Trace File是当前会话的跟踪文件路径,执行ALTER SESSION SET EVENTS或开启SQL跟踪后,结果就写入该文件。
SELECT name, value
FROM v$diag_info
WHERE name IN ('ADR Base','ADR Home','Diag Alert','Default Trace File');
当实例状态异常时,正确的顺序是先用V$INSTANCE和V$DATABASE确认当前状态,再用V$DIAG_INFO找到alert.log,从日志中读取最近一次启动、关闭或报错的时间点和原因。这样就把“状态视图”和“诊断文件”串成了一条完整的排障链路。
四、组合巡检与常见异常判断
把三个视图组合成一次巡检,建议按固定顺序执行:先查V$INSTANCE确认实例是否OPEN、是否被静默;再查V$DATABASE确认打开模式、归档模式和角色是否符合预期;最后查V$DIAG_INFO拿到alert.log路径,在状态异常时立即读取日志。这个顺序的价值在于:状态视图给出“现在是什么”,诊断视图给出“为什么变成这样”。
几种典型异常需要重点识别。第一,STATUS=MOUNTED且OPEN_MODE=MOUNTED,说明实例已挂载但数据库未打开,常见于恢复未完成、数据文件缺失或人为ALTER DATABASE MOUNT后未打开,此时业务连接会报ORA-01033或ORA-01507。第二,DATABASE_STATUS=SUSPENDED,I/O被冻结,所有用户事务挂起,必须执行ALTER SYSTEM RESUME恢复。第三,LOG_MODE=NOARCHIVELOG,生产库处于非归档模式,无法在线备份,也无法搭建Data Guard,属于重大配置风险。第四,DATABASE_ROLE与预期不符,例如本应为主库却显示PHYSICAL STANDBY,说明发生过切换或配置错误,需要立即确认业务连接指向。第五,SWITCHOVER_STATUS=NOT ALLOWED,说明当前不具备切换条件,通常伴随日志传输延迟或GAP,需要检查V$ARCHIVE_DEST_STATUS和V$DATAGUARD_STATS。
V$INSTANCE.STARTUP_TIME与V$DATABASE的OPEN_MODE一起记录。如果STARTUP_TIME在非维护窗口内发生变化,即使当前状态为OPEN,也应视为一次异常重启事件,必须回溯alert.log确认原因。五、可复用的巡检SQL与结果判读
下面这条查询把三个视图的关键字段合并输出,适合作为日常巡检脚本的基础:
SELECT i.instance_name,
i.host_name,
i.status AS inst_status,
i.database_status,
i.active_state,
i.startup_time,
d.open_mode,
d.log_mode,
d.database_role,
d.protection_mode,
d.switchover_status,
(SELECT value FROM v$diag_info WHERE name='Diag Alert') AS alert_dir
FROM v$instance i, v$database d;
判读时抓住四条底线:inst_status必须为OPEN;database_status必须为ACTIVE;log_mode必须为ARCHIVELOG;database_role必须与当前节点预期角色一致。四条全部满足,实例与数据库层面才算健康。任何一条不满足,都应立即通过alert_dir指向的alert.log进一步定位。把这套检查固化为每日巡检项,可以在业务感知之前发现实例重启、归档中断、角色漂移等隐患,为后续的会话、等待事件和性能监控提供可信的起点。