Wie kann ich die Größe des Tablespace für meine Instance von Amazon RDS for Oracle DB ändern?

Letzte Aktualisierung: 3.11.2021

Ich möchte wissen, wie man den Tablespace für meinen Amazon Relational Database Service (Amazon RDS) für Oracle DB-Instance verwaltet oder in der Größe ändert.

Kurzbeschreibung

Der Standard-Tablespace-Typ für Instances von Amazon-RDS-for-Oracle-DB ist bigfile. Bigfile-Tablespaces machen Datendateien für Benutzer transparent. Daher können Sie die Vorgänge in Tablespaces direkt ausführen, anstatt jede der zugrunde liegenden Datendateien zu verwalten. Bigfile-Tablespaces vereinfachen die Verwaltung von Datendateien, indem Sie keine neuen Datendateien hinzufügen oder mit mehreren Dateien umgehen müssen. Es ist eine bewährte Methode, keine smallfile-Tablespaces für Ihr RDS for Oracle-Instances zu verwenden.

Wenn Ihre RDS for Oracle-Instance über einen Tablespace für kleine Dateien verfügt, haben Sie die folgenden Einschränkungen:

  • Sie können die Größe der Datendateien nicht ändern. Sie können die Größe des Tablespace jedoch ändern, indem Sie dem Tablespace neue Datendateien hinzufügen.
  • Sie können die ALTER DATABASE-Abfrage nicht ausführen, um die Größe der Datendatei zu ändern oder zu ändern. Dies liegt daran, dass der Befehl ALTER DATABASE in RDS for Oracle nicht unterstützt wird. Weitere Informationen finden Sie unter Beschränkungen bei RDS for Oracle.
  • Sie müssen den Parameter db_files manuell verwalten, um die maximale Anzahl von Datendateien in der Datenbank zu definieren. Die db_files müssen möglicherweise optimiert werden, wenn die Anzahl der Datendateien diese Grenze erreicht.

Standardmäßig sind die Tablespaces in RDS for Oracle bigfile, wobei AUTOEXTEND aktiviert ist. Die maximale Größe von Bigfile-Tablespaces beträgt 16 TiB. Wenn Sie Daten in den Tablespace einfügen, erhöht sich der Tablespace je nach Bedarf bis zum konfigurierten Maximallimit für diesen Tablespace oder den konfigurierten zugewiesenen Speicher für die RDS-Instance, je nachdem, welcher Wert kleiner ist. Wenn der zugewiesene Speicher für die RDS-Instance vollständig genutzt wird, wechselt die Instance in den Status STORAGE_FULL, und Tablespaces können nicht erweitert werden. Um dieses Problem zu beheben, müssen Sie Ihrer Instance Speicherplatz hinzufügen. Weitere Informationen finden Sie unter Wie löse ich Probleme, die auftreten, wenn Amazon-RDS-DB-Instances keinen Speicher mehr haben?

Wenn Daten aus einem Tablespace gelöscht werden, verkleinert sich die Größe des Tablespace nicht. Die freien Blöcke können wiederverwendet werden, wenn neue Daten eingefügt werden. Sie müssen die Größe des Tablespace manuell ändern, um den ungenutzten Speicherplatz zurückzugewinnen.

Auflösung

Gehen Sie wie folgt vor, um die Größe des Tablespace für Ihre RDS for Oracle-Instance zu ändern:

  1. Prüfen Sie die Konfiguration des Tablespace.
  2. Erhöhen oder verringern Sie die Größe des Tablespace basierend auf Ihrem Anwendungsfall.

Prüfen der Konfiguration des Tablespace

1.    Führen Sie eine Abfrage ähnlich der folgenden aus, um festzustellen, ob der Tablespace

  • permanent, rückgängig oder vorübergehend ist.
  • smallfile oder bigfile ist.
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    Führen Sie eine Abfrage ähnlich der folgenden aus, um zu überprüfen, ob die automatische Erweiterungsfunktion, die aktuelle Größe der Datendatei und das maximal konfigurierte Limit aktiviert sind:

Für permanente und rückgängig-Tablespaces:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

Für temporäre Tablespaces:

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

Möglicherweise bemerken Sie in der Ausgabe dieser Abfragen Folgendes:

  • Wenn die automatische Erweiterungsfunktion nicht aktiviert ist, ist der Wert von MAX_GB gleich 0.
  • Wenn der Tablespace smallfile ist, hängt der Wert von MAX_GB von der Blockgröße ab, die zum Erstellen des Tablespace verwendet wird. Beispielsweise beträgt der Wert von MAX_GB 32 GB, wenn die verwendete Blockgröße 8K beträgt. Weitere Informationen finden Sie in der Oracle-Dokumentation für nicht standardmäßige Blockgrößen.
  • Wenn der Tablespace bigfile ist, wird der Wert von MAX_GB als 32 TB angezeigt. Aufgrund der Betriebssystembeschränkungen in RDS for Oracle kann sich die Größe der Datei jedoch nur auf bis zu 16 TiB anwachsen.

Optional können Sie die folgenden Abfragen ausführen, um die zum Erstellen des Tablespace verwendete DDL abzurufen:

SQL> SET LINESIZE 400
SQL> SET LONG 99999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE','example-tablespace') FROM DUAL;

Sie können die erforderlichen Informationen über den Tablespace aus der zurückgegebenen DDL abrufen.

Erhöhen der Größe des Tablespace

Wenn Sie die automatische Erweiterungsfunktion aktiviert haben, müssen Sie den Tablespace nicht vergrößern, unabhängig von der Art des Tablespace. In diesem Fall wird der Tablespace automatisch nach Bedarf skaliert.

Wenn Sie die automatische Erweiterungsfunktion nicht aktiviert haben und die Größe des Tablespace ändern möchten, gehen Sie wie folgt vor:

Für bigfile-Tablespaces: Ändern Sie die Größe des Tablespace mit dem Befehl ALTER TABLESPACE. Sie können die Größe in Kilobyte (K), Megabyte (M), Gigabyte (G) oder Terabyte (T) angeben. Der bigfile-Tablespace hat eine einzelne Datendatei, und dieser Befehl ändert die Größe der zugrunde liegenden einzelnen Datendatei, die mit dem Tablespace verknüpft ist.

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

Für smallfile-Tablespaces: Sie können die Größe des Tablespace nur ändern, indem Sie dem Tablespace weitere Datendateien hinzufügen. Sie können die Größe der aktuellen Datendateien nicht ändern.

SQL> ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;

Verkleinern der Größe des Tablespace

Wenn der Tablespace smallfile ist, können Sie die zugrunde liegenden Datendateien nicht verwalten. Um die Tablespace-Größe zu erhöhen, fügen Sie eine neue Datendatei hinzu. Achten Sie beim Hinzufügen einer neuen Datendatei darauf, dass Sie die richtigen Werte für AUTOEXTEND, SIZE und MAXSIZE auswählen. Diese Werte können später nicht mehr geändert werden. Um die Größe des smallfile-Tablespace zu reduzieren, erstellen Sie einen neuen Tablespace mit dem gewünschten Speicherplatz und verschieben Sie alle Ihre Daten manuell in den neuen Tablespace.

Wenn Ihr Tablespace bigfile ist, wählen Sie eine der folgenden Methoden, um die Größe des Tablespace basierend auf dem Datentyp Ihres Tablespace zu verringern:

Permanente Tablespaces: Sie können die Größe eines permanenten Tablespace nicht auf einen Wert reduzieren, der unter der Größenbeschränkung des Tablespace liegt. Wenn Sie dies versuchen, schlägt Ihre Größenänderung mit dem folgenden Fehler fehl:

ORA-03297: file contains used data beyond requested RESIZE value

Angenommen, ein Tablespace hat die Größe von 50 GB mit einer Größenbeschränkung von 40 GB. In diesem Fall können Sie die Größe des Tablespace auf 40 GB verringern, indem Sie eine Abfrage ähnlich der folgenden ausführen:

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

Sie können die Größe des Tablespace nicht auf einen Wert verringern, der unter der Größenbschränkung liegt. In solchen Fällen können Sie einen der folgenden Schritte ausführen:

  • Ordnen Sie die Objekte im Tablespace neu an.
  • Erstellen Sie einen neuen Tablespace und migrieren Sie alle Objekte in den neuen Tablespace. Löschen Sie dann den alten Tablespace.

Temporäre Tablespaces: Sie können die Größe Ihres temporären Tablespace mit dem Befehl SHRINK verringern.

Beispiel:

SQL> ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

Verwenden Sie zum Ändern der Größe temporärer Tablespaces in einem Read Replica das Paket rdsadmin.rdsadmin_util.resize_temp_tablespace:

SQL> EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('example-tablespace','100M');

Weitere Informationen finden Sie unter Ändern der Größe des temporären Tablespace in einem Read Replica.

-oder-

Sie können einen weiteren temporären Tablespace mit der Größe Ihrer Wahl erstellen und dann diesen neuen temporären Tablespace als temporären Standard-Tablespace festlegen.

1.    Führen Sie die folgende Abfrage aus, um den aktuellen temporären Standard-Tablespace anzuzeigen:

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

2.    Führen Sie die folgende Abfrage aus, um einen neuen temporären Tablespace zu erstellen:

SQL> CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;

3.    Führen Sie die folgende Abfrage aus, um den neuen temporären Tablespace als temporären Standard-Tablespace festzulegen:

SQL> EXEC RDSADMIN.RDSADMIN_UTIL.ALTER_DEFAULT_TEMP_TABLESPACE(TABLESPACE_NAME => 'example-tablespace');

Um den temporären Tablespace für einen bestimmten Benutzer zu ändern, können Sie Folgendes tun:

1.    Führen Sie die folgende Abfrage aus, um den aktuellen temporären Standard-Tablespace für den Benutzer anzuzeigen:

SQL>  SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';

2.    Führen Sie die folgende Abfrage aus, um den temporären Standard-Tablespace für den Benutzer zu ändern:

SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

rückgängig-Tablespaces: Versuchen Sie zunächst, die Größe des rückgängig-Tablespace mithilfe des Befehls ALTER TABLESPACE zu verringern.

Führen Sie die folgende Abfrage aus, um den derzeit verwendeten rückgängig-Tablespace zu identifizieren:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

Führen Sie eine Abfrage ähnlich der folgenden aus, um die Größe des rückgängig-Tablespace zu verringern:

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

Diese Abfrage wird erfolgreich ausgeführt, wenn es keine rückgängig-Segmente im Speicher gibt, die entfernt werden müssen.

Wenn die obige Abfrage nicht erfolgreich ausgeführt wird, gehen Sie wie folgt vor:

1.    Erstellen Sie einen neuen rückgängig-Tablespace:

Führen Sie eine Abfrage ähnlich der folgenden aus, um einen neuen rückgängig-Tablespace zu erstellen:

SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;

2.    Legen Sie den neu erstellten Tablespace als standardmäßigen rückgängig-Tablespace fest:

Legen Sie den UNDO_TABLESPACE-Initialisierungsparameter in der Parametergruppe so fest, dass er auf den neu erstellten Tablespace verweist. Weitere Informationen finden Sie unter Ändern von Parametern in einer DB-Parametergruppe.

Beispiel:

UNDO_TABLESPACE = example-new-tablespace

Dieser Parameter ist ein dynamischer Parameter und führt zu keinen Ausfallzeiten, um die Änderung anzuwenden. Es empfiehlt sich jedoch, die DB-Instance nach dieser Änderung neu zu starten. Weitere Informationen finden Sie unter Verwalten von rückgängig.

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob der neue rückgängig-Tablespace der Standard-Tablespace ist:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    Löschen Sie den alten rückgängig-Tablespace:

Führen Sie eine Abfrage ähnlich der folgenden aus, um den alten rückgängig-Tablespace zu löschen:

SQL> DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;