

# 设置和取消设置系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents"></a>

要在会话级别设置和取消设置诊断事件，可以使用 Oracle SQL 语句 `ALTER SESSION SET EVENTS`。但是，要在系统级别设置事件，您不能使用 Oracle SQL。相反，请使用 `rdsadmin.rdsadmin_util` 软件包中的系统事件过程。以下引擎版本中提供系统事件过程：
+ 所有 Oracle Database 21c 版本
+ 19.0.0.0.ru-2020-10.rur-2020-10.r1 或更高的 Oracle Database 19c 版本

  有关更多信息，请参阅《Amazon RDS for Oracle 发布说明》**中的[版本 19.0.0.0.ru-2020-10.rur-2020-10.r1](https://docs.aws.amazon.com/AmazonRDS/latest/OracleReleaseNotes/oracle-version-19-0.html#oracle-version-RU-RUR.19.0.0.0.ru-2020-10.rur-2020-10.r1)

**重要**  
`rdsadmin.rdsadmin_util` 软件包内部使用 `ALTER SYSTEM SET EVENTS` 语句设置事件。Oracle 数据库文档中没有记录此 `ALTER SYSTEM` 语句。某些系统诊断事件可能会生成大量跟踪信息、引起争用或影响数据库可用性。我们建议您在非生产数据库中测试特定的诊断事件，并且在 Oracle 支持的指导下仅在生产数据库中设置事件。

## 列出允许的系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.listing"></a>

要列出可以设置的系统事件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.list_allowed_system_events`。此过程不接受任何参数。

以下示例列出了您可以设置的所有系统事件。

```
SET SERVEROUTPUT ON
EXEC rdsadmin.rdsadmin_util.list_allowed_system_events;
```

以下示例输出列出了事件编号及其描述。使用 Amazon RDS 过程 `set_system_event` 来设置这些事件并使用 `unset_system_event` 来取消设置它们。

```
604   - error occurred at recursive SQL level
942   - table or view does not exist
1401  - inserted value too large for column
1403  - no data found
1410  - invalid ROWID
1422  - exact fetch returns more than requested number of rows
1426  - numeric overflow
1427  - single-row subquery returns more than one row
1476  - divisor is equal to zero
1483  - invalid length for DATE or NUMBER bind variable
1489  - result of string concatenation is too long
1652  - unable to extend temp segment by  in tablespace
1858  - a non-numeric character was found where a numeric was expected
4031  - unable to allocate  bytes of shared memory ("","","","")
6502  - PL/SQL: numeric or value error
10027 - Specify Deadlock Trace Information to be Dumped
10046 - enable SQL statement timing
10053 - CBO Enable optimizer trace
10173 - Dynamic Sampling time-out error
10442 - enable trace of kst for ORA-01555 diagnostics
12008 - error in materialized view refresh path
12012 - error on auto execute of job
12504 - TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
14400 - inserted partition key does not map to any partition
31693 - Table data object  failed to load/unload and is being skipped due to error:
```

**注意**  
允许的系统事件列表可能会随着时间的推移而变化。要确保您拥有最新的符合条件的活动列表，请使用 `rdsadmin.rdsadmin_util.list_allowed_system_events`。

## 设置系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.setting"></a>

要设置系统事件，请使用Amazon RDS过程`rdsadmin.rdsadmin_util.set_system_event`。您只能设置 `rdsadmin.rdsadmin_util.list_allowed_system_events` 输出中列出的事件。`set_system_event` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_event`  |  number  |  —  |  是  |  系统事件编号。此值必须是 `list_allowed_system_events` 报告的事件编号之一。  | 
|  `p_level`  |  number  |  —  |  是  |  活动级别。有关不同级别值的说明，请参阅 Oracle 数据库文档或 Oracle 支持。  | 

过程 `set_system_event` 根据以下原则构造和运行所需的 `ALTER SYSTEM SET EVENTS` 语句：
+ 事件类型（`context` 或 `errorstack`）是自动确定的。
+ `ALTER SYSTEM SET EVENTS 'event LEVEL event_level'` 表单中的语句设置上下文事件。此符号等同于 `ALTER SYSTEM SET EVENTS 'event TRACE NAME CONTEXT FOREVER, LEVEL event_level'`。
+ `ALTER SYSTEM SET EVENTS 'event ERRORSTACK (event_level)'` 表单中的语句设置错误堆栈事件。此符号等同于 `ALTER SYSTEM SET EVENTS 'event TRACE NAME ERRORSTACK LEVEL event_level'`。

以下示例将事件 942 设置为级别 3，将事件 10442 设置为级别 10。示例输出包括在内。

```
SQL> SET SERVEROUTPUT ON
SQL> EXEC rdsadmin.rdsadmin_util.set_system_event(942,3);
Setting system event 942 with: alter system set events '942 errorstack (3)'

PL/SQL procedure successfully completed.

SQL> EXEC rdsadmin.rdsadmin_util.set_system_event(10442,10);
Setting system event 10442 with: alter system set events '10442 level 10'

PL/SQL procedure successfully completed.
```

## 列出设置的系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.listing-set"></a>

要列出当前设置的系统事件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.list_set_system_events`。此过程仅报告 `set_system_event` 在系统级别设置的事件。

以下示例列出了活动的系统事件。

```
SET SERVEROUTPUT ON
EXEC rdsadmin.rdsadmin_util.list_set_system_events;
```

以下示例输出显示了事件列表、事件类型、当前设置事件的级别以及设置事件的时间。

```
942 errorstack (3) - set at 2020-11-03 11:42:27
10442 level 10 - set at 2020-11-03 11:42:41

PL/SQL procedure successfully completed.
```

## 取消设置系统诊断事件
<a name="Appendix.Oracle.CommonDBATasks.SystemEvents.unsetting"></a>

要取消设置系统事件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.unset_system_event`。您只能取消设置 `rdsadmin.rdsadmin_util.list_allowed_system_events` 输出中列出的事件。`unset_system_event` 过程接受以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_event`  |  number  |  —  |  是  |  系统事件编号。此值必须是 `list_allowed_system_events` 报告的事件编号之一。  | 

以下示例取消设置事件 942 和 10442。示例输出包括在内。

```
SQL> SET SERVEROUTPUT ON
SQL> EXEC rdsadmin.rdsadmin_util.unset_system_event(942);
Unsetting system event 942 with: alter system set events '942 off'

PL/SQL procedure successfully completed.

SQL> EXEC rdsadmin.rdsadmin_util.unset_system_event(10442);
Unsetting system event 10442 with: alter system set events '10442 off'

PL/SQL procedure successfully completed.
```