domingo, 21 de outubro de 2012

Como remover a tablespace de UNDO com os segmentos ativos


Neste artigo vou descrever como podemos remover a tablespace de UNDO, caso os segmentos de UNDO estejam ativos no banco de dados.

As vezes pode acontecer dos segmentos de UNDO ficarem inacessíveis e então muitas vezes será necessário recriar a tablespace de UNDO, ou mesmo os segmentos de UNDO. Dependendo de cada caso.

1.       Primeiro passo, deve-se baixar o banco de dados:

sqlplus /nolog

SQL>connect / as sysdba
Connected.

SQL> shutdown immediate

2.       Deve-se montar o banco de dados em modo RESTRITO, usando o arquivo de “pfile”, conhecido também como “init.ora”.

SQL> STARTUP RESTRICT MOUNT pfile=C:\Oracle\init_test.ora

ORACLE instance started.

Total System Global Area 1620126452 bytes
Fixed Size                   457460 bytes
Variable Size             545259520 bytes
Database Buffers         1073741824 bytes
Redo Buffers                 667648 bytes

Database mounted.

3.       Abaixo, será demonstrado o que acontece quando tentamos remover o “datafile” que possui os segmentos de UNDO ativos.

SQL> ALTER DATABASE DATAFILE 'K:\ORADATA\UNDOTBS2_02.DBF' OFFLINE DROP;
*
ERROR at line 1:
ORA-01548: active rollback segment ‘_SYSSMU11$’ found, terminate dropping tablespace.

Ou utilizando outra instrução SQL:

SQL> DROP TABLESPACE undotbs2 INCLUDING CONTENTS AND DATAFILES;
*
ERROR at line 1:
ORA-01548: active rollback segment ‘_SYSSMU11$’ found, terminate dropping tablespace.

4.       Utilizando a consulta abaixo pode-se verificar quais os segmentos de UNDO que estão corrompidos.

SQL> select segment_name,status,tablespace_name
       from dba_rollback_segs
      where status='NEEDS RECOVERY';


SEGMENT_NAME STATUS         TABLESPACE_NAME
------------ -------------- ---------------
_SYSSMU11$   NEEDS RECOVERY UNDOTBS2
_SYSSMU12$   NEEDS RECOVERY UNDOTBS2
_SYSSMU13$   NEEDS RECOVERY UNDOTBS2
_SYSSMU14$   NEEDS RECOVERY UNDOTBS2
_SYSSMU15$   NEEDS RECOVERY UNDOTBS2
_SYSSMU16$   NEEDS RECOVERY UNDOTBS2
_SYSSMU17$   NEEDS RECOVERY UNDOTBS2
_SYSSMU18$   NEEDS RECOVERY UNDOTBS2
_SYSSMU19$   NEEDS RECOVERY UNDOTBS2
_SYSSMU20$   NEEDS RECOVERY UNDOTBS2

5.       Para desativar os segmentos de UNDO, deve-se adicionar a linha abaixo no arquivo “PFILE”, no arquivo “init.ora”.

_corrupted_rollback_segments=('_SYSSMU11$','_SYSSMU12$','_SYSSMU13$','_SYSSMU14$','_SYSSMU15$','_SYSSMU16$','_SYSSMU17$','_SYSSMU18$','_SYSSMU19$','_SYSSMU20$')

Certifique-se de alterar o parâmetro "UNDO_MANAGEMENT = AUTO", alterá-lo para MANUAL  no arquivo “PFILE” e especificar o nome da nova  tablespace de UNDO.

*.UNDO_MANAGEMENT=MANUAL

SQL> alter system set undo_tablespace=UNDOTBS1;

System Altered.

6.       Deve-se levantar o banco de dados novamente.

SQL> STARTUP RESTRICT MOUNT pfile=C:\Oracle\init_test.ora

ORACLE instance started.

Total System Global Area 1620126452 bytes
Fixed Size                   457460 bytes
Variable Size             545259520 bytes
Database Buffers         1073741824 bytes
Redo Buffers                 667648 bytes

Database mounted.

7.       Depois devemos remover os segmentos de UNDO que estão corrompidos. Para  remover os segmentos de UNDO, deve-se usar o comando abaixo, para cada segmento de UNDO.

SQL> drop rollback segment "_SYSSMU11$";

Rollback segment dropped.

.
.
.

SQL> drop rollback segment "_SYSSMU20$";

Rollback segment dropped.

8.       Fazer uma nova verificação dos segmentos de UNDO.

SQL> select segment_name,status,tablespace_name
       from dba_rollback_segs;

SEGMENT_NAME STATUS TABLESPACE_NAME
------------ ------ ---------------
SYSTEM       ONLINE SYSTEM

9.       Com os segmentos de UNDO removidos, agora já podemos remover a tablespace de UNDO.

SQL> drop TABLESPACE UNDOTBS2 including contents and datafiles;

Tablespace dropped.

10.   Agora vamos recriar a nova tablespace de UNDO com todos os seus segmentos.

SQL> CREATE UNDO TABLESPACE UNDOTBS1
     DATAFILE 'K:\oradata\CRM\UNDOTBS01.DBF' SIZE 2000M
     AUTOEXTEND OFF;

Tablespace created.


11.   Alterar a tablespace de UNDO no banco de dados, usar:

SQL> ALTER SYSTEM SET undo_tablespace = UNDOTBS1;


12.   Depois devemos remover a linha abaixo do arquivo de “PFILE”.

_corrupted_rollback_segments=('_SYSSMU11$','_SYSSMU12$','_SYSSMU13$','_SYSSMU14$','_SYSSMU15$','_SYSSMU16$','_SYSSMU17$','_SYSSMU18$','_SYSSMU19$','_SYSSMU20$')

E descomentar o parâmetro “UNDO_MANAGEMENT=AUTO”  e verificar os demais parâmetros para o gerenciamento dos segmentos de UNDO do arquivo “PFILE”.

UNDO_MANAGEMENT=AUTO
UNDO_RETENTION=10800
UNDO_TABLESPACE=UNDOTBS1

13.   Baixar o banco de dados para atualização dos parâmetros.

SQL> shutdown immediate;

Editar o arquivo “PFILE”, arquivo “init.ora” e alterar o parâmetro “UNDO_TABLESPACE=” do valor “UNDOTBS2” para  “UNDOTBS1” e então levantar o banco de dados.

SQL> STARTUP pfile=C:\Oracle\init_test.ora

ORACLE instance started.

Total System Global Area 1620126452 bytes
Fixed Size                   457460 bytes
Variable Size             545259520 bytes
Database Buffers         1073741824 bytes
Redo Buffers                 667648 bytes

Database mounted.
Database opened.

14.   Se você utilizar o “SPFILE” deve atualizá-lo no banco

SQL> CREATE SPFILE FROM PFILE;

Spfile created.

No próximo “restart” do banco de dados, já será possível realizá-lo utilizando o “SPFILE”.




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