先把三种状态用最直白的话记住:
-
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。
srvctl 是 Server 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;