Nachdem mein letzter Blog-Beitrag „Database Links – Ein Überblick für den DBA „ sich mit einem Überblick über Database Links befasst hat, möchte ich mit diesem Artikel genauer auf die Prüfung von Database Links eingehen und ein hilfreiches Script zum Download anbieten.

Notwendigkeit und Problem der Überprüfung von Datenbanklinks
Bei Umgebungen mit einer hohen Anzahl von verteilten Anwendungen und verteilten Daten und der damit einhergehenden intensiven Nutzung von Database Links, ist es nicht ungewöhnlich, dass der eine oder andere Database Link nicht mehr funktioniert und/oder nicht mehr genutzt wird. Dies gilt insbesondere, wenn die Oracle Landschaft in der Vergangenheit Änderungen unterworfen war. Datenbanken wurden ggf. migriert oder konsolidiert, Passwörter wurden geändert oder Einträge in der tnsnames.ora haben sich geändert. So kann es also sein, dass in einer Datenbank Database Links vorhanden, diese jedoch nicht mehr funktionsfähig sind.
Wenn man Eigentümer oder der Database Link vom Typ Public ist, kann man den Datenbanklink z.B. wie folgt testen.
select sysdate from dual@orcl2;
Wenn man jedoch als DBA einen Database Link vom Typ Private testen möchte, so funktioniert dies trotzt der vorhandenen SYS-Privilegien nicht wie oben dargestellt. Die Nutzung eines Private Database Links ist nur dem Eigentümer, z.B. dem Schema User einer Anwendung, vorbehalten. Wenn dem DBA das Passwort des Eigentümers nicht bekannt ist und er sich somit nicht ad hoc zum Eigentümer machen kann, dann hat er keine Chance die Funktion mit der oben dargestellen Abfrage zu testen. Die gleiche Einschränkung gilt auch für das Erstellen oder Löschen einen Database Links in einem fremden Schema.
Scriptbasierte Prüfung
Nachfolgend möchte ich ein SQL-Script vorstellen, welches unter der Zuhilfenahme des Package DBMS_SYS_SQL die zuvor genannte Einschränkung umgeht. Das SQL-Script enthält eine PL/SQL Prozedur, die nicht nur Informationen über alle in einer Datenbank vorhandenen Database Links ausgibt, sondern diese auch testet! Allerdings funktioniert der Funktionstest nur bei Fixed-User Database Links. Bei Connected-User und Current-User Database Links kann man diese nur als Eigentümer testen. Das Script sollte bevorzugt als User SYS ausgeführt werden. Wenn dies nicht möglich ist, ist zumindest die DBA Rolle und die Execute-Berechtigung auf das Package SYS.DBMS_SYS_SQL erforderlich. Ein DBA, der das Script regelmäßig gegen seine Datenbanken ausführt, erkennt schnell, ob vorhandene Database Links noch funktionsfähig sind. Wenn ein nicht mehr funktionsfähiger Database Link weiterhin benötigt wird, sollte man versuchen die Ursache für den Fehler zu beheben. Stellt sich ein nicht funktionierender Database Link als überflüssig heraus, weil z.B. die Schnittstelle, die dieser genutzt hat, nicht mehr existiert, kann man ihn löschen.
Das Script check_dblinks.sql listet alle vorhandenen Database Links auf, prüft Fixed-User Database Links und gibt, wenn möglich, Informationen zu Zieldatenbank- und Server aus.
Das besondere an dem Script ist, dass es bei einem festgestellten Fehler auch die Fehlermeldung dazu ausgibt.
Folgende Fehlermeldungen werden unter Umständen als Zusatzinformationen ausgegeben:
ORA-12700: Cannot reach remote host - connect timeout ORA-12154: Connect identifier not resolvable. ORA-12541: Cannot reach listener at remote host ORA-12545: Connect failed because target host or object does not exist ORA-01017: Invalid username/password for remote user ORA-28000: Remote Account locked
Beispiel Ausgabe des Scripts check_dblinks.sql:
-----------------------------------------------------------------------------------------
ORACLE DATABASE LINKS ORCL1
-----------------------------------------------------------------------------------------
Database Link Name: OE_ORCL2
Database Link Type: PUBLIC
Database User Type: Fixed User
Remote User: OE
Connect Identifier: ORCL2 (tnsnames alias)
Connect Status: SUCCESSFUL
Remote DB Name: ORCL2
Remote Version: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
Remote Instance: orcl2
Remote Host: dbserver2.example.com
Remote Platform: Linux x86 64-bit
-----------------------------------------------------------------------------------------
Database Link Name: HR_ORCL2
Database Link Type: PRIVATE
Database Link Owner: HR
Database User Type: Connected User
Remote User: HR
Connect Status: UNKNOWN - Check not possible with user type Connected User
To verify the database link, login as remote user HR and do
"select * from dual@HR_ORCL2;".
-----------------------------------------------------------------------------------------
Database Link Name: MAT_ORCL5
Database Link Type: PUBLIC
Database User Type: Fixed User
Remote User: OE
Connect Identifier: //dbserver3:1521/orcl5
Connect Status: SUCCESSFUL
Remote DB Name: ORCL5
Remote Version: Oracle Database 12c Release 12.1.0.2.0 - 64bit Production
Remote Instance: orcl5
Remote Host: dbserver3.example.com
Remote Platform: Solaris[tm] OE (64-bit)
-----------------------------------------------------------------------------------------
Database Link Name: OEM_KAPDB
Database Link Type: PRIVATE
Database Link Owner: OEM
Database User Type: Connected User
Remote User: OEM
Connect Identifier: KAPDB (tnsnames alias)
Connect Status: FAILED
ORA-12154: Connect Identifier not resolvable
Probably no tnsnames.ora entry present for connect identifier KAPDB
-----------------------------------------------------------------------------------------
Database Link Name: PH_IRDB
Database Link Type: PRIVATE
Database Link Owner: PH
Database User Type: Fixed User
Remote User: SCOTT
Connect Identifier: IRDB (tnsnames alias)
Connect Status: FAILED
ORA-12545: Connect failed because target or host does not exist
-----------------------------------------------------------------------------------------
Database Link Name: APPL_KUBEDB
Database Link Type: PRIVATE
Database Link Owner: APPL
Database User Type: Fixed User
Remote User: CONV
Connect Identifier: KUBEDB (tnsnames alias)
Connect Status: FAILED
ORA-28000: Remote Account locked
-----------------------------------------------------------------------------------------
Database Link Name: MW_CONDB
Database Link Type: PRIVATE
Database User Type: Fixed User
Remote User: MW
Connect Identifier: CONDB (tnsnames alias)
Connect Status: SUCCESSFUL
Remote DB Name: CONDB
Remote Version: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit
Remote Instance: condb
Remote Host: dbserv1.example.com
Remote Platform: Microsoft Windows x86 64-bit
-----------------------------------------------------------------------------------------
Database Link Name: SH_SALESDB
Database Link Type: PRIVATE
Database Link Owner: SH
Database User Type: Connected User
Remote User: SH
Connect Identifier: SH_SALESDB (tnsnames alias)
Connect Status: FAILED
ORA-1017: Invalid username/password for remote user SH
-----------------------------------------------------------------------------------------
Database Link Name: SCOTT_PERSDB
Database Link Type: PRIVATE
Database Link Owner: SCOTT
Database User Type: Fixed User
Remote User: SCOTT
Connect Identifier: PERS (tnsnames alias)
Connect Status: SUCCESSFUL
Remote DB Name: PERSDB
Remote Version: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit
Connect Status: SUCCESSFUL
Remark: Not possible to get more information about remote database due to
missing credentials on remote dictionary for remote user SCOTT
Download Script check_dblinks.sql