Détection de l’utilisation des Dblinks sur ORACLE

Une demande récurrente de nos clients est de savoir si leurs Dblinks sont utilisés ou non.
En effet, sur une base vivante depuis de nombreuses années, l’historique de la création des Dblinks n’est pas toujours suivi et la suppression d’un Dblink est rarement envisagée par crainte d’effets de bord.

 

Utilisation des Dblinks à l’instant T :

Il existe une vue (v$dblink) qui permet de déterminer l’utilisation d’un Dblink à l’instant T.
Mais cette information ne nous permet pas de savoir strictement si le Dblink n’est jamais utilisé et si la suppression du Dblink n’impactera pas des objets de la base.
Elle ne donne en effet des informations que sur l’utilisation en cours d’un Dblink.

 

Interrogation de la table d’Audit :

Si l’audit est actif, il est possible de voir les connections entrantes qui ont utilisé un Dblink pour atteindre la base courante.
La requête suivante permet de voir certains détails intéressants (dont le timestamp, le nom du dblink, le serveur source) :

select userid, ntimestamp#, comment$text
from aud$
where comment$text like '%DBLINK%';

Cependant, ce n’est souvent pas l’information recherchée, puisqu’il s’agit bien des connections entrantes et non sortantes.
Il faudrait donc se connecter sur chacune des bases des Dblinks pour vérifier si le Dblink a été utilisé (à condition que l’audit soit bien actif sur toutes les bases concernées).

Ce qui nous intéresse ici est de déterminer quels sont les objets de la base courante qui sont dépendants d’un DBlink.

Il faut alors distinguer les objets de type PL/SQL des objets de type Vue ou Vue Matérialisée.

 

Détecter l’utilisation d’un Dblink dans les procédures stockées, fonctions et Packages :

Cette requête permet de lister les objets et les numéros de ligne où les Dblinks sont invoqués :

set pages 3000
set lines 300
column db_link format a50
select d.owner, d.db_link,s.TYPE, s.owner, s.name, s.line
from dba_source s, dba_db_links d
where s.TEXT like '%@'||d.db_link||'%'
order by 1,2,4,3,5,6;

 

Détecter l’utilisation d’un Dblink dans les vues et vues matérialisées :

Pour les objets de type Vue ou Vue Matérialisée, la recherche s’avère plus compliquée puisqu’il faut utiliser la génération de l’ordre DDL des objets pour retrouver la chaîne.

Le bloc PL/SQL suivant permet de retrouver l’ensemble des vues utilisant un Dblink. Cependant, il boucle sur l’ensemble des vues multiplié par le nombre de Dblink.
Sur une base présentant beaucoup de vues, il est alors intéressant de limiter la recherche à un seul schéma (en activant la clause WHERE ici commentée) :

Set server output on
BEGIN
FOR r IN
(SELECT DBMS_METADATA.GET_DDL
(object_type => 'VIEW', name => d.view_name, schema => d.owner)
AS view_text, view_name, d.owner, db_link
FROM dba_views d, dba_db_links
-- where d.owner='[SCHEMA]'
)
LOOP
IF INSTR (UPPER(r.view_text), '@'||r.db_link) > 0 THEN
DBMS_OUTPUT.PUT_LINE (r.owner||'.'||r.view_name||' --- @'||r.db_link);
END IF;
END LOOP;
END;
/

Le principe reste le même pour les vues matérialisées, avec quelques adaptations :

Set server output on
BEGIN
FOR r IN
(SELECT DBMS_METADATA.GET_DDL
(object_type => 'MATERIALIZED_VIEW', name => d.mview_name, schema => d.owner)
AS view_text, mview_name, d.owner, db_link
FROM dba_mviews d, dba_db_links
-- where d.owner='[SCHEMA]'
)
LOOP
IF INSTR (UPPER(r.view_text), '@'||r.db_link) > 0 THEN
DBMS_OUTPUT.PUT_LINE (r.owner||'.'||r.mview_name||' --- @'||r.db_link);
END IF;
END LOOP;
END;
/

Il faut aussi avoir en tête que certaines applications peuvent intégrer l’utilisation d’un Dblink directement dans les requêtes envoyées à la base (ce qui est en général déconseillé).
C’est alors le code de l’application qu’il faut analyser.

1 réflexion sur “Détection de l’utilisation des Dblinks sur ORACLE”

  1. Ping : Créer un Dblink vers une base d’une ancienne version - EASYTEAM

Les commentaires sont fermés.