Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Warum verwendet meine Amazon RDS für Oracle DB-Instance mehr Speicher als ich erwartet habe?
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:
-
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;
-
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.
-
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;
-
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;
-
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;
-
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:
-
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.
-
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'));
-
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:
-
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;
-
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
Ähnliche Videos


Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 3 Jahren
- AWS OFFICIALAktualisiert vor 2 Jahren