3 数据库的启动和关闭
这一章描述了启动和关闭Oracle数据库实例的规程,包含如下主题:
启动数据库
改变数据库的可用性
关闭数据库
停顿数据库
抑制和恢复数据库
启动数据库
当你启动一个数据库,你就创建了这个数据库的一个实例,并且决定了这个数据库的状态。通常情况下你通过挂载、打开来启动一个数据库使其对任何有效地用户连接、执行典型的数据访问操作都是可用的。其他存在的选项我们也将在本节中讨论。
本节包含如下与启动数据库实例相关的主题:
启动数据库的选项
理解数据库初始化参数文件
准备启动一个实例
启动一个实例
启动数据库的选项
你可以通过SQL*Plus,Recovery Manager 或这Enterprise Manager 启动数据库实例。
用SQL*Plus启动数据
你可以启动一个SQL*Plus会话,用管理员权限连接Oracle 数据库,然后使用 startup 命令。在本书中指详细讨论用SQL*Plus这种方法。
用Recovery Manager 启动数据库
你也可以通过RMAN执行 startup 和 shutdown命令。如果你正在RMAN环境下或者更喜欢这种方式,而不是调用SQL*Plus。
用 Enterprise Manager启动数据库
你可以使用Oracle EM来管理你的数据库,包括启动和关闭。EM联合了图形化操作台、代理、通用服务和工具为管理Oracle产品提供了集成的和综合系统管理平台。EM Database Control是EM中一个管理Oracle数据库的部分,使你用图形接口代替命令行来本书中讨论的功能。
理解初始化配置参数文件
要启动一个数据库实例,数据库首先要从服务器参数配置文件(SPFILE)或者是初始化参数配置文件中读取实例配置参数。
当你使用SQL*Plus的 startup 命令时,数据库试图从平台指定的默认位置的SPFILE中读取初始化参数,如果没有找到SPFILE, 她就搜寻初始化参数文件。
注意:
对于Unix和Linux,平台指定的SPFILE和初始化参数文件的默认位置是:
$ORACLE_HOME/dbs
对于Windows NT 和Windows 2000 的位置是:
%ORACLE_HOME%/database
在平台指定的默认位置,Oracle数据库按照如下顺序通过检查文件名搜寻参数文件:
1. spfile$ORACLE_SID.ora
2. spfile.ora
3. init$ORACLE_SID.ora
前两个文件名表示SPFILE,第三个代表test initialization parameter文件。
注意:
spfile.ora 被包含在搜索路径是因为在RAC环境中,一个SPFILE被所有的实例用来存储初始化参数,所以没有为SPFILE存储指定实例的位置。
如果你创建了一个SPFILE,但是想用一个test initialization parameter 文件覆盖它,你可以在startup命令中指定PFILE子句来识别initialization parameter 文件。
startup pfile=/u01/oracle/dbs/init.ora
用非默认的SPFILE启动数据库
非默认的SPFILE是一个不在默认位置的SPFILE,它通常不能用来启动数据库。然而假设有这样的需求出现,你可以按照下面的方法使用非默认的SPFILE来启动数据库:
1. 创建一个仅有一行的初始化参数文件,文件中仅包含一个SPFILE参数,参数的值就是那个非默认SPFILE文件的位置。
例如:创建一个仅包含如下参数的初始化参数文件/u01/oracle/dbs/spf_init.ora
SPFILE=/u01/oracle/dbs/test_spfile.ora
注意:你不能在初始化参数文件中使用IFILE参数来指向SPFILE,在这个背景下,必须使用SPFILE初始化参数。
2. 启动实例并指明初始化参数文件
startup pfile=/u01/oracle/dbs/spf_init.ora
SPFILE 文件必须位于运行数据库的服务器上,因此之前的方法提供了一种客户机使用SPFILE启动数据库。它也消除了客户端维护客户端的初始化参数的必要。当客户端机器读这个包含SPFILE参数的初始化参数文件,它传递这个值到SPFILE指定的服务器读取。
初始化文件和自动存储管理
一个使用ASM的数据库通常有一个非默认的SPFILE。如果你使用DBCA配置数据库使用ASM,DBCA在ASM磁盘组上创建一个SPFILE,并且在默认的位置创建一个初始化参数文件执行SPFILE。
准备启动实例
在你试图用SQL*Plus来启动实例之前必须执行一些预先的步骤。
1. 确认环境变量已经设置好以便于你连接到目标数据库。
2. 启动SQL*Plus ,不连接到数据库:
sqlplus /nolog
3. 用 sysdba连接到数据库
connect username/password as sysdba
现在你已经连接到数据库,准备启动你的数据库实例。
启动实例
你使用SQL*Plus 的 startup命令启动数据库实例,你可以启动一个实例到各种模式:
启动实例但不挂着数据库。这个状态不允许访问数据库,仅在创建数据库或者重建控制文件时需要。
启动实例,挂载数据库,但是保持数据库关闭。这种状态允许DBA的活动,但不允许数据库的一般访问。
启动实例,挂载并打开数据库。在不受限制的模式下允许所有的用户访问,在受限制模式下仅允许数据库管理员访问。
在实例启动或关闭出现问题,或者介质恢复完成后就马上想启动数据库可以强制启动实例。
主要:
如果是通过共享服务器连接到数据库,你不能启动数据库实例。
下面的情节阐述了启动数据库的不同的状态。一些限定条件被联合在startup 命令上。
主要:
在启动数据库的时候,如果控制文件、数据文件或者重做日志文件不可用就会出现启动问题。如果当你试图挂载数据库的时候,一个或多个控制文件中指定的文件不存在或者不能打开,Oracle将返回一个警告信息并且数据库不会挂载(mount)。如果当试图打开数据库的时候,一个或多个数据文件或者重做日志文件不可用或者打不开,数据库将返回警告信息并且不会打开(open)数据库。
启动实例,挂载和打开数据库
正常数据库操作意味着启动实例并且挂载和打开数据库。这种模式允许任何有效用户连接数据库执行数据访问。
下面的命令启动实例,从默认位置读出初始化参数,并且挂载和打开数据库。
startup
启动实例,不挂着数据库
你可以启动实例而不挂着数据库。典型的情况是,在数据库创建期间你所做的。使用带有nomount参数的startup命令:
startup nomount
启动实例,挂载数据库
你可以启动实例,挂载数据库但不打开她,这时允许你执行一些特定的维护操作。例如,如下任务需要数据库挂载而不打开:
启用和禁用归档日志选项。
执行数据库的完全恢复。
下面的命令用来启动实例,挂载数据库,但保持数据库关闭。
startup mount
在启动时限制访问
你可以启动实例,并且选择性的挂载和打开数据库,在限制模式下这个实例只有管理员可用。在你需要完成下列任务可以使用这样模式。
执行数据的导入和导出
执行数据的加载
临时阻止一般用户使用数据
执行特定的迁移和更新操作
典型的情况下,所有拥有 create session 系统权限的用户都可以连接到一个已打开的数据库。打开一个数据库在限制模式,仅允许即拥有create session 和restricted session 系统权限。只有管理员才应该拥有 restricted session 系统权限。另外,当数据库允许在限制模式,数据库管理员只能从运行实例的机器上本地访问实例,而不能通过Oracle Net listener 远程访问实例。
接下来的命令启动数据库到限制模式:
startup restrict
你可以使用 restrict子句和mount 、nomount、open的组合。
<startup nomount restrict; 不明白有什么意义呢,还没有挂载数据库别的用户也登陆不了啊?>
之后,可以使用alter system 语句禁用resticted session 特性:
alter system disable restricted session;
如果你打开数据可在非限制模式,之后想要限制访问,你也可以使用 alter system 语句。
<alter system enable restricted session; 启用restricted 访问>
———————————————————————————2010年9月12日星期日
强制启动实例
在一些不常见的情况下,当你试图启动数据库的时候或许会遭遇问题。除非你遇到如下问题否则不应该强制启动数据库。
你使用shutdown normal, shutdown immediate, shutdown transtractional 命令不能关闭当前实例。
在启动数据库的时候遇到问题。
如果出现上述的任一情况,你可以通过带有force的startup命令来启动一个新的实例来解决这个问题:
startup force
如果一个实例正在运行中,startup force 先用带abort模式关闭数据库,然后重启她。在这种情况下,从Oracle 10g R2开始,会在告警日志中显示“Shutting down instance (abort)”,紧跟着是“Starting ORACLE instance (normal).”。早期的版本中只是显示“Starting ORACLE instance (force)”。
启动实例,挂载数据库,然后开始完全介质恢复
如果你知道需要介质恢复,你启动实例,挂载数据库,然后使用带有 recover 子句的startup命令来自动启动恢复进程:
startup open recover
当没有必要而你却试图执行数据恢复时,Oracle会产生一个错误消息。
在操作系统启动是自动启动数据库
许多站点使用程序使一个或多个数据库实例跟随操作系统启动。执行这个任务的程序特定于操作系统吧。关于更多的自动启动信息,请参考operating system specific Oracle文档。
启动远程实例
如果你本地的oracle 数据库是分布式数据库的一部分,你或许想启动远程实例和数据库。启动远程实例的程序是多种多样的,取决于通信协议和操作系统。
修改数据库的可用性
你可以修改一个数据库的可用性。你可以会因为维护的原因而限制访问或者是使数据库只读而做这些。接下来的部分介绍如何修改数据库的可用性:
挂载数据库到实例
打开一个关闭的数据库
打开数据库到只读模式
限制对一个已打开数据库的访问
挂载数据到实例
当你需要执行特殊的管理操作时,数据库必须启动和挂载到实例,但是数据库的状态是关闭的。你可以通过启动数据库并挂载她来达到这个情景。要挂载数据库到预先启动的,但没有打开的实例上,你可以使用带有mount子句的 alter database 命令:
alter database mount;
打开一个关闭的数据库
你可以通过打开数据库来让一个已经挂载当没有打开的数据库对所有的用户可用。要打开一个已挂载的数据库,使用带有 open 子句的alter database 命令:
alter database open;
执行这个语句之后,所有具有 create session 系统权限的有效oracle 用户都可以连接数据库。
打开数据库到只读模式
打开数据库到只读模式使你完全消除在线数据内容改变的潜在可能来查询数据库。
关闭数据库
要发起数据库的关闭,使用sqlp*plus的 shutdown 命令。从初始化数据库的关闭到关闭完成,控制权不会交还给这个连接。在数据库关闭过程中试图连接数据库的用户将收到一个类似如下的信息:
ORA-01090:shutdown in progress – connection is notpermited
注意:
如果你是通过共享服务器连接到数据库,你不能关闭数据库。
为了关闭数据库和实例,你必须首先已 sysoper 或者是sysdba 的身份连接到数据库。有许多方法可以关闭数据库,将在接下来的章节讨论:
使用 normal 字句关闭数据库
使用 immediate 字句关闭数据库
使用 transactional 字句关闭数据库
使用 abort 字句关闭数据库
一些关闭方法在正常关闭数据库前等待特定的事件(例如交易完成或者用户断开)发生。对于这些事件有一个小时的超时时间。这个超时行为将在二外的章节讨论。<这个时效应该值的是shutdown这个行为,过了超时时间后,应该是没有关闭数据库,shutdown 这个行为超时失效>
Shutdown timeout
使用带有 normal 子句的关闭命令
在正常状态下要关闭数据库,使用带有 normal子句的shutdown命令:
shutdown normal
normal 子句是可选的,因为如果没有提供子句,这就是关闭数据库的默认方法。
正常数据库的关闭需要如下条件:
当命令执行之后不在允许新连接。
在数据库关闭之前,她等待所有当前已连接的用户从数据库断开连接。
下次数据库启动时不需要任何实例恢复过程。
使用带有 immediate 子句的关闭命令
只有在如下情景下使用立即关闭数据库
开始自动的和无人值守的备份
当电源马上要关闭
当数据库或者一个应用程序不规律的运行,并且你不能联系到用户让他注销或者是不能注销。
要立即关闭数据库,使用带有immediate 子句的shutdown命令:
Shutdown immediate
Immediate database shutdown proceeds with the following conditions:
不允许新的连接,也不允许新的事务
任何没有提交的事务将回滚(如果一个长的未提交的事务,这种关闭的方法不会迅速的完成)
Oracle数据库不等待当前连接的数据库断开,数据库暗中回滚活动的事务并断开所有用户
数据库下一启动时,不需要实例恢复。
带有 transactional 子句的关闭命令
当你想执行一个计划的关闭命令,并且允许活动的事务完成,使用带有transactional 子句的shutdown命令:
Shutdown transactional
Transactional database shutdown proceeds with the following conditions:
不允许新的连接,也不允许新的事务启动
当所有的事务完成,任何客户端到实例的连接被断开
此时实例关闭就像当提交的 shutdown immediate一样
数据库下一次启动时不需要执行实例恢复。
这种关闭方式防止了客户端丢失自己的工作,同时也不要求所有的用户注销。
带有abort 子句的shutdown 命令
你可以通过终止实例来瞬间关闭数据库。如果肯能的话,仅在下列情形下执行这种类型的关闭命令:
数据库或她的应用程序出现功能不规律并且其他关闭方式不能奏效时
你需要瞬间关闭数据库(例如,一分钟后电源将被关闭)
当启动数据库是遇到问题
当你必须终止事务并断开用户连接时,使用带有abort的shutdown命令:
Shutdown abort
An aborted database shutdown proceeds with the following conditions:
不允许新的连接,也不允许新的事务启动
当前客户端的sql语句迅速被oracle终止
未提交的事务不会回滚
Oracle不等待当前已连接到数据库的用户断开连接,数据库瞬间断开所有用户。
数据库下一次启动时需要实例恢复。
关闭超时
关闭模块有一个等待用户断开连接或者事务完成的总共时间的限制。如果所有的事件在一个小时内阻塞了关闭的发生,关闭命令将被取消,并且输出如下信息:ORA-01013:user requested cancel of current operation.
--------------------------------------------------------------------------2010.09.22