Perché la mia istanza database Amazon RDS per Oracle utilizza più storage del previsto?

7 minuti di lettura
0

Ho un'istanza Amazon Relational Database Service (Amazon RDS) per Oracle DB che utilizza più spazio di quanto mi aspetto.

Breve descrizione

Vari componenti possono utilizzare lo storage sottostante per le istanze Amazon RDS for Oracle. Questi componenti includono tablespace, registri di archivio, file di registro, file di registro di ripristino online e file di pompaggio dati.

Per gestire la crescita dello storage nella tua istanza, identifica la quantità di spazio di storage utilizzata dai tuoi componenti:

1.    Trova la quantità di spazio allocata ai dati in tutte le tablespace, incluse le tablespace temporanee.

2.    Controlla l'allocazione dello spazio per i log di archivio o i file di traccia.

3.    Controlla l'allocazione dello spazio per la directory della pompa di dati.

Nota: Lo spazio di archiviazione allocato per un'istanza RDS rappresenta il volume di dati. Quando crei un'istanza, Amazon RDS associa lo storage allocato al volume di dati. Questo processo utilizza anche una piccola percentuale di spazio su disco grezzo per creare il file system sopra il volume di archiviazione fisico.

Risoluzione

Trova la quantità di spazio allocata ai dati nei tablespace

Per determinare la distribuzione dello spazio allocato ai diversi componenti del database Oracle, utilizza la seguente query:

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

Per impostazione predefinita, le istanze database di Amazon RDS per Oracle attivano l'estensione automatica per tutti i tablespace. Sono incluse le tablespace dati, le tablespace UNDO e le tablespace temporanee. Ciò significa che ogni tablespace cresce per ospitare più dati. Questa funzione continua fino a quando non è più necessario altro spazio di archiviazione o non si utilizza tutto lo spazio di archiviazione allocato.

Ridimensiona le tablespace

Tablespace dati e ANNULLARE tablespace

Per ridimensionare i dati e ANNULLARE le tablespace, vedi Come faccio a ridimensionare il tablespace per la mia istanza Amazon RDS per Oracle DB?

Tablespace temporaneo

1.    Per visualizzare informazioni sull'utilizzo temporaneo delle tablespace, eseguite la seguente query sulla vista DBA\ _TEMP\ _FREE\ _SPACE:

SQL> SELECT * FROM dba_temp_free_space;

2.    Per ridimensionare il tablespace temporaneo (ad esempio, a 10 GB), esegui la seguente query in base all'output della query di utilizzo del tablespace:

SQL> ALTER TABLESPACE temp RESIZE 10g;

Se il tablespace allocato si estende oltre la soglia di 10 GB, questo comando potrebbe non riuscire.

3.    Se il comando fallisce, riduci lo spazio nella tablespace temporanea:

SQL> ALTER TABLESPACE temp SHRINK SPACE KEEP 10g;

4.    Verifica la presenza di sessioni di lunga durata che eseguono un ordinamento attivo su disco e in cui sono allocati segmenti temporanei. A tale scopo, esegui la seguente query:

SQL> SELECT * FROM v$sort_usage;

5.    Se la logica dell'applicazione e il business consentono di terminare la sessione, termina la sessione. Quindi, ridimensionate nuovamente il tablespace temporaneo, come illustrato nel passaggio 2.

6.    Se non riesci a terminare le sessioni, crea un nuovo tablespace temporaneo. Quindi, imposta il nuovo tablespace come predefinito ed elimina il vecchio tablespace temporaneo:

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;

Controlla l'allocazione dello spazio per i log di archivio o i file di traccia

1.    Controlla l'attuale conservazione dei registri di archivio:

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

Nelle istanze Amazon RDS per Oracle, la conservazione dei log di archivio è impostata su 0 per impostazione predefinita. Ciò significa che dopo il caricamento degli archivi su Amazon S3, Amazon RDS li elimina automaticamente dall'host sottostante. Se devi utilizzare gli archivelog con prodotti come Oracle LogMiner o GoldenGate, aumenta la conservazione degli archivi.

2.    Calcola lo spazio utilizzato dagli archivelog sull'host sottostante. Innanzitutto, crea una directory archivelog:

SQL> EXEC rdsadmin.rdsadmin_master_util.create_archivelog_dir;

Quindi, identifica l'uso esatto di archivelog su un'istanza RDS:

SQL> SELECT sum(FILESIZE)/1024/1024/1024 archivelog_usage_GiB FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'ARCHIVELOG_DIR'));

3.    Se lo spazio allocato per i log di archivio è superiore al previsto, aggiorna il valore della politica di conservazione. Quindi, consenti all'automazione Amazon RDS di cancellare i file di registro di archivio meno recenti. L'esempio seguente configura l'istanza RDS per Oracle per conservare 24 ore di log di archiviazione:

begin
 rdsadmin.rdsadmin_util.set_configuration(name => 'archivelog retention hours', value => '24');
end;
 /
commit;

Per ulteriori informazioni sull'elenco e l'eliminazione dei file di traccia, consulta Eliminazione dei file di traccia.

Controlla l'allocazione dello spazio per la directory della pompa di dati

1.    Se lo spazio allocato nella directory data pump è superiore al previsto, trova i file.dmp che possono essere rimossi:

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

2.    Se questa query trova file con estensione dmp, eliminali con la seguente query. Sostituisci il nome del file con il nome dei file.dmp:

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

Informazioni correlate

Utilizzo dello storage per le istanze DB di Amazon RDS

Interruzione di una sessione

Monitoraggio delle metriche in un'istanza Amazon RDS

L'istanza database Amazon RDS sta esaurendo lo storage