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.
Nenhum comentário:
Postar um comentário