跳过导航链接
退出打印视图
| 适用于 Oracle 的 Oracle Solaris Cluster 数据服务指南 Oracle Solaris Cluster 3.3 3/13 (简体中文)

搜索范围:

- 本文档
- 整个文档库

## 定制 HA for Oracle 服务器 故障监视器

通过定制 HA for Oracle 服务器 故障监视器，可以按如下方式修改服务器故障监视器的行为：

- 覆盖错误的预设操作

- 为没有预设操作的错误指定操作

| 注意 - 定制 HA for Oracle 服务器 故障监视器之前，需要考虑定制的效果，尤其是将操作从重新启动或切换更改为忽略或停止监视的情况。如果错误长时间未得到纠正，则可能会导致数据库问题。如果在定制了 HA for Oracle 服务器 故障监视器之后遇到数据库问题，请恢复使用预设操作。通过恢复预设操作，可以确定问题是否由定制导致。

以下各节介绍了定制 HA for Oracle 服务器故障监视器所需执行的活动：

- 为错误定义定制行为

- 将定制操作文件传播到群集中的所有节点

- 指定服务器故障监视器应使用的定制操作文件

### 为错误定义定制行为

HA for Oracle 服务器故障监视器可检测以下类型的错误：

- 服务器故障监视器探测数据库期间发生的 DBMS 错误

- Oracle 在警报日志文件中记录的警报

- 由于无法在 `Probe_timeout` 扩展属性设置的时间内接收响应而产生的超时

要为这些类型的错误定义定制行为，可创建定制操作文件。本节包含有关定制操作文件的以下信息：

- 定制操作文件格式

- 更改对 DBMS 错误的响应

- 更改对记录的警报的响应

- 更改连续超时探测的最大次数

#### 定制操作文件格式

定制操作文件是一种纯文本文件。该文件包含一个或多个条目，定义 HA for Oracle 服务器 故障监视器的定制行为。每个条目为单个 DBMS 错误、单个超时错误或多个记录的警报定义定制行为。一个定制操作文件中最多允许有 1024 个条目。

注 - 定制操作文件中的每个条目会覆盖错误的预设操作，或者为没有预设操作的错误指定操作。在定制操作文件中，请仅为那些要覆盖的预设操作或没有预设操作的错误创建条目。请不要为不需要更改的操作创建条目。

定制操作文件中的条目由一系列用分号分隔的关键字-值对组成。每个条目都括在括号中。

定制操作文件中的条目格式如下：

    {
    [ERROR_TYPE=DBMS_ERROR|SCAN_LOG|TIMEOUT_ERROR;]
    ERROR=error-spec;
    [ACTION=SWITCH|RESTART|STOP|NONE;]
    [CONNECTION_STATE=co|di|on|*;]
    [NEW_STATE=co|di|on|*;]
    [MESSAGE="message-string"]
    }

分隔的关键字-值对之间以及条目之间可以使用空格来设置文件格式。

定制操作文件中关键字的含义和允许值如下：

`ERROR_TYPE`

  表示服务器故障监视器检测到的错误类型。该关键字允许使用以下值：

  `DBMS_ERROR`

    指定该错误为 DBMS 错误。

  `SCAN_LOG`

    指定该错误为警报日志文件中记录的警报。

  `TIMEOUT_ERROR`

    指定该错误为超时。

  `ERROR_TYPE` 关键字是可选的。如果忽略该关键字，则假定错误为 DBMS 错误。

`ERROR`

  用于标识错误。error-spec 的数据类型和含义取决于 `ERROR_TYPE` 关键字的值，如下表所示。

  `ERROR_TYPE` | 数据类型 | 含义
  --- | --- | ---
  `DBMS_ERROR` | 整数 | 由 Oracle 生成的 DBMS 错误的错误编号
  `SCAN_LOG` | 引用的正则表达式 | Oracle 已记录到 Oracle 警报日志文件的错误消息中的字符串
  `TIMEOUT_ERROR` | 整数 | 自服务器故障监视器上次启动或重新启动以后，连续超时探测的次数

  必须指定 `ERROR` 关键字。如果忽略该关键字，将忽略定制操作文件中的对应条目。

`ACTION`

  指定服务器故障监视器在响应错误时要执行的操作。该关键字允许使用以下值：

  `NONE`

    指定服务器故障监视器忽略该错误。

  `STOP`

    指定停止服务器故障监视器。

  `RESTART`

    指定服务器故障监视器停止和重新启动由 `SUNW.oracle_server` 资源的 `Restart_type` 扩展属性值指定的实体。

  `SWITCH`

    指定服务器故障监视器将数据库服务器资源组切换到其他节点或区域。

  `ACTION` 关键字是可选的。如果忽略该关键字，服务器故障监视器将忽略该错误。

`CONNECTION_STATE`

  指定检测到错误时数据库与服务器故障监视器之间所需的连接状态。该条目仅适用于检测到错误后连接处于所需状态的情况。该关键字允许使用以下值：

  `*`

    指定该条目始终适用，不考虑连接状态。

  `co`

    指定该条目仅适用于服务器故障监视器正尝试连接到数据库的情况。

  `on`

    指定该条目仅适用于服务器故障监视器联机的情况。如果服务器故障监视器连接到数据库，则为联机。

  `di`

    指定仅当服务器故障监视器与数据库断开连接时才应用该条目。

  `CONNECTION_STATE` 关键字是可选的。如果忽略该关键字，则该条目始终适用，不考虑连接状态。

`NEW_STATE`

  指定服务器故障监视器检测到错误后，数据库与服务器故障监视器之间必须实现的连接状态。该关键字允许使用以下值：

  `*`

    指定连接状态必须保持不变。

  `co`

    指定服务器故障监视器必须与数据库断开连接，并立即重新连接到数据库。

  `di`

    指定服务器故障监视器必须与数据库断开连接。服务器故障监视器下次探测数据库时会重新连接。

  `NEW_STATE` 关键字是可选的。如果忽略该关键字，则检测到错误后数据库连接状态保持不变。

`MESSAGE`

  指定检测到错误时需输出到资源日志文件的附加消息。该消息必须括在双引号中。该消息是为错误定义的标准消息的附加消息。

  `MESSAGE` 关键字是可选的。如果忽略该关键字，则在检测到该错误后，不会将任何附加消息输出到资源的日志文件。

#### 更改对 DBMS 错误的响应

表 B-1 中列出了服务器故障监视器为响应每个 DBMS 错误而预设的操作。要确定是否需要更改对 DBMS 错误的响应，需要考虑 DBMS 错误对数据库的影响，以便确定预设操作是否合适。有关示例，请参见以下各小节：

- 响应影响严重的错误

- 忽略影响轻微的错误

要更改对 DBMS 错误的响应，可在定制操作文件中创建一个条目，并在该条目中按如下方式设置关键字：

- `ERROR_TYPE` 设置为 `DBMS_ERROR`。

- `ERROR` 设置为 DBMS 错误的错误编号。

- `ACTION` 设置为所需的操作。

##### 响应影响严重的错误

如果服务器故障监视器忽略的错误会影响多个会话，则可能需要服务器故障监视器执行操作以防止服务丢失。

例如，没有为 Oracle 错误 4031: `unable to allocate` num-bytes `bytes of shared memory` 预设任何操作。但是，该 Oracle 错误表示共享全局区域 (Shared Global Area, SGA) 内存不足、碎片太多或者同时存在这两种状态。如果该错误仅影响一个会话，则忽略该错误可能是恰当的。但是，如果该错误影响多个会话，则需考虑指定服务器故障监视器重新启动数据库。

以下示例展示了定制操作文件中的一个条目，用于将对 DBMS 错误的响应更改为重新启动。

示例 1-4 更改对 DBMS 错误的响应以重新启动

    {
    ERROR_TYPE=DBMS_ERROR;
    ERROR=4031;
    ACTION=restart;
    CONNECTION_STATE=*;
    NEW_STATE=*;
    MESSAGE="Insufficient memory in shared pool.";
    }

此示例展示了定制操作文件中的一个条目，用于覆盖 DBMS 错误 4031 预设操作。该条目指定以下行为：

- 为响应 DBMS 错误 4031，服务器故障监视器执行的操作是重新启动。

- 检测到错误时，无论数据库与服务器故障监视器之间的连接状态如何，都适用该条目。

- 检测到错误后，数据库与服务器故障监视器之间的连接状态必须保持不变。

- 检测到此错误后，以下消息会输出到资源的日志文件中：

      Insufficient memory in shared pool.

##### 忽略影响轻微的错误

如果服务器故障监视器响应的错误影响轻微，则忽略错误可能比响应错误造成的干扰更少。

例如，Oracle 错误 4030: `out of process memory when trying to allocate` num-bytes `bytes` 的预设操作为重新启动。该 Oracle 错误表示服务器故障监视器无法分配专用堆内存。该错误的一个可能原因是操作系统可用内存不足。如果该错误影响多个会话，则重新启动数据库可能是恰当的。但是，该错误可能不会影响其他会话，因为这些会话不需要额外的专用内存。在这种情况下，可以考虑指定服务器故障监视器忽略该错误。

以下示例展示了定制操作文件中的一个条目，用于忽略 DBMS 错误。

示例 1-5 忽略 DBMS 错误

    {
    ERROR_TYPE=DBMS_ERROR;
    ERROR=4030;
    ACTION=none;
    CONNECTION_STATE=*;
    NEW_STATE=*;
    MESSAGE="";
    }

此示例展示了定制操作文件中的一个条目，用于覆盖 DBMS 错误 4030 预设操作。该条目指定以下行为：

- 服务器故障监视器忽略 DBMS 错误 4030。

- 检测到错误时，无论数据库与服务器故障监视器之间的连接状态如何，都适用该条目。

- 检测到错误后，数据库与服务器故障监视器之间的连接状态必须保持不变。

- 检测到此错误后，没有任何其他消息会输出到资源的日志文件中。

#### 更改对记录的警报的响应

Oracle 软件将警报记录在 `alert_log_file` 扩展属性标识的文件中。服务器故障监视器会扫描该文件，并执行操作以响应为其定义了操作的警报。

表 B-2 列出为其预设了操作的记录的警报。更改对记录的警报的响应以更改预设操作，或定义服务器故障监视器要响应的新警报。

要更改对已记录警报的响应，请在定制操作文件中创建一个条目，并在其中按如下所述设置关键字：

- `ERROR_TYPE` 设置为 `SCAN_LOG`。

- `ERROR` 被设置为一个引用的正则表达式，用于标识 Oracle 已记录到 Oracle 警报日志文件中的错误消息中的字符串。

- `ACTION` 设置为所需的操作。

服务器故障监视器按照条目在定制操作文件中出现的顺序处理条目。仅处理第一个与记录的警报匹配的条目。后面的匹配条目将被忽略。如果使用正则表达式为多个记录的警报指定操作，请确保较具体的条目出现在一般条目之前。在一般条目之后出现的具体条目可能会被忽略。

例如，定制操作文件可能会为正则表达式 `ORA-65` 和 `ORA-6` 标识的错误定义不同的操作。为确保不忽略包含正则表达式 `ORA-65` 的条目，请确保该条目出现在包含正则表达式 `ORA-6` 的条目之前。

以下示例展示了定制操作文件中的一个条目，用于更改对记录的警报的响应。

示例 1-6 更改对已记录警报的响应

    {
    ERROR_TYPE=SCAN_LOG;
    ERROR="ORA-00600: internal error";
    ACTION=RESTART;
    }

此示例展示了定制操作文件中的一个条目，用于覆盖有关内部错误的记录的警报的预设操作。该条目指定以下行为：

- 为响应包含文本 `ORA-00600: internal error` 的记录的警报，服务器故障监视器执行的操作是重新启动。

- 检测到错误时，无论数据库与服务器故障监视器之间的连接状态如何，都适用该条目。

- 检测到错误后，数据库与服务器故障监视器之间的连接状态必须保持不变。

- 检测到此错误后，没有任何其他消息会输出到资源的日志文件中。

#### 更改连续超时探测的最大次数

默认情况下，服务器故障监视器会在第二次连续超时探测后重新启动数据库。如果数据库负载很轻，两次连续超时探测应足以表明该数据库已挂起。但是，在负载很重时，即使数据库正常工作，服务器故障监视器探测也可能会超时。为防止服务器故障监视器不必要地重新启动数据库，可以增加连续超时探测最大次数。

| 注意 - 增加连续超时探测最大次数会延长检测数据库挂起所需的时间。

要更改允许的连续超时探测最大次数，可以在定制操作文件中为除第一次超时探测以外的每个允许的连续超时探测创建一个条目。

注 - 无需为第一次超时探测创建条目。服务器故障监视器响应第一次超时探测时执行的操作已经预设。

对于最后一次允许的超时探测，可以创建一个条目，其中的关键字设置如下：

- `ERROR_TYPE` 设置为 `TIMEOUT_ERROR`。

- `ERROR` 设置为允许的连续超时探测最大次数。

- `ACTION` 设置为 `RESTART`。

对于除第一次超时探测以外的其余每次连续超时探测，可以创建一个条目，其中的关键字设置如下：

- `ERROR_TYPE` 设置为 `TIMEOUT_ERROR`。

- `ERROR` 设置为超时探测的序号。例如，对于第二次连续超时探测，可将此关键字设置为 2。对于第三次连续超时探测，可将此关键字设置为 3。

- `ACTION` 设置为 `NONE`。

提示 - 为方便调试，可以指定指示超时探测序号的消息。

以下示例展示了定制操作文件中的一些条目，用于将连续超时探测的最大次数增加到五次。

示例 1-7 更改连续超时探测的最大次数

    {
    ERROR_TYPE=TIMEOUT;
    ERROR=2;
    ACTION=NONE;
    CONNECTION_STATE=*;
    NEW_STATE=*;
    MESSAGE="Timeout #2 has occurred.";
    }

    {
    ERROR_TYPE=TIMEOUT;
    ERROR=3;
    ACTION=NONE;
    CONNECTION_STATE=*;
    NEW_STATE=*;
    MESSAGE="Timeout #3 has occurred.";
    }

    {
    ERROR_TYPE=TIMEOUT;
    ERROR=4;
    ACTION=NONE;
    CONNECTION_STATE=*;
    NEW_STATE=*;
    MESSAGE="Timeout #4 has occurred.";
    }

    {
    ERROR_TYPE=TIMEOUT;
    ERROR=5;
    ACTION=RESTART;
    CONNECTION_STATE=*;
    NEW_STATE=*;
    MESSAGE="Timeout #5 has occurred. Restarting.";
    }

本示例说明了定制操作文件中用于将连续超时探测的最大次数增加到五的条目。这些条目指定以下行为：

- 服务器故障监视器忽略第二次到第四次连续超时探测。

- 为响应第五次连续超时探测，服务器故障监视器执行的操作是重新启动。

- 发生超时时，无论数据库与服务器故障监视器之间的连接状态如何，都适用这些条目。

- 发生超时后，数据库与服务器故障监视器之间的连接状态必须保持不变。

- 发生第二次到第四次连续超时探测时，会向资源的日志文件输出以下形式的消息：

      Timeout #number has occurred.

- 发生第五次连续超时探测时，将向资源的日志文件输出以下消息：

      Timeout #5 has occurred. Restarting.

### 将定制操作文件传播到群集中的所有节点

服务器故障监视器在所有群集节点或区域上的行为必须一致。因此，服务器故障监视器使用的定制操作文件必须在所有群集节点或区域上相同。创建或修改定制操作文件后，可以通过将该文件传播到所有群集节点或区域来确保该文件在所有群集节点或区域上相同。要将该文件传播到所有群集节点或区域，可以使用最适合群集配置的方法：

- 将该文件放置在所有节点或区域共享的文件系统上

- 在高可用性的本地文件系统上查找文件

- 通过操作系统命令（如 `rcp`(1) 命令或 `rdist`(1) 命令）将文件复制到每个群集节点或区域的本地文件系统

### 指定服务器故障监视器应使用的定制操作文件

要将定制操作应用到服务器故障监视器，必须指定故障监视器应使用的定制操作文件。服务器故障监视器读取定制操作文件时，定制操作会应用到该服务器故障监视器。服务器故障监视器会在指定定制操作文件时读取该文件。

指定定制操作文件时还会验证该文件。如果该文件中包含语法错误，则将显示错误消息。因此，修改了定制操作文件后，请重新指定该文件以便对其进行验证。

| 注意 - 如果在修改后的定制操作文件中检测到语法错误，请更正错误后再重新启动故障监视器。如果在重新启动故障监视器时语法错误仍未得到纠正，则故障监视器会读取有错误的文件，并忽略第一个语法错误之后出现的条目。

### 如何指定服务器故障监视器应使用的定制操作文件

1. 在群集节点上，成为超级用户或承担可提供 `solaris.cluster.modify` RBAC 授权的角色。
2. 设置 `SUNW.oracle_server` 资源的 `Custom_action_file` 扩展属性。

   将此属性设置为定制操作文件的绝对路径。

       # clresource set -p custom_action_file=filepath server-resource

   `-p` `custom_action_file=` filepath

     指定定制操作文件的绝对路径。

   server-resource

     指定 `SUNW.oracle_server` 资源。

版权所有 © 2000, 2014, Oracle 和/或其附属公司。 保留所有权利。 法律声明 |