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