Listar todos os segmentos de rollback, com o banco fora do ar
Se você perder todos os DATAFILEs de sua TABLESPACE de UNDO, e não tiver backup (em RMAN, é claro, pois Backup é em RMAN), você pode recuperar-se desligando a instância, alterando o parâmetro UNDO_MANAGEMENT para MANUAL, e em seguida iniciando a instância, colocando os DATAFILEs de UNDO em OFFLINE, e executando DROP na TABLESPACE de UNDO. Esta é a situação do Lab 26.3 de meu Treinamento Oracle Backup e Recovery, na Nerv.
Mas se o UNDO estava em uso no momento do desastre, o que é muito provável, você pode ter que utilizar o parâmetro “_offline_rollback_segments”, apontando os segmentos de UNDO que devem ser ignorados, ou o Oracle não permitirá que a TABLESPACE de UNDO seja removida.
Mas como saber quais os nomes dos segmentos? Estes nomes devem ser informados neste parâmetro.
Uma saída é consultar a DBA_ROLLBACK_SEGS, mas em algumas ocasiões isto não foi possível, pois o banco de dados não abria. Outra saída é listar todos os segmentos manuais (eles ficam na TABLESPACE SYSTEM), e colocar todos em OFFLINE, menos um, e tentar abrir o banco para conseguir remover a TABLESPACE de UNDO e criar outra.
E como listar todos os segmentos manuais, se o banco de dados não abre? No Linux, utilize o comando strings, como a demonstração abaixo.
[oracle@gg01 datafile]$ ls -lh
total 34G
-rw-r-----. 1 oracle oinstall 346M Apr 8 14:57 o1_mf_example_8obrm1yg_.dbf
-rw-r-----. 1 oracle oinstall 5.5G Apr 8 14:57 o1_mf_soe_8obt42ld_.dbf
-rw-r-----. 1 oracle oinstall 5.6G Apr 8 14:57 o1_mf_soe_8obt5jk3_.dbf
-rw-r-----. 1 oracle oinstall 5.4G Apr 8 14:57 o1_mf_soe_8obt5pr8_.dbf
-rw-r-----. 1 oracle oinstall 5.4G Apr 8 14:57 o1_mf_soe_8obt5ww3_.dbf
-rw-r-----. 1 oracle oinstall 5.6G Apr 8 14:57 o1_mf_soe_8obt628r_.dbf
-rw-r-----. 1 oracle oinstall 701M Apr 8 14:57 o1_mf_sysaux_8obrhrgf_.dbf
-rw-r-----. 1 oracle oinstall 731M Apr 8 14:57 o1_mf_system_8obrhrcn_.dbf
-rw-r-----. 1 oracle oinstall 3.6G Apr 8 14:58 o1_mf_temp_8obrlv0y_.tmp
-rw-r-----. 1 oracle oinstall 501M Apr 8 14:57 o1_mf_undotbs1_8obrhrj1_.dbf
-rw-r-----. 1 oracle oinstall 6.3M Apr 8 14:57 o1_mf_users_8obrhrkr_.dbf
[oracle@gg01 datafile]$ strings o1_mf_system_8obrhrcn_.dbf | grep _SYSSMU | cut -d $ -f 1 | sort -u
_SYSSMU10_3271578125
_SYSSMU10_960603280
_SYSSMU11_125382609
_SYSSMU1_1240252155
_SYSSMU12_2245433549
_SYSSMU13_3242268464
_SYSSMU1_3728092404
_SYSSMU14_44821983
_SYSSMU15_1872739176
_SYSSMU16_1376564431
_SYSSMU17_1839632768
_SYSSMU18_3088942417
_SYSSMU19_2867910983
_SYSSMU20_948290921
_SYSSMU2_111974964
_SYSSMU2_2850105180
_SYSSMU3_4004931649
_SYSSMU3_4160240979
_SYSSMU4_1126976075
_SYSSMU4_348804819
_SYSSMU5_2968973961
_SYSSMU5_4011504098
_SYSSMU6_2060978448
_SYSSMU6_3654194381
_SYSSMU7_4222772309
_SYSSMU7_894058185
_SYSSMU8_3612859353
_SYSSMU8_87803851
_SYSSMU9_2370500926
_SYSSMU9_3945653786
[oracle@gg01 datafile]$
Agora, é colocar estes nomes no parâmetro no PFILE, desta forma:
_offline_rollback_segments=('_SYSSMU8_87803851','_SYSSMU9_2370500926','_SYSSMU9_3945653786')
Agora você consegue abrir o banco de dados, remover a TABLESPACE de UNDO, e adicionar uma nova. Nem precisaria remover a antiga para adicionar uma nova, mas você não quer esta TABLESPACE sem DATAFILEs em seu banco de dados.