实例生命周期
数据库实例从 STARTUP 命令创建开始,直到被终止时结束。
在此期间,一个实例能且只能与一个数据库相关联。进一步而言,该实例只能加载数据库一次、打开数据库一次,并且关闭数据库一次。在数据库关闭之后,必须重新启动一个实例,然后加载并打开数据库。
下表演示了一个实例尝试重新打开之前关闭的数据库的过程。
表 13- 1 实例生命周期
| 语句 | 注释 |
|---|---|
| SQL> STARTUP ORACLE instance started. Total System Global Area 468729856 bytes Fixed Size 1333556 bytes Variable Size 440403660 bytes Database Buffers 16777216 bytes Redo Buffers 10215424 bytes Database mounted. Database opened. | STARTUP 命令创建一个实例,然后加载并打开数据库。 |
| SQL> SELECT TO_CHAR(STARTUP_TIME,‘MON-DD-RR HH24:MI:SS’) AS “Inst Start Time” FROM V$INSTANCE; Inst Start Time ------------------ JUN-18-14 13:14:48 | 该查询显示了当前实例的启动时间。 |
| SQL> SHUTDOWN IMMEDIATE | 关闭数据库和实例,结束实例的生命周期。 |
| SQL> STARTUP Oracle instance started… . . | STARTUP 命令创建一个新的实例,然后加载并打开数据库。 |
| SQL> SELECT TO_CHAR(STARTUP_TIME,‘MON-DD-RR HH24:MI:SS’) AS “Inst Start Time” FROM V$INSTANCE; Inst Start Time ------------------ JUN-18-14 13:16:40 | 该查询显示了当前实例的启动时间。不同的启动时间表明了这是一个新的实例。 |
实例标识
一个主机上可以运行多个数据库实例。因此,访问时需要指定访问哪个实例。
Oracle 最优灵活体系结构(OFA)规则是一组配置指南,可以确保组织良好的 Oracle 软件安装。本节中的示例使用 OFA 体系结构。
本节包含以下主题:
- Oracle 根目录
- Oracle 主目录
- Oracle 系统标识符(SID)
Oracle 根目录
Oracle 根目录(Oracle Base directory)存储 Oracle 产品的二进制文件。
Oracle 根目录是 Oracle 数据库安装拥有者的数据库主目录。一个主机上可以按照多个 Oracle 数据库,以及多个 Oracle 数据库软件安装的拥有者。
以下示例显示了操作系统用户 oracle 的 Oracle 根目录:
/u01/app/oracle
1
在路径的前缀中, /u01/ 是存储的挂载点, /u01/app/ 是安装应用软件的分支目录。
Oracle 主目录
Oracle 主目录(Oracle home directory)是 Oracle 数据库软件的安装位置。
每个新的 Oracle 数据库软件安装都需要指定一个新的 Oracle 主目录。默认情况下,Oracle 主目录是 Oracle 根目录(ORACLE_BASE)下的一个子目录。
在同一个主机上,相同的 Oracle 根目录下,可以安装不同版本的数据库软件。归属于不同系统用户的不同版本的多个数据库可以并存。
以下示例显示了三个不同的 Oracle 主目录的完整路径名称,它们都位于相同的 Oracle 根目录(/u01/app/oracle/)下:
/u01/app/oracle/product/12.1.0/dbhome_1
/u01/app/oracle/product/12.1.0/dbhome_2
/u01/app/oracle/product/18.0.0/dbhome_1
123
路径名称中, Oracle 根目录(/u01/app/oracle/)之后的部分包含了产品版本编号(例如 12.1.0)和 Oracle 主目录的相对路径(例如 dbhome_1)目录 /u01/app/oracle/product/12.1.0/ 中包含了两个不同的 Oracle 主目录: dbhome_1 和 dbhome_2。
从 Oracle Database 18c 开始,支持创建只读的 Oracle 主目录,将其作为一个软件的映像。只读 Oracle 主目录存储静态文件,例如二进制程序。Oracle 根主目录(ORACLE_BASE_HOME)位于 ORACLE_BASE/homes/home_name,存储与特定 Oracle 主目录相关的动态文件。Oracle 根配置目录(ORACLE_BASE_CONFIG)由 Oracle 根目录中的所有 Oracle 主目录共享,用于存储实例相关的动态文件。
以下示例中,第一个路径是一个只读 Oracle 主目录,第二个路径是其对应的 根主目录:
/u01/app/oracle/product/18.0.0/ro_dbhome_1
/u01/app/oracle/homes/ro_dbhome_1
12
Oracle SID
系统标识符(SID) 是一个主机上的 Oracle 数据库实例的唯一名称。
在 UNIX 和 Linux 系统上,Oracle 数据库使用 SID 和 Oracle 主目录的路径名称作为共享内存的键值。 另外,Oracle 数据库默认使用 SID 查找初始化参数文件,通过初始化文件查找其他相关文件,例如数据库控制文件。
在大多数平台上,使用 ORACLE_SID 环境变量设置 SID,使用 ORACLE_HOME 变量设置 Oracle 主目录。客户端连接数据库实例时,可以在 Oracle Net 连接中指定 SID,或者使用一个网络服务名(service name)。 Oracle 数据库将服务名转换为 ORACLE_HOME 和 ORACLE_SID。
传统的可读写 Oracle 主目录包含了实例相关的文件。但是,如果 Oracle 主目录改为只读,实例相关的文件单独存储在 Oracle 根目录中。无论哪种情况,名称中包含 SID 的文件存储在 Oracle 主配置目录(ORACLE_BASE_CONFIG)的 dbs 子目录中。有了这种文件分离,用户可以使用只读 Oracle 主目录中的软件创建数据库,然后使用另一个只读 Oracle 主目录中的软件启动一个实例,管理该数据库。
实例启动与关闭
数据库实例(database instance)为用户提供数据库访问。实例和数据库存在各种不同的状态。
启动实例与数据库
通常来说,管理员手动启动一个实例,然后加载并打开数据库,接受客户端连接。这些操作可以通过 SQL*Plus 的 STARTUP 命令、 Oracle 企业管理器(Enterprise Manager)或者 SRVCTL 工具完成。
如果使用 Oracle Net 启动一个数据库实例,需要满足以下条件:
- 数据库通过静态方式注册到 Oracle Net 监听器中。
- 使用 SYSDBA 权限进行连接。
监听器启动一个专用的服务器进程,用于启动数据库实例。
下图显示了数据库从关闭到打开的处理过程。
图 13-3 实例与数据库启动顺序
数据库从关闭状态到打开状态需要经历以下几个阶段。
表 13-2 实例启动阶段
| 阶段 | 加载状态 | 描述 | 更多内容 |
|---|---|---|---|
| 1 | 启动实例,未加载数据库 | 启动一个实例,但没有与数据库关联。 | 启动实例 |
| 2 | 加载数据库 | 实例已经启动,并且读取数据库的控制文件。数据库对用户不可用。 | 加载数据库 |
| 3 | 打开数据库 | 实例已经启动,并且打开数据库。授权用户可以访问数据文件中的数据。 | 打开数据库 |
管理员登录
数据库的启动和关闭是非常强大的管理功能,只能由具有管理员权限的用户执行。
普通用户无法控制数据库的当前状态。根据操作系统的不同,用户可以通过以下方式获得管理员权限:
- 用户的操作系统权限允许他/她已管理员权限连接到数据库。
- 用户被授予特殊的系统权限,数据库使用口令文件认证通过网络连接的管理员
以下特殊的系统权限能够在数据库未打开时访问实例:
- SYSDBA
- SYSOPER
- SYSBACKUP
- SYSDG
- SYSKM
以上权限的管理不在数据库的自身范围之内。使用 SYSDBA 系统权限连接时,用户位于 SYS 模式中。使用 SYSOPER 连接时,用户位于公共模式中。SYSOPER 权限是 SYSDBA 权限的一个子集。
启动实例
当 Oracle 数据库启动一个实例时,需要经过几个阶段。
实例启动阶段包括:
- 查找不同平台下默认位置中的服务器参数文件,如果没有找到该文件,查找文本形式的初始化参数文件(在 STARTUP 命令中指定 SPFILE 或 PFILE 参数将会覆盖默认行为)
- 读取参数文件,获取初始化参数的值
- 基于初始化参数设置分配 SGA
- 启动 Oracle 后台进程
- 打开告警日志(alert log)文件和跟踪文件(trace file),按照参数设置的语法在告警日志中写入所有显式指定的参数设置
在这一阶段,实例还没有关联到数据库。NOMOUNT 状态的使用场景包括数据库创建以及备份与恢复操作。