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