笔记

126 阅读7分钟

实例生命周期

数据库实例从 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 权限进行连接。

监听器启动一个专用的服务器进程,用于启动数据库实例。

下图显示了数据库从关闭到打开的处理过程。
Instance and Database Startup Sequence
图 13-3 实例与数据库启动顺序

数据库从关闭状态到打开状态需要经历以下几个阶段。

表 13-2 实例启动阶段

阶段加载状态描述更多内容
1启动实例,未加载数据库启动一个实例,但没有与数据库关联。启动实例
2加载数据库实例已经启动,并且读取数据库的控制文件。数据库对用户不可用。加载数据库
3打开数据库实例已经启动,并且打开数据库。授权用户可以访问数据文件中的数据。打开数据库

管理员登录

数据库的启动和关闭是非常强大的管理功能,只能由具有管理员权限的用户执行。

普通用户无法控制数据库的当前状态。根据操作系统的不同,用户可以通过以下方式获得管理员权限:

  • 用户的操作系统权限允许他/她已管理员权限连接到数据库。
  • 用户被授予特殊的系统权限,数据库使用口令文件认证通过网络连接的管理员

以下特殊的系统权限能够在数据库未打开时访问实例:

  • SYSDBA
  • SYSOPER
  • SYSBACKUP
  • SYSDG
  • SYSKM

以上权限的管理不在数据库的自身范围之内。使用 SYSDBA 系统权限连接时,用户位于 SYS 模式中。使用 SYSOPER 连接时,用户位于公共模式中。SYSOPER 权限是 SYSDBA 权限的一个子集。

启动实例

当 Oracle 数据库启动一个实例时,需要经过几个阶段。

实例启动阶段包括:

  1. 查找不同平台下默认位置中的服务器参数文件,如果没有找到该文件,查找文本形式的初始化参数文件(在 STARTUP 命令中指定 SPFILE 或 PFILE 参数将会覆盖默认行为)
  2. 读取参数文件,获取初始化参数的值
  3. 基于初始化参数设置分配 SGA
  4. 启动 Oracle 后台进程
  5. 打开告警日志(alert log)文件和跟踪文件(trace file),按照参数设置的语法在告警日志中写入所有显式指定的参数设置

在这一阶段,实例还没有关联到数据库。NOMOUNT 状态的使用场景包括数据库创建以及备份与恢复操作。