4.1 使用Oracle Restart管理组件

Oracle Restart是GI提供的一个服务,它包含一组由操作系统启动和监控的进程。其中的一些进程用根(或管理员)权限来运行。其他进程用安装GI的用户权限来运行。Oracle Restart可以配置为自动或手动启动。

在这里,资源是可以由GI管理的对象。所有资源都在Oracle Local Registry(OLR)中注册。一旦注册,它们就在Oracle Restart控制之下。一些配置工具如果检测到Oracle Restart配置,就隐式注册资源。其他配置工具就不是这样。对于后者,资源必须显式注册。一旦注册,资源就可以用GI实用工具(GI也能停止或启动任何依赖的资源)或资源内置的实用工具来启动或停止。

最重要的是可用性高的功能。GI包含一个事件监控机制,它会检测已注册资源的任何状态变化,传递与状态变化相关的消息,如果需要,还尝试自动重启失败的资源。

4.1.1 管理Oracle Restart进程

按照GI的安装过程进行,在启动服务器时,Oracle Restart 进程会自动启动。在Linux上,核心进程是init.ohasd守护进程。它通过rc脚本启动,监控和重启功能由/etc/inittab文件中的一个选项启用。如果守护进程停止,init会重启它。在Windows上,该功能由Windows服务OracleOHService提供,该服务启动、监控、重启ohasd.exe进程。

为了手工控制Oracle Restart,可以使用crsctl实用程序。图4-1显示了在Windows系统上管理Oracle Restart最常用的crsctl命令。这些命令在语法上与Linux相同。注意大多数命令都只能由具备管理员(Windows)或根(Linux)权限的用户执行。

图4-1 使用crsctl实用程序管理Oracle Restart(Windows)

表4-1所示是图4-1中使用的命令:

表4-1 图4-1中使用的命令

图4-2显示了更多的crsctl命令,这次是用于Linux系统的。

图4-2 使用crsctl实用程序管理Oracle Restart(Linux)

表4-2所示是图4-2中使用的命令:

表4-2 图4-2中使用的命令

4.1.2 管理注册的资源

如果要为资源提供高可用性的服务,就必须用Oracle Restart注册资源。一些工具在创建资源时注册它们,另外一些则不然。例如,如果用DBCA实用工具创建数据库,它就会检测到Oracle Restart的存在,于是运行注册数据库的命令。在DBCA生成的脚本中可以看到这些命令。如果用SQL *Plus创建数据库,就必须自己注册。如果用Net Configuration Assistant创建一个侦听器,就会注册它。如果用Net Manager创建它,就不会注册它。如果在已经安装了其他产品后安装GI,所有以前创建的资源就必须显式注册。

可以用 crsctl 实用工具注册资源,但这是一个一般意义的工具,说得好听一些,添加资源的语法是很麻烦的。注册资源时,至少要给Oracle Restart提供如下信息:

● 如何启动、停止、监控资源

● 资源失败时该怎么办

● 它可能依赖什么其他资源

而且,对于不同类型的资源,所需信息的本质是不同的。处理Oracle资源的一种更好方法是使用srvctl实用工具。它用DBA可能需要的、处理所有资源的命令预先配置。但是,这仅限于Oracle资源;不能使用它(例如)把Apache网络侦听器注册为托管资源。

srvctl实用工具的一般语法如下:

        srvctl <command> <object> <options>

常用命令如表4-3所示:

表4-3 常用命令

常用对象如表4-4所示:

表4-4 常用对象

在srvctl命令中使用的选项取决于命令和对象的本质。

提示:

srvctl实用工具有一个superb帮助功能。运行srvctl -help,就会看到每个资源类型的每个命令的完整语法。可惜,不能在考试时这么做。

要注册数据库,可使用如下命令:

        srvctl add database -db orclz -oraclehome /u01/db_home1

第一个选项是数据库的DB_UNIQUE_NAME,它一般是DB_NAME。第二个选项是Oracle Home,打开数据库的实例就运行在该Oracle Home上。其他不常用的选项可以指定需要的磁盘组,指定服务器参数文件(spfile)和密码文件,控制自动启动。默认情况下,数据库配置为Oracle Restart在OPEN模式下自动启动它。要显示数据库orclz的配置,可以使用如下命令:

        srvctl config database -db orclz -all

下面启动、停止、检查数据库的状态:

        srvctl start database -db orclz -startoption open
        srvctl stop database -db orclz -stopoption immediate
        srvctl status database -db orclz

变元STARTOPTION和STOPOPTION的值默认为OPEN和IMMEDIATE, STARTOPTION的其他值是NOMOUNT、MOUNT和READONLY。STOPOPTION的其他值是NORMAL、TRANSACTIONAL和ABORT。

考点:

srvctl实用工具安装在数据库Oracle Home和GI Oracle Home下,可以从这两个目录下运行。crsctl实用工具只能在GI Oracle Home下使用。

4.1.3 重启功能

资源在Oracle Restart的控制下放置,由GI监控,在失败时重启。资源的可控关闭(使用srvctl实用工具或内置于资源的工具)不会重启它。

考点:

使用SRVCTl ADD时没有进行“实际的检查”。数据库在OLR中成功注册,并不意味着它实际存在。

重启行为由传递给SRVCTL ADD命令的POLICY参数确定,或者由以后传递给SRVCTL MODIFY命令的POLICY参数确定。默认值是启用自动的重启。

        -POLICY AUTOMATIC | MANUAL | NORESTART

练习4-1 用Oracle Restart配置数据库

本练习用Oracle Restart配置数据库。假定练习3-1已完成。

(1) 在操作系统的提示下,确认配置并运行了OHASD,注意这需要管理员权限或根权限,并确保搜索路径包括GI主目录下的bin目录。接着使用crsctl实用工具,如下:

        crsctl config has
        crsctl check has

(2) 演示实现Oracle Restart的GI过程本身由操作系统防止失败。在Linux上,根用户标识守护进程的进程号,再关闭它。使用这些命令,用自己的init.ohasd进程的进程号替代12345:

        ps -ef | grep init.ohasd
        kill -9 12345
        ps -ef | grep init.ohasd

在Windows上,使用任务管理器定位ohasd.exe进程,再单击“结束任务”按钮,关闭它。

不一会儿,进程重启了,但进程ID不同。

(3) 使用srvctl实用工具通过Oracle Restart注册数据库。所有变元都可以使用默认值,但数据库的唯一名称和Oracle Home除外。如果把ORACLE_HOME环境变量设置为数据库的主目录,就可以使用它。下面的例子在Linux上注册数据库orclz:

        srvctl add database -d orclz -oraclehome $ORACLE_HOME

(4) 确定数据库已成功注册,再检查其状态:

        srvctl config database -d orclz
        srvctl status database -d orclz

无论数据库是否运行,都会报告“未运行”。这是因为自从它注册以来,就没有启动过。

(5) 发出一个启动命令,强制GI进行实际的检查,再次检查状态。

        srvctl start database -db orclz
        srvctl status database -db orclz

图4-3显示了Windows系统上的第2~4步。

图4-3 显示Windows系统上的第2~4步

(6) 用srvctl和SQL *Plus试验启动和关闭命令。每次都检查状态。

(7) 数据库运行时,演示重启功能。在Linux上,使用ps命令标识smon背景进程,再关闭它。这会立即中断实例。在Windows上,使用任务管理器的“结束任务”按钮关闭oracle.exe进程。

不一会儿,实例重启了。

图4-4显示了在Linux上的实例重启测试:

图4-4 Linux上的实例重启测试

Oracle Restart可以保护数据库之外的资源,包括Oracle提供的服务和第三方服务。如果Oracle Restart已经安装,大多数后续安装的Oracle服务就在其安装过程中注册。如果没有安装Oracle Restart,它们就可以在以后注册。

练习4-2 把侦听器注册为托管资源

把数据库侦听器放在Oracle Restart的控制下,演示其作用。需要的命令如下(没有换行符):

        srvctl add listener
        [ -listener <lsnr_name> ]
        [ -oraclehome <path> ]
        [ -endpoints "<port>" ]

变元的默认值假定,侦听器的名称是LISTENER,侦听的端点是1521。Oracle Home是GI主目录(如果完成了前面的练习,它就是不正确的)。接着检查其配置和状态,停止并启动侦听器,用操作系统实用工具观察关闭侦听器进程的效果。

下面是可用的命令(使用Windows Oracle Home):

        srvctl add listener -listener listener -oraclehome
        c:\app\oracle\product\12.1.0\dbhome_1
        srvctl config listener -listener listener
        srvctl stop listener -listener listener
        srvctl start listener -listener listener

这是在Windows上模拟失败的一种方式:

        net stop OracleOraDB12Home1TNSListener

在Linux上,找到tnslsnr进程的进程ID,关闭它。

注意侦听器稍后会重启。