适用于 Oracle 数据库的 Oracle® Solaris Cluster 数据服务指南

退出打印视图

更新时间: 2014 年 9 月
 
 

为错误定义定制行为

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

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

  • Oracle 数据库在警报日志文件中记录的警报

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

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

定制操作文件格式

定制操作文件是一种纯文本文件。该文件包含一个或多个条目,用于定义 HA for Oracle Database 服务器故障监视器的定制行为。每个条目为单个 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 错误的响应

Table 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-3  更改对 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-4  忽略 DBMS 错误
{
ERROR_TYPE=DBMS_ERROR;
ERROR=4030;
ACTION=none;
CONNECTION_STATE=*;
NEW_STATE=*;
MESSAGE="";
}

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

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

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

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

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

更改对记录的警报的响应

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

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

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

  • ERROR_TYPE 设置为 SCAN_LOG

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

  • ACTION 设置为所需的操作。

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

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

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

示例 1-5  更改对已记录警报的响应
{
ERROR_TYPE=SCAN_LOG;
ERROR="ORA-00600: internal error";
ACTION=RESTART;
}

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

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

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

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

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

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

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


Caution

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


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


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

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

  • ERROR_TYPE 设置为 TIMEOUT_ERROR

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

  • ACTION 设置为 RESTART

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

  • ERROR_TYPE 设置为 TIMEOUT_ERROR

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

  • ACTION 设置为 NONE


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

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

示例 1-6  更改连续超时探测的最大次数
{
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.