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

Lesedauer: 6 Minute
0

Ich habe eine Amazon Relational Database Service (Amazon RDS) für Oracle DB-Instance, die mehr Speicherplatz beansprucht als erwartet.

Kurzbeschreibung

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

Um das Speicherwachstum in Ihrer Instance zu managen, finden Sie heraus, wie viel Speicherplatz Ihre Komponenten belegen:

1.    Ermitteln Sie die Menge an Speicherplatz, die Daten in allen Tablespaces zugewiesen ist, einschließlich temporärer Tablespaces.

2.    Überprüfen Sie die Speicherplatzzuweisung für Archivprotokolle oder Trace-Dateien.

3.    Überprüfen Sie die Speicherplatzzuweisung für das Data-Pump-Verzeichnis.

**Hinweis:**Der zugewiesene Speicherplatz für eine RDS-Instance stellt das Datenvolumen dar. Wenn Sie eine Instance erstellen, ordnet Amazon RDS den zugewiesenen Speicher dem Datenvolumen zu. Dieser Prozess verwendet außerdem einen kleinen Prozentsatz des Raw-Festplattenspeichers, um das Dateisystem auf dem physischen Speichervolume zu erstellen.

Behebung

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

Verwenden Sie die folgende Abfrage, 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+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);

Standardmäßig aktiviert Amazon RDS für Oracle DB-Instances auto-extend für alle Tablespaces. Dazu gehören Daten-Tablespaces, UNDO-Tablespaces und temporäre Tablespaces. Das bedeutet, dass jeder Tablespace wächst, um mehr Daten aufzunehmen. Diese Funktion wird so lange ausgeführt, bis Sie keinen weiteren Speicherplatz mehr benötigen oder den gesamten zugewiesenen Speicherplatz nutzen.

Größe von Tablespaces ändern

Daten-Tablespace und UNDO-Tablespace

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

Temporärer Tablespace

1.    Führen Sie die folgende Abfrage in der Ansicht „DBA_TEMP_FREE_SPACE“ aus, um Informationen zur temporären Tablespace-Nutzung anzuzeigen:

SQL> SELECT * FROM dba_temp_free_space;

2.    Um die Größe des temporären Tablespace (z. B. auf 10 GB) zu ändern, führen Sie die folgende Abfrage auf der Grundlage der Ausgabe der Tablespace-Nutzungsabfrage aus:

SQL> ALTER TABLESPACE temp RESIZE 10g;

Wenn der zugewiesene Tablespace den Schwellenwert von 10 GB überschreitet, schlägt dieser Befehl möglicherweise fehl.

3.    Wenn der Befehl fehlschlägt, verringern Sie den Speicherplatz auf dem temporären Tablespace:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

4.    Suchen Sie nach Sitzungen mit langer Laufzeit, die eine aktive Sortierung auf der Festplatte durchführen und denen temporäre Segmente zugewiesen sind. Führen Sie dazu die folgende Abfrage aus:

SQL> SELECT * FROM v$sort_usage;

5.    Wenn die Anwendungslogik und die Geschäfte es Ihnen ermöglichen, die Sitzung zu beenden, beenden Sie die Sitzung. Ändern Sie dann erneut die Größe des temporären Tablespace, wie in Schritt 2 gezeigt.

6.    Wenn Sie Ihre Sitzungen nicht beenden können, erstellen Sie einen neuen temporären Tablespace. Legen Sie dann den neuen Tablespace als Standard fest und löschen Sie den alten temporären Tablespace:

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;

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

1.    Überprüfen Sie die aktuelle Aufbewahrung des Archivprotokolls:

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

In Amazon RDS für Oracle-Instances ist die Aufbewahrung von Archivprotokollen standardmäßig auf 0 festgelegt. Das bedeutet, dass Amazon RDS Archivprotokolle nach dem Hochladen auf Amazon S3 automatisch vom zugrunde liegenden Host löscht. Wenn Sie Archivprotokolle mit Produkten wie Oracle LogMiner oder GoldenGate verwenden müssen, erhöhen Sie die Aufbewahrung von Archivprotokollen.

2.    Berechnen Sie den Speicherplatz, den Archivprotokolle auf dem zugrunde liegenden Host belegen. Erstellen Sie zunächst ein Verzeichnis für Archivprotokolle:

SQL> EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

Ermitteln Sie dann die genaue Verwendung des Archivprotokolls auf einer RDS-Instance:

SQL> 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 für Archivprotokolle größer als erwartet ist, aktualisieren Sie den Wert der Aufbewahrungsrichtlinie. Erlauben Sie dann Amazon RDS Automation, ältere Archivprotokolldateien zu löschen. Im folgenden Beispiel 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 zum Auflisten und Löschen von Protokolldateien finden Sie unter Löschen von Protokolldateien.

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

1.    Wenn der zugewiesene Speicherplatz des Data-Pump-Verzeichnisses größer als erwartet ist, suchen Sie nach DMP-Dateien, die entfernt werden können:

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

2.    Wenn diese Abfrage DMP-Dateien findet, löschen Sie sie mit der folgenden Abfrage. Ersetzen Sie den Dateinamen durch den Namen der DMP-Dateien:

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

Ä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