segunda-feira, 18 de julho de 2011

Como alterar uma tablespace de UNDO no banco de dados

Este artigo demonstrará como alterar a tablespace de UNDO num banco de dados. Este procedimento necessitará programar uma parada no banco de dados.


1.Criar uma nova tablespace de UNDO com o tamanhos e caminho desejados, respeitando as regras
   de  negócio da empresa.

SQL> create undo tablespace UNDOTBS2 
     datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL2\UNDOTBS02.DBF' size 500M;


Tablespace created.


2. Atualizar o arquivo "init.ora" apartir do SPFILE caso esteja configurado e editar o parâmetro
    "undo_tablespace=", usar:

SQL> create pfile='d:\oracle\product\10.2.0\db_1\dbs\pfileorcl2.ora' 
       from spfile='D:\ORACLE\PRODUCT\10.2.0\DB_1\DBS\SPFILEORCL2.ORA';


File created.


Alterar os parâmetros abaixo:

UNDO_TABLESPACE=UNDOTBS2
UNDO_MANAGEMENT=MANUAL 

Onde o nome informado no parâmetro UNDO_TABLESPACE será o da nova tablespace de UNDO.

Configurar o parâmetro UNDO_MANAGEMENT para MANUAL para que os segmentos de UNDO possam ser colocados em OFFLINE e editados após o "restart" do banco de dados, (ver passo 6).

3. Agendar uma janela de tempo para baixar o banco de dados, usar:

SQL> shutdown immediate;


4. Levantar o banco de dados, com o PFILE (ajustado no passo 2).

SQL> startup pfile='d:\oracle\product\10.2.0\db_1\dbs\pfileorcl2.ora'


5. Confirmar se a nova tablespace de UNDO está em uso:

SQL> show parameter undo_tablespace


NAME              TYPE            VALUE
-------------     --------------  -----------------
undo_tablespace   string          UNDOTBS2


6. Verificar os status dos segmentos de UNDO e colocar os segmentos de UNDO antigos em OFFLINE.
    Os segmentos de UNDO deverão ser criados na nova tablespace de UNDO.

SQL> select owner, segment_name, tablespace_name, status from dba_rollback_segs order by 3;


OWNER       SEGMENT_NAME    TABLESPACE_NAME STATUS
------      --------------- --------------- ------- 
PUBLIC      _SYSSMU3$       UNDOTBS1        OFFLINE
PUBLIC      _SYSSMU2$       UNDOTBS1        OFFLINE
PUBLIC      _SYSSMU19$      UNDOTBS2        OFFLINE
...
... 
...


Se os segmentos de UNDO antigos estiverem ONLINE, deve-se colocá-los em OFFILNE, usar:

SQL>alter rollback segment "_SYSSMU3$" offline;
SQL>alter rollback segment "_SYSSMU2$" offline;
...
...
...


Esse comando deverá ser executado para todos os segmentos de UNDO antigos que estejam apontando para a tablespace antida de UNDO.

7. Certifique-se que todos os segmentos antigos de UNDO estão em OFFLINE, para a remoção da
    tablespace de UNDO antiga. Para a remoção da tablespace de UNDO antiga usar:

SQL> drop tablespace UNDOTBS1 including contents and datafiles;


Tablespace dropped.


8. Recrie o arquivo de configuração SPFILE para atualizar os parâmetros alterados
    (UNDO_TABLESPACE  e UNDO_MANAGEMENT) porém antes altere o parâmetro
    UNDO_MANAGEMENT para AUTO, conforme demonstrado abaixo:

UNDO_MANAGEMENT='AUTO'
UNDO_TABLESPACE='UNDOTBS2'


SQL> create spfile='d:\oracle\product\10.2.0\db_1\dbs\spfileorcl2.ora' 
       from pfile='D:\ORACLE\PRODUCT\10.2.0\DB_1\DBS\PFILEORCL2.ORA';


File created.


9. Baixe o banco de dados (shutdown immediate) e "restart" o banco de dados utilizando o arquivo SPFILE.

SQL> startup;

Ao término da execução desses passos o banco de dados já estará utilizando a nova tablespace de UNDO.



Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com