Πώς απελευθερώνουμε δεσμευμένο χώρο από datafiles / tempfiles μίας βάσης δεδομένων της Oracle

Πώς απελευθερώνουμε δεσμευμένο χώρο από datafiles / tempfiles μίας βάσης δεδομένων της Oracle
Πώς απελευθερώνουμε δεσμευμένο χώρο από datafiles / tempfiles μίας βάσης δεδομένων της Oracle

Σε αυτό το άρθρο θα δούμε ένα script με το οποίο μπορούμε έυκολα να αποδεσμεύσουμε χώρο από τα datafiles και tempfiles όπου αυτός δεν χρησιμοποιείται σε βάσεις δεδομένων της Oracle. Πιο συγκεκριμένα θα μειώσουμε το μέγεθος των datafiles ώστε να είναι στο όριο του High Water Mark (HWM) του καθενός.

Με τον κώδικα αυτό μπορούμε να αποδεσμέυσουμε χώρο από συγκεκριμένο μόνο tablespace είτε από ολόκληρη τη βάση δεδομένων. Με την εκτέλεση του θα δημιουργήθουν alter commands με την παράμετρο resize.

Ο κώδικας

Τρέχοντας τον παρακάτω κώδικα από command window θα γίνουν generate τα alter commands που θα κάνουν το resize, κάθως θα μας ενημερώσει και για τον συνολικό χώρο που θα αποδεσμευτεί από το filesystem αν εκτελεστούν αυτές οι εντολές. Μπορούμε επίσης να ορίσουμε ένα threshold ώστε να αποδευσμευτεί ο χώρος από συγκεκριμένο μόνο tablespace και μόνο από όσα datafiles απελευθερωθεί πάνω από κάποιο όριο χώρου (free space threshold).

Για το παράδειγμα είναι ορισμένο να κάνει generate alter statements μόνο για όσα datafiles θα ελευθερωθούν πάνω από 256mb χώρου και για όσα ανήκουν στο tablespace USERS:

set heading on;
set linesize 300;
set echo off;
column cmd format a300 word_wrapped
column value new_val block_size
select value from v$parameter where name = 'db_block_size';



--generate commands

select 'alter database datafile '''||file_name||''' resize ' || ceil( (nvl(hwm,1)*&&block_size)/1024/1024 )  || 'm;' cmd
from dba_data_files df
inner join ( select file_id, max(block_id+blocks-1) hwm from dba_extents group by file_id ) de on df.file_id = de.file_id
where 1=1
and ceil( blocks*&&block_size/1024/1024) - ceil( (nvl(hwm,1)*&&block_size)/1024/1024 ) > 256 --free space threshold
and tablespace_name = 'USERS'  --filter tablespace
;
     
--generate tempfile commands

select 'alter database tempfile '''||file_name||''' resize ' || ceil( (nvl(hwm,1)*&&block_size)/1024/1024 )  || 'm;' cmd
from dba_temp_files df
inner join ( select file_id, max(block_id+blocks-1) hwm from dba_extents group by file_id ) de on df.file_id = de.file_id
where 1=1
and ceil( blocks*&&block_size/1024/1024) - ceil( (nvl(hwm,1)*&&block_size)/1024/1024 ) > 512 --free space threshold
--and file_name like '%TEMPORARY_A%'  
and tablespace_name = 'TEMPORARY'
;

--estimate reclaimed space

select 
      ('Space it ll be saved (MB): ' || sum(ceil( blocks*&&block_size/1024/1024) - ceil( (nvl(hwm,1)*&&block_size)/1024/1024 ))) space_save
from dba_data_files df
inner join ( select file_id, max(block_id+blocks-1) hwm from dba_extents group by file_id ) de on df.file_id = de.file_id
where 1=1
and ceil( blocks*&&block_size/1024/1024) - ceil( (nvl(hwm,1)*&&block_size)/1024/1024 ) > 256 --free space threshold
and tablespace_name = 'USERS'  --filter tablespace
;

Τρέχοντας το script θας μας εμφανίσει το block size, τα alter commands και τον συνολικό χώρο που θα αποδεσμεύσει. Αν θέλουμε να προχωρήσουμε στο resizing εκτελούμε όλα τα alter commands που μας έχει εμφανίσει:

SQL> 
8192

alter database datafile '/oracle/oradata/users_44.DBF' resize 27158m;
alter database datafile '/oracle/oradata/users_74.DBF' resize 6094m;
alter database datafile '/oracle/oradata/users_58.DBF' resize 31390m;
alter database datafile '/oracle/oradata/users_59.DBF' resize 30227m;
alter database datafile '/oracle/oradata/users_60.DBF' resize 28979m;
alter database datafile '/oracle/oradata/users_75.DBF' resize 3465m;
alter database datafile '/oracle/oradata/users_68.DBF' resize 26756m;
alter database datafile '/oracle/oradata/users_61.DBF' resize 29126m;
alter database datafile '/oracle/oradata/users_63.DBF' resize 27440m;
alter database datafile '/oracle/oradata/users_40.DBF' resize 27479m;
alter database datafile '/oracle/oradata/users_70.DBF' resize 27351m;
alter database datafile '/oracle/oradata/users_62.DBF' resize 27587m;
alter database datafile '/oracle/oradata/users_67.DBF' resize 26682m;

13 rows selected

Space it ll be saved (MB): 71751

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση