暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

Oracle数据库的启动和关闭

原创 周波 云和恩墨 2022-10-24
2502

一、启动数据库

  本文主要介绍使用SQL*Plus工具启动和关闭数据库的方法和过程。

1.启动数据库的方法

  当Oracle Restart未被使用时,您可以使用SQL * Plus、恢复管理器(RMAN)或Oracle企业管理器云控制(Cloud Control)启动数据库实例。

1)使用SQL * Plus启动数据库
  您可以启动一个SQL*Plus会话,以管理员权限连接到Oracle数据库,然后发出STARTUP命令。

2)使用恢复管理器启动数据库
  还可以使用Recovery Manager (RMAN)执行STARTUP和SHUTDOWN命令。

3)使用云控制启动数据库
  您可以使用Cloud Control来管理数据库,包括启动和关闭数据库。Cloud Control结合了GUI控制台、代理、公共服务和工具,为管理Oracle产品提供了一个集成的、全面的系统管理平台。

4)使用SRVCTL启动数据库
  当为数据库安装和配置Oracle Restart时,Oracle建议使用SRVCTL启动数据库。
  使用SRVCTL启动一个数据库实例:执行命令srvctl start database。

2.在启动时指定初始化参数

  要启动一个实例,数据库必须从服务器参数文件(SPFILE)或文本初始化参数文件(PFILE)读取实例配置参数(初始化参数)。数据库在默认位置查找这些文件。当然也可以为这些文件指定非默认的位置。

1)关于初始化参数文件和启动
  在特定平台的默认位置,Oracle数据库通过以下顺序检查文件名来定位您的初始化参数文件:

  • (1)SRVCTL命令SRVCTL add database或SRVCTL modify database中的-spfile选项指定的位置。
    可以使用srvctl config database命令检查当前设置。
[oracle@oracle4 ~]$ srvctl config database -db orcl
Database unique name: orcl
Database name: orcl
Oracle home: /u01/app/oracle/product/19.3.0.0/dbhome_1
Oracle user: oracle
Spfile: +DATA/ORCL/PARAMETERFILE/spfile.266.1118266261
Password file: 
Domain: 
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA
Services: 
OSDBA group: 
OSOPER group: 
Database instance: orcl
  • (2)spfileORACLE_SID.ora
  • (3)spfile.ora
  • (4)initORACLE_SID.ora

  前三个文件是spfile,第四个是文本初始化参数文件。如果DBCA在Oracle自动存储管理磁盘组中创建了SPFILE,则数据库将在磁盘组中搜索该SPFILE。
  当CREATE SPFILE语句中没有指定AS COPY,并且数据库在Oracle Clusterware中被定义为资源时,如果同时指定了spfile_name和FROM PFILE子句,那么该语句将自动更新数据库资源中的SPFILE名称和位置。当在CREATE SPFILE语句中指定AS COPY时,将复制SPFILE,而不更新数据库资源。
  如果你(或数据库配置助手)创建了一个服务器参数文件,但你想用一个文本初始化参数文件覆盖它,那么你可以用SQL*Plus,指定STARTUP命令的PFILE子句来识别初始化参数文件,如下:

STARTUP PFILE = /u01/oracle/dbs/init.ora

  使用Oracle自动存储管理(ASM)的数据库通常有一个非默认的SPFILE。如果使用数据库配置助手(DBCA)配置数据库使用Oracle ASM, DBCA在Oracle ASM磁盘组中为数据库实例创建一个SPFILE,然后在本地文件系统的默认位置创建一个文本初始化参数文件(PFILE),以指向该SPFILE。

2)启动数据库时使用非默认的服务器参数文件
  使用SQL*Plus,您可以使用PFILE子句使用非默认的服务器参数文件启动实例。

# 1.创建一个仅包含SPFILE参数的文本初始化参数文件
vi  /u01/oracle/dbs/spf_init.ora
SPFILE = /u01/oracle/dbs/test_spfile.ora

# 2.执行startup命令并指定pfile子句
STARTUP PFILE = /u01/oracle/dbs/spf_init.ora

  SPFILE必须驻留在数据库主机上。当客户端系统读取包含SPFILE参数的初始化参数文件时,它将读取到的值传递给服务器。

如果您的数据库正在由Oracle Restart管理:

# 1.修改SPFILE的位置
srvctl modify database -db db_unique_name -spfile spfile_path
## 其中,db_unique_name必须匹配数据库的db_unique_name初始化参数。

# 2.启动数据库
srvctl start database -db db_unique_name 

3.数据库的自动启动

  当数据库由Oracle Restart管理时,可以为每个数据库服务(service)配置启动选项。
  如果将服务的管理策略设置为AUTOMATIC(默认),则当使用SRVCTL启动数据库时,服务会自动启动。如果设置管理策略为“MANUAL”,则服务不会自动启动,需要使用SRVCTL手动启动。MANUAL设置不会阻止Oracle Restart在服务运行时监视服务并在出现故障时重新启动服务。

4.启动实例之前,需要干些啥?

  • 1)确保数据库所依赖的所有Oracle组件都已启动。
    例如,如果数据库将数据存储在Oracle ASM磁盘组中,则需要确保Oracle ASM实例处于运行状态,并已挂载所需磁盘组。另外,最好在启动数据库之前启动Oracle Net侦听器。
  • 2)如果您打算使用操作系统身份验证,请使用OSDBA组的成员登录到数据库主机
  • 3)确保设置了环境变量,以便连接到所需的Oracle实例(特别是ORACLE_SID)
  • 4)启动SQL*Plus(不连接数据库):
sqlplus /nolog
  • 5)以SYSOPER、SYSDBA、SYSBACKUP或SYSDG的身份连接Oracle数据库:
CONNECT username AS SYSDBA
# or
CONNECT / AS SYSDBA

## 现在您已经连接到数据库,并准备启动数据库实例

5.启动实例

1)启动实例相关信息

  当Oracle Restart未被使用时,使用SQL*Plus STARTUP命令启动Oracle数据库实例。如果您的数据库正在由Oracle Restart管理,Oracle建议您使用srvctl start database命令。

启动模式:

  • NOMOUNT:启动实例且不挂在数据库。不允许访问数据库,通常只用于数据库创建或控制文件的重新创建。
  • MOUNT:启动实例并挂载数据库,但保持关闭状态。这种状态允许某些DBA活动,但不允许对数据库的一般访问。
  • OPEN:启动实例,挂载并打开数据库。这可以在无限制模式(允许所有用户访问)下完成,也可以在限制模式(只允许数据库管理员访问)下完成。
  • FORCE:在出现启动或关闭问题后强制启动实例。
  • OPEN RECOVER:启动实例并立即开始完成介质恢复。

注意:
  如果通过共享服务器进程连接到数据库,则无法启动数据库实例。
  如果控制文件、数据库文件或在线重做日志不可用,启动实例时可能会遇到问题。当您试图挂载数据库时,如果一个或多个由CONTROL_FILES初始化参数指定的文件不存在或无法打开,Oracle数据库将返回警告消息并且不挂载数据库。当试图打开数据库时,如果一个或多个数据文件或在线重做日志不可用或无法打开,数据库将返回警告消息并且不打开数据库。

2)启动实例,挂载并打开一个数据库

  下面的命令启动一个实例,从默认位置读取初始化参数,然后挂载并打开数据库。

# SQL*Plus
startup;

# srvctl(使用Oracle Restart时)
srvctl start database -db db_unique_name
3)启动实例但不挂载数据库

  通常,您只在数据库创建过程中这样做:

# SQL*Plus
startup nomount;

# srvctl(使用Oracle Restart时)
srvctl start database -db db_unique_name -startoption nomount
4)启动实例并挂载数据

  您可以启动一个实例并挂载一个数据库但不打开它,该状态允许您执行特定的维护操作,例如:
(1)从Oracle Database 12c Release 1(12.1.0.2)开始,将数据库实例置于强制全数据库缓存模式
(2)启用和禁用重做日志归档选项
(3)执行全数据库恢复。

# SQL*Plus
startup mount;

# srvctl(使用Oracle Restart时)
srvctl start database -db db_unique_name -startoption mount
5)在启动时限制对实例的访问

  可以在受限模式下启动实例,并可选地挂载和打开数据库,以便该实例只对管理人员(而不是普通数据库用户)可用。

当您必须完成以下任务之一时,请使用此实例启动模式:
(1)执行数据的导出或导入
(2)执行数据加载(使用SQL * Loader)
(3)临时禁止一般用户使用数据
(4)执行某些迁移或升级操作

  通常,所有具有CREATE SESSION系统特权的用户都可以连接到一个打开的数据库。以受限模式打开数据库只允许同时具有CREATE SESSION和RESTRICTED SESSION系统特权的用户访问数据库。只有数据库管理员应该具有RESTRICTED SESSION系统权限。此外,当实例处于受限模式时,数据库管理员不能通过Oracle Net侦听器远程访问该实例,只能从运行该实例的系统本地访问该实例。

  以受限模式启动一个实例(挂载并打开数据库):

# SQL*Plus
startup restrict;

# srvctl(使用Oracle Restart时)
srvctl start database -db db_unique_name -startoption restrict

  可以结合mount、nomount和open模式使用受限模式。
  之后,使用ALTER SYSTEM语句禁用RESTRICTED SESSION特性:

ALTER SYSTEM DISABLE RESTRICTED SESSION;

# 如果以非限制模式打开数据库,然后发现必须限制访问,执行如下命令
ALTER SYSTEM ENABLE RESTRICTED SESSION;

  将正在运行的实例置于受限模式时,用户会话不会终止或受到其他影响。因此,在将实例置于受限模式后,请考虑在执行管理任务之前杀死(终止)所有当前用户会话。

6)强制启动一个实例

  在不寻常的情况下,尝试启动数据库实例时可能会遇到问题,可以强制启动数据库实例,例如:
(1)不能使用SHUTDOWN NORMAL、SHUTDOWN IMMEDIATE或SHUTDOWN TRANSACTIONAL命令关闭当前实例。
(2)启动实例时会遇到问题

  如果出现这些情况之一,通常可以通过使用以下命令之一启动一个新实例(并可选地挂载和打开数据库)来解决问题:

# SQL*Plus
startup force;

# srvctl(使用Oracle Restart时)
srvctl start database -db db_unique_name -startoption force

  如果一个实例正在运行,强制模式下,在重新启动它之前使用ABORT模式关闭它。在这种情况下,警报日志显示的消息是“Shutting down instance (abort)”,后面跟着“Starting ORACLE instance (normal)”。

7)启动实例,挂载数据库,启动完全介质恢复

  如果您知道需要进行介质恢复,那么您可以启动一个实例,将数据库挂载到该实例,然后自动启动恢复过程,使用其中一个命令:

# SQL*Plus
startup open recover;

# srvctl(使用Oracle Restart时)
srvctl start database -db db_unique_name -startoption "open,recover"

  如果在不需要恢复的情况下尝试执行恢复,Oracle数据库将提示错误信息。

二、改变数据库可用性

1.将数据库挂载到实例

  如果实例已经启动,但是还没有挂载数据库,我们可以通过如下命令挂载数据库:

ALTER DATABASE MOUNT;

2.打开一个关闭的数据库

  要打开一个挂载的数据库,使用带有open子句的ALTER database SQL语句:

ALTER DATABASE OPEN;

3.以只读模式打开数据库

  在只读模式下打开数据库使您能够查询一个打开的数据库,同时消除任何对在线数据内容潜在的更改。
  虽然以只读模式打开数据库可以保证数据文件和重做日志文件不会被写入,但它不会限制数据库恢复或在不产生重做的情况下改变数据库状态的操作。例如,您可以使数据文件脱机或联机,因为这些操作不会影响数据内容。
  如果在只读模式下对数据库的查询使用临时表空间,例如进行磁盘排序,那么查询的提出者必须将本地管理的表空间分配为默认临时表空间。否则,查询将失败。

# 下面的语句以只读模式打开数据库
ALTER DATABASE OPEN READ ONLY;

# 以读写方式打开数据库:
ALTER DATABASE OPEN READ WRITE;

说明:默认为读写模式,不能将RESETLOGS子句与READ ONLY子句一起使用。

三、关闭数据库

1.关闭数据库的有关信息

  当没有使用Oracle Restart时,可以通过SYSOPER、SYSDBA、SYSBACKUP或SYSDG连接并发出SHUTDOWN命令,使用SQL*Plus关闭数据库实例。如果您的数据库是由Oracle Restart管理的,建议使用srvctl stop database命令关闭数据库。

在关闭过程中尝试连接的用户将收到如下消息:

ORA-01090: shutdown in progress - connection is not permitted

说明:如果通过共享的服务器进程连接到数据库,就不能关闭数据库。

2.正常模式关闭

  当使用正常模式关闭数据库时,数据库将等待所有连接的用户断开连接后再关闭。正常模式为默认关机模式。

# SQL*Plus
shutdown [normal];

# srvctl(使用Oracle Restart时)
srvctl stop database -db db_unique_name -stopoption normal

  SQL*Plus SHUTDOWN命令的NORMAL子句是可选的,因为这是默认的关闭方法。  对于SRVCTL,如果省略了-stopoption选项,关闭操作将根据数据库Oracle Restart配置中存储的停止选项进行。默认的停止选项是immediate。

说明
(1)在发出该语句之后,不允许新的连接
(2)在数据库关闭之前,数据库等待所有当前连接的用户从数据库断开连接。

  数据库的下一次启动将不需要任何实例恢复过程。

3.及时模式关闭

  当使用immediate模式关闭数据库时,Oracle数据库将终止所有正在执行的SQL语句并断开用户连接。活动的事务被终止,未提交的更改被回滚。

仅在以下情况下使用立即关闭数据库:
(1)启动自动和无人值守的备份
(2)当停电即将发生的时候
(3)当数据库或其中一个应用程序运行不正常,而您无法联系用户要求他们注销或他们无法注销时

# SQL*Plus
shutdown immediate;

# srvctl(使用Oracle Restart时)
srvctl stop database -db db_unique_name -stopoption immediate

说明
(1)在发出该语句之后,不允许新的连接,也不允许启动新的事务
(2)任何未提交的事务都将回滚。
(3)Oracle数据库不等待当前连接的用户断开连接。数据库隐式回滚活动事务并断开所有已连接的用户。
  数据库的下一次启动将不需要任何实例恢复过程。

4.事务模式关闭

  当使用事务模式关闭数据库时,数据库将阻止用户启动新的事务,而是等待所有当前事务完成后再关闭。根据当前事务的性质,这种模式可能花费大量的时间
当您打算关闭实例,同时允许活动事务先完成时,请使用以下命令之一:

# SQL*Plus
shutdown transactional;

# srvctl(使用Oracle Restart时)
srvctl stop database -db db_unique_name -stopoption transactional

说明
(1)在发出该语句之后,不允许新的连接,也不允许启动新的事务
(2)在所有事务完成后,任何仍然连接到实例的客户机都将断开连接。
(3)此时,实例将像提交SHUTDOWN IMMEDIATE语句时一样关闭。

  数据库的下一次启动将不需要任何实例恢复过程。
  事务模式关闭可以防止客户机丢失工作,同时不需要所有用户注销。

5.中断模式关闭

  通过中止数据库实例,可以瞬间关闭数据库。

如果可能,只在以下情况下执行这种类型的关闭:
(1)数据库或其中一个应用程序运行不正常,其他类型的关闭都不起作用
(2)您必须立即关闭数据库(例如,如果您知道将在一分钟内关闭电源)
(3)启动数据库实例时遇到问题

当您必须通过中止事务和用户连接来关闭数据库时,请使用以下命令之一:

# SQL*Plus
shutdown abort;

# srvctl(使用Oracle Restart时)
srvctl stop database -db db_unique_name -stopoption abort

说明
(1)在发出该语句之后,不允许新的连接,也不允许启动新的事务。
(2)Oracle数据库当前正在处理的客户端SQL语句将立即终止。
(3)未提交的事务不会回滚。
(4)Oracle数据库不等待当前连接的用户断开连接。数据库隐式地断开所有已连接用户的连接。
  数据库的下一次启动将需要自动实例恢复过程。

6.关闭超时

  等待用户断开连接或等待事务完成的关闭模式对等待的时间是有限制的。
  如果在一小时内没有发生所有阻止关机的事件,则关机操作终止,并返回以下消息:ORA-01013: user requested cancel of current operation. 如果中断关机过程,例如按CTRL-C,也会显示此消息。Oracle建议您不要试图中断实例的关闭。相反,应该让关闭过程完成,然后重新启动实例。
  在ORA-01013发生之后,您必须认为该实例处于不可预测的状态。因此,您必须通过重新提交shutdown命令来继续关闭过程。如果后续的SHUTDOWN命令继续失败,您必须提交一个SHUTDOWN ABORT命令来关闭实例。然后可以重新启动实例。

四、静默数据库

1.关于静默数据库的有关信息

  有时,您可能希望将数据库置于只允许运行属于DBA的事务、查询、获取或PL/SQL语句的状态。这样的状态被称为静默状态,在这种意义上,系统中没有正在运行的非DBA事务、查询、获取或PL/SQL语句。

说明
  在对静默数据库的讨论中,DBA被定义为用户SYS或SYSTEM。其他用户,包括DBA角色的用户,不允许发出ALTER SYSTEM QUIESCE DATABASE语句,也不允许在数据库静默后继续进行。

静默状态允许管理员执行在其他情况下无法安全地执行的操作。这些行动包括:
(1)如果并发用户事务访问同一个对象,则会失败的操作——例如,更改数据库表的模式或向不需要等待锁的现有表添加列。
(2)并发用户事务可以看到其不良中间效果的操作——例如,在首先导出表、然后删除表、最后导入表时重组表的多步骤过程。如果并发用户试图在表被删除后、但在导入之前访问表,则无法准确视图的情况。

  如果没有静默数据库的能力,您将需要关闭数据库并以受限模式重新打开它。这是一个严重的限制,特别是对于需要24 x 7可用性的系统。静默数据库的限制要小得多,因为它消除了对用户的中断以及与关闭和重新启动数据库相关的停机时间。
  当数据库处于静默状态时,正是通过数据库资源管理器的功能,防止非dba会话变为活动的。因此,当此语句生效时,任何更改当前资源计划的尝试都将被排队,直到系统处于非静默状态。

2.将数据库置于静默状态

  当您将数据库置于静默状态时,非dba活动会话将会继续,直到变为非活动会话为止。
  如果用户发出一个SQL查询,试图将一个不活动的会话强制变为活动的会话,那么查询将被挂起。当数据库变为非静默状态时,将恢复会话,并处理阻塞的操作。

# 将数据库置于静默状态
ALTER SYSTEM QUIESCE RESTRICTED;

  一旦所有非dba会话变为非活动状态,ALTER SYSTEM QUIESCE RESTRICTED语句就会完成,数据库就处于静默状态。在Oracle Real Application Clusters环境中,该语句影响所有实例,而不仅仅是发出该语句的实例。
  ALTER SYSTEM QUIESCE RESTRICTED语句可能会等待很长时间,使活动会话变为非活动会话。通过查询VBLOCKING_QUIESCE视图,可以确定哪些会话正在阻塞quiesce操作。这个视图只返回一个列:SID (Session ID)。您可以将它与VSESSION连接以获得关于会话的更多信息:

select bl.sid, user, osuser, type, program
from v$blocking_quiesce bl, v$session se
where bl.sid = se.sid;

  对于专用的和共享的服务器连接,在发出此语句之后,所有非dba登录都被数据库资源管理器排队,并且不允许继续。对于用户来说,它看起来像是挂起了登录。当数据库处于非静默状态时,登录将恢复。
  即使发出语句的会话退出,数据库仍然处于静默状态。DBA必须登录到数据库,发出特定的解除数据库静默的语句。

说明:当数据库处于静默状态时不能执行冷备份,因为即使在数据库处于静默状态时,Oracle数据库后台进程仍可能执行内部更新。此外,在线数据文件的文件头是可以访问的。它们看起来不像执行了一次干净的关闭。但是,您仍然可以在数据库处于静默状态时进行在线备份。

3.恢复系统正常的操作

  当您将系统恢复到正常操作时,所有非dba活动都可以继续进行:

ALTER SYSTEM UNQUIESCE;

  在Oracle Real Application Clusters环境中,这个语句不需要从静默数据库的同一个会话,甚至不需要从同一个实例发出。如果发出ALTER SYSTEM UNQUIESCE语句的会话异常终止,Oracle数据库服务器将确保UNQUIESCE操作完成。

4.查看实例的静默状态

通过查询V$INSTANCE视图,可以查看实例的静默状态。

# 询V$INSTANCE视图的ACTIVE_STATE列。
SYS@mynewdb> select active_state from v$instance;

ACTIVE_ST
---------
QUIESCED

# NORMAL:正常的非静默状态
# QUIESCING:静默状态,但一些非dba会话仍处于活动状态。
# QUIESCED:静默状态,没有非dba会话是活动的或被允许的。

五、挂起和恢复数据库

  ALTER SYSTEM SUSPEND语句停止对数据文件(文件头和文件数据)和控制文件的所有输入和输出(I/O)。挂起状态允许您在不受I/O干扰的情况下备份数据库。当数据库挂起时,所有预先存在的I/O操作都被允许完成,任何新的数据库访问都被置于排队状态。使用ALTER SYSTEM RESUME语句恢复正常的数据库操作。

# 挂起数据库操作
ALTER SYSTEM SUSPEND;

# 恢复数据库操作
ALTER SYSTEM RESUME;

  该命令不针对实例。在Oracle Real Application Clusters环境中,当您在一个系统上发出suspend命令时,内部锁定机制会跨实例传播暂停请求,从而静默给定集群中的所有活动实例。但是,如果一个新实例在另一个实例挂起时启动,则新实例不会挂起。
SUSPEND和RESUME命令可以从不同的实例发出。例如,如果实例1、2和3正在运行,并且您从实例1发出一个ALTER SYSTEM SUSPEND语句,那么您可以从实例1、2或3发出一个具有相同效果的RESUME语句。
  挂起/恢复特性在允许镜像磁盘或文件然后分割镜像的系统中非常有用,这提供了一种备用备份和恢复解决方案。如果您使用的系统不能在执行写操作时从现有数据库中分隔镜像磁盘,那么您可以使用挂起/恢复特性来促进分割。
  挂起/恢复特性不是正常关机操作的合适替代品,因为挂起数据库的副本可能包含未提交的更新。

说明:不要使用ALTER SYSTEM SUSPEND语句作为将表空间置于热备份模式的替代品。在任何数据库挂起操作之前使用ALTER TABLESPACE BEGIN BACKUP语句。

查询V$INSTANCE视图,确认数据库状态:

SYS@mynewdb> alter system suspend;
System altered.
SYS@mynewdb> select database_status from v$instance;
DATABASE_STATUS
-----------------
SUSPENDED
SYS@mynewdb> alter system resume;
System altered.
SYS@mynewdb> select database_status from v$instance;
DATABASE_STATUS
-----------------
ACTIVE

六、延迟实例终止

  INSTANCE_ABORT_DELAY_TIME初始化参数指定当错误导致实例中止时延迟关闭数据库的时间,以秒为单位。
  数据库管理员可以使用延迟时间来获取有关错误的信息,并尽量减少实例中止时可能导致的问题。例如,数据库管理员可能使用延迟时间来获取诊断信息,使用Transparent Application Failover (TAF)重定向连接,并刷新缓冲区缓存。当延迟中止启动时,将向警报日志写入一条消息。

说明:不要将INSTANCE_ABORT_DELAY_TIME值设置得太高。由于实例因错误而关闭,一些进程或资源可能已损坏或不可用,这可能使复杂的操作无法进行。

# INSTANCE_ABORT_DELAY_TIME参数默认为0。
alter system set instance_abort_delay_time = 60;
最后修改时间:2023-01-30 15:28:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论