我的 Amazon RDS for Oracle 数据库实例的存储使用量为何超出预期?

4 分钟阅读
0

我的一个 Amazon Relational Database Service (Amazon RDS) for Oracle 数据库实例的存储使用量超出了预期。

简短描述

各种组件都可以使用 Amazon RDS for Oracle 实例的底层存储。这些组件包括表空间、存档日志、日志文件、在线重做日志文件及数据泵文件。

要管理实例的存储增长,请确定您的组件使用了多少存储空间:

1.    了解有多少空间分配给了所有表空间(包括临时表空间)中的数据。

2.    查看存档日志或跟踪文件的空间分配。

3.    查看数据泵目录的空间分配。

**注意:**为 RDS 实例分配的存储空间代表数据卷。创建实例时,Amazon RDS 会将已分配的存储空间映射到数据卷。此进程还使用一小部分原始磁盘空间,以在物理存储卷之上创建文件系统。

解决方法

查找分配给表空间中数据的空间量

要确定分配给 Oracle 数据库不同组件的空间分布情况,请使用以下查询:

set pages 200
select
'===========================================================' || chr(10) ||
'Total Database Physical Size = ' || round(redolog_size_gib+dbfiles_size_gib+tempfiles_size_gib+ctlfiles_size_gib,2) || ' GiB' || chr(10) ||
'===========================================================' || chr(10) ||
' Redo Logs Size : ' || round(redolog_size_gib,3) || ' GiB' || chr(10) ||
' Data Files Size : ' || round(dbfiles_size_gib,3) || ' GiB' || chr(10) ||
' Temp Files Size : ' || round(tempfiles_size_gib,3) || ' GiB' || chr(10) ||
' Archive Log Size - Approx only : ' || round(archlog_size_gib,3) || ' GiB' || chr(10) ||
' Control Files Size : ' || round(ctlfiles_size_gib,3) || ' GiB' || chr(10) ||
'===========================================================' || chr(10) ||
' Used Database Size : ' || used_db_size_gib || ' GiB' || chr(10) ||
' Free Database Size : ' || free_db_size_gib || ' GiB' ||chr(10) ||
' Data Pump Directory Size : ' || dpump_db_size_gib || ' GiB' || chr(10) ||
' BDUMP Directory Size : ' || bdump_db_size_gib || ' GiB' || chr(10) ||
' ADUMP Directory Size : ' || adump_db_size_gib || ' GiB' || chr(10) ||
'===========================================================' || chr(10) ||
'Total Size (including Dump and Log Files) = ' || round(round(redolog_size_gib,2) +round(dbfiles_size_gib,2)+round(tempfiles_size_gib,2)+round(ctlfiles_size_gib,2) +round(adump_db_size_gib,2) +round(dpump_db_size_gib,2)+round(bdump_db_size_gib,2),2) || ' GiB' || chr(10) ||
'===========================================================' as summary
FROM (SELECT sys_context('USERENV', 'DB_NAME')
db_name,
(SELECT SUM(bytes) / 1024 / 1024 / 1024 redo_size
FROM v$log)
redolog_size_gib,
(SELECT SUM(bytes) / 1024 / 1024 / 1024 data_size
FROM dba_data_files)
dbfiles_size_gib,
(SELECT nvl(SUM(bytes), 0) / 1024 / 1024 / 1024 temp_size
FROM dba_temp_files)
tempfiles_size_gib,
(SELECT SUM(blocks * block_size / 1024 / 1024 / 1024) size_gib
FROM v$archived_log
WHERE first_time >= SYSDATE - (
(SELECT value
FROM rdsadmin.rds_configuration
WHERE name =
'archivelog retention hours') /
24 ))
archlog_size_gib,
(SELECT SUM(block_size * file_size_blks) / 1024 / 1024 / 1024
controlfile_size
FROM v$controlfile)
ctlfiles_size_gib,
round(SUM(used.bytes) / 1024 / 1024 / 1024, 3)
db_size_gib,
round(SUM(used.bytes) / 1024 / 1024 / 1024, 3) - round(
free.f / 1024 / 1024 / 1024)
used_db_size_gib,
round(free.f / 1024 / 1024 / 1024, 3)
free_db_size_gib,
(SELECT round(SUM(filesize) / 1024 / 1024 / 1024, 3)
FROM TABLE(rdsadmin.rds_file_util.listdir('BDUMP')))
bdump_db_size_gib,
(SELECT round(SUM(filesize) / 1024 / 1024 / 1024, 3)
FROM TABLE(rdsadmin.rds_file_util.listdir('ADUMP')))
adump_db_size_gib,
(SELECT round(SUM(filesize) / 1024 / 1024 / 1024, 3)
FROM TABLE(rdsadmin.rds_file_util.listdir('DATA_PUMP_DIR')))
dpump_db_size_gib
FROM (SELECT bytes
FROM v$datafile
UNION ALL
SELECT bytes
FROM v$tempfile) used,
(SELECT SUM(bytes) AS f
FROM dba_free_space) free
GROUP BY free.f);

默认情况下,Amazon RDS for Oracle 数据库实例会为所有表空间启用 auto-extend。这包括数据表空间、UNDO 表空间和临时表空间。这意味着每个表空间都会增大,以容纳更多数据。此功能将持续到您不再需要更多存储空间或使用所有已分配的存储空间为止。

调整表空间大小

数据表空间和 UNDO 表空间

要调整数据表空间和 UNDO 表空间的大小,请参阅如何为 Amazon RDS for Oracle 数据库实例调整表空间的大小?

临时表空间

1.    要查看有关临时表空间使用情况的信息,请对视图 DBA_TEMP_FREE_SPACE 运行以下查询:

SQL> SELECT * FROM dba_temp_free_space;

2.    要调整临时表空间的大小(例如调整到 10 GB),请根据表空间使用情况查询的输出运行以下查询:

SQL> ALTER TABLESPACE temp RESIZE 10g;

如果已分配的表空间超过了 10 GB 这一阈值,则此命令可能会失败。

3.    如果命令失败,则缩小临时表空间的空间:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

4.    检查是否存在长时间运行的会话,这些会话对磁盘执行主动排序并分配了临时分段。为此,请运行以下查询:

SQL> SELECT * FROM v$sort_usage;

5.    如果应用程序逻辑和业务允许结束会话,请结束会话。然后,再次调整临时表空间的大小,如步骤 2 所示。

6.    如果无法结束会话,请创建新的临时表空间。然后,将新的表空间设置为默认表空间,并丢弃旧的临时表空间:

SQL> SELECT property_name,property_value FROM DATABASE_PROPERTIES where PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
SQL> create temporary tablespace temp2;
SQL> exec rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp2');
<wait for a few minutes and verify if the default temporary tablespace for all users have been updated>
SQL> set pages 2000
SQL> column username for a30
SQL> select username, TEMPORARY_TABLESPACE from dba_users;
SQL> drop tablespace temp including contents and datafiles;

检查存档日志或跟踪文件的空间分配

1.    检查当前的存档日志保留期:

SQL> SELECT value FROM rdsadmin.rds_configuration WHERE name ='archivelog retention hours';

在 Amazon RDS for Oracle 实例中,默认情况下,存档日志保留期设置为 0。这意味着当存档日志上传到 Amazon S3 后,Amazon RDS 会自动将其从底层主机中删除。如果需要对 Oracle LogMiner 或 GoldenGate 等产品使用存档日志,请增加存档日志保留期

2.    计算存档日志在底层主机上使用的空间。首先,创建一个存档日志目录

SQL> EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

然后,确定 RDS 实例上存档日志的确切用量:

SQL> SELECT sum(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));

3.    如果为存档日志分配的空间超出了预期,则应更改保留策略值。然后,允许 Amazon RDS 自动化清除较旧的存档日志文件。以下示例将 RDS for Oracle 实例配置为保留存档日志 24 小时:

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

有关列出和清除跟踪文件的详细信息,请参阅清除跟踪文件

检查数据泵目录的空间分配

1.    如果数据泵目录的已分配空间超出了预期,则查找可以删除的 .dmp 文件:

SQL> SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER by mtime;

2.    如果此查询找到了 .dmp 文件,请使用以下查询将其删除。将 file name 替换为 .dmp 文件的名称:

SQL> EXEC utl_file.fremove('DATA_PUMP_DIR','[file name]');

相关信息

处理 Amazon RDS 数据库实例的存储

终止会话

监控 Amazon RDS 实例中的指标

Amazon RDS 数据库实例耗尽存储空间