Come posso ridimensionare il tablespace per la mia istanza database Amazon RDS for Oracle?

Ultimo aggiornamento: 03-11-2021

Voglio sapere come gestire o ridimensionare il tablespace per la mia istanza Amazon Relational Database Service (Amazon RDS) per Oracle DB.

Breve descrizione

Il tipo di tablespace predefinito per le istanze database Amazon RDS for Oracle è bigfile. I tablespace bigfile rendono i file di dati trasparenti per gli utenti. Pertanto, è possibile eseguire direttamente le operazioni sui tablespace anziché gestire ciascuno dei file di dati sottostanti. I tablespace bigfile semplificano la gestione dei file di dati eliminando la necessità di aggiungere nuovi file di dati o gestire più file. È consigliabile evitare di utilizzare tablespace smallfile per le istanze RDS per Oracle.

Se l'istanza RDS per Oracle dispone di un tablespace smallfile, sono disponibili le seguenti limitazioni:

  • Non è possibile ridimensionare i file di dati. Tuttavia, è possibile ridimensionare il tablespace aggiungendo nuovi file di dati nel tablespace.
  • Non è possibile eseguire la query ALTER DATABASE per ridimensionare o modificare le configurazioni dei file di dati. Questo perché il comando ALTER DATABASE non è supportato in RDS per Oracle. Per ulteriori informazioni, consulta Limitazioni di RDS per Oracle.
  • È necessario gestire manualmente il parametro db_files per definire il numero massimo di file di dati nel database. È possibile che i file db_files vengano ottimizzati quando il numero di file di dati raggiunge questo limite.

Per impostazione predefinita, i tablespace in RDS per Oracle sono bigfile con AUTOEXTEND attivato. La dimensione massima dei tablespace bigfile è 16 TiB. Quando si inseriscono dati nel tablespace, il tablespace aumenta in base alle esigenze fino al limite massimo configurato o allo spazio di archiviazione allocato configurato per l'istanza RDS, a seconda di quale dei due valori è inferiore. Se lo spazio di archiviazione allocato per l'istanza RDS è completamente utilizzato, l'istanza passa allo stato STORAGE_FULL e i tablespace non possono essere estesi. Per risolvere questo problema, è necessario aggiungere spazio di archiviazione all'istanza. Per ulteriori informazioni, consulta In che modo è possibile risolvere i problemi relativi all'esaurimento di spazio di archiviazione delle istanze database di Amazon RDS?

Quando i dati vengono eliminati da un tablespace, le dimensioni del tablespace non vengono ridotte. I blocchi liberi possono essere riutilizzati quando vengono inseriti nuovi dati. È necessario ridimensionare manualmente il tablespace per recuperare lo spazio inutilizzato.

Risoluzione

Per ridimensionare il tablespace per l'istanza RDS per Oracle, completa le seguenti operazioni:

  1. Controlla la configurazione del tablespace.
  2. Aumenta o diminuisci le dimensioni del tablespace in base al caso d'uso.

Controlla la configurazione del tablespace

1.    Esegui una query simile alla seguente per identificare se il tablespace è:

  • Permanente, annullamento o temporaneo
  • Smallfile o bigfile
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    Esegui una query simile alla seguente per controllare se la funzione di estensione automatica è attivata e verificare la dimensione corrente del file di dati e il limite massimo configurato:

Per i tablespace permanenti e di annullamento:

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;

Per i tablespace temporanei:

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;

Nell'output di queste query è riportato quanto segue:

  • Se la funzione di estensione automatica non è attivata, il valore di MAX_GB è uguale a 0.
  • Se il tablespace è smallfile, allora il valore di MAX_GB dipende dalla dimensione del blocco utilizzato per creare il tablespace. Ad esempio, il valore di MAX_GB è 32 GB se la dimensione del blocco utilizzato è 8K. Per ulteriori informazioni, consulta la documentazione Oracle per le dimensioni dei blocchi non standard.
  • Se il tablespace è bigfile, il valore di MAX_GB visualizzato è 32 TB. Tuttavia, a causa delle limitazioni del sistema operativo in RDS per Oracle, il file può estendersi solo fino a 16 TiB.

Facoltativamente, è possibile eseguire le seguenti query per ottenere il DDL utilizzato per creare il tablespace:

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

Puoi ottenere le informazioni richieste sul tablespace dal DDL restituito.

Aumento delle dimensioni del tablespace

Se è stata attivata la funzione di estensione automatica, non è necessario aumentare le dimensioni del tablespace, indipendentemente dal suo tipo. In questo caso, il tablespace viene ridimensionato automaticamente in base alle necessità.

Se non è stata attivata la funzione di estensione automatica e si desidera ridimensionare il tablespace, completa le seguenti operazioni:

Per tablespace bigfile: ridimensiona il tablespace utilizzando il comando ALTER TABLESPACE. È possibile specificare le dimensioni in kilobyte (K), megabyte (M), gigabyte (G) o terabyte (T). Il tablespace bigfile ha un singolo file di dati e questo comando ridimensiona il singolo file di dati associato al tablespace.

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

Per tablespace smallfile: è possibile ridimensionare il tablespace solo aggiungendo altri file di dati al tablespace. Non è possibile ridimensionare o modificare la configurazione dei file di dati correnti.

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

Diminuzione delle dimensioni del tablespace

Se il tablespace è smallfile, non è possibile gestire i file di dati. Per aumentare le dimensioni del tablespace, aggiungi un nuovo file di dati. Quando aggiungi un nuovo file di dati, assicurati di scegliere i valori corretti per AUTOEXTEND, SIZE e MAXSIZE. Questi valori non potranno essere modificati in seguito. Per ridurre le dimensioni del tablespace smallfile, crea un nuovo tablespace con lo spazio desiderato e sposta manualmente tutti i dati nel nuovo tablespace.

Se il tablespace è bigfile, scegli uno dei seguenti metodi per ridurre le dimensioni del tablespace in base al tipo di dati della tablespace stesso:

Tablespace permanenti: non è possibile ridurre le dimensioni di un tablespace permanente a un valore inferiore al valore di livello massimo del tablespace. Se si prova a farlo, l'operazione di ridimensionamento non riesce con il seguente errore:

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

Tuttavia, supponiamo che un tablespace abbia le dimensioni di 50 GB con un valore di livello massimo di 40 GB. Quindi, è possibile ridurre le dimensioni del tablespace a 40 GB eseguendo una query simile alla seguente:

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

Non è possibile ridurre le dimensioni del tablespace a un valore inferiore al valore di livello massimo. In questi casi, è possibile effettuare una delle seguenti operazioni:

  • Riorganizzare gli oggetti nel tablespace.
  • Creare un nuovo tablespace e migrare tutti gli oggetti al nuovo tablespace. Quindi, eliminare il vecchio tablespace.

Tablespace temporanei: è possibile ridurre le dimensioni del tablespace temporaneo utilizzando il comando SHRINK.

Esempio:

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

Per ridimensionare i tablespace temporanei in una replica di lettura, utilizza il pacchetto rdsadmin.rdsadmin_util.resize_temp_tablespace:

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

Per ulteriori informazioni, consulta Ridimensionamento del tablespace temporaneo in una replica di lettura.

-oppure-

Puoi creare un altro tablespace temporaneo con le dimensioni desiderate e quindi impostarlo come tablespace temporaneo predefinito.

1.    Esegui la query riportata per visualizzare il tablespace temporaneo predefinito corrente:

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

2.    Esegui la query riportata per creare un nuovo tablespace temporaneo:

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

3.    Esegui la query riportata per impostare il nuovo tablespace temporaneo come tablespace temporaneo predefinito:

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

Per modificare il tablespace temporaneo per un utente specifico, puoi completare le seguenti operazioni:

1.    Esegui la query riportata per visualizzare il tablespace temporaneo predefinito corrente per l'utente:

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

2.    Esegui la query riportata per modificare il tablespace temporaneo predefinito per l'utente:

SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

Tablespace di annullamento: per prima cosa, prova a ridurre le dimensioni del tablespace di annullamento utilizzando il comando ALTER TABLESPACE.

Esegui la query riportata per identificare il tablespace di annullamento correntemente in uso:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

Esegui una query simile alla seguente per ridurre le dimensioni del tablespace di annullamento:

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

Questa query viene eseguita correttamente se non ci sono segmenti di annullamento nella memoria che devono essere rimossi.

Se la query precedente non viene eseguita correttamente, procedi come segue:

1.    Crea un nuovo tablespace di annullamento:

Esegui una query simile alla seguente per creare un nuovo tablespace di annullamento:

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

2.    Imposta il tablespace appena creato come tablespace di annullamento predefinito:

Imposta il parametro di inizializzazione UNDO_TABLESPACE nel gruppo di parametri in modo che punti al tablespace appena creato. Per ulteriori informazioni, consulta Modifica di parametri in un gruppo di parametri database.

Esempio:

UNDO_TABLESPACE = example-new-tablespace

Questo parametro è un parametro dinamico e non comporta alcun tempo di inattività per applicare la modifica. Tuttavia, dopo la modifica è consigliabile riavviare l'istanza database. Per ulteriori informazioni, consulta Gestione dell’annullamento.

Esegui la query riportata per verificare che il nuovo tablespace di annullamento sia il tablespace predefinito:

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    Elimina il vecchio tablespace di annullamento:

Esegui una query simile alla seguente per eliminare il vecchio tablespace di annullamento:

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