

# 执行 Oracle 数据库实例的常见日志相关任务
<a name="Appendix.Oracle.CommonDBATasks.Log"></a>

下文中介绍了如何在运行 Oracle 的 Amazon RDS 数据库实例上，执行与日志记录相关的特定常见 DBA 任务。为了提供托管服务体验，Amazon RDS 不允许通过 shell 访问数据库实例，而仅限访问某些需要高级权限的系统过程和表。

有关更多信息，请参阅“[Amazon RDS for Oracle 数据库日志文件](USER_LogAccess.Concepts.Oracle.md)”。

**Topics**
+ [设置强制日志记录](#Appendix.Oracle.CommonDBATasks.SettingForceLogging)
+ [设置补充日志记录](#Appendix.Oracle.CommonDBATasks.AddingSupplementalLogging)
+ [切换联机日志文件](#Appendix.Oracle.CommonDBATasks.SwitchingLogfiles)
+ [添加联机重做日志](#Appendix.Oracle.CommonDBATasks.RedoLogs)
+ [删除联机重做日志](#Appendix.Oracle.CommonDBATasks.DroppingRedoLogs)
+ [调整联机重做日志的大小](Appendix.Oracle.CommonDBATasks.ResizingRedoLogs.md)
+ [保留存档重做日志](Appendix.Oracle.CommonDBATasks.RetainRedoLogs.md)
+ [访问在线和存档的重做日志](Appendix.Oracle.CommonDBATasks.Log.Download.md)
+ [从 Amazon S3 下载存档的重做日志](Appendix.Oracle.CommonDBATasks.download-redo-logs.md)

## 设置强制日志记录
<a name="Appendix.Oracle.CommonDBATasks.SettingForceLogging"></a>

在强制日志记录模式下，Oracle 记录对数据库进行的所有更改，但在临时表空间和临时段中进行的更改除外 (忽略 `NOLOGGING` 子句)。有关更多信息，请参阅 Oracle 文档中的[指定“强制日志记录”模式](https://docs.oracle.com/cd/E11882_01/server.112/e25494/create.htm#ADMIN11096)。

要设置强制日志记录，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.force_logging`。`force_logging` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 是 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_enable`  |  布尔值  |  true  |  否  |  设置为 `true`，数据库为强制日志记录模式；设置为 `false` 则取消数据库的强制日志记录模式。  | 

以下示例将数据库置于强制日志记录模式下。

```
EXEC rdsadmin.rdsadmin_util.force_logging(p_enable => true);
```

## 设置补充日志记录
<a name="Appendix.Oracle.CommonDBATasks.AddingSupplementalLogging"></a>

如果启用补充日志记录，则 LogMiner 将具有支持链接行和集群表的必要信息。有关更多信息，请参阅 Oracle 文档中的[补充日志记录](https://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm#SUTIL1582)。

Oracle 数据库在默认情况下不启用补充日志记录。要启用和禁用补充日志记录，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.alter_supplemental_logging`。有关 Amazon RDS 如何管理 Oracle 数据库实例的存档重做日志的保留期的更多信息，请参阅 [保留存档重做日志](Appendix.Oracle.CommonDBATasks.RetainRedoLogs.md)。

`alter_supplemental_logging` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_action`  |  varchar2  |  —  |  是  |  如果为 `'ADD'`，则添加补充日志记录；如果为 `'DROP'`，则删除补充日志记录。  | 
|  `p_type`  |  varchar2  |  null  |  否  |  补充日志记录的类型。有效值为 `'ALL'`、`'FOREIGN KEY'`、`'PRIMARY KEY'`、`'UNIQUE'` 或 `PROCEDURAL`。  | 

以下示例启用补充日志记录。

```
begin
    rdsadmin.rdsadmin_util.alter_supplemental_logging(
        p_action => 'ADD');
end;
/
```

以下示例为所有具有固定长度的最大大小列启用补充日志记录。

```
begin
    rdsadmin.rdsadmin_util.alter_supplemental_logging(
        p_action => 'ADD',
        p_type   => 'ALL');
end;
/
```

以下示例为主键列启用补充日志记录。

```
begin
    rdsadmin.rdsadmin_util.alter_supplemental_logging(
        p_action => 'ADD',
        p_type   => 'PRIMARY KEY');
end;
/
```

## 切换联机日志文件
<a name="Appendix.Oracle.CommonDBATasks.SwitchingLogfiles"></a>

要切换日志文件，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.switch_logfile`。`switch_logfile` 过程没有参数。

以下示例切换日志文件。

```
EXEC rdsadmin.rdsadmin_util.switch_logfile;
```

## 添加联机重做日志
<a name="Appendix.Oracle.CommonDBATasks.RedoLogs"></a>

运行 Oracle 的 Amazon RDS 数据库实例从四个联机重做日志 (每个日志的大小为 128 MB) 开始。要添加其他重做日志，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.add_logfile`。

`add_logfile` 过程具有以下参数。

**注意**  
这些参数是互斥的。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `bytes`  |  positive  |  null  |  否  |  日志文件的大小 (以字节为单位)。 仅当日志大小小于 2147483648 字节（2 GiB）时才使用此参数。否则，RDS 会发出错误。对于大于此字节值的日志大小，请改用 `p_size` 参数。  | 
|  `p_size`  |  varchar2  |  —  |  是  |  日志文件的大小，单位为 KB（K）、MB（M）或 GB（G）。  | 

以下命令将添加一个 100MB 日志文件。

```
EXEC rdsadmin.rdsadmin_util.add_logfile(p_size => '100M');
```

## 删除联机重做日志
<a name="Appendix.Oracle.CommonDBATasks.DroppingRedoLogs"></a>

要删除重做日志，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.drop_logfile`。`drop_logfile` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `grp`  |  positive  |  —  |  是  |  日志的组编号。  | 

以下示例删除组编号为 3 的日志。

```
EXEC rdsadmin.rdsadmin_util.drop_logfile(grp => 3);
```

您只能删除具有未使用或不活动状态的日志。以下示例获取日志的状态。

```
SELECT GROUP#, STATUS FROM V$LOG;

GROUP#     STATUS
---------- ----------------
1          CURRENT
2          INACTIVE
3          INACTIVE
4          UNUSED
```

# 调整联机重做日志的大小
<a name="Appendix.Oracle.CommonDBATasks.ResizingRedoLogs"></a>

运行 Oracle 的 Amazon RDS 数据库实例从四个联机重做日志 (每个日志的大小为 128 MB) 开始。以下示例说明如何使用 Amazon RDS 过程将每个日志的大小从 128 MB 调整到 512 MB。

```
/* Query V$LOG to see the logs.          */
/* You start with 4 logs of 128 MB each. */

SELECT GROUP#, BYTES, STATUS FROM V$LOG;

GROUP#     BYTES      STATUS
---------- ---------- ----------------
1          134217728  INACTIVE
2          134217728  CURRENT
3          134217728  INACTIVE
4          134217728  INACTIVE


/* Add four new logs that are each 512 MB */

EXEC rdsadmin.rdsadmin_util.add_logfile(bytes => 536870912);
EXEC rdsadmin.rdsadmin_util.add_logfile(bytes => 536870912);
EXEC rdsadmin.rdsadmin_util.add_logfile(bytes => 536870912);
EXEC rdsadmin.rdsadmin_util.add_logfile(bytes => 536870912);


/* Query V$LOG to see the logs. */ 
/* Now there are 8 logs.        */

SELECT GROUP#, BYTES, STATUS FROM V$LOG;

GROUP#     BYTES      STATUS
---------- ---------- ----------------
1          134217728  INACTIVE
2          134217728  CURRENT
3          134217728  INACTIVE
4          134217728  INACTIVE
5          536870912  UNUSED
6          536870912  UNUSED
7          536870912  UNUSED
8          536870912  UNUSED


/* Drop each inactive log using the group number. */

EXEC rdsadmin.rdsadmin_util.drop_logfile(grp => 1);
EXEC rdsadmin.rdsadmin_util.drop_logfile(grp => 3);
EXEC rdsadmin.rdsadmin_util.drop_logfile(grp => 4);


/* Query V$LOG to see the logs. */ 
/* Now there are 5 logs.        */

select GROUP#, BYTES, STATUS from V$LOG;

GROUP#     BYTES      STATUS
---------- ---------- ----------------
2          134217728  CURRENT
5          536870912  UNUSED
6          536870912  UNUSED
7          536870912  UNUSED
8          536870912  UNUSED


/* Switch logs so that group 2 is no longer current. */

EXEC rdsadmin.rdsadmin_util.switch_logfile;


/* Query V$LOG to see the logs.        */ 
/* Now one of the new logs is current. */

SQL>SELECT GROUP#, BYTES, STATUS FROM V$LOG;

GROUP#     BYTES      STATUS
---------- ---------- ----------------
2          134217728  ACTIVE
5          536870912  CURRENT
6          536870912  UNUSED
7          536870912  UNUSED
8          536870912  UNUSED


/* If the status of log 2 is still "ACTIVE", issue a checkpoint to clear it to "INACTIVE".  */

EXEC rdsadmin.rdsadmin_util.checkpoint;


/* Query V$LOG to see the logs.            */ 
/* Now the final original log is inactive. */

select GROUP#, BYTES, STATUS from V$LOG;

GROUP#     BYTES      STATUS
---------- ---------- ----------------
2          134217728  INACTIVE
5          536870912  CURRENT
6          536870912  UNUSED
7          536870912  UNUSED
8          536870912  UNUSED


# Drop the final inactive log.

EXEC rdsadmin.rdsadmin_util.drop_logfile(grp => 2);


/* Query V$LOG to see the logs.    */ 
/* Now there are four 512 MB logs. */

SELECT GROUP#, BYTES, STATUS FROM V$LOG;

GROUP#     BYTES      STATUS
---------- ---------- ----------------
5          536870912  CURRENT
6          536870912  UNUSED
7          536870912  UNUSED
8          536870912  UNUSED
```

# 保留存档重做日志
<a name="Appendix.Oracle.CommonDBATasks.RetainRedoLogs"></a>

您可以在数据库实例上本地保留存档的重做日志，以用于 Oracle LogMiner（`DBMS_LOGMNR`）这类产品。保留重做日志后，您可以使用 LogMiner 分析日子。有关更多信息，请参阅 Oracle 文档中的[使用 LogMiner 分析重做日志文件](http://docs.oracle.com/cd/E11882_01/server.112/e22490/logminer.htm)。

要保留存档的重做日志，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.set_configuration`。如果您在 Oracle Data Guard 中的主实例上使用此过程，则 RDS 会更改主实例和打开只读副本的存档日志保留设置，但不会更改已挂载副本上的设置。RDS 会短时间保留已挂载副本的最新存档重做日志。RDS 会自动删除下载到已挂载副本的较旧日志。

`set_configuration` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `name`  |  varchar  |  —  |  是  |  要更新的配置的名称。要更改已存档的重做日志的保留时间，请将名称设置为 `archivelog retention hours`。  | 
|  `value`  |  varchar  |  —  |  是  |  该配置的值。设置日志要保留的小时数的值。  | 

以下示例保留 24 小时的重做日志。

```
begin
    rdsadmin.rdsadmin_util.set_configuration(
        name  => 'archivelog retention hours',
        value => '24');
end;
/
commit;
```

**注意**  
要使更改生效，必须执行提交操作。

要查看存档的重做日志为数据库实例保留多长时间，请使用 Amazon RDS 过程 `rdsadmin.rdsadmin_util.show_configuration`。

以下示例显示日志保留时间。

```
set serveroutput on
EXEC rdsadmin.rdsadmin_util.show_configuration;
```

输出显示 `archivelog retention hours` 的当前设置。以下输出显示存档的重做日志保留 48 小时。

```
NAME:archivelog retention hours
VALUE:48
DESCRIPTION:ArchiveLog expiration specifies the duration in hours before archive/redo log files are automatically deleted.
```

由于存档的重做日志保留在数据库实例中，因此，请确保数据库实例已为保留的日志分配足量的存储空间。要确定数据库实例上在最近 X 小时内使用的空间量，可以运行以下查询（将 X 替换为小时数）。

```
SELECT SUM(BLOCKS * BLOCK_SIZE) bytes 
  FROM V$ARCHIVED_LOG
 WHERE FIRST_TIME >= SYSDATE-(X/24) AND DEST_ID=1;
```

仅在数据库实例的备份保留期大于零时，RDS for Oracle 才会生成存档的重做日志。默认情况下，备份保留期大于零。

当存档的日志保留期过期时，RDS for Oracle 将从数据库实例中删除归档的重做日志。为支持将数据库实例还原到某个时间点，Amazon RDS 会根据备份保留期在数据库实例之外保留存档的重做日志。要修改备份保留期，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

**注意**  
在一些情况下，您可以在 Linux 上使用 JDBC 下载存档重做日志并体验长延迟时间和连接重置。在此类情况下，您的 Java 客户端上的默认随机数字生成器设置可能会引发问题。我们建议您将 JDBC 驱动程序设置为使用非阻塞的随机数字生成器。

# 访问在线和存档的重做日志
<a name="Appendix.Oracle.CommonDBATasks.Log.Download"></a>

您可能需要访问在线和存档重做日志文件，以供 GoldenGate、Attunity、Informatica 等外部工具进行挖掘。要访问这些文件，请执行以下操作：

1. 创建目录对象，对物理文件路径提供只读访问权限。

   使用 `rdsadmin.rdsadmin_master_util.create_archivelog_dir` 和 `rdsadmin.rdsadmin_master_util.create_onlinelog_dir`。

1. 使用 PL/SQL 读取文件。

   您可以使用 PL/SQL 读取文件。有关从目录对象读取文件的更多信息，请参阅 [列出数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ListDirectories) 和 [读取数据库实例目录中的文件](Appendix.Oracle.CommonDBATasks.Misc.md#Appendix.Oracle.CommonDBATasks.ReadingFiles)。

以下版本支持访问事务日志：
+ Oracle Database 21c
+ Oracle Database 19c

以下代码用于创建目录，为您的在线和存档重做日志文件提供只读访问权限。

**重要**  
此代码还会撤销 `DROP ANY DIRECTORY` 权限。

```
EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;
EXEC rdsadmin.rdsadmin_master_util.create_onlinelog_dir;
```

以下代码会删掉在线和存档重做日志文件的目录。

```
EXEC rdsadmin.rdsadmin_master_util.drop_archivelog_dir;
EXEC rdsadmin.rdsadmin_master_util.drop_onlinelog_dir;
```

以下代码用于授予和撤销 `DROP ANY DIRECTORY` 权限。

```
EXEC rdsadmin.rdsadmin_master_util.revoke_drop_any_directory;
EXEC rdsadmin.rdsadmin_master_util.grant_drop_any_directory;
```

# 从 Amazon S3 下载存档的重做日志
<a name="Appendix.Oracle.CommonDBATasks.download-redo-logs"></a>

您可以使用 `rdsadmin.rdsadmin_archive_log_download` 软件包在数据库实例上下载存档的重做日志。如果存档的重做日志不再存在于数据库实例上，您可能需要从 Amazon S3 重新下载它们。然后，您可以挖掘日志或使用日志恢复或复制数据库。

**注意**  
您无法在只读副本实例上下载存档的重做日志。

## 下载归档的重做日志：基本步骤
<a name="Appendix.Oracle.CommonDBATasks.download-redo-logs.basic-process"></a>

归档的重做日志的可用性取决于以下保留策略：
+ 备份保留策略 – Amazon S3 提供了此策略内的日志。此策略之外的日志将被删除。
+ 归档的日志保留策略 – 此策略内的日志在数据库实例上可用。此策略之外的日志将被删除。

如果日志不在您的实例上，但受到备份保留期的保护，请使用 `rdsadmin.rdsadmin_archive_log_download` 以重新下载。RDS for Oracle 会将日志保存到数据库实例的 `/rdsdbdata/log/arch` 目录。

**从 Amazon S3 下载归档的重做日志**

1. 配置您的保留期，以确保您下载的归档重做日志在您需要的时间内得到保留。请确保 `COMMIT` 您的更改。

   RDS 根据归档日志保留策略保留您下载的日志，从下载日志之时开始。要了解如何设置保留策略，请参阅[保留存档重做日志](Appendix.Oracle.CommonDBATasks.RetainRedoLogs.md)。

1. 最多等待 5 分钟，使归档的日志保留策略更改生效。

1. 使用 `rdsadmin.rdsadmin_archive_log_download` 从 Amazon S3 下载归档的重做日志。

   有关更多信息，请参阅“[下载单个归档的重做日志](#Appendix.Oracle.CommonDBATasks.download-redo-logs.single-log)”和“[下载一系列归档的重做日志](#Appendix.Oracle.CommonDBATasks.download-redo-logs.series)”。
**注意**  
RDS 在下载之前会自动检查可用的存储空间。如果请求的日志占用大量空间，您将收到警报。

1. 确认日志已成功从 Amazon S3 下载。

   您可以查看 bdump 文件中的下载任务的状态。bdump 文件的路径名称为 `/rdsdbdata/log/trace/dbtask-task-id.log`。在前面的下载步骤中，您可以运行 `SELECT` 语句，该语句可返回 `VARCHAR2` 数据类型中的任务 ID。有关更多信息，请参阅[监控文件传输的状态](oracle-s3-integration.using.md#oracle-s3-integration.using.task-status)中的类似示例。

## 下载单个归档的重做日志
<a name="Appendix.Oracle.CommonDBATasks.download-redo-logs.single-log"></a>

要将单个归档的重做日志下载到 `/rdsdbdata/log/arch` 目录中，请使用 `rdsadmin.rdsadmin_archive_log_download.download_log_with_seqnum`。此过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `seqnum`  |  number  |  —  |  是  |  归档的重做日志的序列号。  | 

以下示例展示的是下载序列号为 20 的日志。

```
SELECT rdsadmin.rdsadmin_archive_log_download.download_log_with_seqnum(seqnum => 20) 
       AS TASK_ID 
FROM   DUAL;
```

## 下载一系列归档的重做日志
<a name="Appendix.Oracle.CommonDBATasks.download-redo-logs.series"></a>

要将一系列归档的重做日志下载到 `/rdsdbdata/log/arch` 目录中，请使用 `download_logs_in_seqnum_range`。每个请求的下载限制为 300 个日志。`download_logs_in_seqnum_range` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `start_seq`  |  number  |  —  |  是  |  系列的起始序列号。  | 
|  `end_seq`  |  number  |  —  |  是  |  系列的结束序列号。  | 

以下示例展示的是下载序列号为 50 至 100 的日志。

```
SELECT rdsadmin.rdsadmin_archive_log_download.download_logs_in_seqnum_range(start_seq => 50, end_seq => 100) 
       AS TASK_ID 
FROM   DUAL;
```