执行 Oracle 数据库实例的常见日志相关任务
下文中介绍了如何在运行 Oracle 的 Amazon RDS 数据库实例上,执行与日志记录相关的特定常见 DBA 任务。为了提供托管服务体验,Amazon RDS 不允许通过 shell 访问数据库实例,而仅限访问某些需要高级权限的系统过程和表。
有关更多信息,请参阅“Oracle 数据库日志文件”。
设置强制日志记录
在强制日志记录模式下,Oracle 记录对数据库进行的所有更改,但在临时表空间和临时段中进行的更改除外 (忽略 NOLOGGING
子句)。有关更多信息,请参阅 Oracle 文档中的指定“强制日志记录”模式
要设置强制日志记录,请使用 Amazon RDS 过程 rdsadmin.rdsadmin_util.force_logging
。force_logging
过程具有以下参数。
参数名称 | 数据类型 | 默认值 | 是 | 描述 |
---|---|---|---|---|
|
布尔值 |
true |
否 |
设置为 |
以下示例将数据库置于强制日志记录模式下。
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
过程具有以下参数。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
varchar2 |
— |
是 |
如果为 |
|
varchar2 |
null |
否 |
补充日志记录的类型。有效值为 |
以下示例启用补充日志记录。
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_logfile
。switch_logfile
过程没有参数。
以下示例切换日志文件。
EXEC rdsadmin.rdsadmin_util.switch_logfile;
添加联机重做日志
运行 Oracle 的 Amazon RDS 数据库实例从四个联机重做日志 (每个日志的大小为 128 MB) 开始。要添加其他重做日志,请使用 Amazon RDS 过程 rdsadmin.rdsadmin_util.add_logfile
。
add_logfile
过程具有以下参数。
注意
这些参数是互斥的。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
positive |
null |
否 |
日志文件的大小 (以字节为单位)。 |
|
varchar2 |
— |
是 |
日志文件的大小。可以 KB (K)、MB (M) 或 GB (G) 为单位指定大小。 |
以下命令将添加一个 100MB 日志文件。
EXEC rdsadmin.rdsadmin_util.add_logfile(p_size => '
100M
');
删除联机重做日志
要删除重做日志,请使用 Amazon RDS 过程 rdsadmin.rdsadmin_util.drop_logfile
。drop_logfile
过程具有以下参数。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
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_configuration
。set_configuration
过程具有以下参数。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
varchar |
— |
是 |
要更新的配置的名称。 |
|
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 等外部工具进行挖掘。要访问这些文件,请执行以下操作:
-
创建目录对象,对物理文件路径提供只读访问权限。
使用
rdsadmin.rdsadmin_master_util.create_archivelog_dir
和rdsadmin.rdsadmin_master_util.create_onlinelog_dir
。 -
使用 PL/SQL 读取文件。
您可以使用 PL/SQL 读取文件。有关从目录对象读取文件的更多信息,请参阅 列出数据库实例目录中的文件 和 读取数据库实例目录中的文件。
以下版本支持访问事务日志:
-
Oracle Database 21c
-
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 下载归档的重做日志
-
配置您的保留期,以确保您下载的归档重做日志在您需要的时间内得到保留。请确保
COMMIT
您的更改。RDS 根据归档日志保留策略保留您下载的日志,从下载日志之时开始。要了解如何设置保留策略,请参阅保留存档重做日志。
-
最多等待 5 分钟,使归档的日志保留策略更改生效。
-
使用
rdsadmin.rdsadmin_archive_log_download
从 Amazon S3 下载归档的重做日志。有关更多信息,请参阅“下载单个归档的重做日志”和“下载一系列归档的重做日志”。
注意
RDS 在下载之前会自动检查可用的存储空间。如果请求的日志占用大量空间,您将收到警报。
-
确认日志已成功从 Amazon S3 下载。
您可以查看 bdump 文件中的下载任务的状态。bdump 文件的路径名称为
/rdsdbdata/log/trace/dbtask-
。在前面的下载步骤中,您可以运行task-id
.logSELECT
语句,该语句可返回VARCHAR2
数据类型中的任务 ID。有关更多信息,请参阅监控文件传输的状态中的类似示例。
下载单个归档的重做日志
要将单个归档的重做日志下载到 /rdsdbdata/log/arch
目录中,请使用 rdsadmin.rdsadmin_archive_log_download.download_log_with_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
过程具有以下参数。
参数名称 | 数据类型 | 默认值 | 必需 | 描述 |
---|---|---|---|---|
|
number |
— |
是 |
系列的起始序列号。 |
|
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;