Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 e navegador Mozilla Firefox


segunda-feira, 5 de maio de 2008

Cuidado ao manipular objetos do dicionário de dados do Oracle

Por Eduardo Legatti

Olá,

Recentemente um membro do Forum OTN da Oracle postou uma questão relacionada à tabela SYS.DUAL do dicionário de dados e perguntou se existe algum impacto para o banco de dados se a mesma for dropada. Bom, o que me chamou a atenção foi a resposta de um outro membro dizendo que não há impacto nenhum para o banco de dados se a mesma for dropada, e logo após, recriada. Isto é um grande erro porque por qualquer que seja o motivo, os objetos do dicionário de dados jamais deverão ser tocados (alterados com comandos DML/DDL), salvo por aconselhamento e supervisão direta do suporte técnico da Oracle, já que qualquer alteração inadequada nestes objetos poderão resultar em um problema sério no funcionamento do banco de dados ou até mesmo ocasionar um "crash" que impossibilite o "startup" do mesmo. Neste artigo irei mostrar o quanto é perigoso "brincar" com as tabelas de propriedade do usuário SYS, simulando a exclusão da tabela DUAL.
C:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sex Mai 2 14:17:07 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Conectado a:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

SYS@XE> desc dual;
Nome                            Nulo?    Tipo
------------------------------- -------- ----------------------------
DUMMY                                    VARCHAR2(1)

SYS@XE> drop table dual;

Tabela eliminada.

SYS@XE> shutdown
Banco de dados fechado.
Banco de dados desmontado.
Instância ORACLE desativada.

SYS@XE> startup
Instância ORACLE iniciada.

Total System Global Area  188743680 bytes
Fixed Size                  1286460 bytes
Variable Size              96472772 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes
Banco de dados montado.
ORA-01092: instância ORACLE finalizada. Desconexão forçada

-- Conteúdo do arquivo de log de alerta
Fri May 02 14:21:26 2008
Errors in file c:\oraclexe\app\oracle\admin\xe\udump\xe_ora_3348.trc:
ORA-01775: loop na cadeia de sinônimos

-- Conteúdo do arquivo de rastreamento
Dump file c:\oraclexe\app\oracle\admin\xe\udump\xe_ora_3348.trc
Fri May 02 14:21:25 2008
ORACLE V10.2.0.1.0 - Production vsnsta=0
The following information may aid in finding
the errors which cause the deadlock:
ORA-04020: detectado um conflito durante a tentativa de bloquear o objeto SYS.DUAL

SYS@XE> shutdown abort
ORA-24324: handle de serviços não inicializado
ORA-01041: erro interno: a extensão hostdef não existe
SYS@XE> exit
Desconectado de Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

Podemos perceber que após a exclusão da tabela SYS.DUAL, O banco de dados ficou impossibilitado de abrir gerando o erro ORA-01092. E agora, como resolver o problema? Bem, sabemos que as tabelas-base do dicionário de dados são criadas automaticamente quando o servidor Oracle executa o script sql.bsq durante a criação do banco de dados através do comando CREATE DATABASE, então será necessário capturar deste arquivo os comandos DDL para recriar tabela DUAL. A questão é como recriar a tabela DUAL se o banco de dados está incapacitado de ser aberto? A dica é setar o parâmetro replication_dependency_tracking no arquivo de inicialização da instância para FALSE.

-- Verificando o conteúdo do script sql.bsq
C:\oraclexe\app\oracle\product\10.2.0\server\RDBMS\ADMIN>findstr /c:"dual" sql.bsq
rem   ssamu      09/28/95 -  dual object number phase 2
rem   ssamu      09/20/95 -  dual object number - cleanup
rem   ssamu      09/18/95 -  dual object numbers
rem   ssamu      09/12/95 -  dual object numbers
create table dual                   /* pl/sql's standard pckg requires dual. */
(dummy varchar2(1))    /* note, the optimizer knows sys.dual is single row */
insert into dual values('X')
create public synonym dual for dual
grant select on dual to public with grant option

-- Alterando o parâmetro replication_dependency_tracking para FALSE
C:\>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sex Mai 2 14:32:07 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Conectado a uma instância inativa.

SYS@XE> startup nomount
Instância ORACLE iniciada.

Total System Global Area  188743680 bytes
Fixed Size                  1286460 bytes
Variable Size              96472772 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes

SYS@XE> alter system set replication_dependency_tracking = FALSE scope=spfile;

Sistema alterado.

SYS@XE> shutdown
ORA-01507: banco de dados não montado

Instância ORACLE desativada.

-- Executando o script para recriar a tabela SYS.DUAL
SYS@XE> startup
Instância ORACLE iniciada.

Total System Global Area  188743680 bytes
Fixed Size                  1286460 bytes
Variable Size              96472772 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes
Banco de dados montado.
Banco de dados aberto.

SYS@XE> create table dual
2    (dummy varchar2(1))
3    storage (initial 1)
4  /

Tabela criada.

SYS@XE> insert into dual values('X')
2  /

1 linha criada.

SYS@XE> create public synonym dual for dual
2  /
create public synonym dual for dual
               *
ERRO na linha 1:
ORA-00955: nome já está sendo usado por um objeto existente


SYS@XE> grant select on dual to public with grant option
2  /

Concessão bem-sucedida.

-- Alterando o parâmetro replication_dependency_tracking para o seu valor padrão
SYS@XE> alter system set replication_dependency_tracking = TRUE scope=spfile;

Sistema alterado.

SYS@XE> shutdown
Banco de dados fechado.
Banco de dados desmontado.
Instância ORACLE desativada.

-- Verificando se o problema foi resolvido
SYS@XE> startup
Instância ORACLE iniciada.

Total System Global Area  188743680 bytes
Fixed Size                  1286460 bytes
Variable Size              96472772 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes
Banco de dados montado.
Banco de dados aberto.

SYS@XE> select * from dual;

D
-
X


Em resumo, jamais pense em dropar qualquer objeto de propriedade do usuário SYS.

Google+

Nenhum comentário:

Postagens populares