如果 Oracle 的 PMON 进程被终止,会发生什么情况?当然,实例终止。同样的结果也适用于任何其他关键进程的终止,如 SMON、LGWR
等。有些时候,问题本质上是暂时性的,可由自身解决。在这些情况下,如果您重新启动实例,它将恢复正常;但您必须亲自处理检测故障和启动进程这一过程。
之前,使用 Oracle RAC 时,CRS 负责检测和重新启动。如果您没有使用 RAC,则没有这种选择。但是,在此版本的 Oracle Database 中,即使您不使用 RAC,也具有这种能力。Grid Infrastructure 中提供被称作 Oracle Restart 的功能。代理会检查数据库、监听器、ASM 等重要组件的可用性,在这些组件关闭的情况下自动将其启动。该功能是现成可用的,除了基本配置外,无需额外编程。用于检查可用性并重新启动故障组件的组件被称作 HAS(高可用性服务)。
以下是检查 HAS 自身可用性的方法(在 Grid Infrastructure 主目录中):
$ crsctl check has
CRS-4638: Oracle High Availability Services is online
该服务必须联机才能生效。可通过以下命令来检查版本:
$ crsctl query has releaseversion
Oracle High Availability Services release version on the local node is [11.2.0.1.0]
$ crsctl query has softwareversion
Oracle High Availability Services version on the local node is [11.2.0.1.0]
该服务可设置为自动启动。检查该服务是否已配置为自动启动:
$ crsctl config has
CRS-4622: Oracle High Availability Services autostart is enabled.
如果该服务未设置为自动启动,可以通过以下方式进行设置:
$ crsctl enable has
CRS-4622: Oracle High Availability Services autostart is enabled.
将“enable”替换为“disable”将删除 HAS 的自动启动属性。如果未启动,可通过如下方式启动:
$ crsctl start has
类似地,“stop”子句可停止 HAS。Grid Infrastructure 安装将一个名为 ohasd 的可执行文件放在服务器的自动启动目录中,例如,对于 Linux,放在 /etc/init.d 中。这个可执行文件提供 HAS 服务,换言之,它是 HAS 后台程序。在 Linux 中,可通过检查以下进程来进行确认:
$ ps -aef|grep has
root 5185 1 0 Aug10 ? 00:00:00 /bin/sh /etc/init.d/init.ohasd run
oracle 5297 1 0 Aug10 ? 00:05:24 /opt/oracle/product/11.2.0/grid/bin/ohasd.bin reboot
有了 HAS 之后,就可以注册应由 HAS 监视并在需要时进行恢复的组件。这些操作通过 Grid Infrastructure 的 ORACLE_HOME/bin 下的 srvctl 命令完成。您可能熟悉此命令;它用于 RAC 中。在 Oracle Database 11.2 中,也可以在单个实例中使用此命令。
您要添加的第一个组件是 Oracle Database 本身。下面是注册数据库的方式:
--在oracle用户下执行
$ srvctl add database -d D112D2 -o /opt/oracle/product/11.2.0/db1 -y AUTOMATIC -r PRIMARY -s open
以上命令注册了一个在 Oracle 主目录 /opt/oracle/product/11.2.0/db1 中运行、名为 D112D2 的数据库。“-y”选项可命令 HAS 在发生故障时自动重新启动数据库。“-r”选项指明角色,在此例中为 Primary(假定采用 Data Guard 配置)。“-s”选项可命令 HAS 在重新启动时恢复数据库直到打开状态。
完成配置后,可使用如下所示的命令启动数据库:
--在grid用户下
$ srvctl start database -d D112D2
该命令按正确顺序启动组件,即,必须先启动 ASM 实例并挂载磁盘组,然后才能启动数据库。仅在使用 SRVCTL 时才有此要求。如果您使用 SQL*Plus 启动数据库,就不会检查这些依赖性。
检查数据库的状态:
$ srvctl status database -d D112D2
Database is running.
选项“-v”显示数据库中正在运行的服务:
$ srvctl status database -d D112D2 -v
Database D112D2 is running with online services APP
要获取数据库的详细信息,应使用“config”选项
$ srvctl config database -d D112D2 -a
Database unique name: D112D2
Database name: D112D2
Oracle home: /opt/oracle/product/11.2.0/db1
Oracle user: oracle
Spfile: +DATA/D112D2/spfileD112D2.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Disk Groups: DATA
Services: APP
Database is enabled
类似地,可以通过如下所示的命令来配置监听器:
$ srvctl config listener -l LISTENER1
Name: LISTENER1
Home: /opt/oracle/product/11.2.0/grid
End points: TCP:1522
完成配置后,就会创建监听器;检查监听器的状态:
$ srvctl status listener -l LISTENER1
Listener LISTENER1 is enabled
Listener LISTENER1 is not running
监听器没有运行。只是创建了监听器;并未启动。启动监听器:
$ srvctl start listener -l LISTENER1
可以用同样的方式检查 ASM 的配置。
$ srvctl config asm -a
ASM home: /opt/oracle/product/11.2.0/grid
ASM listener: LISTENER
Spfile: +DATA/asm/asmparameterfile/registry.253.720043719
ASM diskgroup discovery string: /dev/sdb*
ASM is enabled.
检查 ASM 的状态:
$ srvctl status asm -a
ASM is running on oradba2
ASM is enabled.
也可以对磁盘组以及服务进行配置。下面是创建名为 APP 服务的方法(切记,我们是在单个实例中执行此操作,而非在长久使用这些命令的 RAC 中)。
$ srvctl add service -d D112D2 -s APP
创建 APP 服务后,可以检查该服务的各种属性:
$ srvctl config service -d D112D2 -a
Service name: APP
Service is enabled
Cardinality: SINGLETON
Disconnect: false
Service role: PRIMARY
Management policy: AUTOMATIC
DTP transaction: false
AQ HA notifications: false
Failover type: NONE
Failover method: NONE
TAF failover retries: 0
TAF failover delay: 0
Connection Load Balancing Goal: LONG
Runtime Load Balancing Goal: NONE
TAF policy specification: NONE
服务已创建,但尚未启动。可以检查服务的状态并启动服务:
$ srvctl status service -d D112D2 -s APP
Service APP is not running.
$ srvctl start service -d D112D2 -s APP
$ srvctl status service -d D112D2 -s APP
Service APP is running
也可以对 ASM 中的磁盘组使用这个命令,这些磁盘组也被视为资源。
$ srvctl start diskgroup -g <dg_name>
$ srvctl stop diskgroup -g <dg_name> [-f]
(“-f”选项强制停止磁盘组,即使某个数据库正在使用该磁盘组并且当前正在运行)
$ srvctl status diskgroup -g <dg_name> [-a]
(“-a”选项用于显示所有状态)
$ srvctl enable diskgroup -g <dg_name>
$ srvctl disable diskgroup -g <dg_name>
要修改配置,可以使用“modify”子句:
$ srvctl modify database -d D112D2 –z
在此示例中,我们已配置为删除数据库上磁盘组的依赖性(–z 选项执行该操作)
要从 Oracle Restart 中删除数据库,可以使用
$ srvctl remove database -d D112D2 -v
Remove the database D112D2? (y/[n]) y
Successfully removed database and its dependent services.
这只是从 HAS 服务中删除了数据库。不会删除数据库本身。
您可以在 HAS 所管理的资源运行时获取它们的大量信息。以下命令可执行该操作。代表“详细”输出的“-v”选项可执行该操作。
$ crsctl status resource -v
NAME=ora.DATA.dg
TYPE=ora.diskgroup.type
LAST_SERVER=oradba2
STATE=ONLINE on oradba2
TARGET=ONLINE
CARDINALITY_ID=ONLINE
CREATION_SEED=6
CURRENT_RCOUNT=0
FAILURE_COUNT=0
FAILURE_HISTORY=
ID=ora.DATA.dg oradba2 1
INCARNATION=1
LAST_RESTART=1281465040
STATE_DETAILS=
… 删减了部分输出 …
NAME=ora.diskmon
TYPE=ora.diskmon.type
LAST_SERVER=oradba2
STATE=ONLINE on oradba2
TARGET=ONLINE
CARDINALITY_ID=1
CREATION_SEED=1
CURRENT_RCOUNT=0
FAILURE_COUNT=0
FAILURE_HISTORY=
ID=ora.diskmon 1 1
INCARNATION=1
LAST_RESTART=1281462735
STATE_DETAILS=
尽管有一些详细信息,但是不太便于阅读。可通过以下命令获取更简洁的报告:
$ crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg ONLINE ONLINE oradba2
ora.DG1.dg ONLINE ONLINE oradba2
ora.DG2.dg OFFLINE OFFLINE oradba2
ora.LISTENER.lsnr ONLINE ONLINE oradba2
ora.asm ONLINE ONLINE oradba2 Started
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd 1 ONLINE ONLINE oradba2
ora.d112d2.db ONLINE ONLINE oradba2 Open
ora.diskmon ONLINE ONLINE oradba2
如果您希望仅获取特定资源的详细输出,该怎么办?通过将该资源命名为参数可实现此目的。(请注意:必须提供完整的资源名称,就像 crsctl 输出中显示的那样。例如,资源 APP 不是完整名称。完整名称为 ora.d112d2.app.svc。)
$ crsctl status resource ora.d112d2.app.svc
NAME=ora.d112d2.app.svc
TYPE=ora.service.type
TARGET=ONLINE
STATE=ONLINE on oradba2
“-v”选项使输出更加详细。
$ crsctl status resource ora.d112d2.app.svc -v
NAME=ora.d112d2.app.svc
TYPE=ora.service.type
LAST_SERVER=oradba2
STATE=ONLINE on oradba2
TARGET=ONLINE
CARDINALITY_ID=1
CREATION_SEED=17
CURRENT_RCOUNT=0
FAILURE_COUNT=0
FAILURE_HISTORY=
ID=ora.d112d2.app.svc 1 1
INCARNATION=1
LAST_RESTART=1293305825
STATE_DETAILS=
可通过以下命令启动所有资源
$ crsctl start resource -all
CRS-5702: Resource 'ora.DG1.dg' is already running on 'oradba2'
CRS-5702: Resource 'ora.LISTENER.lsnr' is already running on 'oradba2'
CRS-5702: Resource 'ora.asm' is already running on 'oradba2'
CRS-5702: Resource 'ora.cssd' is already running on 'oradba2'
CRS-5702: Resource 'ora.d112d2.app.svc' is already running on 'oradba2'
CRS-5702: Resource 'ora.d112d2.db' is already running on 'oradba2'
CRS-5702: Resource 'ora.diskmon' is already running on 'oradba2'
CRS-2672: Attempting to start 'ora.DG2.dg' on 'oradba2'
CRS-2676: Start of 'ora.DG2.dg' on 'oradba2' succeeded
CRS-4000: Command Start failed, or completed with errors.
这是一个有用的命令,可一次启动所有资源,但如果一个命令失败,将在结尾处显示“completed with errors”输出。如果对所有组件启用了自动启动,那么该命令确实没什么必要。在某些情况下,特别是在您尝试诊断环境中的问题时,可能希望禁用自动启动,然后手动启动组件。
要停止在特定 Oracle 主目录中运行的所有资源,可执行以下命令:
$ srvctl stop home -o /opt/oracle/product/11.2.0/db1 -s mystate.txt
文件 mystate.txt 被称作“状态文件”,记录组件关闭时 HAS 组件的状态。该文件如下所示:
$ cat mystate.txt
svc-APP
db-d112d2
类似地,要启动在特定 Oracle 主目录中启动的所有资源,可执行以下命令:
$ srvctl start home -o /opt/oracle/product/11.2.0/db1 -s mystate.txt
需要有状态文件才能启动在关闭时所运行的资源