Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
我的 Amazon RDS for Oracle 数据库实例的存储空间使用量为何超出预期?
我的一个 Amazon Relational Database Service (Amazon RDS) for Oracle 数据库实例的空间使用量超出了预期。我想知道我是否可以释放该实例上的空间。
简短描述
多个组件使用 Amazon RDS for Oracle 实例的存储空间。这些组件包括表空间、存档日志、日志文件、在线重做日志文件以及数据泵文件。
要管理实例中的存储增长,请执行以下操作来确定您的组件使用的存储空间量:
- 确定分配给所有表空间(包括临时表空间等对象)中数据的空间量。
- 检查存档日志或跟踪文件的空间分配。
- 检查数据泵目录的空间分配。
**注意:**为 RDS 实例分配的存储空间代表数据卷。创建实例时,Amazon RDS 会将已分配的存储空间映射到数据卷。除了物理存储卷之外,此过程还会使用一小部分原始磁盘空间来创建文件系统。
解决方法
创建存档日志目录
要创建存档日志目录,请运行以下 SQL 代码:
EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;
确定分配给表空间中数据的空间量
要确定分配给 Oracle 数据库不同组件的空间分布情况,请运行以下 SQL 代码:
SET pages 200 SELECT '===========================================================' || CHR(10) || 'Total Database Physical Size = ' || ROUND(redolog_size_gib + dbfiles_size_gib + tempfiles_size_gib + archlog_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 : ' || 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(archlog_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 (SELECT bytes FROM v$log UNION ALL SELECT bytes FROM v$standby_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 ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir('ARCHIVELOG_DIR'))) 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);
要确定分配给 Oracle 数据库不同用户目录的空间分布情况,请运行以下命令:
SET SERVEROUTPUT ON; DECLARE v_result NUMBER; v_directory_name VARCHAR2(100); BEGIN DBMS_OUTPUT.PUT_LINE(' '); DBMS_OUTPUT.PUT_LINE('------------------------------'); DBMS_OUTPUT.PUT_LINE('ADDITIONAL DIRECTORY FOUND IN DATABASE'); DBMS_OUTPUT.PUT_LINE('------------------------------'); FOR rec IN (SELECT directory_name, directory_path FROM dba_directories WHERE directory_name NOT IN ('OPATCH_INST_DIR','JAVA$JOX$CUJS$DIRECTORY$','RDS$TEMP','DATA_PUMP_DIR','ADUMP','RDS$DB_TASKS','OPATCH_SCRIPT_DIR','OPATCH_LOG_DIR','BDUMP','SDO_DIR_WORK','SDO_DIR_ADMIN','BDUMP_A') ) LOOP v_directory_name := rec.directory_name; -- Output directory details EXECUTE IMMEDIATE 'SELECT ROUND(SUM(filesize) / 1024 / 1024 / 1024, 3) FROM TABLE(rdsadmin.rds_file_util.listdir(''' || v_directory_name || '''))' INTO v_result; DBMS_OUTPUT.PUT_LINE('Directory Name: ' || rec.directory_name); DBMS_OUTPUT.PUT_LINE('Directory Path: ' || rec.directory_path); DBMS_OUTPUT.PUT_LINE('Total Size (GB) for ' || v_directory_name || ': ' || v_result); DBMS_OUTPUT.PUT_LINE('------------------------------'); END LOOP; END; /
默认情况下,Amazon RDS for Oracle 数据库实例会为所有表空间启用 auto-extend。这包括数据表空间、undo 表空间和临时表空间。每种类型的表空间都会增大,以容纳更多的数据。您的表空间会不断增大,直到您不再需要更多存储空间,或直到表用完所有分配的存储空间为止。
调整表空间大小
数据表空间和 undo 表空间
要调整数据表空间和 undo 表空间的大小,请参阅如何调整我的 Amazon RDS for Oracle 数据库实例的表空间大小?
临时表空间
要调整临时表空间的大小,请完成以下步骤:
-
要查看有关临时表空间使用情况的信息,请对 DBA_TEMP_FREE_SPACE 视图运行以下命令:
SELECT * FROM dba_temp_free_space; -
要调整临时表空间的大小,请根据表空间使用情况查询的输出运行以下命令:
ALTER TABLESPACE temp RESIZE 10G;**注意:**请将 10G 替换为要调整到的数量。当分配的表空间超过 10 GB 阈值时,上述命令将失败。
-
如果前面的命令失败,请运行以下命令来减少临时表空间上的空间:
ALTER TABLESPACE temp SHRINK SPACE KEEP 10g; -
要检查是否存在对磁盘执行主动排序并分配了临时分段的长时间运行会话,请运行以下命令:
SELECT * FROM v$sort_usage; -
如果应用程序逻辑允许结束会话,请结束会话。结束会话后,再次调整临时表空间的大小。
如果无法结束会话,请创建一个新的临时表空间。创建表空间后,将其设置为默认表空间。
然后,删除之前的临时表空间:SELECT property_name, property_value FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'; CREATE TEMPORARY TABLESPACE temp2; EXEC rdsadmin.rdsadmin_util.alter_default_temp_tablespace(tablespace_name => 'temp2'); SET pages 2000 COLUMN username FRO a30 SELECT username, TEMPORARY_TABLESPACE FROM dba_users; DROP TABLESPACE temp including contents and datafiles; -
如果您的数据库实例类具有基于 NVMe 的 SSD 存储,请在实例存储中创建 Oracle 临时表空间,以节省 RDS 存储空间。有关详细信息,请参阅在 RDS for Oracle 实例存储中存储临时数据。
检查存档日志或跟踪文件的空间分配
完成以下步骤:
-
要检查当前存档日志保留期,请运行以下 SQL 命令:
SELECT value FROM rdsadmin.rds_configuration WHERE name ='archivelog retention hours';注意:在 Amazon RDS for Oracle 实例中,默认情况下,存档日志保留期设置为 0。当存档日志上传到 Amazon S3 后,Amazon RDS 会自动从底层主机中删除这些日志。要将存档日志与其他服务(例如 Oracle LogMiner 或 GoldenGate)一起使用,请增加存档日志保留期。
-
计算存档日志在底层主机上使用的空间。
首先,运行以下命令创建存档日志目录:EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;然后,运行以下命令以确定存档日志在 RDS 实例上使用的空间量:
SELECT SUM(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR')); -
如果分配的空间超出了预期,请更新保留策略值。然后,允许 Amazon RDS 自动化清除较旧的存档日志文件。
以下示例命令将 RDS for Oracle 实例配置为将存档日志保留 24 小时:BEGIN rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24'); END; / COMMIT;
有关详细信息,请参阅清除跟踪文件。
检查数据泵目录的空间分配
完成以下步骤:
-
如果为数据泵目录分配的空间超出了预期,请查找可以删除的 .dmp 文件。运行以下命令:
SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime; -
如果上述命令找到了 .dmp 文件,请对每个文件运行以下命令以将其删除:
EXEC utl_file.fremove('DATA_PUMP_DIR', 'file_name');**注意:**在上述命令中,请将 file_name 替换为您的 .dmp 文件的名称。

