lunes, noviembre 23, 2009

Oracle: controla los database link


Hola, vuelvo a la carga, esta vez con algo light que vengo de entrenar y estoy bastante hecho polvo.

¿Habéis utilizado alguna vez un database link?

Empecemos diciendo que sirve para que una base de datos Oracle se pueda acceder a objetos (tablas, vistas, etc.) de otra base de datos Oracle.

Con eso ya os podéis hacer a la idea de todas las posibilidades que nos ofrece y también de los peligros.

¿Tenemos una base de datos en la DMZ para almacenar datos recogidos por nuestro servidor web? Pues una aplicación que trabaja en la red interna de nuestra organización podría acceder a los datos almacenados a través de un database link.

¿Por seguridad queremos replicar los datos de una tabla en una base de datos remota? Podemos preparar un job que se encargue de refrescar periodicamente la tabla remota.

Uno de los peligros que he visto con mis propios ojos es la confusión que se puede crear en el futuro respecto a la ubicación de los datos.

Cuando se crea un database link de esta forma:

Create database link LNK_ORIGEN_DESTINO connect to USUARIO identified by CONTRASEÑA USING 'instancia-destino';

Oracle sabe llegar a la 'instancia-destino' porque encontrará la entrada adecuada en el fichero de configuración tnsnames.ora

Al utilizarlo se indica que se está utilizando el DBLINK:

Select * from tabla@LNK_ORIGEN_DESTINO;

Ahora bien, el desarrollador por comodidad suele emplear un sinónimo que enmascara el uso del dblink. En proyectos heredados al final ocurre que un desarrollador piensa que los datos están en la base de datos origen, y pueden estar en el destino.


¿Cómo saber cuantos database links hay en nuestra base de datos?

Como todo en Oracle, también los DBLINKS se encuentran recogidos en el diccionario de datos. Hay 3 tablas fundamentales donde consultar:

  1. DBA_DB_LINKS. Nos permite conocer todos los dblinks de la base de datos.
  2. ALL_DB_LINKS. Información sobre los dblinks accesibles por el usuario con el que nos hemos conectado.
  3. USER_DB_LINKS. Dblinks cuyo propietario es el usuario con el que nos hemos conectado.

Como buenas prácticas creo que conviene tener un script que nos liste con un formato adecuado información sobre todos los dblinks. Sería algo así:

Nombre del fichero: ver-dblinks.sql

SET PAGESIZE 100

SET LINESIZE 300

COL OWNER FORMAT A11 HEADING "PROPIETARIO"

COL USERNAME FORMAT A28 HEADING "USUARIO"

COL DB_LINK FORMAT A30

COL HOST FORMAT A17

SELECT * FROM DBA_DB_LINKS

/

Para ejecutarlo, podemos entrar al sqlplus:

sqlplus "/as sysdba"

SQL>@ver-dblinks.sql

Para eliminar un database link hay que distinguir si es público o no:

drop database link dblink

drop public database link dblink

Para eliminarlo hay que hacerlo desde el usuario propietario.

Y eso es todo.

Saludos.

2 comentarios:

Félix Daniel dijo...

Hola, colega. Estoy tratando de buscar la forma de verificar el estado de un dblink antes de consultarlo, porque si la base de datos remota no está disponible, al hacer un SELECT a alguna de sus tablas, la aplicación se me cuelga. ¿Alguna sugerencia?

Luis Felipe Rios Diaz dijo...

SELECT 1 FROM DUAL@NOMBRE_DBLINK; Si la consulta funciona, el dblink está OK... Sino atrapa la excepción y cualquier error indica problemas con el dblink (Puede ser que la BD esté caida, que el usuario tenga algún inconveniente, etc.)