[oracle] Redução de espaço de datafiles (shirink datafiles)

19 02 2010

Palavras chaves

Oracle, datafiles, redução, shirink, diminuir, tablespaces, resize, ORA-03297

Problema

Os datafiles estão muito grandes  e você quer reduzir, diminuir, desfragmenta-los.

Tentou executar o comando:

ALTER DATABASE DATAFILE '/u01/oradata/DATAFILENAME' RESIZE 23000M;

E o seguinte erro ocorreu:

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

Solução

Há uma possibilidade que pode reduzir alguns dos arquivos de dados, no entanto só será possível reduzir até um certo ponto, que é definido pelo “high water mark” (acredito que traduzindo seria o ponto mais alto de escrita no datafile) .

Não encontrei outra solução que reduza mais que isso, a não ser recriar o banco com os comandos EXPDP e IMPDP.

O Script abaixo irá identificar os pontos possíveis de redução e irá informar os comandos necessários para efetuar a redução.

----------- maxshrink.sql ----------------------------------

set verify off
column file_name format a50 word_wrapped
column smallest format 999,990 heading "Smallest|Size|Poss."
column currsize format 999,990 heading "Current|Size"
column savings  format 999,990 heading "Poss.|Savings"
break on report
compute sum of savings on report

column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/

select file_name,
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
       ceil( blocks*&&blksize/1024/1024) currsize,
       ceil( blocks*&&blksize/1024/1024) -
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
from dba_data_files a,
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+)
/

column cmd format a75 word_wrapped

select 'alter database datafile '''||file_name||''' resize ' ||
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 )  || 'm;' cmd
from dba_data_files a,
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+)
  and ceil( blocks*&&blksize/1024/1024) -
      ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/

É importante lembrar que isso é um procedimento para remediar a situação, o melhor é você estar sempre cuidando do espaço dos datafiles, ter espaço físico suficiente,  se não tiver espaço então realocar para um outro dispositivo, em sumo gerenciar melhor os recursos.

FONTE: AQUI

Anúncios

Ações

Information

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: