2009年3月30日星期一

database and instance startup and shutdown

oracle数据库在运行期间总存在一个与之对应的实例。当用户在服务器上启动数据库时,oracle将为数据库分配被称为系统全局区SGA的内存区,并启动一个或多个oracle进程。SGA与oracle进程被统称为oracle实例。构成实例的内存区及进程负责对数据库进行管理,并为用户提供服务。
当一个实例启动后,oracle将令此实例与指定的数据库共同工作。当数据库与实例关联后被称为已挂载的数据库(mounted database)。已挂载的数据库可以被打开(open),供授权用户访问。
在同一个服务器上可以同时运行多个实例,每个实例和一个与之相关的数据库共同工作。在应用了RAC的大型集群系统(cluster system)中,一个数据库可以挂载到多个实例上。
只有DBA能够执行启动实例及打开数据库的操作。当数据库处于打开状态时,DBA还能够执行停止(shutdown)操作令数据库进入关闭状态。当数据库处于关闭状态后,其中的数据不能被访问。
oracle将赋予满足以下条件的用户 管理员权限:
1、用户的操作系统权限,允许他以管理员的身份连接数据库
2、用户被授予了SYSDBA或SYSOPER权限,且数据库使用密码文件(password file)来对数据库管理员进行验证
当用户以SYSDBA权限连接数据库时,其所处的方案(schema)由SYS用户所有。而用户以SYSOPER权限连接数据库时,将处于public schema,SYSOPER权限是SYSDBA权限的一个子集。

在启动实例时,oracle需要读取初始化参数文件(initialization parameter file)或服务器参数文件(server parameter file)。这两个文件包含了一组供实例及数据库使用的配置参数。服务器参数文件能够持续地(persistent)存储系统的初始化参数。在实例运行期间对初始化参数所做的修改能够保存到服务器参数文件中,供下次实例启动时使用。
绝大多数的初始化参数的作用可以被分为以下三类:1、用于命名的参数,例如为文件命名
2、用于设限的参数,例如设定一个最大值
3、用于设定容量的参数,例如设定SGA的大小,这种参数被称为变量参数(variable parameter)
而其他的初始化参数则用于进行以下设定:
1、实例启动后与那个数据库共同工作
2、SGA中的内存结构能够使用多少内存
3、重做日志用完后进行何种操作
4、数据库控制文件的存储位置及文件名
5、数据库的撤销表空间名称

DBA可以通过调整变量参数(variable parameter)的值来提高数据库系统的性能。有些初始化参数可以在实例运行时使用ALTER SESSION或ALTER SYSTEM 语句动态地修改。如果没有使用服务器参数文件(server parameter file, spfile),使用ALTER SYSTEM语句对初始化参数的修改只对当前实例有效。管理员必须手工修改初始化参数文件(initialization parameter file)才能使这些修改在下次实例启动时仍然有效。我们可以使用DBCA自动创建一个初始化参数文件。

启动数据库并使其可以为所有用户提供服务需要三个步骤:
1、启动实例
2、挂载(mount)数据库
3、打开(open)数据库
我们可以通过SQL*PLUS的STARTUP语句或企业管理器(Enterprise Manager)来执行这三个步骤。

在Oracle启动实例时,首先需要从服务器参数文件或初始化参数文件中读取初始化参数,之后创建存储数据库信息的共享内存区SGA,最后创建后台进程。此时,构成实例的内存区及进程还没有和数据库产生关联。
管理员可以使实例以限制模式(restrited mode)启动,也可以将当前运行的实例切换到限制模式。运行在限制模式下的实例只允许具有RESTRICTED SESSION系统权限的用户连接到数据库

Oracle将数据库挂载(mount)到实例,以便实例和数据库共同工作。在挂载数据库时,实例首先需要找到并打开数据库控制文件(control file)。控制文件的名称及位置信息记录在参数文件的CONTROL_FILES参数中。接着oracle将读取控制文件获取数据库的数据文件(datafile)名及重做日志文件(redo log file)名。
此时,数据库还没有被打开,只有DBA才能访问数据库。当数据库处于挂载状态时,管理员可以进行维护操作。此时数据库的常规操作都是被禁止的。
spfile是实例的参数文件,control file是数据库的参数文件

备用数据库(standby database)是一个与主数据库(primary database)完全相同的副本,他能在发生灾难时保证系统的持续可用性(availablity)。备用数据库永远处于恢复模式(recovery mode)。为了构造一个备用数据库,DBA必须使用ALTER DATABASE语句使一个数据库以备份模式(standby mode)挂载,并将主数据库中产生的归档重做日志(archived redo log)加载到此数据库中。用户可以将一个备份数据库以只读模式(read-only mode)打开,作为临时的报表查询数据库。备份数据库不能以可读写状态(read/write mode)打开。

克隆数据库(clone database)是专供按时间点(point-in-time recovery)表空间功能使用的数据库副本。当用户按时间点恢复表空间时,需要将克隆数据库挂载(mount)并将其中的表空间恢复到期望的时间,之后将克隆数据库中被恢复的表孔吉爱你的元数据及数据文件复制到主数据库(primary database)

将已挂载的数据库打开就可以使此数据库正常工作。当管理员打开数据库时,oracle将打开所有联机的数据文件(datafile)及重做日志文件。如果数据库上次停止时某个表空间处于脱机状态,那么打开数据库时此表空间及相关的数据文件将依旧处于脱机状态。如果oracle在打开数据库时找不到所需的数据文件或重做日志文件,系统将返回错误信息。管理员必须从备份中恢复损坏或缺失的文件后,才能打开数据库。
如果数据库上次关闭时发生了异常情况(DBA终止了数据库实例或出现电源故障等),oracle将在数据库再次打开时自动地执行恢复操作。

当DBA打开数据库时,实例将请求一个或多个撤销表空间(undo tablespace)。DBA在实例启动时通过UNDO_MANAGEMENT初始化参数决定数据库运行于自动撤销管理模式(automatic undo management mode)或手工撤销管理模式(manual undo management mode)。可选的参数值为AUTO或MANUAL。当此值为AUTO时,实例将运行在自动撤销管理模式下。参数模式为MANUAL。
1、如果用户正使用撤销表空间(undo tablespace),那么数据库就运行在自动撤销管理模式下。oracle 建议采用此模式
2、如果用户正使用回滚段(rollback segment)管理撤销空间,那么数据库运行手工撤销管理模式下

DBA能够以只读模式打开数据库,防止数据被用户事务修改。在只读模式下,只有只读事务才能访问数据库,只读事务不能向数据文件及重做日志文件写入信息。
在只读模式下,其他文件(例如控制文件、操作系统监控文件audit trail、跟踪文件trace file 及告警日志alert log)依然可以被写入。用于排序操作的临时表空间依然可用。但是用户不能在只读模式下将永久表空间(permanent tablespace)脱机。作业队列(job queue)在只读模式下无法使用。
在只读模式下,依旧可以执行数据库恢复,也可以执行改变数据库状态的操作(只要此类操作不产生重做数据即可)。例如,在只读模式下:
1、可以令数据文件联机或脱机
2、可以恢复脱机的数据文件与表空间
3、控制文件可以用于记录数据库状态变化

关闭一个数据库及相关实例需要三个步骤:
1、关闭数据库
2、卸载数据库
3、停止实例

当DBA关闭数据库时,oracle将SGA内的数据库数据及恢复数据分别写入数据文件及重做日志文件。之后,oracle关闭所有联机的数据文件及重做日志文件。(脱机表空间的脱机数据文件已经处于关闭状态,当用户再次打开数据库时,脱机的表空间及其中的数据文件将保持脱机状态)此时数据库已经处于关闭状态,不能执行一般操作。在数据库已经关闭但仍然挂载时,控制文件还是处于打开状态。
在紧急情况下,DBA可以终止一个处于打开状态的数据库的实例,以便立即关闭(close)并完全停止(shutdown)一个数据库。这个过程很快,因为将SGA区内各缓存的数据写入磁盘的步骤被省略了。数据库重新打开时oracle将自动执行恢复操作。

当数据库被关闭后,oracle将卸载数据库,使之与实例分离。此时,实例依旧存在于计算机的内存中。数据库被卸载后,oracle将关闭数据库的控制文件。

停止实例是停止数据库的最后一个步骤,当DBA停止实例时,SGA将被从内存中清除,后台进程将被终止。
在异常情况下,可能出现实例停止(shutdown)不完全的情况:内存中可能依然存在未被清除的内存结构,或者某些后台进程未被终止。如果系统中存在未被完全清除的实例,此实例再次启动时将会出错。在此种情况下,DBA可以采用两种方法强制启动实例,第一种方法是彻底清除之前的实例(removing the remnants of the previous instance) 并启动新实例。第二种方法就是在SQL*PLUS或企业管理器中执行SHUTDOWN ABORT语句。

没有评论:

发表评论