segunda-feira, 17 de outubro de 2011

Como remover um database link do banco de dados depois de alterar o parâmetro “global_name”


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:

Verificando o parâmetro “global_name”.

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.

Verificando a criação do db_link.

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


Removendo o DB_LINK.

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.

Verificando o parâmetro “global_name” alterado.

SQL> select * from global_name;

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$
set value$ = ''
where name ='GLOBAL_DB_NAME';

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