Reduzindo o tamanho de um datafile no Oracle
Introdução
por Rodrigo Salviatto
Você já precisou redimensionar os datafiles dos tablespaces existentes no banco de dados Oracle de um sistema em produção? Quando necessitamos expandir o tablespace, é sempre muito fácil, criamos novos datafiles no disco ou incrementamos os datafiles existentes, passando de 500MB para 1GB por exemplo. Mas e se você precisar reduzir o tamanho de um determinado datafile que está com espaço alocado desnecessário? Como devemos proceder? Veremos neste artigo alguns exemplos, de como efetuar esta tarefa de forma rápida e segura.
Identificando o tamanho do datafile
Vamos imaginar a seguinte situação: você possui um tablespace chamado USERS. Este, por sua vez, possui 100MB alocados porém apenas 20MB utilizados, conforme apresentado na listagem 1.
SQL>select substr(a.tablespace_name,1,20) "Tablespaces",
2 (b.BYTES/1048576) as "TotalMB",
3 (b.BYTES/1048576)-(c.BYTES/1048576) as "UsedMB",
4 (c.BYTES/1048576) as "FreeMB"
5 from dba_tablespaces a,
6 (select tablespace_name,sum(bytes) as "BYTES"
7 from dba_data_files
8 group by tablespace_name ) b,
9 (select tablespace_name,sum(bytes) as "BYTES"
10 from dba_free_space
11 group by tablespace_name) c
12 where
13 a.tablespace_name = b.tablespace_name(+)
14 and b.tablespace_name = c.tablespace_name(+)
15 order by a.tablespace_name;
SQL>
Tablespaces TotalMB UsedMB FreeMB
-------------------- ---------- ---------- ----------
USERS 100 20.625 79.375
…
Listagem 1. Espaço utilizado no tablespace USERS.
Caso necessitarmos reduzir o tamanho do tablespace USERS de 100MB para 21MB, executamos o comando da listagem 2.
SQL> ALTER DATABASE DATAFILE ‘C:\ORACLE\ORADATA\USERS.DBF’ RESIZE 21M;
*
ERROR at line 1:
ORA-03214: File Size specified is smaller than minimum required
Listagem 2. Procedimento para reduzir o tamanho do datafile da tablespace USERS
Por que ocorreu o erro ORA-03214? Como solucionar este problema?
Este é exatamente o propósito deste artigo, informar a você como proceder para identificar qual o real tamanho alocado do tablespace. Veja o bloco de comando PL/SQL, apresentado na listagem 2, utilizado para identificar qual o tamanho mínimo requerido para reduzir o datafile do tablespace USERS.
set serveroutput on
execute dbms_output.enable(2000000);
declare
cursor c_dbfile is
select tablespace_name
,file_name
,file_id
,bytes
from sys.dba_data_files
where status !='INVALID'
order by tablespace_name,file_id;
cursor c_space(v_file_id in number) is
select block_id,blocks
from sys.dba_free_space
where file_id=v_file_id
...
Exibição do post interrompida. Para ler conteúdo completo,
clique aqui