Verifizierung von Oracle Database Links

By | 9. November 2017

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.

Oracle Database Link

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

 

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.