Muito boa noite a todos!!
Hoje vou compartilhar com vocês
mais um problema que passei, e realmente fiquei preocupado até achar a solução.
Foi algo muito interessante e acho que muitos já devem ter passado por
problemas parecidos (ao menos em nível de stress).
A história é mais ou menos a
seguinte...
Estou realizando um trabalho de
padronização de TABLESPACES em todas as bases de dados Oracle
da organização onde trabalho. Esse trabalho consiste basicamente em criar as “N” tablespaces, divididas por tamanhos
de extents distintos, como por
exemplo: TBS50MB, TBS100MB, TBS500MB, etc.
Para alocar as tabelas e índices
em uma tablespaces compatível com o tamanho do objeto, foi realizado um cálculo
(que não vem ao caso) para que a tabela “residisse” em uma tablespace compatível
com seu tamanho. Essa alteração é importante para muitas coisas, inclusive para
facilitar o gerenciamento e melhorar performance dos scripts contra esses
objetos.
O procedimento que estava
realizando, e ainda estou pois são muitas bases, era o seguinte:
1- Criação
das tablespaces “corretas”;
2- Realização
da movimentação das tabelas e índices das tablespaces “antigas” para as novas
através dos scripts abaixo:
a. ALTER TABLE OWNER.TBL_TABELA MOVE TABLESPACE TBS50MB;
b. ALTER INDEX IDX_TBL_01 REBUILD TABLESPACE TBS50MB;
3- Após
mover todos os objetos da tablespace, realizava o drop da tablespace antiga com
o comando:
a. DROP TABLESPACE TBSOLD INCLUDING CONTENTS AND DATAFILES;
4- Depois
de dropar a tablespace, acessava o servidor da base em questão e realizava a
exclusão física do datafile (pois às vezes não eram excluídos pelo comando
acima) e às vezes tinha que “derrubar” e iniciar a instância para conseguir excluir
o datafile. Fazia isso para liberar espaço em disco gasto desnecessariamente,
uma vez que os datafiles não seriam mais utilizados.
Basicamente foi isso que estava
fazendo (mas pode acreditar, não é tão simples quanto parece).
Foi então que em uma das
execuções, acabei interrompendo o trabalho para fazer alguma outra coisa, e
quando retornei para essa atividade, executei o descrito no passo 4 antes do
passo 3, ou seja, excluí o datafile antigo (e vazio) fisicamente antes de
dropar a tablespace. Resultado, quando tentei “levantar” a instância, não
consegui, pois quanto realizei o startup,
foi solicitado o datafile excluído acidentalmente.
Na hora que dei conta de que
tinha feito uma besteira, fui logo verificar como estava o backup, pois seria o
pior dos casos realizar o recovery da base. Obviamente comecei
essa tarefa de padronização das tablespaces pelas bases de teste e
desenvolvimento, o que me fez respirar mais tranquilo para manter a “estabilidade
emocional” (hehe).
Conversei com um colega também
DBA sobre o que tinha acontecido e começamos a ver as possibilidades de solução
que tínhamos para a situação. Procurei na internet sobre o assunto, foi então que
encontrei, em um blog, um artigo com a seguinte chamada: How Drop Tablespace and Recover Oracle Database When Accidentally
Delete Datafile.
Pessoal, isso foi um “achado”! (hehehe)
O autor expos uma situação muito
parecida com a que vivi e descrevi acima, e a solução que ele apresentou foi
mais ou menos a seguinte:
1- Conectar
no SQL*Plus como SYSDBA
a.
SQLPLUS /NOLOG
b.
CONNECT / AS SYSDBA
2- O banco de dados deve estar no estado mount para conseguirmos executar o comando,
então montemos o banco:
a.
STARTUP MOUNT;
3- Em
seguida, o comando que tornará o datafile off-line, e nos permitirá iniciar a
instância (abrir o banco):
a. ALTER DATABASE DATAFILE ' /opt/oracle/oradata/workspace/TBSOLD01.dbf' OFFLINE DROP;
4- Agora
vamos abrir o banco:
a.
ALTER DATABASE OPEN;
5- Agora
sim! Com a instância iniciada pude finalmente eliminar a tablespace do banco
com o comando:
a. DROP TABLESPACE TBSOLD INCLUDING CONTENTS AND DATAFILES;
É isso aí pessoal!
Realmente foi um susto o que ocorreu,
um problema que pode acontecer com qualquer um (ou não... hehehe), mas
felizmente foi tudo resolvido de forma tranquila.
Foi um ótimo aprendizado mas
espero que vocês não passem por isso, porém caso ocorra, já sabem com solucionar,
ok?!?!
Por hoje é só e até a próxima!
Referência:
MY DIGITAL LIFE - How Drop Tablespace and
Recover Oracle Database When Accidentally Delete Datafile. Disponível
em: http://www.mydigitallife.info/how-drop-tablespace-and-recover-oracle-database-when-accidentally-delete-datafile/.
Acessado em: 04/04/2013.
Muito obrigado, essa informação foi muito útil.
ResponderExcluir