Ripristino dello spazio logico da un tablespace


11

Ho un tablespace chiamato DATA, ed è impostato con l'estensione automatica come falso. Questo tablespace ha due file di dati ed è impostato in modo da occupare 350 GB di spazio fisico.

Una settimana fa ho interrogato user_tablespaces e dba_data_files e ho notato che aveva il 20% dello spazio logico disponibile. Ho quindi proceduto con una pulizia e rimosso molti record dalle tabelle in questo tablespace. Ci aspettavamo un grande aumento dello spazio disponibile. Sfortunatamente quando ho interrogato le viste ho notato che lo spazio disponibile era ora del 20,5%.

Ciò potrebbe essere dovuto alla frammentazione dei dati? Possiamo "deframmentare" il tablespace in qualche modo e recuperare lo spazio perso? O dobbiamo ricreare il tablespace da zero?

Risposte:


14

Quando elimini i record non c'è nulla che compatta automaticamente il segmento, quindi dovrai fare un restringimento del segmento per recuperare lo spazio. Ecco un estratto dalla Guida dell'amministratore 11.2 per il recupero dello spazio sprecato :

Nel tempo, gli aggiornamenti e le eliminazioni di oggetti all'interno di un tablespace possono creare sacche di spazio vuoto che individualmente non sono abbastanza grandi da poter essere riutilizzate per nuovi dati. Questo tipo di spazio vuoto viene definito spazio libero frammentato.

Gli oggetti con spazio libero frammentato possono comportare uno spreco di spazio e influire sulle prestazioni del database. Il modo preferito per deframmentare e recuperare questo spazio è eseguire un restringimento del segmento online. Questo processo consolida lo spazio libero frammentato al di sotto dell'high water mark e compatta il segmento. Dopo la compattazione, il segno di alta marea viene spostato, creando un nuovo spazio libero sopra il segno di alta marea. Lo spazio sopra l'high water mark viene quindi deallocato. Il segmento rimane disponibile per query e DML durante la maggior parte dell'operazione e non è necessario allocare spazio su disco aggiuntivo.

Più in basso nella stessa pagina puoi leggere questo:

La riduzione dei segmenti è un'operazione online, sul posto. Le operazioni e le query DML possono essere emesse durante la fase di spostamento dei dati della riduzione del segmento. Le operazioni DML simultanee vengono bloccate per un breve periodo al termine dell'operazione di riduzione, quando lo spazio viene deallocato. Gli indici vengono mantenuti durante l'operazione di restringimento e rimangono utilizzabili al termine dell'operazione. La riduzione del segmento non richiede l'allocazione di spazio su disco aggiuntivo.

La riduzione del segmento recupera lo spazio inutilizzato sia sopra che sotto il segno di alta marea. Al contrario, la deallocazione dello spazio recupera lo spazio inutilizzato solo al di sopra del limite massimo dell'acqua. Nelle operazioni di compattazione, per impostazione predefinita, il database compatta il segmento, regola il segno di massima e rilascia lo spazio recuperato.

La pagina include molte più informazioni sul problema, inclusi esempi.

La "segmento spaziale e l'High Water Mark" sezione dai concetti guida potrebbe anche essere utile.


9

Sì, sarà a causa della frammentazione.

Per recuperare lo spazio, ottenere innanzitutto un elenco di tabelle nel tablespace con la seguente query (ignorando le partizioni: modificare la domanda se le si utilizza):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Quindi, per ogni tabella, abilita il movimento delle righe:

alter table TABLEINDATAPARTITION enable row movement;

È quindi possibile ridurre la tabella:

alter table TABLEINDATAPARTITION shrink space;

Quindi ridurre i file di dati con:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

I nomi dei file di dati possono essere ottenuti dalla DBA_DATA_FILESvista di cui si è già a conoscenza.


Eccellente, una risposta pratica. +1
Leigh Riffel
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.