执行 Oracle 数据库实例的常见日志相关任务 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

执行 Oracle 数据库实例的常见日志相关任务

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

有关更多信息,请参阅“Oracle 数据库日志文件”。

设置强制日志记录

在强制日志记录模式下,Oracle 记录对数据库进行的所有更改,但在临时表空间和临时段中进行的更改除外 (忽略 NOLOGGING 子句)。有关更多信息,请参阅 Oracle 文档中的指定“强制日志记录”模式

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

参数名称 数据类型 默认值 描述

p_enable

布尔值

true

设置为 true,数据库为强制日志记录模式;设置为 false 则取消数据库的强制日志记录模式。

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

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

设置补充日志记录

如果启用补充日志记录,则 LogMiner 将具有支持链接行和集群表的必要信息。有关更多信息,请参阅 Oracle 文档中的补充日志记录

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

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; /

切换联机日志文件

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

以下示例切换日志文件。

EXEC rdsadmin.rdsadmin_util.switch_logfile;

添加联机重做日志

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

add_logfile 过程具有以下参数。

注意

这些参数是互斥的。

参数名称 数据类型 默认值 必需 描述

bytes

positive

null

日志文件的大小 (以字节为单位)。

p_size

varchar2

日志文件的大小。可以 KB (K)、MB (M) 或 GB (G) 为单位指定大小。

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

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

删除联机重做日志

要删除重做日志,请使用 Amazon RDS 过程 rdsadmin.rdsadmin_util.drop_logfiledrop_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

调整联机重做日志的大小

运行 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

保留存档重做日志

您可以在数据库实例上本地保留存档的重做日志,以用于 Oracle LogMiner(DBMS_LOGMNR)这类产品。保留重做日志后,您可以使用 LogMiner 分析日子。有关更多信息,请参阅 Oracle 文档中的使用 LogMiner 分析重做日志文件

要保留存档的重做日志,请使用 Amazon RDS 过程 rdsadmin.rdsadmin_util.set_configurationset_configuration 过程具有以下参数。

参数名称 数据类型 默认值 必需 描述

name

varchar

要更新的配置的名称。

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 数据库实例

注意

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

访问在线和存档的重做日志

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

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

    使用 rdsadmin.rdsadmin_master_util.create_archivelog_dirrdsadmin.rdsadmin_master_util.create_onlinelog_dir.

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

    您可以使用 PL/SQL 读取文件。有关从目录对象读取文件的更多信息,请参阅 列出数据库实例目录中的文件读取数据库实例目录中的文件

以下版本支持访问事务日志:

  • Oracle Database 19c

  • Oracle Database 12c 第 2 版 (12.2.0.1)

  • Oracle Database 12c 第 1 版 (12.1)

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

重要

此代码还会撤销 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 下载存档的重做日志

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

注意

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

下载归档的重做日志:基本步骤

归档的重做日志的可用性取决于以下保留策略:

  • 备份保留策略 – Amazon S3 提供了此策略内的日志。此策略之外的日志将被删除。

  • 归档的日志保留策略 – 此策略内的日志在数据库实例上可用。此策略之外的日志将被删除。

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

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

  1. 延长归档的重做日志保留期,这样 RDS 便不会删除您下载的日志。请确保 COMMIT 您的更改。

    要了解如何设置保留策略,请参阅保留存档重做日志

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

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

    有关更多信息,请参阅“下载单个归档的重做日志”和“下载一系列归档的重做日志”。

    注意

    RDS 在下载之前会自动检查可用的存储空间。如果请求的日志占用大量空间,您将收到警报。

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

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

下载单个归档的重做日志

要将单个归档的重做日志下载到 /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;

下载一系列归档的重做日志

要将一系列归档的重做日志下载到 /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;