Warum verwendet meine Amazon RDS für Oracle DB-Instance mehr Speicher als ich erwartet habe?

Lesedauer: 7 Minute
0

Ich habe eine Amazon Relational Database Service (Amazon RDS) für Oracle DB-Instance, die mehr Speicherplatz beansprucht als erwartet. Ich möchte wissen, ob ich Speicherplatz auf der Instance freigeben kann.

Kurzbeschreibung

Mehrere Komponenten verwenden den Speicher für Amazon RDS für Oracle-Instances. Zu diesen Komponenten gehören Tablespaces, Archivprotokolle, Protokolldateien, Online-Redo-Log-Dateien und Data-Pump-Dateien.

Um das Speicherwachstum in der Instance zu verwalten, führe die folgenden Aktionen aus, um zu ermitteln, wie viel Speicherplatz die Komponenten verwenden:

  • Ermittle die Menge an Speicherplatz, die Daten in allen Tablespaces zugewiesen ist, einschließlich Objekte wie temporäre Tablespaces.
  • Speicherplatzzuweisung für Archivprotokolle oder Trace-Dateien überprüfen.
  • Speicherplatzzuweisung für das Data-Pump-Verzeichnis überprüfen.

Hinweis: Der Speicherplatz, der für eine RDS-Instance zugewiesen wurde, stellt das Datenvolumen dar. Wenn du eine Instance erstellst, ordnet Amazon RDS den zugewiesenen Speicher dem Datenvolumen zu. Dieser Prozess verwendet außerdem einen kleinen Prozentsatz des Raw-Festplattenspeichers, um das Dateisystem zusätzlich zum physischen Speichervolume zu erstellen.

Lösung

Ein Verzeichnis für Archivprotokolle erstellen

Führe den folgenden SQL-Code aus, um ein Archivelog-Verzeichnis zu erstellen:

EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

Den Speicherplatz finden, der den Daten in den Tablespaces zugewiesen ist

Führe den folgenden SQL-Code aus, um die Verteilung des Speicherplatzes zu ermitteln, der verschiedenen Komponenten der Oracle-Datenbank zugewiesen ist:

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

Führe den folgenden Befehl aus, um die Verteilung des Speicherplatzes zu ermitteln, der verschiedenen Benutzerverzeichnissen der Oracle-Datenbank zugewiesen ist:

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

Standardmäßig aktiviert Amazon RDS für Oracle DB-Instances auto-extend für alle Tablespaces. Dazu gehören Datentablespaces, Undo-Tablespaces und temporäre Tablespaces. Jeder Tablespace-Typ wächst, um mehr Daten aufzunehmen. Die Tablespaces wachsen, bis du nicht mehr Speicherplatz benötigst oder bis die Tabellen den gesamten zugewiesenen Speicherplatz nutzen.

Größe von Tablespaces ändern

Daten-Tablespace und Undo-Tablespace

Informationen zum Ändern von Daten- und Undo-Tablespaces findest du unter Wie ändere ich die Größe des Tablespace für meine Amazon RDS für Oracle DB-Instance?

Temporärer Tablespace

Gehe wie folgt vor, um die Größe temporärer Tablespaces zu ändern:

  1. Führe den folgenden Befehl in der Ansicht DBA_TEMP_FREE_SPACE aus, um Informationen zur temporären Tablespace-Nutzung anzuzeigen:

    SELECT * FROM dba_temp_free_space;
  2. Um die Größe des temporären Tablespace zu ändern, führe den folgenden Befehl auf der Grundlage der Ausgabe der Tablespace-Nutzungsabfrage aus:

    ALTER TABLESPACE temp RESIZE 10G;

    Hinweis: Ersetze 10 G durch die Zahl, auf die du die Größe ändern möchtest. vorherige Befehl schlägt fehl, wenn der zugewiesene Tablespace den Schwellenwert von 10 GB überschreitet.

  3. Wenn der vorherige Befehl fehlschlägt, führe den folgenden Befehl aus, um den Speicherplatz im temporären Tablespace zu reduzieren:

    ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;
  4. Führe den folgenden Befehl aus, um nach Sitzungen mit langer Laufzeit zu suchen, die eine aktive Sortierung auf der Festplatte durchführen und zugewiesene temporäre Segmente haben:

    SELECT * FROM v$sort_usage;
  5. Wenn die Anwendungslogik es dir ermöglicht, die Sitzung zu beenden, beende die Sitzung. Nachdem du die Sitzung beendet hast, ändere die Größe des temporären Tablespace erneut.
    Wenn du deine Sitzungen nicht beenden kannst, erstelle einen neuen temporären Tablespace. Nachdem du den Tablespace erstellt hast, lege ihn als Standard-Tablespace fest.
    Entferne dann den vorherigen temporären Tablespace:

    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. Wenn die DB-Instance-Klasse über NVMe-basierten SSD-Speicher verfügt, erstelle temporäre Oracle-Tablespaces in einem Instance-Speicher, um den RDS-Speicherplatz zu sparen. Weitere Informationen findest du unter Speichern temporärer Daten in einem RDS für Oracle-Instance-Speicher.

Speicherplatzzuweisung für Archivprotokolle oder Trace-Dateien überprüfen

Führe die folgenden Schritte aus:

  1. Führe den folgenden SQL-Befehl aus, um die aktuelle Aufbewahrung des Archivprotokolls zu überprüfen:

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

    Hinweis: In Amazon RDS für Oracle-Instances ist die Aufbewahrung von Archivprotokollen standardmäßig auf 0 festgelegt. Nach dem Hochladen der Archivprotokolle auf Amazon S3, löscht Amazon RDS automatisch die Protoklle vom zugrunde liegenden Host. Um Archivprotokolle mit anderen Services wie Oracle LogMiner oder GoldenGate zu verwenden, erhöhe die Aufbewahrung von Archivprotokollen.

  2. Berechne den Speicherplatz, den Archivprotokolle auf dem zugrunde liegenden Host belegen.
    Führe zunächst den folgenden Befehl aus, um ein Verzeichnis mit Archivprotokollen zu erstellen:

    EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

    Führe dann den folgenden Befehl aus, um zu ermitteln, wie viel Speicherplatz Archivprotokolle auf einer RDS-Instance verwenden:

    SELECT SUM(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));
  3. Wenn der zugewiesene Speicherplatz höher ist als erwartet, aktualisiere den Wert der Aufbewahrungsrichtlinie. Erlaube dann Amazon RDS Automation, frühere Archivprotokolldateien zu löschen.
    Im folgenden Beispielbefehl wird die RDS für Oracle-Instance so konfiguriert, dass Archivprotokolle 24 Stunden lang aufbewahrt werden:

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

Weitere Informationen findest du unter Löschen von Trace-Dateien.

Speicherplatzzuweisung für das Data-Pump-Verzeichnis überprüfen

Führe die folgenden Schritte aus:

  1. Wenn der zugewiesene Speicherplatz des Data-Pump-Verzeichnisses größer als erwartet ist, suche nach DMP-Dateien, die entfernt werden können: Führe den folgenden Befehl aus:

    SELECT * FROM TABLE(RDSADMIN.RDS_FILE_UTIL.LISTDIR('DATA_PUMP_DIR')) ORDER BY mtime;
  2. Wenn mit dem vorherigen Befehl DMP-Dateien gefunden werden, führe für jede Datei den folgenden Befehl aus, um sie zu löschen:

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

    Hinweis: Ersetze im vorherigen Befehl file_name durch die Namen der DMP-Dateien.

Ähnliche Informationen

Arbeiten mit Speicher für Amazon RDS-DB-Instances

Beenden einer Sitzung

Überwachen von Metriken in einer Amazon RDS-Instance

Amazon RDS-DB-Instance hat nur noch wenig Speicherplatz