terça-feira, 20 de junho de 2017

Mover tabela AUD$ da tablespace SYSTEM + ORA-46267

Olá pessoal.
Se você procurou por esse procedimento, provavelmente já sabe que não podemos redimensionar a tablespace SYSTEM.
Nessa tablespace podemos adicionar novos datafiles, porém, a mesma irá crescer e não será possível reduzir esse espaço que alocado.
Mas o foco desse post é falarmos sobre a tabela AUD$ que fica na tablespace SYSTEM. Quando configuramos a auditoria de alguma tabela do banco de dados, as informações são "populadas" na tabela AUD$ e para que a tabela não cresça muito e ocupe o espaço da tablespace SYSTEM, faremos o move da tabela AUD$ para outra tablespace, para isso, siga o procedimento abaixo:



1 - Verificar tablespace da tabela AUD$.

SQL> SELECT table_name, tablespace_name FROM dba_tables WHERE table_name ='AUD$';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
AUD$                                                SYSTEM



2 - Criar uma nova tablespace de auditoria para mover a tabela AUD$.

SQL> create tablespace auditoria datafile '+DGDATAFILES' SIZE 128M autoextend on next 128M maxsize 25600m
     extent management LOCAL autoallocate segment space management AUTO
     LOGGING;

Tablespace criado.



3 - Verificar tamanho da tabela AUD$.
SQL>  select segment_name,bytes/1024/1024 size_in_megabytes from dba_segments where segment_name ='AUD$';

SEGMENT_NAME                                                                      SIZE_IN_MEGABYTES
--------------------------------------------------------------------------------- -----------------
AUD$                                                                                          20080


Obs.: Nesse caso temos uma "pegadinha" do Oracle. Como podemos observar a tabela possui 20GB e como criei a tablespace com SIZE 128M e autoextend de 128M até crescimento total de 25G, será exibido o seguinte erro:

ORA-46267: Espaco insuficiente no tablespace 'AUDITORIA', n?o e possivel concluir a operac?o

Pois, o Oracle não consegue copiar toda a tabela de uma só vez com o size 128M, para corrigir o problema, você precisa fazer um resize do datafile da seguinte forma:

alter database datafile '+DGDATAFILES/oracleteste/datafile/auditoria.335.946922105' resize 25g;


4 - Mover a tabela AUD$ para tablespace AUDITORIA:

BEGIN
DBMS_AUDIT_MGMT.SET_AUDIT_TRAIL_LOCATION(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD,
audit_trail_location_value => 'AUDITORIA');
END;
/

Obs.: No meu caso, demorou 32 minutos devido o tamanho da tabela AUD$.


5 - Verificar se a tabela foi movida.

SQL> SELECT table_name, tablespace_name FROM dba_tables WHERE table_name ='AUD$';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
AUD$                           AUDITORIA


6 - Verificar tamanho da tabela movida.

SQL> select segment_name,bytes/1024/1024 size_in_megabytes from dba_segments where segment_name ='AUD$';

SEGMENT_NAME                   SIZE_IN_MEGABYTES
------------------------------ -----------------
AUD$                                       20280


Espero ter ajudado, qualquer dúvida, deixe o seu comentário.
Um abraço.

Nenhum comentário:

Postar um comentário