Este artigo é para ajudar
quem possui bases de dados Oracle na versão 9i.
Na versão 9i, existe um problema que depois de alterar
o parâmetro “global_name” do banco, não será possível remover o DB_LINK do
banco de dados.
Em versões anteriores ao Oracle 9i o parâmetro
“global_name” não tinha o nome de domínio ligado a esse parâmetro. Essa
funcionalidade foi adicionada a partir da versão 9i.
Portanto, se o DBA alterar o parâmetro “global_name” e
depois tentar remover o DB_LINK do banco de dados será apresentada a mensagem
abaixo:
ORA-02024: database link not
found
Porém, se o DBA verificar no banco de dados ele irá
perceber que DB_LINK está presente na base de dados, conforme demonstrado
abaixo:
SQL> select * from global_name;
GLOBAL_NAME
---------------------------------------------------------
DB11GR2
Criando um db_link, chamado “l1”.
SQL>
create database link l1 connect to scott identified by tiger;
Database link created.
Database link created.
Verificando a criação do db_link.
SQL> select db_link from user_db_links;
DB_LINK
---------------------------------------------------------
L1
SQL> select db_link from user_db_links;
DB_LINK
---------------------------------------------------------
L1
Renomeando o parâmetro “global_name”.
SQL> alter database rename global_name to DB11GR2.WORLD;
Verificando o novo parâmetro “global_name”.
SQL>
select * from global_name;
GLOBAL_NAME
---------------------------------------------------------
DB11GR2.WORLD
GLOBAL_NAME
---------------------------------------------------------
DB11GR2.WORLD
Removendo o DB_LINK.
SQL> drop database link l1;
drop database link l1
*
ERROR at line 1:
ORA-02024: database link not found
SQL> drop database link l1;
drop database link l1
*
ERROR at line 1:
ORA-02024: database link not found
NOTA: Se o
parâmetro “global_name” for alterado novamente para o valor original, o mesmo erro ocorre, durante a remoção do DB_LINK.
SQL>
select * from global_name;
GLOBAL_NAME
---------------------------------------------------------
DB11GR2.WORLD
GLOBAL_NAME
---------------------------------------------------------
DB11GR2.WORLD
Voltando o “global_name”.
SQL> alter database rename global_name to DB11GR2;
Database altered.
Verificando o parâmetro “global_name” alterado
novamente.
SQL> select * from global_name;
GLOBAL_NAME
---------------------------------------------------------
DB11GR2.WORLD
Qual
a causa deste erro?
Inicialmente,
ocorre quando o banco de dados é criado sem domínio no nome global (parâmetro
global_name), o valor deste domínio será nulo ao invés de “.WORLD”.
Porém,
quando o parâmetro “global_name” foi alterado para conter o domínio
(DB11GR2.WORLD), mesmo voltando para o nome sem o domínio (DB11GR2), o domínio permanecerá.
Como solucionar?
A
opção para corrigir este é alterar o conteúdo da tabela PROPS$.
Para
aplicar esta solução deve-se seguir os passos abaixo:
1) Faça um backup consistente e completo do banco de
dados;
2) Execute os passos abaixo:
Realize a alteração na tabela
PROPS$, como demonstrado.
$sqlplus
/nolog
connect / as sysdba
SQL> update props$
connect / as sysdba
SQL> update props$
set value$ =
''
where
name ='GLOBAL_DB_NAME';
SQL>commit;
SQL>commit;
3)
Em seguida, deve-se conectar como o usuário “dono” do DB_LINK e removê-lo.
4)
Uma vez que o DB_LINK do banco de dados for removido, o parâmetro global_name
poderá ser alterado novamente para o nome desejado contendo parte de domínio,
deve-se usar o comando “ALTER DATABASE RENAME GLOBAL_NAME;”
Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com