Oracle 实例与数据库的关系

Oracle 实例与数据库的关系

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概念辨析

实例(Instance):内存结构(SGA/PGA)+ 后台进程的集合,运行时存在[1]。

数据库(Database):磁盘上的物理文件集合(数据文件、控制文件、Redo Log 等),持久存在

核心区别

维度实例数据库
形态内存 + 进程物理文件
生命周期启动时创建,关闭时销毁持久存在
必需性临时存在持久存在
数量关系1 实例 ↔ 1 数据库(单实例)1 数据库 ↔ N 实例(RAC)

2. 三种典型组合

2.1 单实例 + 单数据库

最常见架构:一个实例对应一个数据库。

+----------+        +----------+
| Instance |  <-->  | Database |
+----------+        +----------+

2.2 RAC:多实例 + 单数据库

多个实例(每节点一个)共享一个数据库,提供高可用与扩展性[2]:

+----------+    +----------+        +----------+
| Node 1   |    | Node 2   |        | Database |
| Instance |    | Instance |  <-->  | (Shared  |
|   1      |    |   2      |        |  Storage)|
+----------+    +----------+        +----------+

关键

  • 共享存储:ASM/集群文件系统
  • Cache Fusion:通过私有网络同步 buffer cache
  • 每个实例独立 SGA,但访问同一份物理数据

2.3 Data Guard:单实例 + 多数据库副本

主库 + 一个或多个 standby 数据库,每个 standby 有独立实例:

+----------+       +----------+
| Primary  |  -->  | Standby  |
| Instance |  Redo | Instance |
| + DB     |       | + DB     |
+----------+       +----------+

3. 启动关闭流程对应关系

SHUTDOWN 状态:无实例、无 SGA、无后台进程

   │ STARTUP NOMOUNT

NOMOUNT 状态:有实例(SGA + 进程),无数据库访问
   │  - 读取参数文件
   │  - 分配 SGA
   │  - 启动后台进程

   │ ALTER DATABASE MOUNT

MOUNT 状态:实例已装载控制文件
   │  - 读取控制文件
   │  - 定位数据文件、Redo Log

   │ ALTER DATABASE OPEN

OPEN 状态:实例与数据库完全对应,可正常访问
   │  - 打开数据文件
   │  - 打开 Redo Log
   │  - 实例恢复(如需要)

4. 实例与数据库的标识

实例标识INSTANCE_NAMEINSTANCE_NUMBER(RAC 中)

数据库标识DB_NAMEDB_UNIQUE_NAMEDBID

-- 实例信息
SELECT instance_name, instance_number, host_name 
FROM v$instance;

-- 数据库信息
SELECT name, db_unique_name, dbid, created, 
       log_mode, open_mode, database_role
FROM v$database;

5. RAC 中多实例协作

5.1 Cache Fusion

RAC 中多个实例的 buffer cache 通过私有网络同步[2]:

Node 1 请求读 block X(已在 Node 2 缓存为脏块):
1. Node 1 向 Node 2 发送请求
2. Node 2 将 block X 通过 private network 发送给 Node 1
3. Node 1 收到后缓存该块
4. 若有锁冲突,通过 LMD 进程协调

5.2 RAC 后台进程

进程作用
LMONLock Monitor,监控集群锁
LMDLock Daemon,处理锁请求
LMSLock Manager Server,传递数据块
LCKLock Process,非 cache 资源锁

6. 常见坑与排错

6.1 误以为关闭实例就是删除数据库

澄清:关闭实例后,数据库文件仍然存在。重启实例后,数据库重新可用。

6.2 DB_NAME 与 INSTANCE_NAME 必须匹配

# /etc/oratab 示例
orcl:/u01/app/oracle/product/19.3.0/dbhome_1:N

如果不匹配,启动会报 ORA-01102: cannot mount database in EXCLUSIVE mode

6.3 RAC 中实例名相同导致冲突

# 每个节点实例名应不同
# 节点1: orcl1
# 节点2: orcl2

7. 最佳实践

  1. RAC 实例命名规范<db_name><node_number>,如 orcl1orcl2
  2. Data Guard 中 DB_UNIQUE_NAME 必须不同:主备库分别用 orcl_priorcl_std
  3. 参数文件统一管理:RAC 使用 ASM 中的共享 SPFILE
  4. 监控实例状态:定期检查 v$instance
  5. 保留 DBID 信息:用于 RMAN 恢复

8. 参考资料

[1] Oracle Database Concepts 19c, “Database Instances” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/database-instances.html

[2] Oracle Real Application Clusters Administration and Deployment Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/racad/