跳至内容

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

4 分钟阅读
0

我的一个 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 数据库实例的表空间大小?

临时表空间

要调整临时表空间的大小,请完成以下步骤:

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

    SELECT * FROM dba_temp_free_space;
  2. 要调整临时表空间的大小,请根据表空间使用情况查询的输出运行以下命令:

    ALTER TABLESPACE temp RESIZE 10G;

    **注意:**请将 10G 替换为要调整到的数量。当分配的表空间超过 10 GB 阈值时,上述命令将失败。

  3. 如果前面的命令失败,请运行以下命令来减少临时表空间上的空间:

    ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;
  4. 要检查是否存在对磁盘执行主动排序并分配了临时分段的长时间运行会话,请运行以下命令:

    SELECT * FROM v$sort_usage;
  5. 如果应用程序逻辑允许结束会话,请结束会话。结束会话后,再次调整临时表空间的大小。
    如果无法结束会话,请创建一个新的临时表空间。创建表空间后,将其设置为默认表空间
    然后,删除之前的临时表空间:

    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;
  6. 如果您的数据库实例类具有基于 NVMe 的 SSD 存储,请在实例存储中创建 Oracle 临时表空间,以节省 RDS 存储空间。有关详细信息,请参阅在 RDS for Oracle 实例存储中存储临时数据

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

完成以下步骤:

  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. 计算存档日志在底层主机上使用的空间。
    首先,运行以下命令创建存档日志目录:

    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'));
  3. 如果分配的空间超出了预期,请更新保留策略值。然后,允许 Amazon RDS 自动化清除较旧的存档日志文件。
    以下示例命令将 RDS for Oracle 实例配置为将存档日志保留 24 小时:

    BEGIN rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');  
    END;   
    /  
    COMMIT;

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

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

完成以下步骤:

  1. 如果为数据泵目录分配的空间超出了预期,请查找可以删除的 .dmp 文件。运行以下命令:

    SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime;
  2. 如果上述命令找到了 .dmp 文件,请对每个文件运行以下命令以将其删除:

    EXEC utl_file.fremove('DATA_PUMP_DIR', 'file_name');

    **注意:**在上述命令中,请将 file_name 替换为您的 .dmp 文件的名称。

相关信息

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

终止会话

监控 Amazon RDS 实例中的指标

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