Oracle 中 NOMOUNT、MOUNT、OPEN 怎么理解? 在不同场景下如何操作?_20260402

先把三种状态用最直白的话记住:

  • NOMOUNT:实例已经启动,但数据库还没有挂载。Oracle 官方说明,这种状态通常用于建库或重建控制文件等场景。

  • MOUNT:实例已启动,数据库已挂载,但库还是关闭状态,适合做某些 DBA 维护操作,不对普通业务开放。

  • OPEN :数据库已经正常打开,可以对外提供服务。STARTUP 默认就是把数据库启动到 OPEN

    帮助理解三种状态:
    举例1:
    你可以把 Oracle 数据库想象成一辆性能强悍的越野车:

    NOMOUNT:通电自检
    你坐进车里,先给车辆通电。

    MOUNT:发动机已经着了,但车还没上路
    你把车发动起来了。

    OPEN:正式上路
    你挂挡、松刹车、踩油门,车真正开起来了。

    举例2:
    NOMOUNT(通电):
    按下电源键,屏幕亮起 Logo。系统分配了内存,CPU 开始工作,但还没加载操作系统。
    (对应:实例启动,分配内存/进程)

    MOUNT(解锁):
    进入锁屏界面。手机识别出了 SIM 卡和存储空间,知道数据在哪,但还没进入桌面。
    (对应:读取控制文件,找到数据位置)

    OPEN(进桌面):
    输入密码进入主界面。所有 App 都能点开,你可以收发消息了。
    (对应:打开数据文件,对外服务)

1、NON-CDB场景

这种情况没有 PDB,整个库就是一个整体。

如果这台服务器上只有这一个库,一般这样进入:

复制代码
su - oracle
sqlplus / as sysdba

如果这台服务器上有多个实例,建议先指定实例再进入:

复制代码
su - oracle
export ORACLE_SID=<实例名>
sqlplus / as sysdba

然后执行:

复制代码
-- 启动到 NOMOUNT
startup nomount;

-- 启动到 MOUNT
startup mount;

-- 启动到 OPEN
startup;

-- 或者一步一步往下推
startup nomount;
alter database mount;
alter database open;

注释:

  • startup nomount;:只启动实例,不挂载数据库

  • startup mount;:启动实例,并挂载数据库,但不打开

  • startup;:正常启动到 OPEN,最常见。(Oracle 文档)


2、CDB / PDB场景

这种情况要记住:

先管整个 CDB,再管 PDB。

如果这台服务器上只有一个 CDB,一般这样进入:

复制代码
su - oracle
sqlplus / as sysdba

如果这台服务器上有多个 CDB,建议先指定当前要操作的实例:

复制代码
su - oracle
export ORACLE_SID=<实例名>
sqlplus / as sysdba

先操作整个 CDB:

复制代码
-- CDB 启动到 NOMOUNT
startup nomount;

-- CDB 启动到 MOUNT
startup mount;

-- CDB 启动到 OPEN
startup;

-- 或者一步一步往下推
startup nomount;
alter database mount;
alter database open;

如果 CDB 打开后,还要打开 PDB:

复制代码
-- 打开所有 PDB
alter pluggable database all open;

-- 只打开某个 PDB
alter pluggable database pdb01 open;

-- 保存当前 PDB 打开状态
alter pluggable database all save state;

注释:

  • 上面第一组命令操作的是整个 CDB

  • alter pluggable database all open;:打开所有 PDB

  • alter pluggable database pdb01 open;:只打开指定 PDB

  • alter pluggable database all save state;:保存当前状态,下次 CDB 重启后按当前状态恢复

  • STARTUP MOUNT 属于 CDB 这一层 ,不是给 PDB 这一层单独用的。(oracle-base.com)


3、RAC+NON-CDB场景

Oracle RAC官方原话就是:Oracle RAC 在不同计算机上运行多个实例,这些实例共享同一个物理数据库 / 同一套数据库文件

这种情况要记住:

状态没变,但入口变了。

RAC 下,整库或整实例的启停,优先用 srvctl
srvctlServer Control Utility ,管理数据库时通常在数据库软件用户 下执行,比如 oracle,不是默认在 root 下直接敲。(Oracle 文档)

3.1 先查询本机实例名

复制代码
如果环境变量已经配置好,也可以直接看:
echo $ORACLE_SID

如果已经进入 SQL*Plus,也可以查询:
select instance_name, host_name from gv$instance order by instance_name;
把查询结果里的 HOST_NAME 和当前主机名对应起来,就能确定本机实例名。

tip:
echo $? 是用来查看 上一条命令的返回码。
返回 0:上一条命令执行成功
返回非 0:上一条命令执行失败,或者执行结果有异常

ls /tmp
echo $?

如果 ls /tmp 执行成功,通常会看到:
0

进入数据库软件用户:

复制代码
su - oracle

3.2 查询数据库唯一名 DB_UNIQUE_NAME

如果你还不知道 <DB_UNIQUE_NAME> 是什么,先查:

复制代码
su - oracle
export ORACLE_SID=<本机实例名>
sqlplus / as sysdba

show parameter db_unique_name;

-- 或者
select value from v$parameter where name='db_unique_name';

注释:

  • 查出来的结果,就是后面 srvctl -db 要用的值

  • DB_UNIQUE_NAME 就是数据库唯一名;srvctl -db 用的就是它。(Oracle 文档)

然后再执行 RAC 常用操作:

复制代码
# 启动整个 RAC 数据库到 NOMOUNT
srvctl start database -db <DB_UNIQUE_NAME> -startoption nomount

# 启动整个 RAC 数据库到 MOUNT
srvctl start database -db <DB_UNIQUE_NAME> -startoption mount

# 启动整个 RAC 数据库到 OPEN
srvctl start database -db <DB_UNIQUE_NAME>

# 查看整个 RAC 数据库状态
srvctl status database -db <DB_UNIQUE_NAME>

# 启动某个实例到 NOMOUNT
srvctl start instance -db <DB_UNIQUE_NAME> -instance <INSTANCE_NAME> -startoption nomount

# 启动某个实例到 MOUNT
srvctl start instance -db <DB_UNIQUE_NAME> -instance <INSTANCE_NAME> -startoption mount

# 启动某个实例到 OPEN
srvctl start instance -db <DB_UNIQUE_NAME> -instance <INSTANCE_NAME>

# 查看某个实例状态
srvctl status instance -db <DB_UNIQUE_NAME> -instance <INSTANCE_NAME>

注释:

  • -db 后面填 数据库唯一名 DB_UNIQUE_NAME

  • -instance 后面填 实例名

  • 不加 -startoption,默认就是 OPEN。(Oracle 文档)

3.3 本机实例名和数据库唯一名的关系?

  • 数据库唯一名 DB_UNIQUE_NAME :表示整套数据库的名字
  • 本机实例名 :表示当前这台机器上的那个实例的名字

关系本质

一个 DB_UNIQUE_NAME 可以对应多个实例名;而本机实例名只代表当前主机上的那一个实例。

一个数据库唯一名,对应一套数据库;一套数据库下面,可以有多个实例名。

  • DB_UNIQUE_NAME整库级别
  • INSTANCE_NAME / 本机实例名 是实例级别
  • RAC = 一套数据库,多个实例。

假设你有一套 RAC 数据库:

  • DB_UNIQUE_NAME = orcl
  • 节点 1 的实例名 = orcl1
  • 节点 2 的实例名 = orcl2

那它们的关系就是:

  • orcl:整套数据库的名字
  • orcl1:这套数据库在节点 1 上跑的实例
  • orcl2:这套数据库在节点 2 上跑的实例

4、RAC+CDB场景

就记一句:

整库用 srvctl,PDB 用 alter pluggable database

先启动整库:

复制代码
su - oracle
srvctl start database -db <DB_UNIQUE_NAME>

如果还要打开 PDB,再进入数据库执行:

复制代码
su - oracle
export ORACLE_SID=<本机实例名>
sqlplus / as sysdba

alter pluggable database all open instances=all;
alter pluggable database all save state instances=all;

注释:

  • 在 RAC 里,不加 instances=all,默认只影响当前实例

  • 想让所有实例都生效,就加 instances=all。(oracle-base.com)


5、最后最简版结论

5.1 如果是 NON-CDB

复制代码
su - oracle
sqlplus / as sysdba

如果有多个实例:

复制代码
su - oracle
export ORACLE_SID=<实例名>
sqlplus / as sysdba

startup nomount;
startup mount;
startup;

-- 或者
startup nomount;
alter database mount;
alter database open;

5.2 如果是 CDB / PDB

复制代码
su - oracle
export ORACLE_SID=<实例名>
sqlplus / as sysdba

startup nomount;
startup mount;
startup;

alter pluggable database all open;
alter pluggable database all save state;

5.3 如果是 RAC

先查 DB_UNIQUE_NAME

复制代码
su - oracle
export ORACLE_SID=<本机实例名>
sqlplus / as sysdba

show parameter db_unique_name;

再执行:

复制代码
su - oracle
srvctl start database -db <DB_UNIQUE_NAME> -startoption nomount
srvctl start database -db <DB_UNIQUE_NAME> -startoption mount
srvctl start database -db <DB_UNIQUE_NAME>

如果还要操作 PDB:

复制代码
su - oracle
export ORACLE_SID=<本机实例名>
sqlplus / as sysdba

alter pluggable database all open instances=all;
alter pluggable database all save state instances=all;
相关推荐
arvin_xiaoting5 小时前
OpenClaw学习总结_III_自动化系统_3:CronJobs详解
数据库·学习·自动化
Amctwd5 小时前
【Linux】OpenCode 安装教程
linux·运维·服务器
jzwugang5 小时前
postgresql链接详解
数据库·postgresql
2601_949815335 小时前
MySQL输入密码后闪退?
数据库·mysql·adb
和小潘一起学AI5 小时前
SHH隧道内网穿透
运维·服务器
wwj888wwj6 小时前
Docker基础(复习)
java·linux·运维·docker
paldier6 小时前
rootfs挂载失败(error -5)的一个可能
linux
lifewange6 小时前
Redis的测试要点和测试方法
数据库·redis·缓存
_下雨天.6 小时前
MySQL高可用
数据库·mysql