www.ordix.de ORDIX News Das IT-Magazin der ORDIX AG Ausgabe 2/2006 € 2,20 Der Oracle SQL Developer ist da! Vererbung mit Hibernate S. 18 IBM IDS 10.0 Neuheiten (Teil II) Abbildung von Objekthierarchien S. 42 Neuerungen im Bereich Backup & Recovery S. 37 ITIL – Eine Oase in der Servicewüste JavaServer Faces Teil II beschäftigt sich mit den taktischen bzw. planerischen Prozessen von ITIL S. 21 Einführung in die richtungsweisende Programmierung von Web-Oberflächen S. 8 Editorial Paderborn, Juni 2006 Mit Sicherheit Sicherheit Bisher habe ich es mir verkniffen, an dieser Stelle etwas zum Thema WM zu schreiben. Man tritt dabei ja zu schnell in Fettnäpfchen. Als ich aber von dem „Sicherheitstreffen“ zwischen Schäuble, Ballmer und Ricke las, konnte ich nicht anders. Hier meine ganz private Meinung zum Thema WM und Sicherheit ☺. Im Vorfeld möchte ich mitteilen, dass ich in meiner Jugend selbst gerne und viel Fußball gespielt habe, aber mit diesem Thema dann 1982 abgeschlossen habe. Nicht wegen des erbärmlichen Gekickes zwischen Deutschland und Österreich, auch der deutsch-österreichische Nicht-Angriffs-Pakt genannt. Nein, mir reichte schon der Vorläufer Deutschland gegen Algerien. Seitdem habe ich festgestellt, dass alle interessanten Szenen eines Fußballspiels problemlos in die 90-Sekunden-Berichte der Tagesschau passen. Und seither habe ich auch kein einziges Fußballspiel mehr in voller Länge angesehen. Die gesparte Zeit konnte ich durchaus nutzbringend verwenden – soviel als Nachtrag zum Thema „Sparen“ aus dem letzten Editorial. Jetzt zu den Sicherheitsweltmeistern Schäuble und Ballmer: Ballmer könnte mindestens genauso viel über Sicherheitslücken erzählen, wie der Trainer des 1. FC Köln nach dem Spiel gegen Bremen (0:6) über Lücken in der Abwehr. Beide, Ballmer und der Kölner Trainer Latour, weisen dies jedoch weit von sich. Und Schäuble ist derjenige Politiker, der noch nicht einmal mit Sicherheit sagen konnte, ob und wieviel Geld er in Koffern oder Umschlägen erhalten hat. Zumindest behaupteten andere, dass er das nicht sagen konnte. Damit die WM sicher wird (aha!), wollte Schäuble mal schnell das Grundgesetz ändern. Das geht Gott sei Dank nicht ganz so leicht, wie ein neues Sicherheitsloch bei Microsoft zu entdecken. Aber erstaunlich ist es schon, dass man für die ordnungsgemäße Durchführung von Fußballspielen neben mehreren Hundertschaften von Polizisten jetzt auch noch die Bundeswehr, deren ursprüngliche Aufgabe die Verteidigung der bundesdeutschen Grenzen war, benötigt. Das lässt zwei Schlüsse zu: Entweder die deutsche Verteidigung ist so löchrig oder die WM stellt einen Notstand dar. Ich hoffe nicht, dass der ausgerufen wird, wenn Horden von Hooligans mit den SICHERHEITskräften ihre Scharmützel austragen. Obwohl sie das leider mit ziemlicher Sicherheit tun werden (siehe Frankreich 1998). Hoffentlich bleibt die WM auch die einzige Auseinandersetzung mit dem Iran und die Amerikaner wollen keine späte Revanche für die Niederlage von 1998. Bei der WM würde das frühestens im Halbfinale passieren, was ich für sehr unwahrscheinlich halte. Allerdings hat mein absoluter Lieblingspolitiker, George W. Bush, jetzt ja eine neue Freundin, mit der er/man Hand in Hand gegen den Iran vorgehen will. – Wie immer bei den Amerikanern: Notfalls auch ohne die UN. Weltpolitik wird im Übrigen demnächst in Stralsund gemacht. Also Achtung: Die Gullideckel werden wieder festgeschweißt und Mülltonnen vorübergehend als gefährliches Gut beschlagnahmt. Wir wissen ja schon aus dem Editorial 1/2005: Georgie ist sehr auf Sicherheit bedacht. Bei uns gibt es natürlich auch was zum Thema Sicherheit zu lesen: Neue Backup und Recovery Features bei Informix und höhere Sicherheit (Verfügbarkeit) durch RMAN (Convert Database). Den Bezug zu JavaServer Faces (JSF) bekomme ich nur darüber hin, dass JSF mit Sicherheit eines der kommenden Themen in Bezug auf neue Java Technologien ist ☺. Interessant, auch wenn sie weniger mit Sicherheit zu tun haben, sind ebenfalls die Themen Hibernate (wir erläutern ein weiteres Feature bezüglich Vererbung), die Fortsetzung der ITIL-Artikelreihe und einige Neuigkeiten rund um Oracle (Behandlung von Large Objects, SQL Developer, Web-Services im Zusammenspiel mit PL/SQL). Ich wünsche Ihnen eine entspannte WM-Zeit. Hoffentlich tappen Sie in keine Sicherheitskontrolle. Und wenn Sie Karteninhaber sind, sind Sie ja auch schon sicherheitsüberprüft. Wolfgang Kögler PS: Letzte Verbindung zu einem Editorial (3/2003): In Paderborn Elsen fiel am 12.5. der Strom für etwa eine halbe Stunde aus. Also Sorry USA! – Oder war das ein gezielter Anschlag der Familienministerin, der sogenannte von der Leyensche Blackout, um endlich einen Baby-Boom zu erzeugen? ORDIX News 2/2006 Inhaltsverzeichnis Standards Training 02 ....Editorial 03 ....Inhalt 41 ....Impressum 24 ....Seminarübersicht: Juni bis Dezember 2006 Aktuell Java/XML Titel- 21 ....Larry Ratlos: System Monitoring 29 ....Chess Classic 2006: Hol dir den Titel! Gewinnen Sie eine Teilnahme am weltgrößten Schnellschachturnier und mehr. 44 ....Rätsel zum Relaunch von www.ordix.de thema 08 ....JavaServer Faces Einführung in die Grundlagen der JavaServer Faces, die als die kommende Alternative für die Programmierung von WebOberflächen bezeichnet werden. Titel- thema 42 ....Vererbung mit Hibernate Hibernate ist ein Framework zur Speicherung von Daten. Wir beschäftigen uns mit der Abbildung von Objekthierarchien (Stichwort Vererbung) in einer relationalen Datenbank mit Hilfe von Hibernate. Datenbanken 04 ....Information Sharing mit Oracle Streams Die Verwendung von Daten in einer verteilten Oracle-Umgebung wurde bisher meist mit Hilfe der Replikation durchgeführt. Ein mächtigeres Werkzeug ist Oracle Streams. Insbesondere mit der Version 10g wurde die Handhabung erleichtert. 34 ....PL/SQL Web-Services (Teil II) Vorstellung mehrerer Alternativen, wie mit PL/SQL Web-Services aufgerufen werden können. Zur Verdeutlichung zeigen wir entsprechende Beispiele. 14 ....LOB - Oracle Large Object Die Verwendung von Large Objects in Anwendungen nimmt stetig zu. Wir stellen die Oracle LOB und einzelne Funktionen des Pakets DBMS_LOB vor. 37 ....IBM Informix Dynamic Server 10.0 Neuheiten (Teil II): thema Das Administrieren wird einfacher für den Informix DBA Dieser Artikel beschreibt Neuerungen für den IDS im Bereich Backup & Recovery. Verwendung und Umgang mit den neuen Features werden anhand von Beispielen erklärt. Titela 18 ....Der Oracle SQL Developer ist da! them Erste Erfahrungen beim Einsatz des neuen SQL Developers in der Entwicklung. Unix/Linux/Open Source 30 ....100 % MySQL – Wie richte ich ein Cluster ein? Beschreibung der Möglichkeiten des Clustering unter MySQL und die exemplarische Installation und Konfiguration eines MySQL-Clusters. ORDIX News 2/2006 26 ....Neues bei Oracle 10gR2 (Teil III): RMAN Convert Database Überblick über die RMAN-Funktionalität, eine Datenbank von einer Plattform auf eine andere zu konvertieren. Titel- 45 ....Oracle unter Mac OS X Der Artikel zeigt die Installation von Oracle 10g Release 1 auf Mac OS X. Projektmanagement Titel- 22 ....ITIL – Eine Oase in der Servicewüste (Teil II) thema In der letzten Ausgabe behandelten wir den Themenkomplex „Service-Support“. In diesem Teil beschäftigen wir uns mit den taktischen Prozessen von ITIL. 40 ....Projektmanagement Coaching: Lernen ohne zu scheitern! Projektmanagement (PM) ist eine Kompetenz, die auf Erfahrung beruht. Damit der Lernprozess nicht durch gescheiterte Projekte zu teuer wird, empfiehlt es sich, PM-Coaching als Instrument einzusetzen. 3 Unix/Linux/Open Source – Titelthema MySQL 5 Datenbanken Information Sharing mit Oracle Streams Das neue Verfahren des Information Sharing beruht auf Advanced Queuing und ermöglicht die Weitergabe von Informationen, Transaktionsdaten und Events innerhalb eines einzigen Datenstroms. Mit der Version Oracle 10g wurden die Funktionalitäten von Oracle Streams erweitert und damit vereinfacht. Der Artikel richtet sich an Datenbankentwickler und -administratoren, die Daten aus verschiedenen Datenbanken nutzen bzw. den Zugriff verwalten müssen. Datenbanksysteme sind darauf ausgelegt, Informationen für andere Datenbanken und Anwendungen zugänglich zu machen. Ora­ cle bietet ab Oracle9i Version 2 ein neues Verfahren des Information Sharing an: Oracle Streams. Datenweitergabe innerhalb eines Datenstroms Oracle Streams ermöglicht die Weitergabe von Informationen, Transaktionsdaten und Events innerhalb eines einzigen Datenstroms. Dieser Datenstrom kann in der gleichen Datenbank genutzt werden oder von einer Datenbank an andere Datenbanken weitergeleitet werden. Streams werden beispielsweise zur Replikation von Daten, zum Message Queuing und Message Management, zum Laden von aufbereiteten Daten in ein Data Warehouse, zum Versenden von datenbankinternen Informationen an Datenbankadministratoren und zur Datensicherung im Bereich von Hochverfügbarkeitslösungen eingesetzt. Das Konzept von Oracle Streams beruht auf Advanced Queuing (AQ). In der Version 10g wurden die Funktionalitäten von Oracle Streams erweitert und damit vereinfacht. Mit der Version 10g und dem damit beabsichtigten Grid Computing bekommt Oracle eine noch größere Bedeutung. Streams sind in der Enterprise Edition enthalten. DB C DB B Datenfluss DB A Datenfluss DML + DDL Datenfluss DML + DDL Abb. 1: Beispiel einer Architektur zur Nutzung von Oracle Streams. Capture Staging Abb. 2: Die Prozesse von Oracle Streams. Consumption Abbildung 1 zeigt das Beispiel einer Architektur zur Nutzung von Oracle Streams. Komponenten von Oracle Streams Die drei grundlegenden Komponenten für Ora­ cle Streams sind Capture, Staging und Consumption (Apply), siehe Abbildung 2. Die Anwendungen stellen mittels dieser Elemente Informationen in einen Stream. Es kann sich dabei um beliebige Informationen handeln, die durch den Aufruf mitgelieferter Prozeduren lediglich in ein vorgegebenes Format gebracht werden. Automatisierung über den LogMiner-Mechanismus Handelt es sich um Informationen, die durch DML-Befehle (Änderung des Datenbestands) oder DDL-Befehle (Änderung der Datenstruktur) entstehen, ist dieser Vorgang sogar nahezu vollständig automatisiert. Er erfolgt per Zugriff auf die Redo Log Dateien (Protokolldateien der Datenbank) durch den LogMinerMechanismus, ohne die Datenbank dabei zu belasten. Der Fluss sämtlicher Daten von Anwendung zu Anwendung und von Knoten zu Knoten ist dann vollständig zu steuern. Selbstverständlich können die Daten des Informationsflusses an jeder Stelle bearbeitet oder transformiert werden. Ebenfalls ist jederzeit kontrollierbar, wer Zugriff auf die Informationen hat und wann die Daten des Datenstroms schließlich gelöscht werden. Der Capture-Prozess (siehe Abbildung 3) kann eine ganze Datenbank, ein Schema sowie eine oder mehrere Tabellen betreffen. Die erfassten Events werden in die Queue/Staging Area geschrieben. Das log-basierte Change Capture erzeugt nur geringen Overhead. Zwischengespeichert werden die Daten in der System Global Area (SGA). Seit Version 10 gibt es einen Bereich ORDIX News 2/2006 Datenbanken Capture Process LCRs Capture Changes Redo Log Log Changes Queue ---------------------------LCR LCR User Message User Message LCR User Message LCR LCR . . . Database Objects Source Queue ---------------------------LCR User Message LCR LCR LCR User Message . . . Propagate Events Destination Queue ---------------------------User Message LCR User Message LCR LCR . . . Abb. 4: Propagation. LCRs or Messages Queue Apply ----------------------Process LCR LCR Apply Messages Row User Message Changes LCRs User Message LCR Message DML User Message Handler Handler LCR Procedure Procedure LCR DDR . LCRs . . DDL Handler Database Objects Procedure User Changes Abb. 3: Capture-Prozess. der SGA für Streams. Dieser wird durch den init.ora Parameter streams_pool_size konfiguriert. Messages or LCRs Precommit Handler Procedure Abb. 5: Apply. Staging Area Die Staging Area ist als Queue implementiert. Staging basiert auf einem Datenbank-Job. Die Daten werden in Logical Change Records (LCR) in den Datentyp SYS.Anydata gepackt. Verarbeitet werden alle gültigen LCRs, falls sie nicht durch ein Ruleset (siehe „Transformation und Regeln“) ausgefiltert werden und sie nicht schon verarbeitet wurden. Erkennbar ist dies durch ein Tag im LCR. Dabei werden alle SQL-Befehle in der richtigen Reihenfolge verarbeitet. DML-Handler können die eigentliche Verarbeitung übernehmen. LCRs können vor der Verarbeitung oder Weiterleitung verändert werden (Transformation). Eventuell werden LCRs auch nur weitergeleitet. Ein Propagate-Prozess verarbeitet die vom Capture-Prozess eingestellten Events und die über AQ/Streams eingestellten Meldungen. Mit DB-Jobs wird der Inhalt der Queue der Quelldatenbank in die Queue der Zieldatenbank übertragen (siehe Abbildung 4). Die Steuerung der Daten erfolgt über ein Regelwerk oder PL/SQL-Handler. Andere Staging Areas können Events anfordern. Events können über mehrere Staging Areas geroutet werden: ORDIX News 2/2006 • Alle Events, LCRs und benutzerdefinierte Messages können in eine Queue übertragen werden. • Events bleiben so lange in der Staging Queue, bis sie durch alle interessierten Prozesse und Applikationen konsumiert sind. • Queues können angelegt, verändert, gestartet, gestoppt und gelöscht werden. • Falls ein Event einen Konflikt erzeugt, so kommt es zu einer • • Konfliktlösung oder der Event wird alternativ in eine Excep­tion Queue gestellt. Die Staging Area benötigt Speicherplatz in der SGA im Streams Pool. Queues werden in DB-Tabellen gespeichert. Ein Apply Prozess verarbeitet alles, was die Propagate-Prozesse in seine Queue einstellen. Z. B. ein Ausführen der Aktion (DDL oder DML) in oder an einer lokalen Oracle Tabelle oder das Ausführen der Aktion über einen DB-Link. Apply-Prozesse können pa­ rallel arbeiten. Dazu dienen die verschiedenen Handler (siehe Abbildung 5). Konflikte können erkannt werden und werden in spe­ ziellen (Exception-)Queues gehalten. Transformation und Regeln Mit Oracle Streams können Transformationen (siehe Abbildung 6) und Evaluierungen von Regeln vorgenommen werden. Das gilt für Einträge, • die in die Queue gemacht werden • die aus der Queue ausgelesen werden • die von Queue zu Queue propagiert werden Dazu gehören ebenfalls Änderungen des Spaltentyps, der Formatierung oder der Tabellen- oder Spaltennamen. Datenbanken Dequeue Events Queue ----------------------____________ ____________ ____________ ____________ ____________ ____________ Transformation During Dequeue Continue Dequeue of Transformed Events Send Transformed Events to Apply Handlers Apply Process Apply Handlers Apply Transformed Events Directly Vorteile von Streams Database Objects Abb. 6: Transformation beim Apply. Non-Oracle Database Non-Oracle Database Oracle Database Queue ----------------_________ _________ _________ _________ Dequeue Events Heterogenous Services Apply Changes Apply Process Database Objects Oracle Transparent Gateway Abb. 7: Heterogene Systeme. dba_propagation Informationen über Propagation (Quell- und Ziel-Queues, Regelsets, DB-Link, ...) dba_apply Informationen zu Apply (Queue, Regel­sets, Handler, Status, ...) dba_capture Informationen zu Capture (Queue, Regelsets, SCN, Source-DB, ...) V$streams_capture Statistische Informa­tionen über Capture V$streams_apply_reader Statistische Informa­tionen über Apply Abb. 8: Views im Data Dictionary. Als Regel wird ein Datenbank-Objekt bezeichnet, das für einen Client entscheidet, ob ein Event eine Aktion auslöst. Diese Regel muss formal stets in einem Regelset enthalten sein und besteht aus einer Bedingung, die wiederum über eine Rule Engine ausgewertet wird. Eine Bedingung kombiniert einen oder mehrere Ausdrücke und Operatoren. Sie gibt als Bool’schen Wert True, False oder Null zurück. Der Client ruft das Package dbms_rule auf. Die Administration der Regeln erfolgt über das Package dbms_rule_adm. Automatische Konflikterkennung Es erfolgt eine automatische Konflikterkennung mit wählbaren Routinen zur Konfliktlösung. Dazu kann der niedrigste oder der höchste Wert, der älteste oder der jüngste Wert oder auch ein neuer Wert als endgültiger Wert festgelegt werden. Zur Konfliktlösung wird der aktuelle Wert am Bestimmungsort mit dem alten Wert der veränderten Zeile am Quellort verglichen. Sind beide Werte identisch, so werden die neuen Werte übernommen. Sind sie es nicht, dann wird die Konfliktlösungsroutine aufgerufen. Ist der Konflikt nicht lösbar, kommt der LCR in die Exception Queue. Durch den Einsatz von Streams kann eine Replikation einfach in beide Richtungen definiert werden. Es gibt vordefinierte Konfliktlösungsroutinen für Updates (Minimum, Maximum, Over­ write, Discard). Mit Streams kann auch in Nicht-Oracle-Datenbanken repliziert werden (siehe Abbildung 7). Der umgekehrte und viel wichtigere Weg, aus Nicht-Oracle-Datenbanken in Oracle-Datenbanken zu replizieren, funktioniert auch. Verwaltung von Streams Streams können über den Oracle Enterprise Manager überwacht und administriert werden. Man kann allerdings auch mit SQL die in Abbildung 8 erläuterten Views aus dem Data Dictionary ab­fragen. Des Weiteren gibt es eine Reihe von Hintergrundprozessen für die Verarbeitung der folgenden Events: • • • • a0xx => apply q0xx => Datenbank_Jobs p0xx => propagation cjqxx => capture Voraussetzungen für Streams Die in Abbildung 9 vorgestellten init.oraParameter sind für den Einsatz von Streams von Bedeutung. Weitergehende Erläuterungen können gegebenenfalls der Literatur entnommen werden. Eine weitere Voraussetzung ist die Einstellung des „Supplemental Logging“ auf Datenbankoder Tabellen-Ebene. Dies sorgt für die Übermittlung eines Identifikationsschlüssels und für weitere zusätzliche Spalteninformationen. Grundsätzlich sollten alle Tabellen über einen Primary Key verfügen. Über den Streams Administrator werden administrative Aufgaben durchgeführt. Dieser muss auf allen betroffenen Datenbanken angelegt sein. Zur Verwaltung von Streams müssen ihm mit dem Package DBMS_STREAMS_ AUTH Rechte zugewiesen werden. ORDIX News 2/2006 Datenbanken AQ_TM_PROCESSES >= 1 Compatible >= 9.2.0 Erlaubt das Monitoring von Queue Messages. Besser ist mindestens 10.1.0, um die 10g Funktionalitäten nutzen zu können. Job_queue_processes >= 2 Die Staging Queues werden über Jobs gefüllt. Open_links Wird für die Verbindungen zwischen den Datenbanken benötigt. Logmnr_max_persistent_sessions Wird für das Auslesen der Redologs benötigt. (>= Anzahl der Capture-Prozesse) Parallel_max_servers ++2 Spezifiziert die maximale Anzahl paralleler Prozesse. Processes Es ist zu beachten, dass für Capture, Propagation und Apply verschiedene Prozesse notwendig sind. Shared_pool_size +10 % pro Stream mindestens plus 10 MB Streams_pool_size Neu in 10g. Für den Speicherbereich in der SGA zum Zwischenspeichern der Events, mindestens mit 100 MB. Global_names = TRUE Ganz wichtig (!!!), da die Datenströme sich in der Regel zwischen verschiedenen Datenbanken bewegen sollen. Abb. 9: Wichtige init.ora-Parameter für den Einsatz von Streams. Die Quelldatenbanken müssen im ArchivelogModus arbeiten, damit der LogMiner an die komplette Redo Log-Information herankommt. Zwischen den Datenbanken müssen Verbindungen durch Datenbank-Links hergestellt wer­ den. Zum Speichern der Events müssen AQ Queues erstellt werden. Dazu dienen das Package DBMS_STREAMS_ADM und die darin enthaltene Prozedur SET_UP_QUEUE. Die Data Dictionary Information von der Quelldatenbankseite muss zur Zieldatenbank übertragen werden. Dazu dient die Prozedur DBMS_CAPTURE_ADM. PREPARE_SCHEMA_INSTANTIATION. Einrichtung von Streams Die Einrichtung von Streams muss in der richtigen Reihenfolge erfolgen, da sonst ein EventStau entstehen könnte. Es empfiehlt sich folgende Vorgehensweise: 1. Quell- und Zieldatenbank konfigurieren. Dazu gehören init-Parameter, das Einrichten von Tablespaces, das Einrichten spezieller User DBMS_STREAM_ADM, Secure Queue User, Capture- oder ApplyUser und das Einrichten von DB-Links. 2. Capture-Prozess aufsetzen (nicht starten). 3. Propagation-Prozess aufsetzen (nicht starten). 4. Apply-Prozess aufsetzen und starten. 5. Propagate-Prozess starten. 6. Capture-Prozess starten. Das Löschen erfolgt in umgekehrter Reihenfolge. ORDIX News 2/2006 Glossar AQ DDL DML Advanced Queuing LCR Replikation Logical Change Record Redo Log Data Definition Language Data Manipulation Language Datenverteilung in verschiedene Datenbanken Protokolldateien in der Oracle-Datenbank, die durch den Logwriter geschrieben werden. Event Ereignis. Hier DDL- oder DML-Änderung oder Meldung. SGA System Global Area Supplemental Logging Erweiterte Protokollierung in den Redo LogDateien. SYS.ANYDATA Datentyp in Oracle, der einen beliebigen Typ aufnehmen kann. PL/SQL Prozedurale Erweiterung von SQL Queue Speicherstruktur nach dem FIFO-Prinzip (First in First out) DB-Link Datenbank-Link. Verbindung zwischen zwei Datenbanken. Logminer Package mit dem die Redolog-Dateien ausgewertet werden, um die UNDO- und DO-Information zu erhalten. Kennzeichen im Datensatz. Tag Fazit Für den Administrator bedeutet das Aufsetzen von Oracle Streams in einer verteilten Umgebung nach wie vor einen erheblichen Aufwand. Da verteilte Umgebungen in der Praxis jedoch zunehmend an Bedeutung gewinnen und auch die Notwendigkeit des Informationsaustauschs mehr denn je besteht, wird auch der Einsatz von Oracle Streams zunehmend bedeutender. Beate Künneke ([email protected]). Java/XML – Titelthema JavaServer Faces Der zukünftige Web-Standard für die Entwicklung von Benutzeroberflächen JavaServer Faces Aus dem Struts-Lager lassen sich eindeutige Stimmen vernehmen, dass die Zukunft der Web-Benutzeroberflächen den JavaServer Faces (JSF) gehört. Da Struts nicht mehr aktiv weiterentwickelt wird und die JSF-Spezifikation demnächst in eine weitere Runde geht (JSF 1.2), lohnt sich ein genauerer Blick auf die Technologie. Der Artikel richtet sich an Entwickler mit Erfahrungen im Bereich Web-Anwendungen, Benutzeroberflächen und jene, die eine Alternative bzw. Ergänzung zum Struts Framework suchen. Spezifikation eines Standards Die JavaServer Faces basieren auf dem JSR-127 (Java Specification Request), der im Mai 2001 dem Java Community Process hinzugefügt wurde. Ziel war die Erstellung einer Spezifikation und die Entwicklung einer Referenzimplementierung für ein Benutzerschnittstellen-Framework, das die Entwicklung von Web-Applikationen vereinfachen sollte. Großen Wert legte man dabei schon früh auf eine Etablierung als Standard, der mit einer breiten Tool-Unterstützung einher gehen sollte. Folgerichtig setzte sich die beratende Expertengruppe aus namhaften Mitgliedern der J2EE- und Toolhersteller-Szene zusammen. Darunter befanden sich u. a. BEA, Oracle, Sun, Borland und Macromedia sowie Craig McClanahan, der Initiator des bis dato wohl populärsten Frameworks für Web-Applikationen: Struts. Erst im Jahr 2004 war man so weit, den Standard in der Version 1.0 zu verabschieden und eine erste Referenzimplementierung zur Verfügung zu stellen. Diese Referenzimplementierung von Sun ist heute, neben der MyFaces-Implementierung des Apache-Projekts, die meist verwendete. Beide Implementierungen entsprechen der heute aktuellen JSF 1.1 Spezifikation. Beispielapplikation Um die Features sowie die Vorgehensweise beim Entwickeln einer JSF-Anwendung besser darstellen zu können, dient ein kleiner Login-Dialog. An diesem Beispiel (siehe Abbildung 1) sollen die wichtigsten Elemente von JavaServer Faces demonstriert werden: ► ► ► ► ► ► ► ner Sammlung von HTML/JSP-Seiten, Java-Archiven und Deployment-Deskriptoren in Form von XML-Dateien zu tun hat. Die Installation von Tomcat, der unter Windows-Betriebssystemen für Entwicklungszwecke nicht als Dienst betrieben werden sollte, hat keine Besonderheiten. Das gleiche gilt für Eclipse. Mit dem Eclipse Wizard wird anschließend ein neues Dynamic Web Project angelegt. Was jetzt noch fehlt, sind die JSF-Bibliotheken myfaces-api. jar und myfaces-impl.jar aus dem MyFaces-Paket. Die MyFaces-Implementierung benötigt zusätzlich noch einige Bibliotheken (siehe Abbildung 2) aus dem Apache Commons Projekt. Die genannten JAR-Dateien werden unterhalb von WEB-INF in ein lib-Verzeichnis kopiert und in den Build-Pfad des Projektes übernommen. Die Struktur des fertigen Projektes wird später wie in Abbildung 2 aussehen. Konfiguration Um eine JSF-Applikation im Tomcat-Webcontainer ausführen zu können, müssen im De­ ployment-Deskriptor web.xml der Anwendung zwingend weitere Einträge gemacht werden (siehe Abbildung 3). die JSF Tag-Bibliotheken das Datenmodell die Validierung die Konvertierung das Event-Handling die Navigation die Lokalisierung Bei der Erstellung der Anwendung kommt der Tomcat-Servletcontainer, die JSF-Implementierung MyFaces und Eclipse inklusive der Webtools als Entwicklungsumgebung zum Einsatz. Voraussetzungen Jede JSF-Anwendung ist zunächst einmal eine ganz normale WebAnwendung. Das bedeutet, dass man es im Wesentlichen mit ei- Abb. 1: Beispielanwendung eines Login-Dialogs. ORDIX News 2/2006 Java/XML <servlet> <servlet-name> JavaServer Faces Servlet </servlet-name> <servlet-class> org.apache.myfaces.webapp.MyFacesServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name> JavaServer Faces Servlet </servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> Abb. 3: Einbindung von JavaServer Faces im Deployment-Descriptor (web.xml). dies die html_basic Library, die Tags für die Darstellung der bekannten HTML-Elemente enthält. Zum anderen werden Tags benötigt, die Elemente beschreiben, die unabhängig von der jeweiligen Darstellungssprache (HTML, WML, ...) sind. Dazu zählen Tags, die einen Komponentenbaum definieren oder einer Komponente einen ActionListener zuordnen. Diese Tags befinden sich in der jsf_core Library. Abb. 2: Projektstruktur. Dies sorgt dafür, dass das zentrale JSF-FrontController Servlet registriert wird und alle Requests der Form /faces/* an dieses weitergeleitet werden. Es können hier noch eine Vielzahl anderer JSF-Konfigurationselemente eingetragen werden, die im Einzelfall der Dokumentation der Implementierung entnommen werden können. Model-View-Controller Paradigma Im Bereich der Benutzeroberflächen-Frameworks hat sich, unabhängig davon, ob es sich um Desktop- oder Web-Applikationen handelt, die Umsetzung des MVC-Paradigmas bewährt. Das bedeutet, dass auch bei den Java Server Faces auf die strikte Trennung der Daten von deren Darstellung geachtet wird. Während die JSP-Seiten die Darstellung (View) übernehmen, werden die Daten (Model) in so genannten Managed Beans gehalten. Genauso wie bei Struts übernimmt ein zentrales Servlet (FacesServlet) nach dem Front Controller Pattern die Rolle des Controllers, der die beiden anderen Teile koordiniert und die Verbindung zur Geschäftslogik herstellt. JavaServer Faces Tag Libraries Standardmäßig sind die JavaServer Faces mit zwei Tag Libraries ausgestattet. Zum einen ist ORDIX News 2/2006 Damit diese Tags in einer JSP-Seite verwendet werden können, müssen die Libraries an deren Anfang mittels einer Direktive wie folgt eingebunden werden: <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> Damit ist klar, dass alle Tags, die mit <h: beginnen zur html_ basic Library gehören, während alle Tags mit <f: Teil der jsf_ core Library sind. Der Login-Dialog stellt sich mit der Kenntnis über die Tag-Libra­ries dann wie in Abbildung 4 gezeigt dar. Das <f:view> Tag umschließt alle Elemente, die Teil des Komponentenbaums der View werden. Die <h:-Elemente beschreiben die einzelnen Komponenten. Die JavaServer Faces verfügen über eine sehr flexible Expression Languange, mit deren Hilfe auf verschiedene andere Daten zugegriffen werden kann. So wird mittels value="#{messages.username}" auf einen Text verwiesen, der unter dem Schlüssel username in einer Resource-Datei registriert ist. Managed Beans als Datenmodell Als Datenmodell werden bei den JavaServer Faces einfache JavaBeans verwendet. Eine solche Bean muss jedoch zuvor in einer Konfigurationsdatei (normalerweise faces-config.xml) bekannt gemacht werden. Im Beispiel (siehe Abbildung 5) wird die Bean loginBean verwendet. Damit ist die Bean der Klasse test.LoginBean unter dem Namen loginBean aus der JSP-Loginseite zugreifbar. Die JSF-Implementierung kümmert sich um die Instanziierung genauso wie um die Java/XML ... <f:loadBundle basename="test.resources" var="messages" /> <f:view> ... <h:commandLink id="de" action="#{loginBean.dummy}" actionListener="#{loginBean.switchLanguage}"> <h:outputText value="#{messages.german}" /> </h:commandLink> <h:commandLink id="en" action="#{loginBean.dummy}" actionListener="#{loginBean.switchLanguage}"> <h:outputText value="#{messages.english}" /> </h:commandLink> ... <h:form> <h:outputText value="#{messages.title}" /> ... <h:outputText value="#{messages.username}" /> <h:inputText id="username" value="#{loginBean.username}" required="true" /> ... <h:outputText value="#{messages.password}" /> <h:inputSecret id="password" value="#{loginBean.password}" /> ... <h:outputText value="#{messages.code}" /> <h:inputText id="int" value="#{loginBean.code}" required="true"> <f:validateLongRange minimum="1000" maximum="9999" /> </h:inputText> ... <h:commandButton action="#{loginBean.login}" value="Login" /> ... <h:messages layout="table" showDetail="true" style="color: red;" /> </h:form> </f:view> ... Abb. 4: Die Hauptelemente der View. <managed-bean> <description> A simple bean for managing the login </description> <managed-bean-name>loginBean</managed-bean-name> <managed-bean-class>test.LoginBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> Abb. 5: Registrierung der LoginBean als Managed Bean. Zugriffe und die Speicherung der Bean im richtigen Scope. Ähnlich wie Struts, kennen auch die JavaServer Faces die Scopes Application, Request und Session. Hinzu kommt der Scope none, der eine Sonderposition einnimmt. Hier wird die Bean also in der Session abgelegt und ist so auf anderen Seiten der Applikation weiter verfügbar. Im Beispiel bewirkt das Tag <h:inputText id="username" value="#{loginBean.username}" required="true" />, dass der über die Form im Feld Benutzername eingegebene Text im Attribut username der Bean loginBean gespeichert wird. Eine Managed Bean kann jedoch nicht nur Daten aufnehmen. Wie das Beispiel in Abbildung 5 zeigt, kann auch die Ausführung von Methoden erreicht werden. Das Tag <h:commandButton action="#{loginBean.login}" value="Login" /> bewirkt, dass beim Drücken des Login-Buttons der Form die Methode login der Bean loginBean aufgerufen wird. Damit stellen die Managed Beans ebenfalls eine Schnittstelle zur Geschäftslogik zur Verfügung. 10 Validierung Die JSF-Implementierung enthält auch ein umfangreiches Instrumentarium zur Validierung von Eingaben, die bei Bedarf durch eigene Methoden ergänzt werden können. Das Beispiel zeigt die Validierung anhand eines Feldes, das einen Code aufnehmen kann, der aus einer Zahl zwischen 1000 und 9999 bestehen darf (siehe Abbildung 6). Das required Attribut verhindert, dass das Ein­ gabefeld leer gelassen werden kann, während das folgende <f:validateLongRange>-Tag den Wertebereich bestimmt. Konvertierung An dem gezeigten Fall der Validierung lässt sich auch ein weiteres Feature der JavaServer Faces verdeutlichen. Das Attribut des Codes ist in der Bean als Integer deklariert (siehe Abbildung 7). Die JSF-Implementierung ist in der Lage, un­ terschiedliche Datentypen zu konvertieren. Selbst für benutzerdefinierte Datentypen, lassen sich solche Konverter nachträglich entwickeln und einbinden. Wie auch für die Validierung werden bei der Konvertierung im Falle von Fehlern Mechanismen in Gang gesetzt, die entsprechende Fehlermeldungen generieren und anzeigen. ORDIX News 2/2006 Java/XML <h:inputText id="int" value="#{loginBean.code}" required="true"> <f:validateLongRange minimum="1000" maximum="9999" /> </h:inputText> Abb. 6: Validierung der Eingabe. Event Handling Eine Menge ihrer Flexibilität erlangen die JavaServer Faces durch das Event Handling. Wer schon einmal bei der Entwicklung von SwingGUIs mit dem Observer Pattern in Berührung gekommen ist, wird sich hier sofort heimisch fühlen. Bei einer Kommandokomponente lässt sich z. B. eine ActionListener-Methode registrieren, die bei jedem Klick (in diesem Fall ein normaler Link) ausgeführt wird (siehe Abbildung 8). Hier wird dies dazu genutzt, die Spracheinstellung für die Applikation zu verändern. Die Methode switchLanguage ist dabei wie in Abbildung 9 implementiert. Jede Methode, die als ActionListener fungiert, muss die gezeigte Signatur besitzen. Aus den Daten des Events können dann Informationen über die auslösende Komponente ermittelt wer­den. Im Beispiel ist dies die ID der Kom­ po­­nente, die in diesem Fall identisch mit der Bezeichnung (Locale) für die einzustellen­de Sprache ist. Navigation Für den Standardfall der Navigation innerhalb von JSF-Anwendungen ist ein so genannter NavigationHandler verantwortlich. Er wird über die faces-config.xml Datei mit einem Satz von Regeln initialisiert, nach denen er entscheidet, welche Aktion oder Seite als nächstes ausgeführt bzw. aufgerufen wird. Im Beispiel soll bei einer erfolgreichen Identifizierung die Seite main.jsp angezeigt werden, während bei einem Fehler auf der LoginSeite (mit einer entsprechenden Meldung) verblieben werden soll. Die Navigationsregel finden Sie in Abbildung 10. Der NavigationHandler entscheidet im Normalfall anhand so genannter Outcomes, hier SUCCESS und FAILURE (siehe Abbildung 11). Dabei handelt es sich um symbolische Werte, die von einer Action-Methode zurückgegeben werden. Internationalisierung Die Internationalisierung von Web-Applikationen ist ein sehr facettenreiches Thema. Es betrifft die Ausgabe von einfachen Labeln in Formularen genauso, wie die Eingabe von Datums- und Zeitwerten in ihrer regional übli­ chen Form. ORDIX News 2/2006 public class LoginBean { ... private String username = null; private String password = null; private Integer code = null; ... public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } ... } Abb. 7: Attribute der LoginBean. <h:commandLink id="de" action="#{loginBean.dummy}" actionListener="#{loginBean.switchLanguage}"> <h:outputText value="#{messages.german}" /> </h:commandLink> Abb. 8: Registrierung einer Listener-Methode. Im vorgestellten Login-Dialog gibt es zwei Links, mit denen die Sprache zwischen Englisch und Deutsch gewechselt werden kann. Als Basis dafür dienen so genannte Resource Bundles. Dabei handelt es sich um einen Satz von Dateien, in denen zu jeweils einem Schlüsselwert der Text in der jeweiligen Sprache hinterlegt ist. Das Bundle für die deutsche Spracheinstellung finden Sie in Abbildung 12. Im Beispiel gibt es die beiden Dateien resources_en.properties und resources_de.properties, die im Source-Baum im Paket test abgelegt sind. Das Tag <f:loadBundle basename="test. resources" var="messages" /> auf einer JSF-Seite sorgt dafür, dass eines dieser Resource-Bundles geladen wird. Welches genau, hängt von der aktuellen Locale-Einstellung ab. Für Deutschland ist dieser Wert de, für englische Spracheinstellungen entsprechend en. Diese Kürzel werden dem jeweiligen Dateinamen inklusive des Unterstrichs angehängt. Damit sind die lokalisierten Texte unter dem Prefix messages mittels eines Ausdrucks der Expression Language zugreifbar. So sorgt das Tag <h:outputText value="#{messages.username}" /> für die Ausgabe des Labels username in der aktuellen Sprache. Lebenszyklus Jeder JSF-Request wird nach einem einheitlichen Schema abgewickelt, dessen Kenntnis für die Entwicklung von JSF-Applikatio­ nen notwendig ist. Dazu soll an dieser Stelle ein wenig hinter die Kulissen der JavaServer Faces geschaut werden. 11 Java/XML public void switchLanguage(ActionEvent event) { Locale locale = new Locale(event.getComponent().getId()); FacesContext.getCurrentInstance().getViewRoot().setLocale(locale); } Abb. 9: Implementierung der Methode switchLanguage. <navigation-rule> <from-view-id>/login.jsp</from-view-id> <navigation-case> <from-outcome>SUCCESS</from-outcome> <to-view-id>/main.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>FAILURE</from-outcome> <to-view-id>/login.jsp</to-view-id> </navigation-case> </navigation-rule> Abb. 10: Die Navigationsregel. Der Lebenszyklus eines Requests besteht aus sechs verschiedenen Phasen. Es müssen nicht zwangsweise alle sechs Phasen durchlaufen werden. Unter bestimmten Umständen, wie etwa das Auftreten eines Fehlers während der Validierung oder Konvertierung von Werten, können einzelne Phasen auch übersprungen werden. Die zwischen den Phasen auftretenden EventVerarbeitungen werden im Folgenden nicht erläutert. Sie sind im Ablauf-Diagramm (Abbildung 13) aber deutlich (in blauer Farbe) gekennzeichnet. Phase 1: Reconstitute Request Tree Wird von einer JSF-Seite durch Drücken eines Buttons oder Anwählen eines Links ein Request ausgelöst, so besteht die erste Aufgabe der JSF-Implementierung darin, den Komponentenbaum aufzubauen und im FacesContext abzulegen. Existiert dort schon ein zugehöriger Komponentenbaum, so wird dieser aus dem Kontext übernommen. Phase 2: Apply Request Values In dieser Phase füllt das JSF-Framework den Komponentenbaum mit den neuen Werten aus dem Request. Diese Werte überschreiben noch nicht den aktuellen Wert im Datenmodell. Vielmehr werden sie lokal in der Komponente abgelegt, um sie in der nächsten Phase validieren zu können. Schlägt eine Konvertierung dabei fehl, so wird eine der entsprechenden Komponente zugeordnete Fehlermeldung generiert und direkt in die Render Response Phase gewechselt. Befindet sich im Request ein Kommando, beispielsweise durch einen gedrückten Button, so generiert die entsprechende Komponente einen Event. Dieser ermöglicht während einer späteren Verarbeitung, über die bei der Komponente registrierten Listener, die Ausführung spezifischer Geschäftslogik. Phase 3: Process Validations Die mit den einzelnen Komponenten registrierten Validatoren werden in dieser Phase angewendet. Die JSF-Implementierung durchläuft alle Komponenten und überprüft, ob deren in der vorigen Phase lokal gespeicherten Werte mit den hinterlegten Regeln vereinbar sind. Bei einer Regelverletzung wird die entsprechende Kom- 12 ponente als invalid markiert und analog zu Phase 2 in die Render Response Phase gesprungen. Phase 4: Update Model Values In dieser Phase gelten die lokal gespeicherten Werte in der Komponente als gültig. Damit können sie jetzt ins Datenmodell übertragen werden und dort die alten Werte ersetzen. Sollten an dieser Stelle Probleme mit der Konvertierung in die Typen des Datenmodells auftreten, wird wiederum in die Render Response Phase gesprungen. Phase 5: Invoke Application Auf Basis des aktualisierten Datenmodells wird mit der Abarbeitung der aufgetretenen Events begonnen. Das bedeutet typischerweise, dass hier Methoden aufgerufen werden, die als Action an Kommando-Elemente wie Buttons gebunden sind. Dies ist die Stelle, an der die Geschäftslogik ausgeführt wird. Phase 6: Render Response Diese Phase liefert einen symbolischen Wert, der als Outcome bezeichnet wird. Ein Outcome definiert die nächste View, die durch die Navigationsregeln der Applikation festgelegt wurde. Der Komponentenbaum der neuen View wird an­schließend aufgebaut und im FacesContext abgelegt. Trat in einer der vorigen Phasen ein Validierungs- oder Konvertierungsfehler auf, so wurde die Invoke Application Phase übersprungen und keine Geschäftslogik ausgeführt. In diesem Fall ist die neue View gleich der alten. Es wird die gleiche View noch einmal zurückgegeben, was die Möglichkeit zur Darstellung von Fehlermeldungen bietet. Fazit Diese Ausführungen bieten einen ausreichen­ den Überblick, um die Technologie der JavaSer­ ver Faces und deren Möglichkeiten einzuschät­ zen. Die Frage, ob JSF das Mittel der Wahl für zukünftige Web-Projekte ist, lässt sich pauschal nicht beantworten. Die Betrachtung eini­ ger Aspekte kann aber eine Hilfe für die Entscheidung bieten. Klar scheint zu sein, dass Struts für zukünftige Projekte immer weniger Berücksichtigung fin- ORDIX News 2/2006 Java/XML public String login() { if("demo".equals(getUsername()) && "demo".equals(getPassword())) { return SUCCESS; } ... return FAILURE; } Abb. 11: Festlegen der Rückgabewerte (Outcomes) anhand derer der NavigationHandler aus Abbildung 10 entscheidet. den wird. Struts-Shale stellt keine wirkliche Alternative dar, da es oft nur als Studie betrachtet wird, um die kommende JSF 2.0 Spezifikation zu bereichern. Andererseits wird aber auch die Migration bestehender Struts-Applikationen nach JSF eher die Ausnahme bleiben. Dafür ist der Aufwand doch relativ hoch. Außerdem darf man nicht verschweigen, dass JSF auch noch einige Funktionen fehlen. So gibt es noch immer keinen Template-Mecha­ nis­mus, wie man ihn z. B. mit Tiles im Struts Framework findet. Eindeutig für JSF spricht die Tatsache, dass es sich um einen Standard handelt, der sehr viel Flexibilität in sich birgt. So können einzel­ ne Komponenten durch eigene Entwicklungen oder denen von Drittanbietern ausgetauscht oder erweitert werden. JavaServer Faces sind nicht auf HTML-Oberflächen festgelegt, die Erstellung von Anwendungen für z. B. mobile Anwendungen (WAP, etc.) wird ebenfalls unterstützt. Insgesamt hat die JSF-Architektur eine sehr klare Struktur. Die Erstellung der Konfigurationsdateien ist recht einfach und die Beans und Controller unterliegen nicht so starken Restriktionen wie z. B. bei Struts (Form, Action, execute-Methode, ...). Zudem ist die JSF-Spezifikation von Anfang an auf eine breite Tool-Unterstützung ausgelegt worden. Die meisten kommerziellen Entwicklungsumgebungen bieten komfortable Edito­ ren für alle Bereiche. Visuelle Darstellung der Na­vigationsstrukturen oder Drag&Drop-Fä­hig­­­­ keiten bei der Formularerstellung sind fast selbst­ verständlich. In Eclipse wird mit dem Milestone 1.5 der Webtools die JSF-Unterstützung integriert. Die JavaServer Faces werden die Entwicklung vielleicht nicht revolutionieren, aber doch – und das nicht zuletzt wegen des zuletzt angeführten Aspekts der Tool-Unterstützung – um einiges vereinfachen und vereinheitlichen. Andreas Flügge ([email protected]). ORDIX News 2/2006 apptitle=JSF Test title=Bitte melden Sie sich an username=Benutzername password=Kennwort code=Ihr Code login=Anmelden welcome=Herzlich willkommen zu unserem kleinen Test german=Deutsch english=Englisch loginerror=Zugriff verweigert:&nbsp; loginerrordetails=Benutzer und/oder Kennwort falsch Abb. 12: Resource Bundle für die deutsche Spracheinstellung. Response Complete Faces Request Reconstitute Request Tree Apply Request Values Process Events Response Complete Process Validations Process Events Render Response Response Complete Faces Response Render Response Invoke Application Response Complete Process Events Update Model Values Conversion Errors/ Render Response Validation / Conversion Errors / Render Response Abb. 13: JSF Request Lebenszyklus. Glossar Deployment Deskriptor Eine (XML-)Datei, die Konfigurationseinstellungen für die Laufzeitumgebung und die Applikation enthält. Servlet Container Laufzeitumgebung für die Ausführung von Servlets, wo­­zu auch Java Server Pa­ges (JSPs) und JavaServer Faces (JSFs) zählen. Front Controller Software-Muster, bei dem eine zentrale Komponente externe Anfragen entgegennimmt und an interne, nach außen gekapselte Dienste delegiert. Model View Controller (MVC) Ein Paradigma für Benutzer­oberflächen, das die ge­ trenn­te Behandlung von Daten, de­ren Darstellung und die darauf wirkenden Benutzeraktivitäten propagiert. Observer Pattern Software-Muster, bei dem sich mehrere Kom­­ponenten (Observer) bei einer einzelnen Kom­ponente (Subject) registrieren. Das Subject kann so beim Auftreten bestimmter Ereignis­se alle Observer informieren. JSF-Request Die Anfrage eines Clients (meist ein Webbrow­ser) zur Darstellung einer Webseite, die JavaServer Faces-Komponenten enthält. 13 Unix/Linux/Open Source – Titelthema MySQL 5 Datenbanken LOB - Oracle Large Object Die Oracle Large Objects, kurz LOB, sind die Nachfolger für die LONG und RAW Datentypen in Oracle. Dieser Artikel stellt sie vor und gibt den aktuellen Stand der Datenbankversion 10g wieder. Ein Schwerpunkt bildet dabei die Berücksichtigung von LOB in dem PL/SQL Package DBMS_LOB. Der Artikel richtet sich an Entwickler, die sich mit der Verarbeitung von Oracle Large Objects (LOB) beschäftigen. Definition von LOB (Large Objects) Mit den Datentypen BFILE, BLOB, CLOB und NCLOB lassen sich unstrukturierte Daten, z. B. Text, Grafiken/Bilder, Videoclips und Musikdateien, mit bis zu 128 Terabytes speichern. Früher wurden LONG und RAW als Datentypen benutzt. Diese besitzen eine geringere Speicherkapazität von maximal 2 Giga­­byte. Oracle operiert mit LOB durch einen so genannten „Locator“. Dabei handelt es sich um einen Zeiger auf den aktuellen Speicherort des LOB. Jeder Datensatz bekommt seinen eigenen „Locator“. Dieser Zeiger ist nichts anderes als eine Variable mit einem bestimmten Wert, die einen einzelnen LOB-Wert im Datenbankrechner abbildet. LOB-Zeiger wurden entwickelt, um Benutzer mit einem Mechanismus auszustatten, durch den sie sehr große Objekte in den Anwendungsprogrammen leicht verändern können, ohne dass es erforderlich ist, das tatsächliche LOB ständig zwischen Datenbankserver und Client, auf dem das Anwendungsprogramm läuft, zu kopieren. Der Zweck von LOB • Speicherung unstrukturierter Daten • Optimiert für große Datenbestände • Unterstützt einen definierten Zugriff auf große, unstrukturierte Datenmengen innerhalb und außerhalb der Datenbank. Warum sollte man LONG Datentypen nicht mehr verwenden? • Sie können nur maximal 2 Gigabyte groß sein. • Es ist nur eine LONG-/LONG RAW Spalte pro Tabelle erlaubt. • LOB unterstützen den wahlfreien Zugriff, bei LONGs ist nur ein sequentieller Zugriff möglich. LOB-Datentypunterscheidungen im Überblick Es wird einmal unterschieden in interne LOB (BLOB, CLOB, NCLOB) und externe LOB (BFILE). Eine weitere Möglichkeit der Unterscheidung ist die Einteilung in persistente LOB und temporäre LOB. Dieser Unterschied wird im Folgenden näher beschrieben. Interne LOB-Datentypen Interne LOB werden innerhalb der Datenbank in Tablespaces gespeichert, wobei Platz und Zugriff optimiert sind. Interne LOB können im Falle des Transaktions-/Systemabbruchs zurückgewonnen werden. 14 Sie fallen unter das Transaktionskonzept. Das heißt COMMIT und ROLLBACK können durchgeführt werden. Ebenfalls ist ein RECOVERY bei Systemfehlern möglich. Der BLOB dient der Aufnahme von binären, unstrukturierten, großen Objekten. Der CLOB wird für die Speicherung von großen Textdaten sinnvoll eingesetzt. Der NCLOB nimmt die Textdaten im nationalen Zeichensatz auf. Externe LOB-Datentypen Der externe LOB wird durch das BFILE abgebildet. Dieser Datentyp ist im Dateisystem des Betriebsystems gespeichert. Eine BFILE-Spalte/-Variable speichert eine BFILE-„Rechnervariable“, die als Zeiger auf eine binäre Datei auf dem Server dient. Die BFILEs sind nur lesbar. Sie können also (über die Datenbank) nicht geändert werden. Die Größe eines BFILEs ist vom Betriebssystem abhängig. Der Datenbankadministrator muss sicherstellen, dass die Datei existiert und dass die Oracle-Prozesse im Betriebssystem Leserechte besitzen. Die Höchstzahl an geöffneten BFILEs wird über den Parameter SESSION_MAX_OPEN_FILES eingestellt und ist systemabhängig. Sie unterliegen nicht dem Transaktionsprinzip und damit können COMMIT, ROLLBACK und RECOVER nicht genutzt werden. Abgesehen von herkömmlichen Fremdspeichern wie Festplatten, können sich BFILEs auf Speichermedien wie CD-ROMs, Photo CDs und DVDs befinden. Oracle greift auf solche BFILEs auch über das zugrunde liegende Zugriffssystem des Betriebssystems (OS) zu. Die Speicherung der LOB-Werte Die Daten, die in einem LOB gespeichert sind, werden auch als „Wert“ des LOB bezeichnet. Der Wert eines internen LOB kann (!) mit den anderen Werten des Datensatzes „in-line“ ge­ speichert werden, d. h. innerhalb des zugeord­ neten Speicherbereiches innerhalb der Daten­ bank. Wenn der Parameter DISABLE STORAGE IN ROW nicht eingestellt ist und der interne LOB- ORDIX News 2/2006 Datenbanken Wert kleiner als 4.000 Bytes ist, dann wird der Wert „in-line“ gespeichert. Andernfalls wird er außerhalb des Datensatzes („out-of-line“) im LOB-Tablespace gespeichert. Da LOB große Objekte sein sollen, ist eine inline-Ablage nur sinnvoll, wenn die Anwendung kleine und große LOB mischt. Der LOB-Wert wird automatisch aus dem Datensatz verschoben („out-of-line“), sobald er die 4.000 Byte Größe überschreitet. Die Speicherung der LOB-Verzeichnisse (LOB-Locator) Unabhängig davon, wo der Wert des internen LOB gespeichert ist, wird ein Locator in dem Datensatz gespeichert. Der LOB-Locator ist ein Zeiger zur tatsächlichen Position des LOBWertes. Ein LOB-Locator ist ein Zeiger zu einem internen LOB, während ein BFILE-Locator ein Zeiger zu einem externen LOB ist. Für interne LOB speichert die LOB-Spalte einen eindeutigen Locator zum Wert des LOB, der in einem Datenbank Tablespace abgelegt ist. Jede LOB-Spalte/Attribut hat für einen gegebenen Datensatz seinen eigenen eindeutigen LOB-Locator. Externe LOB (BFILEs) speichern die LOBSpalte in einem BFILE-Locator zur externen Datei. Jede BFILE-Spalte/Attribut besitzt für einen gegebenen Datensatz seinen eigenen BFILE-Locator. Jedoch können zwei unterschiedliche Datensätze einen BFILE-Locator besitzen, der auf die gleiche Datei verweist. Setzen von LOB-Spalten/Attributen Bevor aus einem Programm (PL/SQL, OCI, OCCI, Pro*C/C++, Pro*COBOL, Java oder OLE) in einem internen LOB geschrieben werden kann, muss der LOB mit dem Spal­tenattribut NOT NULL gebildet werden. D. h. er muss einen LOCATOR enthalten. Dies wird mit den Funk­ tionen EMPTY_BLOB() für BLOB oder EMPTY_ CLOB() für CLOB und NCLOB erreicht. Bevor in einen externen LOB-Wert (BFILE) mit den programmgestützten Schnittstellen geschrieben werden kann, muss das BFILE ebenfalls mit dem Spaltenattribut NOT NULL gebildet werden. Die BFILE-Spalte kann mit der BFILENAME()-Funktion initialisiert werden, um auf eine Datei im Betriebssystem zu verweisen. Temporäre LOB-Datentypen Temporäre LOB (BLOB, CLOB, NCLOB) werden nicht, wie andere Daten, dauerhaft in der Datenbank gespeichert. Sie werden in den ORDIX News 2/2006 APPEND() COPY() ERASE() LOADFROMFILE() TRIM() WRITE() WRITEAPPEND() READ Hängt den Inhalt eines LOB an einen anderen LOB. Kopiert einen Teil oder alles von einem LOB in einen anderen. Löscht einen Teil von einem LOB ab einer bestimmten Position. Lädt Daten von einem externen in einen internen LOB. Verkleinert den LOB in eine bestimmte Größe. Schreibt Daten in einen LOB an einer bestimmten Stelle. Schreibt Daten an das Ende eines LOB. Lesen der Werte eines LOB. Abb. 1: Funktionen zum Manipulieren von LOB-Typen. CREATE TABLE test_clob ( product_id NUMBER(6), id NUMBER(6), sourcetext CLOB, fltextn NCLOB, foto BLOB ); INSERT INTO test_clob VALUES (1,1,'abcd',EMPTY_CLOB(),EMPTY_BLOB()); COMMIT; Abb. 2: Erstellen einer Tabelle mit den Datentypen BLOB und CLOB und deren Befüllen. temporären Tablespaces gespeichert und nicht in Tabellen abgelegt. Das heißt, dass ein interner, temporärer LOB auf dem Server erstellt (CREATE) werden kann. Allerdings ist er von jeder Tabelle unabhängig und kann somit auch nicht gespeichert werden. Durch die Verwendung von temporären LOB werden die Systemressourcen geschont. Die temporären LOB sind nicht mit einer Tabelle verbunden und somit gibt es auch keinerlei Entsprechung zu den Bezeichnungen „in-line“ und „out-of-line“, wie dies für die anderen LOB-Typen üblich ist. Ausgewählte Funktionen des DBMS_LOB Packages für LOB-Manipulationen Mit diversen Funktionen lassen sich Manipulationen an den einzelnen LOB-Typen vornehmen (siehe Abbildung 1). Es ist dabei zu beachten, dass nicht alle Funktionen für die externen LOB gültig sind, weil sie teilweise nur lesbar und nicht veränderbar sind. Detaillierte Beispiele finden Sie dazu in der Online-Version der ORDIX News im Web: http://www.ordix.de/ORDIXNews. Die besondere Lesekonsistenz bei LOB In Abbildung 2 und 3 a - f wird die Beziehung zwischen der Lesekonsistenz des Locators und der Aktualisierung des LOB-Wertes durch einen zweiten Locator in einem Beispiel dargestellt. Ebenso wird ein Teil der oben aufgeführten Funktionen integriert. 15 Datenbanken Mit der Tabelle test_clob werden drei CLOB als mögliche Locatoren betrachtet: • clob_selected • clob_update • clob_copied Im Zeitpunkt t1 (siehe Abbildung 3a) ist das SELECT INTO (t1) über den Wert der Variablen sourcetext mit dem Locator clob_ selected verknüpft. Im Zeitpunkt t2 (siehe Abbildung 3b) ist der Wert der Variablen sourcetext mit dem Locator clob_updated verbunden. DECLARE num_var clob_selected clob_updated clob_copied read_amount read_offset write_amount write_offset buffer BEGIN -- t1 SELECT INTO FROM WHERE INTEGER; CLOB; CLOB; CLOB; INTEGER; INTEGER; INTEGER; INTEGER; VARCHAR2(20); sourcetext clob_selected test_clob product_id = 1; Abb. 3a: Einlesen des LOB-Wertes in die 1. Locator-Variable. -- t2 SELECT INTO FROM WHERE FOR sourcetext clob_updated test_clob product_id = 1 UPDATE; Abb. 3b: Einlesen des LOB-Wertes in die 2. Locator-Variable. -- t3 clob_copied := clob_selected; -- Ausgabe der einzelnen Locator Inhalte. read_amount := 10; read_offset := 1; dbms_lob.read(clob_selected, read_amount, read_offset,buffer); dbms_output.put_line('t3 - clob_selected value: ' || buffer); -- Ausgabe: 'abcd' dbms_lob.read(clob_copied, read_amount, read_offset, buffer); dbms_output.put_line('t3 - clob_copied value: ' || buffer); -- Ausgabe 'abcd': dbms_lob.read(clob_updated, read_amount, read_offset, buffer); dbms_output.put_line('t3 - clob_updated value: ' || buffer); -- Ausgabe :'abcd' Abb. 3c: Kopieren des Wertes des 1. Locators in eine 3. Locator-Variable. 16 Da es keine Änderungen im Wert der Variablen gegeben hat, ist die Lesekonsistenz in den Zeipunkten t1 und t2 für clob_selected und clob_updated gewahrt. Im Zeitpunkt t3 (siehe Abbildung 3c) wird der Wert von clob_selected nach clob_copied übertragen. In diesem Zeitpunkt besitzen alle drei Locatoren den gleichen Wert. Das Beispiel zeigt dieses mit einer Reihe von DBMS_ LOB.READ() Aufrufen. Im Zeitpunkt t4 (siehe Abbildung 3d) verwendet das Programm DBMS_LOB.WRITE(), um den Wert von clob_updated zu ändern und durch DBMS_LOB.READ() wird der neue Wert angezeigt. Jedoch zeigt ein DBMS_LOB.READ() auf clob_selected den gleichen Wert im Zeitpunkt t5 (siehe Abbildung 3e) an, so dass erkennbar ist, dass der Locator weiterhin so existiert, wie er beim SELECT eingelesen wurde. Ebenso zeigt ein DBMS_LOB.READ() auf clob_copied den gleichen Wert im Zeitpunkt t6 (siehe Abbildung 3f) an, wie er in clob_selected steht. Erstellung von Terabyte LOB Seit der Oracle Datenbankversion 10g spricht Oracle ab einer Größe von mehr als vier Gigabyte von den so genannten „Terabyte LOB“. Die maximale Dateigröße wird dabei einerseits durch das Betriebssystem vorgegeben. Andererseits ist für BFILEs das Maximum grundsätzlich auf 264 – 1 Bytes beschränkt! Zur Zeit werden folgende Umgebungen von Oracle unterstützt: • Java mit JDBC (Java Database Connectivity) • PL/SQL mit dem DBMS_LOB Package • C mit OCI (Oracle Call Interface) Nicht unterstützt werden: • COBOL mit Pro*COBOL Precompiler • C or C++ mit Pro*C/C++ Precompiler • Visual Basic mit OO4O (Oracle Objects for OLE) Hinweise für die Erstellung von „Terabyte“ LOB Operiert man mit sehr großen LOB sollte der Parameter PCT_INCREASE möglichst auf 0 gesetzt werden. Bei der schrittweisen Erweiterung des LOB wird sonst jedes Mal ein Extent entsprechend des Parameters PCT_INCREASE benutzt. Das ist Speicherplatzverschwendung und bei entsprechender Größe auch schwer zu handhaben. ORDIX News 2/2006 Datenbanken Glossar Oracle Large Object (LOB) Binary Large Object (BLOB) Character Large Object (CLOB) National Character Large Object (NCLOB) Binary Large Object (BFILE) Datentyp zur Aufnahme großer Datenmengen. Datentyp zur Aufnahme bi­närer Daten innerhalb der Datenbank (z. B. Programme, Grafiken etc.). Datentyp zur Aufnahme von Textdaten innerhalb der Datenbank. Datentyp zur Aufnahme von Textdaten im nationalen Zeichensatz innerhalb der Datenbank. Datentyp für ein LOB, das nicht in der Datenbank gespeichert wird. Eine andere Möglichkeit ist die Verwendung von locally managed Tablespaces. Der Parameter MAXEXTENTS ist möglichst auf UNLIMITED zu setzen: Hierdurch erfolgt dann keine Beschränkung beim Befüllen der LOB-Spalte durch die Anzahl der Extents. Es sollten möglichst große Extentgrößen verwendet werden. Oracle generiert beim Erstellen eines Extents jedes Mal UNDO-Informationen und weitere Metadaten. Dies kann dazu führen, dass das Maximum des RollbackSegmentes erreicht wird. Eine Extentgröße von zur Zeit 100 Megabyte oder das häufigere Absetzen eines COMMIT Kommandos zum Beenden der Transaktion kann Abhilfe schaffen (siehe Abbildung 4). Die Storage Klausel in diesem Beispiel ist im CREATE TABLESPACE Statement eingebettet. Alternativ kann sie auch in der CREATE TABLE Klausel erfolgen. Dabei ist zu beachten, dass die Storage Klausel in einem CREATE TEMPORARY TABLESPACE Statement nicht erlaubt ist. Fazit Der LOB ist inzwischen ein würdiger Nachfolger der alten LONG und RAW Datentypen geworden. Mit jedem neuen Release seit Oracle 8 wurden die Einsatzmöglichkeiten erweitert. Für die Zukunft empfiehlt sich, auf die Datentypen LONG und RAW generell zu verzichten, da diese im Gegensatz zu LOB-Datentypen nur eingeschränkt nutzbar sind. Somit empfiehlt es sich auch, wenn möglich, eine Migration auf die LOB-Datentypen vorzunehmen. Mit diesem Thema beschäftigen wir uns in einer der nächsten Ausgaben. Klaus Günther ([email protected]). ORDIX News 2/2006 -- t4 write_amount := 3; write_offset := 5; buffer := 'efg'; dbms_lob.write(clob_updated, write_amount, write_offset,buffer); read_amount := 10; dbms_lob.read(clob_updated, read_amount, read_offset, buffer); dbms_output.put_line('t4 - clob_updated value: ' || buffer); -- Ausgabe : 'abcdefg' Abb. 3d: Ändern des LOB-Wertes und anschließendes Auslesen. -- t5 -- trotz Änderung des LOB-Wertes. dbms_lob.read(clob_selected, read_amount, read_offset,buffer); dbms_output.put_line('t5 - clob_selected value: ' || buffer); -- Ausgabe: 'abcd' Abb. 3e: Ausgangswert des ersten Locators ist erhalten geblieben. -- t6 -- trotz Änderung des LOB-Wertes. dbms_lob.read(clob_copied, read_amount, read_offset, buffer); dbms_output.put_line('t6 - clob_copied value: ' || buffer); -- Ausgabe: 'abcd' END; / Abb. 3f: Ausgangswert des kopierten Locators ist erhalten geblieben. CREATE TABLESPACE lobtbs1 DATAFILE '/eigenes/verzeichnis/lobtbs_1.dbf' SIZE 3000M REUSE ONLINE NOLOGGING DEFAULT STORAGE( MAXEXTENTS UNLIMITED); ALTER TABLESPACE lobtbs1 ADD DATAFILE '/eigenes/verzeichnis/lobtbs_2.dbf' SIZE 2000M REUSE; CREATE TABLE test_clob ( product_id NUMBER(6), id NUMBER(6), sourcetext CLOB, ad_fltextn NCLOB, foto BLOB ) LOB(sourcetext) STORE AS ( TABLESPACE lobtbs1 CHUNK 32768 PCTVERSION 0 NOCACHE NOLOGGING STORAGE(INITIAL 100M NEXT 100M MAXEXTENTS UNLIMITED PCTINCREASE 0)); Abb. 4: Beispiel für einen Gigabyte LOB. 17 Unix/Linux/Open Datenbanken – Titelthema Source – Titelthema SQL Developer MySQL 5 Der Oracle SQL Developer ist da! Das einfache Werkzeug mit grafischer Oberfläche zur Bearbeitung von Quellcode innerhalb der Oracle Datenbank ist nun endlich da. Das besondere an diesem Oracle Tool ist, dass es zum freien Download zur Verfügung steht. Noch zu Jahresbeginn firmierte es als nicht unterstützte Version unter dem Namen „Raptor“. Dieser Artikel stellt den SQL Developer vor und gibt die ersten Erfahrungen wieder. Der Artikel richtet sich an Oracle Entwickler und DBAs, die den SQL Developer bei der Entwicklung von Datenbankskripten und -applikationen einsetzen und sich zudem einen schnellen Überblick über die Datenbank verschaffen wollen. Der Sinn des SQL Developers ist, die Entwicklungsaufgaben zu vereinfachen und so eine erhöhte Entwicklungsproduktivität zu gewährleisten. Somit richtet sich der SQL Developer in erster Linie an Datenbankentwickler. Für den klassischen Datenbankadministrator kann er nur ein Hilfsmittel sein. Hardware Oracle empfiehlt zur Zeit, den in Java entwickelten SQL Developer auf den in Abbildung 1 aufgelisteten Plattformen einzusetzen. SQL Developer Funktionalitäten Mit dem SQL Developer können Benutzer Datenbankobjekte anzeigen, bearbeiten, erstellen und löschen. Innerhalb des integrierten SQL Worksheets lassen sich SQL- und PL-/SQL-Statements ausführen und überprüfen (Debug-Funktio­ nalität). Es besteht ebenso die Möglichkeit, vordefinierte oder selbst erstellte Reports zu erstellen. Connections Der SQL Developer besitzt zwei Navigationsebenen, so genannte „Tabs“. Die erste Ebene ist der Verbindungsnavigator „Connections“. Hiermit kann sich der Benutzer mit jedem möglichen Ora­ cle Datenbankschema verbinden, das die Standard Oracle Authen­ tifizierung benutzt. Benutzer können sich mit dem SQL Developer an Oracle Datenbanken ab Version 9.2.0.1 und höher anmelden. Zur Datenbankan- bindung benötigt man den Schemanamen, das Kennwort, den Rechnernamen und die Datenbank SID bzw. den Servicenamen. Sobald der Benutzer verbunden ist, können Datenbankobjekte erstellt, geändert, gelöscht und entsprechend ihrer Funktionalität manipuliert werden. Dies beinhaltet den Zugriff auf folgende Objekttypen: • • • • • • • • Tabellen Views Indizes Packages Prozeduren Funktionen Trigger Typen • • • • • • • • Sequenzen Materialized Views Materialized View Logs Synonyme Public Synonyme Datenbank Links Directories Papierkorb (ganz wichtig ab Oracle 10g!) Darüber hinaus können Datenbankobjekte anderer Datenbankbenutzer entsprechend der vergebenen System- und Objektprivilegien genutzt werden (siehe Abbildung 2). Reports Die zweite Ebene „Reports“ beinhaltet eine An­zahl von vordefinierten Reports über die Da­tenbank und ihre Objekte. Ebenfalls lassen sich selbstdefinierte Reports erstellen. Bei den vordefinierten Reports handelt es sich um Auszüge aus dem Data Dictionary (siehe Abbildung 3). Die Syntax kann angezeigt und durch ein COPY/PASTE in das SQL-Worksheet übertragen werden. Dort wird der Quellcode an die persönlichen Anforderungen angepasst und dann als selbstdefinierter Report gespeichert. Die durch die Reports gewonnenen Daten können auch exportiert werden. SQL-Worksheet und PL/SQL Abb. 2: Datenbankobjekte. 18 Das SQL-Worksheet unter­ stützt die Erstellung von SQL- und PL/SQL-Befehlen. Diese können einzeln oder ORDIX News 2/2006 Datenbanken Windows Windows 2000-Service Pack 4 Windows XP-Service Pack 1 Linux Red Hat Enterprise Linux 3 Red Hat Enterprise Linux 4 Fedora Core 4 SuSE SLES8 Mac-OS X Apple Mac OS X Version 10.3 Abb. 1: Von Oracle empfohlene Plattfor­ men für den Einsatz des SQL Developers. nacheinander als Skript ablau­fen. Eine Befehlshistorie beinhaltet die vorhergehenden Befehle. Zusätzlich existiert die Möglichkeit, sich den Ausführungsplan für ausgewählte Statements anzusehen. Etwas lästig ist die permanente Aufforderung zur Auswahl der entsprechenden Datenbank bei jedem Öffnen des SQL-Worksheets. Hier existieren Tools mit einer komforta­ ble­ren Lösung. Abb. 3: Report Ergebnisse. Ein weiteres Manko ist zur Zeit, dass die SQL*Plus Session Parameter nicht genutzt werden können. Die Darstellung der Ergebnisse durch DBMS_OUTPUT wird dadurch aber nicht beeinträchtigt! Exportieren von Abfrageergebnissen Die zum Beispiel mit SQL gewonnenen Ergebnisse lassen sich in die Formate INSERT-Statements, SQL-Loader, CVS, Text und XML exportieren. Dies geschieht einfach über die Auswahl aus dem Kontextmenü, das per Mausklick aufgerufen werden kann (siehe Abbildung 4). Abb. 4: Export gewonnener Daten durch einen SELECT. Im Anschluss kann bestimmt werden, ob die Daten in einer Datei oder im Clipboard gespeichert werden. Ebenso kann über den Tab Reiter „Columns“ die Auswahl auf einzelne Spalten beschränkt werden. Darüber hinaus kann auch noch eine WHERE-Klausel implementiert werden. Applikationsfenster Eine Gesamtansicht einzelner Applika­ tions­fenster (Connections, Reports, Snip­ pets, SQL-Worksheets) zeigt Abbil­dung 5. Es ist auch möglich, die ein­zel­nen Ap­ plikations­bestandteile jeweils am Appli- ORDIX News 2/2006 Abb. 5: Übersicht der Applikationsfenster. 19 Datenbanken kationsrand minimiert zu positionieren und nur bei Bedarf zu öffnen. Debug Der Benutzer kann PL/SQL-Code erstellen und ändern. Er kann Code-Formatie­rung und Bookmarks hinzufügen und Quell­­code verwenden. Das Prüfen (Debug) von Stored Procedures ist möglich. Diese Eigenschaft erlaubt dem Benutzer, den Code laufen zu lassen, zu prüfen und alternative Daten während des Debug-Vorgangs einzugeben. Dazu wird die entsprechende Stored Procedure aufgeru­fen und durch das Kontextmenü in den De­bug Status versetzt (siehe Abbildung 6). Im Anschluss erscheint ein Fenster, das der Auswahl der zu prüfenden Stored Procedure dient (siehe Abbildung 7). Nach dem Bestätigen der ausgewählten Stored Procedure mit „OK“ wird dies im Debug-Modus angezeigt. Nun stehen alle Debug-Funktionalitäten zur Verfügung. Abbildung 8 gibt ein Beispiel. Snippets Eine weitere, nützliche Implementierung sind die so genannten „Snippets“. Das Bearbeiten von SQL- bzw. PL/SQL-Code im Worksheet wird durch ihre Verwendung vereinfacht. Es handelt sich dabei um vordefinierte Quellcodefragmente, wie z. B. SQL-Funktionen, Optimizer hints oder verschiedene PL/SQLProgrammiertechniken. Support Abb. 6: Debug Kontextmenü. Für den Support ist zu beachten, dass eine Zer­tifizierung (Support bei Fragen) für die einzelnen Bestandteile des SQL Developers (SQLWorksheet, Datenbank-Funktionen, PL/SQL-Support) zur Zeit nur für die Datenbanken 9i (Version 9.2.0.4) und 10g Enterprise Edition, Standard Edition, Standard Edition One und Express Edition gilt. Die Unterstützung der einzelnen Daten­ bankversionen befindet sich aber in ei­ nem fortlaufenden Prozess. Die notwendige Voraussetzung für den Support des SQL Developers ist eine Oracle Datenbank­lizenz. Fazit Abb. 8: Beispiel für das Debugging einer Stored Procedure. 20 Für die erste Version ist der SQL Developer ein durchaus für SQL- und PL/SQLStandardprogrammierung sinnvoll ein- ORDIX News 2/2006 Datenbanken Glossar Debug Prüfung des Quellcodes auf Funktionalität und aktuelle Parameterwerte. GUI Graphical User Interface. Dies ist die grafische Benutzeroberfläche. Stored Innerhalb der Datenbank gespeicherte Prozeduren, Procedures Funktionen und Paketelemente. SQL Structured Query Language. Sie dient als Kommunikationsinstrument mit der Datenbank. PL/SQL Procedural Language/SQL. Erweiterung von SQL um prozedurale Programmierelemente. Abb. 7: Auswahlfenster. zusetzendes Werkzeug, um schnell und ohne großen Konfigurationsaufwand mit der Da tenbank zu kommunizieren. Vor allem das Debug Tool bietet dem Entwickler einen unschätzbaren Vorteil bei seiner täglichen Arbeit. Ein weiterer Pluspunkt dieses Tools besteht dar- in, dass es von Oracle unterstützt wird und dass zur Zeit keine Lizenzgebühren anfallen. Letzteres ist, wie wir wissen, keine Garantie auf Lebenszeit und könnte zunächst nur ein Lockmittel sein. Klaus Günther ([email protected]). Aktuell Larry Ratlos: System Monitoring Larry steht wieder einmal vor einem größeren Problem: Ein neuer Batchjob wurde auf seinem Linuxsystem installiert. Da der betroffene Rechner auch weitere Aufgaben wahrnimmt, soll er nun überprüfen, ob die bereits vorhandenen Jobs negativ beeinflusst werden. Deshalb möchte Larry wis sen, wie hoch die Systemlast bei laufendem Job ist, und ob er gegebenenfalls auf ein dediziertes System ausweichen muss. Leider ist der neue Job ein klassischer Langläufer und natürlich muss auch der Tagesbetrieb, wie üblich, sichergestellt werden. Den Job über die ganze Laufzeit hinweg selbst zu beobachten, ist für Larry also nicht möglich. Sein Kollege aus dem Operating, Beo Bachter, schlägt vor, das System in das zentrale Monitoring aufzunehmen. Aber Larry muss das ablehnen: Langwierige Installationen oder kostenintensive Anschaffungen von Softwarelizenzen zwecks Monitoring sind zunächst einmal keine Option. Larry ist ratlos, dabei möchte er doch nur Daten zu seinem System sammeln, um diese später auszuwerten. „Da gabs doch ein bestimmtes Paket ...?! ...“ denkt sich Larry. Doch es fällt ihm leider nicht mehr ein. Können Sie Larry helfen? Wissen Sie, an welches Paket er sich zu erinnern versucht? ORDIX News 2/2006 Und wenn das Paket installiert wurde, wie ermittelt Larry dann die von ihm benötigten Daten? Senden Sie Ihren Lösungsvorschlag bis zum 24.07.2006 an [email protected]. Lösung der Aufgabe aus 1/2006 In der letzten ORDIX News hatte Larry mit der Bekämpfung übervoller Tabellen zu tun. Er wollte gerne eine quartalsweise Partitionierung der Tabellen vornehmen. Das Statement, mit dem er es letztendlich geschafft hat, ist folgendes: select max(partition_name) "ALT", substr(max(partition_name),1,instr(max(partition_name),'_',1,1)) || to_char(add_months(to_date (substr (max(partition_name),instr(max(partition_name),'_',1,1)+1,4) || decode (substr(max(partition_name),-1,1), '1', '-01-01', '2', '-04-01', '3', '-07-01', '4', '-10-01'),'yyyy-mm-dd'),3),'yyyy_q') "NEU" from user_tab_partitions where table_name = 'BEST_PART'; 21 Projektmanagement – Titelthema ITIL IT-Service Management mit ITIL (Teil II): Service Delivery ITIL - Eine Oase in der Servicewüste Die Philosophie von ITIL basiert auf der Erkenntnis, dass IT noch stärker als bisher Unternehmensziele und geschäftliche Anforderungen unterstützen soll. Das hat zur Folge, dass die Anforderungen an die Qualität und Stabilität immer höher werden und der Kostendruck ebenfalls steigt. Daher muss das Optimierungspotenzial der gesamten IT-Infrastruktur ausgeschöpft werden. In der letzten Ausgabe stellten wir die operativen Prozesse des „Service-Support“ dar, heute betrachten wir die taktischen bzw. planerischen Prozesse von ITIL. Der Artikel richtet sich an diejenigen, die sich als Führungskraft oder Fachverantwortliche im IT-Betrieb und in Querschnittsabteilungen mit IT-Service Management beschäftigen. Zuviel Verwaltung in der IT? Zunächst sei die Frage gestattet, ob Planung und Strategie die notwendige Innovation in der IT zu sehr einschränken? Oder schaffen sie sogar Freiräume? In Zeiten, in denen bei jedem IT-Vorhaben zunächst der Blick auf die Wirtschaftlichkeit gerichtet wird, könnte man Angst um die Innovation bekommen, die gerade in der IT eine so wichtige Rolle spielt. Den Ansprüchen gerecht werden Wie wird man dem wachsenden Anspruch gerecht, eine zuverlässige IT-Infrastruktur für Geschäftsprozesse zur Verfügung zu stellen? 7x24 Stundenbetrieb, Hochverfügbarkeitslösungen, schnelle Netze, verteilte Systeme. Ein bunter Mix aus Anforderungen und Maßnahmen. ITIL bietet mit den Prozess-Sets im Bereich Service Delivery klare Strukturen, definiert Rol len und Verantwortlichkeiten für die Planung im Service Management. Service-Delivery besteht aus: In der jüngeren Vergangenheit wurden in der Praxis sehr viele neue Anwendungen geschaffen, die durch Innovation getrieben waren – technologisch wie geschäftlich. Insbesondere durch den Einsatz moderner Web-Technologie und J2EE-Plattformen versucht man den Kunden direkter zu erreichen, Stichwort Multikanal-Banking, Direkt-Versicherung u. v. m. • • • • • • Dies hat jedoch auch erhebliche Implikationen auf die Komplexität der dahinter liegenden IT-Infrastruktur. Nur wer den Überblick behält, erkennt auch alle Chancen Availability Management Capacity Management Financial Management IT-Security Business Continuity Service Level Management Availability Management Service Delivery Application Management Operative Ebene Abb. 1: ITIL-Serviceprozesse. 22 ITSecurity Technologische Plattform Service Support IT Infrastructure Management IT Service Management Service Level Management Geschäftliche Anforderungen Planung, Strategie Kurz gesagt: hier geht es um Verfügbarkeit. Doch was bedeutet das im Detail? Nicht in erster Linie, dass ein System beispielsweise zu 95 Prozent im Monat „verfügbar“ ist, sondern es geht um die Summe der Maßnahmen, die dafür sorgen, dass eine IT-Infrastruktur zur Verfügung gestellt wird. Also „wie“ stelle ich eine hohe Verfügbarkeit sicher? Wobei die eigentliche Implementierung Aufgabe des Release Managements ist. Availability Management schafft Voraussetzungen, plant und macht Vorgaben. So ist z. B. das Thema Backup & Recovery bzw. Restore in diesem Bereich eine wichtige Disziplin. ORDIX News 2/2006 Projektmanagement Links ► [1] IT-Grundschutzhandbuch des Bun­ desamtes für Sicherheit in der Informa­ tionstechnik: www.bsi.de Angesiedelt sind hier weiterhin Themen wie Hochverfügbarkeitslösungen, Maßnahmen zur Vermeidung von Ausfällen, Maßnahmen zur Performance-Steigerung u. v. m. Zur Qualitätssicherung und Überwachung gehört dann das Monitoring der Systeme. Hier werden Schwellwerte analysiert und prophylaktische Maßnahmen eingeleitet. Das Avail­ ability Management liefert diese Daten dann an das Capacity Management. Capacity Management Niemand plant zu versagen, aber die meisten versagen beim Planen. In diesem Fall sprechen wir von dem Kapazitätsplan. Dieser bildet die Basis für eine ausreichend dimensionierte IT-Infrastruktur. Wie oft haben wir schon die Erfahrung gemacht, dass Funktion und Performance nicht immer harmonieren. Man erinnere sich an die frühen Zeiten des Internets. Hier ein Bild, da ein Applet und schon war die Leitung dicht. Bandbreiten sind auch heute noch ein wichtiges Thema bei der Anbindung von Außenstellen eines Unternehmens, Versicherungsvertretern oder bei Energieversorgern, wenn mal wieder der Gaszähler abgelesen wird. Kapazitätsplanung greift aber auch bei zentralen Systemen. Wir brauchen ausreichende Storage-Systeme, CPUs und vieles mehr. Hier ist eine enge Zusammenarbeit, insbesondere mit dem Change Management, Availability Management und Financial Management gefordert. Was brauchen wir? Eine mittel- bis langfristige Planung, eine richtige Auslegung der Infrastruktur und die richtige Auswertung und Analyse der Inputs aus dem Availability Management. Letztlich müssen alle Prozess-Sets im Service Delivery harmonisch zusam­men­arbeiten. Financial Management Das Financial Management ist mit seinem Controlling die monetäre Steuerungsinstanz im ITIL-Umfeld. Financial Management führt das Controlling durch und liefert die finanziellen Planungswerte, um vor allem im Change Management fundierte Kosten/Nutzen-Entscheidungen treffen zu können. ORDIX News 2/2006 Financial Management hat nicht so sehr mit Kontrolle zu tun, sondern liefert vielmehr die notwendige Kostentransparenz, die den Nutzen bestimmter Maßnahmen sichtbar macht. IT-Security Das Spektrum der IT-Security erstreckt sich vom baulichen bis hin zur systemtechnischen Absicherung der Software und Zurverfügungstellung entsprechender Verfahren. Dies können Berechtigungsverfahren (Stichwort Single Sign On) sein oder auch systemtechnische Maßnahmen zur Absicherung von Vorgaben der IT-Sicherheit, z. B. Design und Implementierung einer Verwaltungsdatenbank für die Vergabe von Zertifikaten. ITIL selbst weist hier auch einige Aktivitäten in seinen ProzessSets aus, jedoch gibt es gerade im deutschen Bereich verschiedene Besonderheiten und Vorschriften. Das zentrale Dokument hierzu ist das IT-Grundschutzhandbuch des Bundesamtes für Sicherheit in der Informationstechnik [1]. Business Continuity Quasi als „Nachbarbereich“ gilt das Business Continuity Management. Hierbei geht es vor allem um Themen der Katastrophenvorsorge, Ausweicharbeitsplätze und -systeme, also um alle Verfahren und Techniken, die dafür sorgen, dass im Falle eines größeren Ausfalls der IT-Infrastruktur die Mindestanforderungen an die Kontinuität des Geschäftsbetriebs erfüllt sind. Fragen Sie doch mal in Ihrem Rechenzen­trum, ob dort ein Notstromaggregat vorhanden ist und ob die Dieseltanks von der Unteren Wasserbehörde genehmigt wurden. Business Continuity hat eben nicht nur mit IT zu tun. Vom Request zum Agreement – Service Level Management Letztendlich oder noch besser zu Beginn ist zu klären, was der Kunde wirklich will und was die Informationstechnologie hierfür zu leisten im Stande ist. Der IT-Dienstleister, sei es ein externer oder ein unternehmensinterner, muss gemeinsam mit seinem Leistungsempfänger definieren, welche Leistungen zu erbringen sind. Hier stehen sich zunächst Service Level Requests (SLRs) als Anforderungen und Service Levels als mögliche Leistungen mit bestimmter Qualität gegenüber: Dies können Servicezeiten und Lösungszeiten für auftretende Störungen oder System­verfügbarkei­ ten sein. Alle Leistungen stellt der Leistungsanbieter in einem Service- oder Leistungskatalog zusammen. Auf dieser Basis wird dann ein Service Level Agreement (SLA) zwischen Leistungs­anbieter und -empfänger abgeschlossen. Das Service Level Management kümmert sich aber nicht nur um dessen Erstellung, sondern auch um die Weiterentwicklung der SLAs und um die Überwachung der Qualität und des Reporting. Service Level Management bildet somit ein wichtiges Bindeglied für die oben genannten ITIL-Prozesse, die nur gemeinsam gut funktionieren können. Denn auch hier gilt: Das Ganze ist mehr als nur die Summe seiner Einzelteile. Rainer Restat ([email protected]). 23 Datenbanken Oracle SQL Oracle SQL für Experten Oracle Datenbankprogrammierung mit PL/SQL Oracle Datenbankadministration Grundlagen Oracle Datenbankadministration Aufbau Oracle Backup und Recovery Oracle Tuning und Monitoring Oracle Troubleshooting Workshop Oracle Real Application Cluster RAC Oracle 10g Neuheiten Oracle Net Oracle Security Workshop Oracle Data Guard Workshop Oracle RMAN Workshop Informix SQL Informix Dynamic Server Administration Informix Tuning und Monitoring Informix Backup und Recovery mit ON-Bar IBM DB2 UDB für Unix/Windows SQL Grundlagen IBM DB2 UDB für Unix/Windows Administration Grundlagen MySQL Administration Microsoft SQL Server Administration Programmierung Einführung in die objektorientierte Programmierung Perl Programmierung Grundlagen Perl Programmierung Aufbau Einführung in XML XML Programmierung unter Java mit DOM und SAX Oracle und XML PHP Programmierung Grundlagen E-Commerce Lösungen mit PHP (Workshop) PHP Programmierung Aufbau Shell, Awk und Sed Java-J2EE Java Programmierung Grundlagen Java Programmierung Aufbau Java 5.0 Neuheiten J2EE für Entscheider Einführung in J2EE JSP und Servlet Programmierung EJB Programmierung Administration und Konfiguration für JBoss Java Web Services Systemmanagement BMC PATROL/Performance Manager Basics BMC PATROL/Performance Manager Customizing and Development BMC PATROL/Performance Manager Advanced Web- und Applikations-Server Apache Web-Server Installation und Administration Tomcat Konfiguration und Administration WebSphere Application Server Installation und Administration Betriebssysteme Unix/Linux Grundlagen für Einsteiger Linux Systemadministration Linux Hochverfügbarkeits-Cluster Solaris Systemadministration Grundlagen Solaris Systemadministration Aufbau Solaris 10 Neuheiten Solaris für Unix Umsteiger Netzwerke Linux Netzwerkadministration Security Unix/Linux Security im Internet Projektmanagement IT-Projektmanagement Grundlagen des IT-Controlling Wiesbaden Saarbrücken 1790,00 1190,00 1790,00 1890,00 1890,00 1890,00 1890,00 1890,00 1490,00 1890,00 790,00 1190,00 1190,00 1490,00 1590,00 1790,00 1890,00 1090,00 1790,00 1890,00 1090,00 1790,00 1090,00 1590,00 1590,00 1090,00 790,00 790,00 1590,00 1090,00 1090,00 1590,00 1590,00 1590,00 1090,00 450,00 1090,00 1590,00 1590,00 1090,00 1090,00 1890,00 1490,00 1890,00 1090,00 1090,00 1290,00 1590,00 1590,00 1190,00 1890,00 1890,00 1890,00 1890,00 1590,00 1590,00 1890,00 1190,00 *) Preise pro Seminar pro Teilnehmer in Euro. Alle Preise gelten zzgl. ges. MwSt. **) Inhousepreise auf Anfrage. Lippstadt Einige der hier aufgeführten Bezeichnungen sind eingetragene Warenzeichen ihrer jeweiligen Inhaber. Irrtümer vorbehalten. Für weitere Informationen und Fragen zu individuell zugeschnittenen Seminaren, Ausbildungsreihen oder Inhouse Schulungen stehen wir jederzeit gerne zur Verfügung. Auf Wunsch senden wir Ihnen auch unser komplettes Seminarprogramm zu. 24 ORDIX ORDIX News News 2/2006 2/2006 KW 36 KW 35 KW 34 KW 33 KW 32 KW 31 August KW 30 KW 28 KW 27 Juli KW 26 KW 25 Juni KW 24 Preis in EURO*)**) - herausnehmbare Übersicht - KW 29 Aus- & Weiterbildung Seminartermine http://training.ordix.de Online-Anmeldung und stets aktuelle Seminarinhalte und Termine! KW 49 KW 48 Dez. KW 47 KW 46 KW 45 KW 44 November KW 43 KW 42 KW 41 KW 40 Oktober KW 39 KW 38 KW 37 September Aus- & Weiterbildung Juni - Dezember 2006 Preis in EURO*)**) 1790,00 1190,00 1790,00 1890,00 1890,00 1890,00 1890,00 1890,00 1490,00 1890,00 790,00 1190,00 1190,00 1490,00 1590,00 1790,00 1890,00 1090,00 1790,00 1890,00 1090,00 1790,00 1090,00 1590,00 1590,00 1090,00 790,00 790,00 1590,00 1090,00 1090,00 1590,00 1590,00 1590,00 1090,00 450,00 1090,00 1590,00 1590,00 1090,00 1090,00 1890,00 1490,00 1890,00 1090,00 1090,00 1290,00 1590,00 1590,00 1190,00 1890,00 1890,00 1890,00 1890,00 1590,00 1590,00 1890,00 1190,00 Datenbanken Oracle SQL Oracle SQL für Experten Oracle Datenbankprogrammierung mit PL/SQL Oracle Datenbankadministration Grundlagen Oracle Datenbankadministration Aufbau Oracle Backup und Recovery Oracle Tuning und Monitoring Oracle Troubleshooting Workshop Oracle Real Application Cluster RAC Oracle 10g Neuheiten Oracle Net Oracle Security Workshop Oracle Data Guard Workshop Oracle RMAN Workshop Informix SQL Informix Dynamic Server Administration Informix Tuning und Monitoring Informix Backup und Recovery mit ON-Bar IBM DB2 UDB für Unix/Windows SQL Grundlagen IBM DB2 UDB für Unix/Windows Administration Grundlagen MySQL Administration Microsoft SQL Server Administration Programmierung Einführung in die objektorientierte Programmierung Perl Programmierung Grundlagen Perl Programmierung Aufbau Einführung in XML XML Programmierung unter Java mit DOM und SAX Oracle und XML PHP Programmierung Grundlagen E-Commerce Lösungen mit PHP (Workshop) PHP Programmierung Aufbau Shell, Awk und Sed Java-J2EE Java Programmierung Grundlagen Java Programmierung Aufbau Java 5.0 Neuheiten J2EE für Entscheider Einführung in J2EE JSP und Servlet Programmierung EJB Programmierung Administration und Konfiguration für JBoss Java Web Services Systemmanagement BMC PATROL/Performance Manager Basics BMC PATROL/Performance Manager Customizing and Development BMC PATROL/Performance Manager Advanced Web- und Applikations-Server Apache Web-Server Installation und Administration Tomcat Konfiguration und Administration WebSphere Application Server Installation und Administration Betriebssysteme Unix/Linux Grundlagen für Einsteiger Linux Systemadministration Linux Hochverfügbarkeits-Cluster Solaris Systemadministration Grundlagen Solaris Systemadministration Aufbau Solaris 10 Neuheiten Solaris für Unix Umsteiger Netzwerke Linux Netzwerkadministration Security Unix/Linux Security im Internet Projektmanagement IT-Projektmanagement Grundlagen des IT-Controlling Informationen und Anmeldung: ORDIX AG Westernmauer 12-16 33098 Paderborn Tel.: 05251 1063-0 ORDIX AG Kreuzberger Ring 13 65205 Wiesbaden Tel.: 0611 77840-00 ORDIX ORDIX News News 2/2006 2/2006 zentrales Fax: 0180 1 ORDIX 0 bzw. 0180 1 67349 0 E-Mail: [email protected] Online-Anmeldung: http://training.ordix.de 25 Datenbanken Neues bei Oracle: 10gR2 (Teil III) RMAN Convert Database In der ORDIX News 1/2006, Seite 4, beschäftigten wir uns mit den neuen Data Guard Möglichkeiten von Ora­ cle 10gR2. In dieser Ausgabe werden wir weitere Features näher betrachten. Der Artikel richtet sich an Datenbankadministratoren und Entscheider, die sich über weitere neue Features der Version 10.2 informieren wollen. Cross-Platform Database Transport Wie sieht der übliche Weg aus, den wir bei einer Migration von einer Serverplattform zu einer anderen, z. B. von Sun zu HP, beschreiten? Wir exportieren (exp/Datapump) die Daten aus der aktuellen Plattform und importieren (imp/Datapump) sie auf der neuen Plattform. Meist geht damit auch eine Migration auf ein neueres Oracle Release einher. Insgesamt ein sehr aufwändiges Verfahren. Ab Oracle 10gR2 steht uns dafür ein neuer Weg zur Verfügung. Dieser Weg heißt Cross-Platform Database Transport. Das passende Recovery Manager (RMAN) Kommando heißt CONVERT DATABASE. Rückblick Zur Erinnerung: Seit Oracle 10gR1 besteht die Möglichkeit, mit dem Recovery Manager transportable Tablespaces zwischen beliebigen Platt­formen zu verschieben. Einen Überblick über die unterstützten Plattformen sowie das zugrunde liegende SQL-Statement, das diese Liste liefert, finden Sie in Abbildung 1. Nun wollen wir betrachten, wie das Ganze funktioniert. Voruntersuchung Teil 1 Bevor wir mit dem Transport der Datenbank beginnen, untersuchen wir, ob der von uns gewünschte Pfad unterstützt wird. SQL> select * from v$transportable_platform order by platform_id; PLATFORM_ID 1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 PLATFORM_NAME ENDIAN_FORMAT Solaris[tm] OE (32-bit) Solaris[tm] OE (64-bit) HP-UX (64-bit) HP-UX IA (64-bit) HP Tru64 UNIX AIX-Based Systems (64-bit) Microsoft Windows IA (32-bit) Microsoft Windows IA (64-bit) IBM zSeries Based Linux Linux IA (32-bit) Linux IA (64-bit) Microsoft Windows 64-bit for AMD Linux 64-bit for AMD HP Open VMS Apple Mac OS Big Big Big Big Little Big Little Little Big Little Little Little Little Little Big Abb. 1: Unterstützte Zielplattformen für einen transportablen Tablespace auf einer beliebigen Plattform. PLATFORM_ID 7 10 5 11 15 8 13 12 17 PLATFORM_NAME ENDIAN_FORMAT Microsoft Windows IA (32-bit) Linux IA (32-bit) HP Tru64 UNIX Linux IA (64-bit) HP Open VMS Microsoft Windows IA (64-bit) Linux 64-bit for AMD Microsoft Windows 64-bit for AMD Solaris Operating System (x86) Little Little Little Little Little Little Little Little Little Abb. 2: Unterstützte Plattformen auf einem Linux Server. 26 Ein select * from v$DB_TRANSPORTABLE_PLATFORM auf einem Linux Server gibt einen ersten Überblick über die unterstützten Plattformen (siehe Abbildung 2). Zusätzlich hilft die Funktion DBMS_TDB. CHECK_DB bei der Voranalyse. Schauen wir uns das Ganze an einem Beispiel an. Dabei wollen wir von Linux IA (32-bit) nach Linux 64-bit for AMD wechseln. Den passenden String für den Plattformnamen erhalten wir aus dem Ergebnis der vorherigen Abfrage. Vor dem Ausführen dieses Packages und für die weiteren Schritte muss die Datenbank read-only geöffnet werden, da es ansonsten zu einer entsprechenden Feh­ lermeldung kommt. Das kleine Skript in Abbildung 3 hilft uns dabei. Damit ist endgültig klar, dass einer „direkten“ Migration nichts im Weg steht. Voruntersuchung Teil 2 Vor der Konvertierung müssen wir noch untersuchen, ob unsere Datenbank externe Tabellen, BFILEs oder directories enthält. Diese können von CONVERT DATABASE nicht bearbeitet werden und ORDIX News 2/2006 Datenbanken müssen separat behandelt, d. h. mit Betriebssystemmitteln kopiert werden. Zur Ermittlung gibt es die DBMS_TDB.CHECK_EXTERNAL Funktion. Auch hier hilft uns ein kleines Skript (siehe Abbildung 4). Konvertierung Nach diesen Vorarbeiten ist unsere Datenbank fertig für das Konvertieren auf die neue Plattform. Das RMAN Kommando CONVERT DATABASE erzeugt dabei die drei notwendigen Bestandteile: 1. Eine vollständige Kopie aller Datenbankdateien 2. Ein Transport Skript zum Anlegen der Datenbank auf dem neuen Server 3. Ein pfile für die neue Datenbank Ein Beispiel mit der entsprechenden Ausgabe liefert Abbildung 5. Die hier entstandenen Dateien werden nun auf den neuen Server kopiert. handelt, da beim CONVERT DATABASE zwar die Datenbank Dateien gesichert wurden, aber kein Backup der Control-Datei angelegt wurde. Dadurch werden wir automatisch dazu gebracht, die Pfade zu den Dateien auf den gewünschten Stand zu bringen. Das von CONVERT DATABASE angelegte pfile ist selbstverständlich vorher den Gegebenheiten anzupassen (siehe Abbildung 7). set serveroutput on declare db_ready boolean; begin db_ready := dbms_tdb.check_db( 'Linux 64-bit for AMD', dbms_tdb.skip_none); end; / PL/SQL procedure successfully completed. Abb. 3: Skript zum Aufruf der Funktion DBMS_TDB.CHECK_DB. set serveroutput on declare external boolean; begin external := dbms_tdb.check_external; end; Transport Skript The following directories exist in the database: SYS.DATA_PUMP_DIR, SYS.ADMIN_DIR, SYS.WORK_DIR Nun schauen wir uns das Transport Skript näher an, das RMAN für uns gebaut hat (siehe Abbildung 6). Wir stellen fest, dass es sich um ein ganz normales create controlfile Skript PL/SQL procedure successfully completed. Abb. 4: Skript zur Ermittlung von externen Tabellen, BFILEs und directories. CONVERT DATABASE NEW DATABASE 'newdb' transport script '/tmp/transport/transportskript' to platform 'Linux 64-bit for AMD' db_file_name_convert '/oradata/ak102' '/tmp/transport'; ------------------------------------------------------------Starting convert at 05.04.06 using target database control file instead of recovery catalog allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=42 devtype=DISK Directory SYS.DATA_PUMP_DIR found in the database Directory SYS.ADMIN_DIR found in the database Directory SYS.WORK_DIR found in the database User SYS with SYSDBA and SYSOPER privilege found in password file channel ORA_DISK_1: starting datafile conversion input datafile fno=00001 name=/oradata/ak102/system01.dbf converted datafile=/tmp/transport/system01.dbf channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:35 channel ORA_DISK_1: starting datafile conversion ... Run SQL script /tmp/transport/transportskript on the target platform to create database Edit init.ora file /oracle/product/10.2/dbs/init_00hfpe8c_1_0.ora. This PFILE will be used to create the database on the target platform To recompile all PL/SQL modules, run utlirp.sql and utlrp.sql on the target platform To change the internal database identifier, use DBNEWID Utility Finished backup at 05.04.06 Abb. 5: Kommando und Ergebnis für die Konvertierung einer Datenbank mit CONVERT DATABASE . ORDIX News 2/2006 27 Datenbanken STARTUP NOMOUNT PFILE='/oracle/product/10.2/dbs/init_00hfpe8c_1_0.ora' CREATE CONTROLFILE REUSE SET DATABASE "NEWDB" RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 1168 LOGFILE GROUP 1 ( '/oracle/product/10.2/dbs/arch_D-NEWDB_id-3659488684_S-145_T-1_A-565987116_00hfpe8c', '/oracle/product/10.2/dbs/arch_D-NEWDB_id-3659488684_S-145_T-1_A-565987116_01hfpe8c' ) SIZE 10M, ... DATAFILE '/tmp/transport/system01.dbf', '/tmp/transport/undotbs01.dbf', '/tmp/transport/sysaux01.dbf', '/tmp/transport/users01.dbf' CHARACTER SET WE8ISO8859P1; ALTER DATABASE OPEN RESETLOGS; ALTER TABLESPACE TEMP ADD TEMPFILE '/oracle/product/10.2/dbs/data_D-NEWDB_I-3659488684_TS-TEMP_FNO-1_00hfpe8c' SIZE 20971520 AUTOEXTEND ON NEXT 655360 MAXSIZE 536870912 ; set echo off prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ prompt * Your database has been created successfully! prompt * There are many things to think about for the new database. Here prompt * is a checklist to help you stay on track: prompt * 1. You may want to redefine the location of the directory objects. prompt * 2. You may want to change the internal database identifier (DBID) prompt * or the global database name for this database. Use the prompt * NEWDBID Utility (nid). prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SHUTDOWN IMMEDIATE STARTUP UPGRADE PFILE='/oracle/product/10.2/dbs/init_00hfpe8c_1_0.ora' @@ ?/rdbms/admin/utlirp.sql SHUTDOWN IMMEDIATE STARTUP PFILE='/oracle/product/10.2/dbs/init_00hfpe8c_1_0.ora' -- The following step will recompile all PL/SQL modules. -- It may take serveral hours to complete. @@ ?/rdbms/admin/utlrp.sql set feedback 6; Abb. 6: Transport Skript. # Please change the values of control_files db_recovery_file_dest db_recovery_file_dest_size background_dump_dest user_dump_dest core_dump_dest audit_file_dest db_name the following parameters: = "/oracle/product/10.2/dbs/cf_D-NEWDB_id-3659488684_00hfpe8c" = "/oracle/product/10.2/dbs/flash_recovery_area" = 2147483648 = "/oracle/product/10.2/dbs/bdump" = "/oracle/product/10.2/dbs/udump" = "/oracle/product/10.2/dbs/cdump" = "/oracle/product/10.2/dbs/adump" = "NEWDB" # Please review the values of __shared_pool_size __large_pool_size __java_pool_size __streams_pool_size __db_cache_size remote_login_passwordfile db_domain the following parameters: = 54525952 = 4194304 = 4194304 = 0 = 37748736 = "SHARED" = "" # The values of the following parameters are from source database: processes = 50 sessions = 60 sga_max_size = 104857600 nls_territory = "GERMANY" sga_target = 104857600 db_block_size = 8192 compatible = "10.2.0.1.0" db_file_multiblock_read_count= 16 db_flashback_retention_target= 120 undo_management = "AUTO" undo_tablespace = "UNDOTBS1" job_queue_processes = 10 open_cursors = 300 pga_aggregate_target = 16777216 Abb. 7: Das von CONVERT DATABASE angelegte pfile. 28 ORDIX News 2/2006 Datenbanken Fazit Glossar Recovery Manager (RMAN) Transportable Tablespace Externe Tabellen BFILE Directory Oracles Tool zur Sicherung von Oracle Datenbanken. Ein Verfahren, um sehr einfach und schnell Table­spaces von einer Oracle Datenbank in eine andere zu übertragen. Tabellen, die in der Datenbank definiert, deren Daten aber außerhalb gespeichert sind. Binäre Daten, die im Filesystem gespeichert werden, aber auf die mit Datenbankmitteln zugegriffen werden kann. Ein directory definiert einen Alias für ein Verzeichnis im Filesystem. Sind alle Dateien auf das neue System gespielt, das „Transport Skript“ und das Pfile angepasst, so steht – letztlich mit vergleichsweise wenig Aufwand – die Datenbank auf einem neuen Server zur Verfügung. Allerdings funktioniert das in dieser Form nur für ei­ne „endian Variante“. Oracle hat uns jedoch bereits mit 10g R1 gezeigt, dass es möglich ist, Tablespaces von einer Plattform auf eine beliebige andere Plattform zu migrieren. Von daher ist CONVERT DATABASE zwar eine gute Idee, aber vollständig ist das Ganze erst, wenn man damit Datenbanken beispielweise von Windows nach Solaris Sparc konvertieren kann. Sie wollen mehr über Oracles Recovery Manager (RMAN) erfahren? Besuchen Sie den 4-tägigen ORDIX Recovery Manager Workshop. Weitere Informationen zu diesem Workshop finden Sie in unserem Online-Trainingsshop unter http://training.ordix.de. Andreas Kother ([email protected]). Verlosung Chess Classic Mainz 2006 ORDIX Open: Hol dir den Titel! Pony auf E7 ! Pünktlich zum Sommer erwartet die Rheingoldhalle in Mainz wieder die Schachprominenz. Vom 15. - 20. August 2006 wird u. a. wieder heiß um den Sieg im ORDIX Open, dem höchstdotierten und weltgrößten Schnellschachturnier gerungen. Das ORDIX Open und die Chess Classic sind mittlerweile eng verwachsen. Seit nunmehr 13 Jahren ist ORDIX als Sponsor mit von der Partie. So hat das Turnier auch in diesem Jahr wieder einen festen Stammplatz im Programm – das Wochendende 19./20.08.2006. Haben Sie Ausdauer? 13 Jahre ORDIX Open und 11 Runden spannende Spielstrategien. Halten Sie diese geistige Anspannung 11 Runden lang aus? Wollen Sie sich der Herausforderung stellen und die gigantischen Momente genießen? Wollen Sie einer von rund 500 Spielern sein, die Runde für Runde schwitzen und einem weiteren Sieg entgegenfiebern, um dem Titel „ORDIX Open Gewinner 2006“ etwas näher zu kommen? ORDIX News 2/2006 Wir geben Ihnen die Chance, dabei zu sein Werden Sie Teilnehmer im ORDIX Open oder spielen Sie im Simultan an einem der 40 Bretter gegen die Anführer der Weltrangliste. Senden Sie einfach eine E-Mail mit dem Stichwort: „Chess Classic 2006“ bis zum 14.07.2006 an [email protected]. Unter den ersten 50 Einsendern verlosen wir • 2 Plätze für das ORDIX Open am 19. und 20.08.2006 • 1 Platz im Simultan gegen Viswanathan Anand am 15.08.2006 • 1 Platz im Simultan am 16.08.2006 (Gegner noch offen) Der Rechtsweg sowie die Teilnahme von ORDIX Mitarbeitern und deren Angehörigen sind ausgeschlossen. Stefanie Heither ([email protected]). 29 Unix/Linux/Open Source Spieglein, Spieglein ... 100 % MySQL – Wie richte ich ein Cluster ein? Bereits in der letzten Ausgabe haben wir in dem Artikel „MySQL 5 - The Next Generation“ (siehe ORDIX News 1/2006, Seite 30) beschrieben, dass es ein erklärtes Ziel der Firma MySQL AB ist, den etablierten Datenbankherstellern das Leben ein wenig schwerer zu machen. Höchste Zeit also, um sich einmal mit dem aktuellen Entwicklungsstand der Clusterlösung von MySQL zu beschäftigen. Der Artikel beschreibt die exemplarische Installation eines MySQL-Clusters. Der Artikel richtet sich an MySQL-Datenbankadministratoren, die ein Interesse an der Hochverfügbarkeit ihrer MySQL-Applikationen haben. Vorabinformation Die MySQL Architektur besteht aus zwei „Bereichen“. Auf der einen Seite sorgt der mysqld-Prozess für die Verarbeitung der Zugriffe inklusive der Koordination der notwendigen Prozesse und der Organisation der Hauptspeicherbereiche. Auf der anderen Seite stehen die Storage-Engines. Sie sind für das Schreiben und Lesen der eigentlichen Daten zuständig. Derzeit stehen circa 10 unterschiedliche Storage-Engines für unterschiedliche Anforderungsbereiche zur Verfügung [1]. NDB – Network Database Der Einfachheit halber gibt es für den Cluster-Betrieb auch eine eigene Storage-Engine: Network Database (NDB). Es ist allerdings darauf zu achten, dass diese Storage-Engine nur in den Download­ paketen [2] enthalten ist, welche in ihrem Namen die Erweiterung Anwender / Applikationen User Web-Shop JBoss mysqld ManagementServer ManagementClient ManagementNode mysqld SQL-Nodes ndb (Master) ndb Storage-Nodes Abb. 1: Die SQL- und Storage-Nodes werden vom Management-Server koordiniert. 30 „-max“ tragen. Einschränkungen gibt es aktuell leider noch hinsichtlich der Datenbankgröße und der Fremdschlüsselunterstützung. Sämtliche Daten einer Cluster-Datenbank werden momentan im Hauptspeicher der „StorageNodes“ gehalten, so dass die Größe des Hauptspeichers gleichzeitig die Größe der Datenbank limitiert. Dieses Verhalten wird mit der nächsten MySQL Version 5.1 jedoch hinfällig sein. Weitere aktuelle Einschränkungen der Storage-Engine NBD und deren geplante Weiterentwicklung finden Sie im Internet auf verschiedenen Webseiten [3, 4]. Unteilbar Der MySQL-Cluster bzw. die NDB-StorageEngine setzt auf eine Share-Nothing-Strategie. Dies bedeutet, dass die an dem Cluster betei­ligten Rechner keinerlei Hardware gemeinsam verwenden. Dies hat zwei Vorteile: 1. Es ermöglicht den Einsatz von preiswer­ ter Hardware. 2. Damit wird automatisch ein „Single Point of Failure“ (zumindest, was die Rechnerkomponenten betrifft) vermieden, da jeder Rechner seine eigenen Platten, seinen eigenen Speicher und seine eigene(n) CPU(s) besitzt. Dieser Ansatz muss natürlich auch auf alle anderen Elemente im Cluster übertragen werden. So sollten z. B. redundante Netzwerkkarten, redundante Stromversorgungen usw. Verwendung finden, um nicht an einer anderen Stelle einen Engpass zu generieren. Funktionsweise Um einen Cluster aufzusetzen braucht es mindestens drei Rechner: ORDIX News 2/2006 Unix/Linux/Open Source Zwei Rechner sollten dabei die Verwaltung der Daten übernehmen, also die NDB StorageEngines betreiben (Storage-Nodes). Zusätzlich können diese Rechner auch die mysqldProzesse (SQL-Nodes) betreiben, über welche die Applikationen bzw. Anwender ihre Anfragen absetzen. Der dritte Rechner sorgt für die Organisation der Storage- und SQL-Nodes und übernimmt deren Überwachung (Management-Node). Für unser Installationsbeispiel haben wir jedoch ein erweitertes Szenario gewählt. Hier übernehmen zwei separate Rechner die Rolle der SQLNodes, so dass insgesamt fünf Rechner (siehe Abbildung 1) an dem Cluster beteiligt sind: • 1 Management-Node • 2 Storage-Nodes • 2 SQL-Nodes Storage- und SQL-Nodes Die Installation eines Clusters sollte mit den Storage-Nodes beginnen. Dazu wird, wie gewohnt, die MySQL-Software installiert. Wahlweise kann man sich die Quell- oder Binärpakete herunterladen [5]. Beim Installieren eines Quellpaketes sollte unbedingt darauf geachtet werden, dass die Option –with-db-cluster aktiviert sein muss. Die Konfiguration der Storageknoten im Anschluss an die Installation ist unproblematisch. In der entsprechenden Konfigurationsdatei (unter Linux z. B. /etc/my.cnf) muss lediglich hinterlegt werden, dass diese My­SQL-Installation Teil eines Clusters ist. Zusätzlich muss definiert werden, wo sich der dazugehörige Management-Node befindet. Die Installation der SQL-Nodes vollzieht sich genau nach demselben Muster (siehe Beispiel einer Konfigurationsdatei in Abbildung 2). Die unterschiedlichen Aufgaben der Storageund SQL-Nodes ergeben sich – trotz einer iden­ tischen Konfiguration – später durch den Start unterschiedlicher Dienstprogramme auf den Nodes. Management-Node Für die Installation des Management-Nodes sind aus dem MySQL-Paket eigentlich nur zwei Programme notwendig. Aus dem Binärpaket können diese direkt extrahiert und auf dem Server abgelegt werden: .../bin/ndb_mgm (Management-Client) .../bin/ndb_mgmd (Management-Server) ORDIX News 2/2006 [mysqld] ndbcluster [mysql_cluster] ndb-connectstring = 172.17.30.100 # IP of Management Server Abb. 2: Zwei Zeilen reichen aus, um einen Storage-Node zu konfigu­ rieren. [NDBD DEFAULT] NoOfReplicas =2 # Anzahl der beteiligten Storage-Nodes [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] [NDB_MGMD] HostName = 172.17.30.100 # IP des Management-Node [NDBD] HostName = 172.17.30.101 # 1. Storage-Node DataDir = /var/lib/mysql-cluster # Datenverzeichnis vom 1. Storage-Node [NDBD] HostName = 172.17.30.102 # 2. Storage-Node DataDir = /var/lib/mysql-cluster # Datenverzeichnis vom 2. Storage-Node [MYSQLD] HostName = 172.17.30.103 # 1. SQL-Node [MYSQLD] HostName = 172.17.30.104 # 2. SQL-Node Abb. 3: Der Management-Node kennt die beteiligten Rechner und ihre spezifischen Aufgaben. Der Management-Server stellt im Cluster die zentrale Kommunikationsplattform dar und regelt die Verteilung der Aufgaben zwischen den beteiligten Systemen. Über den Management-Client können aktuelle Statusinformationen über die Systeme bezogen, sowie einige „Verwaltungsaktionen“ für die Clusterkomponenten veranlasst werden. Darüber hinaus sollte für den Management-Server ein eigenes Arbeitsverzeichnis angelegt werden, welches die Konfigurationsdatei des Management-Nodes und später die erzeugten Logfiles des Clusters aufnehmen kann (unter Linux z. B. /var/lib/mysql-cluster). Die Konfiguration ist im Gegensatz zu den Storage- und SQL-Nodes etwas umfangreicher, da der Management-Node alle am Cluster beteiligten Rechner und Aufgaben kennen muss (siehe Abbildung 3). Startup Nachdem alle Komponenten installiert und konfiguriert sind, kann der Cluster gestartet werden. Als erste Komponente sollte der Management-Server hochgefahren werden, da dieser den anderen Nodes ihre Rolle im Cluster zuweist. Dies geschieht über den Start des entsprechenden Dienstes: ndb_mgmd 31 Unix/Linux/Open Source Connected to Management Server at: localhost:1186 Cluster Configuration --------------------[ndbd(NDB)]2 node(s) [email protected] (Version: 5.0.18, Nodegroup: 0, Master) [email protected] (Version: 5.0.18, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) [email protected] (Version: 5.0.18) [mysqld(API)] 2 node(s) [email protected] (Version: 5.0.18) [email protected] (Version: 5.0.18) StorageNode1 (Master) 03) Weiter 3) Weiter arbeiten!!! arbeiten!!! 2) Soll ich übernehmen? StorageNode2 ManagementServer Abschließend werden die SQL-Nodes aktiviert. Auf diesen startet man, wie bei „gewöhnlichen“ MySQL-Servern, den mysqld-Prozess mit den betriebssystemspezifischen Startskripten (unter Linux: /etc/init.d/mysql.server start). Damit ist der Cluster einsatzbereit. Kontrolle Abb. 4: Über den Management-Client erfahren wir die Rollenverteilung im Cluster. Zunächst werden die Storage-Nodes, dann der Management-Node und anschließend die SQL-Nodes ausgegeben (vgl. Abb. 3). 1) Ausfall der redundanten Heartbeat-Verbindung Anschließend werden die Storage-Nodes eingebunden. Dies erfolgt über den Start des MySQL-Dienstes „ndb“, welchem beim allerersten Start die Option - -initial spendiert werden muss: ndb (--inital) 03) Nicht 3) Nicht übernehmen!!! übernehmen!!! Abb. 5: Split-Brain-Problem: Bei einem Ausfall der direkten Leitung zwischen zwei Storage-Nodes muss eine dritte Instanz entscheiden, wer weiterhin als Master fungiert. Ansonsten würden in diesem Fall beide Storage-Nodes die Rolle des Masters übernehmen. Nach dem Start der Komponenten sollte überprüft werden, ob die Nodes ihre Aufgaben auch zuverlässig übernommen haben. Dazu kann auf dem Management-Node (oder auf allen an­deren im Cluster befindlichen Rechnern) der entsprechende Client (ndb_mgm) genutzt werden. Über das Kommando ndb_mgm –e show werden alle aktiven Nodes mit ihren entsprechen­ den Aufgaben und Stati ausgegeben (siehe Ab­bildung 4). Im Prinzip könnte der Management Node nun wieder heruntergefahren werden, da alle beteiligten Rechner ihre Aufgaben und „Partner“ kennen. Die reine Überwachung der Verfügbarkeit wird auch von den Storage-Nodes alleine gewährleistet. Es gibt aber gute Gründe, warum der Management-Node weiter aktiv bleiben sollte. Über ihn können einzelne Nodes z. B. ab- oder dazugeschaltet werden oder es können auf den einzelnen Nodes Backups gestartet und auch wieder eingespielt werden. Schizophrenie [t1] ... [ndbd(NDB)]2 node(s) id=2 (not connected, accepting connect from 172.17.30.101) [email protected] (Version: 5.0.18, Nodegroup: 0, Master) ... [t2] ... [mysqld(API)] 3 node(s) id=4 (not connected, accepting connect from 172.17.30.103) [email protected] (Version: 5.0.18) Abb. 6: [t1] Ausfall des ersten Storage-Nodes. Der zweite StorageNode wird im Bruchteil einer Sekunde zum neuen Master und übernimmt alle eingehenden Verbindungen. [t2] Ausfall des ersten SQL-Nodes. Die Applikationen und Anwender müssen jetzt über den zweiten SQL-Node auf ihre Daten zugreifen. 32 Wie eben bereits beschrieben, sind die Storage-Nodes auch ohne den Management-Server in der Lage, den Ausfall eines Systems zu erkennen. Allerdings gibt es einen Problemfall, bei dem die zusätzliche Überwachungsfunktionalität des Management-Nodes benötigt wird. Sind die Storage-Nodes an zwei unterschiedlichen Standorten positioniert und kommt es zu einem Ausfall der Kommunikationsleitung (Heartbeat-Überwachung), so weiß keiner der beteiligten Storage-Nodes, ob der Partner ausgefallen oder derzeit aufgrund eines Netzwerk­ ausfalls nur nicht zu erreichen ist (Split Brain Problem). ORDIX News 2/2006 Unix/Linux/Open Source Links: ► ► ► ► ► [1] http://dev.mysql.com/doc/refman/5.0/en/storage-engines.html [2] http://mysql.speedbone.de/downloads/mysql/5.0.html [3] http://dev.mysql.com/doc/refman/5.0/en/mysql-cluster-limitations.html [4] http://dev.mysql.com/doc/refman/5.0/en/mysql-5-1-cluster-roadmap.html [5] http://dev.mysql.com/downloads/ Es bedarf also einer Kontrollinstanz (Management-Node), die entscheidet, welcher StorageNode weiter als Master fungiert. Dazu ist es natürlich notwendig, dass der ManagementNode über eine separate Anbindung an die betroffenen Storage-Nodes verfügt (siehe Abbidung 5). Crash & Failover Jetzt ist es an der Zeit, einige Crash-Szenarien zu simulieren und die Ausgabe des Management-Client (auf dem Management-Node) zu beobachten. Im ersten Schritt wird der 1. Storage-Node physikalisch ausgeschaltet (siehe Abbildung 6, [t1]). Ohne Probleme übernimmt der 2. Storage-Node seine neue Rolle als Master. Zusätzlich wird danach ein SQL-Node „beseitigt“. Die Applikationen und Anwender müssen nun über den anderen, verbliebenen SQL-Node auf ihre Daten zugreifen (siehe Abbildung 6, [t2]). Für den Zugriff auf den richtigen SQL-Node ist in unserem Fall die Applikation selbst verantwortlich. Sie muss selbst erkennen, dass der SQL-Node 1 nicht mehr verfügbar ist und auf den 2. SQL-Node umschwenken. Dieses Problem kann natürlich auch anders gelöst werden. Denkbar wäre z. B. der Einsatz eines Load Balancers, der im Normalfall (wenn alle SQL-Nodes arbeiten) die Anfragen gleichmäßig auf die verfügbaren Dienste verteilt. Glossar Cluster Eine Gruppe von vernetzten Computern, die von außen in vielen Fällen als ein Computer gesehen werden kann. Ziel des „Clustering“ besteht meistens in der Erhöhung der Rechengeschwindigkeit und/oder der Verfügbarkeit gegenüber einem einzelnen Computer. Node Der Begriff Node (Knoten) bezeichnet einen einzelnen Rechner in einem Cluster. Oftmals ist ein Node mit einer bestimmten Aufgabe betraut. Storage Node Node zum Schreiben und Lesen von Daten. SQL-Node Node für die Annahme und Verarbeitung der Anfragen von Applikationen und Usern Management Node Node zur Verwaltung und Kontrolle der anderen Knoten Single Point of Failure Unter einem Single Point of Failure oder kurz SPoF versteht man eine Komponente im Cluster, deren Ausfall den Komplettausfall des Clusters nach sich zieht. Split Brain Ein Zustand in einem Cluster, in dem sich mehrere (Storage-)Nodes im aktiven Modus befinden. ter für viele Anwendungsbereiche eine interessante Alternative werden. Besonders die Verarbeitung von größeren Datenmengen, unabhängig von der Hauptspeichergröße, muss schnellstmöglich gelöst werden. Beim Verlust eines SQL-Nodes verteilt der Load Balancer die Anfragen dann auf die verbleiben­ den Systeme. Fazit Im Portfolio der Firma MySQL AB ist der Cluster noch ein relativ neues Produkt. Die Einschränkungen der NDB-Engine sind derzeit deutlich spürbar. Wenn diese Beschränkungen, wie in der Roadmap [4] versprochen, in der nächsten Version beseitigt werden, dürfte der MySQL-Clus- ORDIX News 2/2006 Matthias Jung ([email protected]). 33 Datenbanken PL/SQL Web-Services (Teil II) Oracle stellt verschiedene Möglichkeiten zur Verfügung, um mit Web-Services zu kommunizieren. Im ersten Teil (siehe ORDIX News 4/2005, Seite 30) zeigten wir auf, wie existierende PL/SQL-Programme ohne großen Aufwand als Web-Services zur Verfügung gestellt werden können. Dieser Teil skizziert, wie mit der Datenbankprogrammiersprache PL/SQL Web-Services aufgerufen werden können. Es werden einige Alternativen anhand von Beispielen vorgestellt. Dieser Artikel richtet sich an Software-Entwickler, die mit der Datenbankprogrammiersprache PL/SQL Web-Services aufrufen wollen. SQL-Package UTL_HTTP kann also unter anderem auch dazu verwendet werden, WebServices aus einem PL/SQL-Programm aufzurufen. Einführung und Motivation Anwendungsbeispiel mit UTL_HTTP In einer Serviceorientierten Architektur (SOA) ist die Anbindung der einzelnen Systemkomponenten an Web-Services von besonderer Bedeutung. Damit auch eine Datenbank die vielen Vorteile von Web-Services (siehe Teil 1) nutzen kann, stellt Oracle mehrere Möglichkeiten zur Verfügung, um direkt aus der Datenbank heraus Web-Services aufzurufen (siehe Abbildung 1). Grundsätzlich stehen folgende drei Alternativen zur Verfügung, die wir anhand von Programmbeispielen erläutern: A) UTL_HTTP PL/SQL-Package B) Java Stored Procedure C) UTL_DBWS PL/SQL-Package A) Alternative mit UTL_HTTP PL/SQL-Package Die Kommunikation zwischen Client und Server findet bei WebServices über das HTTP-Standardprotokoll statt. Das HTTP-Standardprotokoll wird in Oracle mit Hilfe des PL/SQL-Packages UTL_ HTTP unterstützt. Dabei besteht die Möglichkeit, aus einem SQL- oder PL/SQL-Programm Daten über das HTTP-Protokoll auszutauschen. Das PL/ Oracle-DB PL/SQL HTTP SOAP/XML Internet HTTP SOAP/XML Web-Services Abb. 1: Web-Services Call-Out – Die Datenbank als Web-Services Konsument. Ein Beispielprogramm, das zeigt, wie aus ei­ nem PL/SQL-Programm ein Web-Service zur Ermittlung der ORDIX Seminarpreise gestartet wird, finden Sie unter http://www.ordix.de/ ORDIXNews. Dort wird zuerst mit Hilfe der Prozedur ER­ STELLE_ENVELOPE eine SOAP-Nachricht zum Aufruf des Web-Services zusammengestellt. Abbildung 2 zeigt ein Beispiel einer solchen SOAP-Nachricht. Anschließend wird mit der Funktion STARTEHTTP die mit ERSTELLE_ ENVELOPE erstellte SOAP-Nachricht über das PL/SQL-Package UTL_HTTP aufgerufen. Web-Service Response wird im XMLTYPE abgelegt Das Ergebnis des Web-Services „ORDIX Seminarpreise“ (siehe Abbildung 3) wird in einem Datentyp XMLTYPE abgespeichert. Der Datentyp XMLTYPE steht ab Oracle9i zur Verfügung und ermöglicht die Speicherung von XML-Daten in der Datenbank (siehe „Oracle und XML: Ein besonderer Cocktail“ in der ORDIX News 1/2006, Seite 40). Das besondere an dem Datentyp XMLTYPE ist, dass durch diesen SQL-Operationen auf XML-Inhalte und XML-Operationen auf SQLInhalte möglich sind. XML­TYPE liefert außerdem spezielle Funktionen zum Erzeugen, Ex- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <holePreis xmlns="urn:pck_seminar" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <OrdixSeminar xsi:type="xsd:string">Java Grundlagen</OrdixSeminar> </holePreis> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Abb. 2: Die SOAP-Nachricht zum Aufruf eines Web-Services. 34 ORDIX News 2/2006 Datenbanken trahieren und Indizieren von XML-Daten in einer Datenbank. Anschließend wird der Rückgabewert des WebServices – hier der ORDIX Seminarpreis – mit Hilfe der XMLTYPE-Funktion EXTRACT aus der XML-Struktur herausgelöst und ausgege­ ben. B) Alternative mit Java Stored Procedure Eine Java Stored Procedure ist eine mit der Programmiersprache Java erstellte StoredProcedure. Innerhalb einer Java Stored Procedure besteht die Möglichkeit, einen WebService direkt aufzurufen. Voraussetzungen für einen Web-ServiceZugriff aus einer Java Stored Procedure Soll aus einer Java Stored Procedure, die sich innerhalb einer Oracle Datenbank befindet, ein Web-Service aufgerufen werden, so müssen zuerst die SOAP-Klassen, die in der Datei ORACLE_HOME\oc4j\soap\lib\soap.jar vorhanden sind, in eine Datenbank unter dem Datenbankbenutzer SYS geladen werden (siehe Abbildung 4). Um das SOAP-Protokoll in der Datenbank nutzen zu können, müssen dem entsprechenden Datenbankbenutzer, der den Web-Service auf­ rufen soll, die PropertyPermission- und Socket­ Permission-Rechte vergeben werden (siehe Abbildung 5). Java-Stub-Klasse Außerdem wird eine so genannte Java-StubKlasse zum Aufruf des Web-Services benötigt. Eine Java-Stub-Klasse dient als Web-ServiceClient und kann z. B. mit Hilfe von JDeveloper (in der „New Gallery“ unter „Web Services“ und „Web Service Stub/Skeleton“) erstellt werden. Auch ein Beispiel für eine solche Java-StubKlasse finden Sie im Internet unter http://www. ordix.de/ORDIXNews. Die Java-Stub-Klasse muss ebenfalls in die Da­ tenbank geladen werden (siehe Abbildung 6). Hierbei ist darauf zu achten, dass die Methoden in der Java-Stub-Klasse, die den Web-Service aufrufen, mit der Eigenschaft STATIC deklariert sind. Denn innerhalb einer Datenbank können nur STATIC Methoden aufgerufen werden. PL/SQL-Wrapper Um den Zugriff aus der Datenbankprogrammiersprache PL/SQL auf die Java-Stub-Klasse zu ermöglichen, muss ein so genannter PL/SQLWrapper für die innerhalb der Datenbank vor- ORDIX News 2/2006 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <holePreisResponse xmlns="urn:pck_seminar" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:decimal">1800</return> </holePreisResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Abb. 3: Der Web-Service liefert das Ergebnis als SOAP-Nachricht zurück. loadjava -u sys/passwd@orcl10 -r -v -s -grant PUBLIC soap.jar Abb. 4: Verschiedene SOAP-Klassen in eine Datenbank laden. exec dbms_java.grant_permission ('USER1', 'SYS:java.util.PropertyPermission', '*', 'read,write'); exec dbms_java.grant_permission ('USER1', 'SYS:java.net.SocketPermission', 'localhost', 'resolve'); Abb. 5: Privilegien für den Java Stored Procedure Eigentümer vergeben. loadjava -user user1/passwd@orcl10 -resolve -verbose Pck_seminarStub.java Abb. 6: Die Java-Stub-Klasse in die Datenbank laden. CREATE OR REPLACE FUNCTION holePreis(kurs VARCHAR2) RETURN NUMBER AS LANGUAGE JAVA NAME 'Pck_seminarStub.holePreisWebService(java.lang.String) return java.lang.BigDecimal'; / show errors Abb. 7: Einen PL/SQL-Wrapper für eine Java-Stub-Klasse erstellen. SQL> SELECT holePreis('Java Grundlagen') Seminar_Preis FROM dual; SEMINAR_PREIS ------------1600 Abb. 8: Die Java Stored Procedure holePreis starten. handenen Java-Stub-Klassen erstellt werden (siehe Abbildung 7). Ein PL/SQL-Wrapper kann wiederum wie eine herkömmliche PL/SQLStored Function gestartet werden (siehe Abbildung 8). C) Alternative mit UTL_DBWS PL/SQL-Package Ab der Oracle Version 10g stellt Oracle für die Kommunikation mit Web-Services ein neues PL/SQL-Package UTL_DBWS zur Verfügung. Mit diesem Package ist es ebenfalls möglich, aus der Datenbankprogrammiersprache PL/SQL Web-Services aufzurufen. Voraussetzungen für das PL/SQL-Package UTL_DBWS Um das PL/SQL-Package UTL_DBWS verwenden zu können, muss die Datei utl_dbws_jserver.jar in die Datenbank geladen wer­ den. 35 Datenbanken Die aktuelle utl_dbws_jserver.jar Datei kann auf der Ora­cle Internet­seite [1] heruntergeladen werden und z. B. mit dem Programm LOADJAVA in eine Datenbank unter dem Datenbankbenutzer SYS geladen werden (siehe Abbildung 9). Außerdem muss für das Package UTL_DBWS ein PUBLIC SYNONYM erstellt werden (siehe Abbildung 10). Beispielprogramm mit PL/SQL-Package UTL_DBWS Der Zugriff auf einen Web-Service erfolgt mit Hilfe des Packages UTL_DBWS. Auch hierzu finden Sie ein Beispielprogramm im Internet unter http://www.ordix.de/ORDIXNews. Zuerst werden eine Service-Instanz und eine Call-Instanz erzeugt. Diese beiden Instanzen werden benötigt, um Eigenschaften wie unter anderem URL-Adresse, Operationen oder Encodingstyle-URI zu definieren und anschließend den Web-Service aufzurufen. Außerdem werden Parameter hinzugefügt und der Datentyp des Rückgabewertes definiert. Schließlich werden mit der Funktion UTL_DBWS.INVOKE der vorher definierte Web-Service aufgerufen und die Rückgabewerte ausgegeben. loadjava -u sys/passwd@orcl10 -r -v -f -s -grant public -noverify -genmissing utl_dbws_jserver.jar Abb. 9: Die Datei utl_dbws_jserver.jar in eine Datenbank laden. CREATE PUBLIC SYNONYM UTL_DBWS FOR SYS.UTL_DBWS; Abb. 10: Ein Public Synonym für das PL/SQL-Package UTL_DBWS erstellen. Links ► http://www.oracle.com/technology/sample_code/tech/java/jsp/ dbwebservices.htm Glossar XML Extensible Markup Language. XML ist eine so genannte Meta-Sprache zur Beschreibung von Dokumenten. Ein Vorteil von XML ist der vereinfachte Austausch von Daten, da XML-Formate in einer strengen Grammatik defi­niert werden können und so die Implementierung von zuverlässigen Schnittstellen erlaubt. SOAP Simple Object Access Protocol ist ein Protokoll, mit dem Daten zwischen Systemen ausgetauscht und Remote Procedure Calls durchgeführt werden können. JDeveloper JDeveloper ist eine grafische Entwicklungsumgebung von Oracle für die Programmiersprache Java und die Datenbankprogrammiersprache PL/SQL. STATIC Mit dem Schlüsselwort STATIC kann eine Methode in der Program­miersprache Java als eine Klassenmethode deklariert werden. Das besondere an einer Klassen­ methode ist, dass diese zu einer Klasse und nicht zu einem Objekt gehört. Außerdem ist im Speicher immer nur eine Kopie einer Klassenmethode vorhanden. 36 Vergleich der Alternativen Bei der Alternative A) mit dem PL/SQL-Package UTL_HTTP handelt es sich um eine reine PL/SQL-Lösung, die mit dem her­kömmlichen HTTP-Protokoll realisiert wurde. Diese Alternative sendet demnach einen HTTPRequest und bekommt als Antwort einen HTTPResponse. Der HTTP-Request und der HTTPResponse beinhalten jeweils eine SOAP-Nachricht im XML-Format. Dagegen verwenden die beiden anderen Alternativen B) und C) direkt das SOAP-Protokoll, das auf dem HTTP-Protokoll basiert. Performancetest Zum Vergleich der hier vorgestellten Alternativen wurde eine Messung der Zugriffszeiten auf den Web-Service „SeminarPreiseService“ vorgenommen. Die folgende Übersicht stellt die durchschnittlichen Zugriffszeiten auf den Web-Service dar. Die Messung zeigt, dass die Alternative A) (mittels UTL_HTTP) den schnellsten Zugriff auf den Web-Service ermöglicht: Alternative: A) UTL_HTTP B) Java Stored Procedures C) UTL_DBWS Durchschnittliche Zugriffszeit auf einen Web-Service in Sekunden: 0,04 0,07 0,23 Resümee In diesem Beitrag wurde aufgezeigt, wie mit der Datenbankprogrammiersprache PL/SQL auf Web-Services zugegriffen werden kann. Es wurden drei Alternativen vorgestellt, die alle zum Aufruf eines Web-Services aus einer Ora­ cle Datenbank verwendet werden können. Die Alternative A) ermöglicht dabei den schnellsten Zugriff auf einen Web-Service. Da das PL/SQL-Package UTL_DBWS noch über viele undokumentierte Funktionen verfügt und erst ab der Oracle Version 10g vorhanden ist, sollte es mit Vorsicht eingesetzt werden. Vor allem bei den Performancetests benötigt UTL_ DBWS die längsten Zugriffszeiten auf den WebService. Die beiden Varianten UTL_HTTP und Java Stored Procedure können zudem bereits in den Vorversionen von Oracle10g eingesetzt werden. Markus Fiegler ([email protected]). ORDIX News 2/2006 Datenbanken – TitelthemaDatenbanken IBM IDS 10.0 IBM Informix Dynamic Server 10.0 Neuheiten (Teil II): Das Administrieren wird einfacher für den Informix DBA Neben den neuen Sicherheits Features – wir berichteten in ORDIX News 4/2005, Seite 26 – sind mit IBM Infor­ mix 10.0 (und 9.4) einige sehr interessante Neuerungen für die beiden Backup Tools ontape und onbar hinzugekommen. Dieser Artikel stellt zunächst den Renamed Restore vor, der mit beiden Sicherungstools angewendet werden kann. Im Weiteren erfahren Sie, wie Sie eine Sicherung auf die Unix Standardausgabe über ontape umlenken und welche Vorteile sich daraus ergeben. Den ebenfalls im Release 10.0 neu eingeführten Table Level Restore stellen wir in der kommenden Ausgabe vor. Renamed Restore Der Renamed Restore wurde bereits im Release 9.4 implementiert. Seine Vorzüge möchten wir nochmals erwähnen, da sich gerade für den Bereich des Restores völlig neue Möglichkeiten gegenüber älteren Informix Versionen eröffnen. Genutzt werden kann das Feature mit den beiden Backup Tools ontape und onbar. Beide verfügen über entsprechende Optionen. Mit dem Renamed Restore kann man seit der Version IDS 9.4 Chunks in einer anderen Destination wiederherstellen. Muss eine Datenbank z. B. auf Grund einer fehlerhaften Festplatte zurückgespielt werden, so kann durch die Rename Option direkt ein anderes Device genutzt werden. Das ist besonders dann von Vorteil, wenn keine symbolischen Links verwendet wurden beziehungsweise wenn kein weiteres System zur Verfügung steht und die wiederherzustellende Datenbank nicht allein im Online-System liegt. Dieser Artikel richtet sich an Datenbankadministratoren, System­ administratoren und Entscheider. den. Über diese Funktion lassen sich ebenfalls die Offset-Adressen ändern. Anwendungsbeispiel ontape Das folgende Beispiel zeigt die Optionen des Tools ontape beim Full Restore einer Datenbank, bei dem das Root-Dbspace in eine andere Destination zurückgespielt wird. In diesem Fall werden die entsprechenden Parameter und Chunk-Namen dem Befehl direkt mitgegeben. Nach der Option –p folgt die absolute Pfadangabe des alten Chunks, nach der Option –n die absolute Pfadangabe des neuen Chunks. Die Option –o beschreibt den jeweiligen Offset. Beispiel für einen Renamed Restore mit dem Tool ontape: ontape –r –rename –p /opt/informix/dev/rootdbs_old –o 0 –n /opt/informix/dev/rootdbs_new –o 0 In der ONCONFIG-Datei, die für den Restore benutzt wird, muss der Parameter ROOTPATH identisch mit dem des Backups sein. Wird kein Rename des „Initial Chunks“ des ROOTDBS vorgenommen, so wird dieser überschrieben. Andernfalls wird die Änderung auf den neuen ROOTPATH vom Backup Tool (ontape/onbar) vor der Initialisierung des Datenbank-Servers in der ONCONFIG-Datei durchgeführt. Im Verzeichnis $INFORMIXDIR/etc wird eine Sicherheitskopie mit entsprechendem Zeitstempel der alten ONCONFIG-Datei angelegt. Im Weiteren ist somit das einfache Duplizieren von Informix Datenbankinstanzen auf dem gleichen Server System möglich, z. B. für das Duplikat der Produktivinstanz auf eine Testin­stanz. Für den Fall, dass mehrere Chunks während eines Restores umbenannt werden sollen, kann zur Vereinfachung eine ASCII-Datei verwendet werden. Diese beinhaltet die Gegenüberstellung der alten und neuen Chunk-Namen, einschließlich der Offsets (siehe Abbildung 1). Hierbei muss der Datenbankadministrator die neue Chunk-Liste jedoch sehr sorgfältig zusammenstellen, damit keine Datenbereiche der originalen Instanz überschrieben wer- Dem Restore Kommando wird dann mit der Option –f die Datei renamed_restore als Argument übergeben: ORDIX News 2/2006 ontape –r –rename –f /opt/informix/renamed_restore 37 Datenbanken /opt/informix/dev/rootdbs_old 0 /opt/informix/dev/rootdbs_new 0 /opt/informix/dev/llogdbs_old 0 /opt/informix/dev/llogdbs_new 0 /opt/informix/dev/datadbs_old 0 /opt/informix/dev/datadbs_new 0 Abb. 1: Der Aufbau der Datei renamed_restore mit altem und neuem Pfad. Die 0 beschreibt jeweils den alten bzw. neuen Offset des Chunks. Als Trennzeichen dient ein Leerzeichen (Blank). Anwendungsbeispiel onbar Einfache Umlenkung Für die Wiederherstellung mit dem Tool onbar gelten die gleichen Optionen wie in den oberen Beispielen für das ontape-Kommando. Beispiel für einen Renamed Restore mit dem Tool onbar: Möchte man einmalig eine Sicherung auf ein anderes Device schreiben, als in der ONCONFIG-Datei spezifiziert wurde (TAPEDEV), so musste man bei früheren Informix Versionen zunächst den Parameter in der Konfigurationsdatei ändern. Durch die Umlenkung der Ausgabe erspart man sich nun diesen Schritt. onbar –r –rename –p /opt/informix/dev/rootdbs_old –o 0 –n /opt/informix/dev/rootdbs_new –o 0 Für einen Renamed Restore mehrerer Chunks kann man dem Befehl onbar ebenfalls mit der Option -f eine ASCII Datei als Argument mitgeben: onbar –r –rename –f /opt/informix/renamed_restore Der Renamed Restore kann nur durchgeführt werden, wenn sich der Datenbankserver im Offline-Modus befindet. Dies gilt auch für die Wiederherstellung nicht kritischer Datenbankbereiche. Ein teilweiser Restore des Online-Systems (kritische DBSPACES und nur die nicht kritischen DBSPACES, die wirklich benötigt werden) ist ebenfalls möglich. ontape auf die Standardausgabe sichern Ab dem Release 10.00 kann man mit ontape Sicherungen auf die Standardausgabe (STDIO) umlenken, bzw. den Input beim Re­ store von der Standardeingabe lesen. Gerade für den Datenbankadministrator ergeben sich dadurch einige sehr interessante Vorteile unter Unix, da er somit den PipeMechanismus voll nutzen kann. Wir wollen das im Folgenden aufzeigen: $ ontape -s -L 0 -v -t STDIO > \ /home/informix/sicherung_01 10 percent done. 20 percent done. 30 percent done. 100 percent done. Please label this tape as number 1 in the arc tape sequence. This tape contains the following logical logs: 35 Programm over. Abb. 2: Eine Vollsicherung des Datenbanksystems wird auf die Standardausgabe (–t STDIO Option) und in der Shell für den ontapeBefehl die Standardausgabe in eine Datei umgelenkt. 38 Mit ontape –s –L 0 wird eine Vollsicherung (Level 0) des Datenbanksystems erstellt. Das Ergebnis dieses Befehls wird mit –t STDIO auf die Standardausgabe geleitet. Über eine einfache Umlenkung kann nun das Ziel des Backups angegeben werden. Abbildung 2 zeigt einen solchen Backup-Befehl. Auch beim Restore einer ontape Sicherung besteht die Möglichkeit, z. B. mittels Umlenkung von der Standardeingabe eine Sicherung zu lesen und z. B. über eine Pipe an den Re­ store-Befehl zu übergeben. In Abbildung 3 ist das ent­sprechende Kommando zu sehen. Direkte Komprimierung Sehr nützlich ist auch, z. B. die Sicherung direkt zu komprimieren, was früher nur kompliziert über Named Pipes gelöst werden konnte. Wie oben beschrieben, wird wieder eine Vollsicherung angestoßen und das Ergebnis auf die Standardausgabe umgeleitet. Über den normalen Unix Pipe-Mechanismus erfolgt dann die Komprimierung des Backups. Beispiel für die mögliche Komprimierung: ontape –s –L 0 –t STDIO | gzip > \ /home/informix/sicherung_01.gz Remoteverarbeitung Eine ontape Sicherung auf die Standardausgabe kann auch sofort remote, z. B. mittels rsh oder auch ssh weiterverarbeitet werden. Auf Server A wird eine Sicherung erstellt und remote auf Server B mit dem gleichen Befehl wiederhergestellt. Dafür wird eine fertig konfigurierte Informix Installation auf Server B vorausgesetzt. Sollte sich die Struktur der Chunks unterscheiden, ORDIX News 2/2006 Datenbanken so kann an dieser Stelle auch zusätzlich das Feature des Renamed Restores angewendet werden, um eine Wiederherstellung dennoch zu ermöglichen. Es ist allerdings wichtig, vor dem eigentlichen Restore-Befehl die nötige Informix Umgebung (Shellvariable) gesetzt zu haben, damit die Wiederherstellung auf Server B durch­geführt werden kann. Beispiel für eine Remoteverarbeitung: ontape –s –L 0 –t STDIO | rsh Server B " export INFORMIXDIR=/opt/informix/; export INFORMIXSERVER=informix; export ONCONFIG=onconfig.informix; export PATH=$INFORMIXDIR/bin:$PATH; ontape –r –t STDIO" Dieses Feature bringt dem Datenbankadministrator eine große Zeitersparnis z. B. beim Aufbau eines Produktionsabbildes für Testund Entwicklungszwecke oder auch beim Auf­ bau einer Informix HDR Hochverfügbarkeitslösung. Weitere Neuerungen im Überblick Die Konfigurationsparameter TAPESIZE und LTAPESIZE dürfen den Wert 0 annehmen. Dadurch wird die Bandkapazität der Sicherungsmedien automatisch ermittelt und komplett ausgenutzt. Für Sicherungen, die mit ontape erstellt worden sind, gibt es schon seit längerem das Kom­ mando onlog. Mit diesem Kommando kann man die gesicherten logischen Logs analysieren. Für eine Point-in-time- (onbar) bzw. Point-inLog-Wiederherstellung ist dieses Feature wichtig, um den genauen Zeitpunkt von Transaktionen zu ermitteln, die Daten zerstört haben (beispielsweise einem Anwenderfehler). Ab dem Release 10.00 steht nun auch dem Back­ up Tool onbar ein „Logical Log Display“ für archivierte logische Logs zur Verfügung. Auch im Backup- und Recovery-Umfeld wird die Integration weiterer IBM Produkte in den Informix Dynamic Server deutlich. So wird mit dem neuesten Release auch ein Tivoli Data Protector für Informix (TDPI) ausgeliefert. $ cat /home/informix/sicherung_01 | ontape \ -r -v -t STDIO Archive Tape Information Tape type: Online version: Archive date: User id: Terminal id: Archive level: Tape device: Tape blocksize (in k): Tape size (in k): Tape number in series: Archive Backup Tape IBM Informix Dynamic Server Version 10.00.UC4 Thu Mar 23 11:40:30 2006 informix /dev/pts/2 0 STDIO 32 0 1 Spaces to restore:1 [rootdbs 2 [llogdbs 3 [physdbs 4 [datadbs Abb. 3: Restore unter Verwendung von STDIO. Die Abbildung zeigt nur die ersten Zeilen. Glossar Chunk Offset ONCONFIG-Datei ROOTPATH High Data Replication (HDR) Eine Datei im Filesystem oder eine unformatierte Partition einer Festplatte, die von Informix zur Datenspeicherung genutzt wird. Bereich am Anfang eines Chunks, der nicht mit Daten beschrieben werden soll, um nicht eventuell Systeminformationen einer Festplatte zu überschreiben. Informix Konfigurationsdatei Parameter in der Informix Konfigurationsdatei Replikationsart unter Informix zur Duplizierung von Daten eines Datenbankservers auf einen weiteren. ist und eine Wiederherstellung der Struktur aufgrund eines Festplattendefektes durchgeführt werden muss. Dies kann dem Datenbankadministrator eine enorme Zeitersparnis und dem Unternehmen erhebliche Kosteneinsparungen bringen. Die Erweiterungen für das ontape Kommando, die Sicherung auf STDIO umzulenken, sind im täglichen Administratorenleben sehr hilfreich. Zusammen mit der Rename-Option besteht je nach Datenvolumen eine schnelle und einfache Möglichkeit, ein Produktionsabbild aufzubauen (auch auf demselben Server). Auch für einmalige Sicherungen auf andere Medien ist diese Funktion sehr hilfreich. Fazit In der nächsten ORDIX News berichten wir über die Neuerungen im onbar/archecker Umfeld und die Wiederherstellung einzelner Tabellen über den Table Level Restore. Der Renamed Restore ist die optimale Lösung für Informix Datenbanksysteme, auf denen nicht mit symbolischen Links gearbeitet worden Thorsten Schuhmacher ([email protected]). ORDIX News 2/2006 39 Projektmanagement Projektmanagement Coaching: Lernen ohne zu scheitern! Das erste Projekt eines angehenden Projektleiters kann durchaus ein teures Experiment werden. Erst sehr spät – meist zu spät – lässt sich erkennen, ob der Projektleiter erfolgreich war und die richtigen Entscheidungen getroffen hat. Um die Risiken im Projekt zu minimieren, bietet es sich an, dem angehenden Projektleiter einen erfahrenen Coach zur Seite zu stellen. Dieser Artikel richtet sich an angehende Projektleiter, für die aufgrund nicht ausreichender Erfahrung ein Coaching sinnvoll ist. Und er richtet sich an Entscheider, die ein Projekt an einen noch nicht ausreichend erfahrenen Projektleiter übertragen wollen oder müssen. Wie wird man Manager? In der ORDIX News 4/2005, Seite 20, haben wir deutlich gemacht, dass ein Projektmanager alle Fähigkeiten, Kompetenzen und Erfahrungen eines Managers benötigt. Umso größer ein Projekt ist, desto wichtiger wird das „Management“ in dem Wort Projektmanagement (PM). Doch die Fragen, die bleiben, sind: Wie wird man Manager? Wie lernt man Projektmanagement, ohne gleich das erste Projekt zum Scheitern zu bringen? Training ist notwendig, aber nicht hinreichend Um in der Analogie zu bleiben, gibt es inzwischen genauso, wie es Managementschulungen für Führungskräfte gibt, ein großes Angebot an Trainings im Bereich Projektmanagement. Es empfiehlt sich grundsätzlich, eine Einführungsschulung zu besuchen, bevor man sich an sein erstes Projekt wagt. Hierbei bekommt man einen Überblick über alle Phasen eines Projektes und über die wesentlichen Erfolgsfaktoren. Später sollte man begleitend zur praktischen Projektarbeit insbesondere folgende Schwerpunkte vertiefen: • Projektplanung • Change Request Management • Kommunikation im Projekt Solche Schulungsmaßnahmen sind sehr sinnvoll, aber in der Regel nicht ausreichend, um einen Projekterfolg ohne teuere Lernkurven sicherzustellen. Coaching ist gerade am Anfang wichtig In den letzten Jahren hat sich in der Managemententwicklung das professionelle Coaching durchgesetzt, um den angehenden Manager in den ersten Phasen in seiner neuen Funktion zu unterstützen. Dieses Vorgehen setzt sich immer mehr auch in dem Bereich Projektmanagement durch. Ein erfahrener (Senior-)Projektmanager wird dem neuen Projektleiter zur Seite gestellt. Er hilft ihm, sein 40 Projekt professionell aufzusetzen und durchzuführen. Gerade am Anfang eines Projektes werden die wesentlichen Entscheidungen getroffen, die den Erfolg beziehungsweise Misserfolg des Projektes entscheidend prägen. Daher ist ein Coaching gerade am Projektstart am effektivsten. Empfehlenswert ist es hier, insbesondere für die folgenden Phasen einen Coach einzusetzen: • Initiation (Zielvereinbarung, Vertrag) • Planung (Inhalt und Umfang, Arbeitspakete, Meilensteine, Terminplan, Kostenplan, Risikomanagement Planung, Ressourcenplanung etc.) Wenn das Coaching in diesen Phasen erfolgreich war, reicht es häufig in den folgenden Projektphasen aus, einen festen „Jour Fixe“ pro Woche durchzuführen, um aktuelle Fragen aus dem Projekt zu klären und den Projekterfolg insgesamt zu überwachen. Coaching in kritischen Phasen Aber auch in späteren Phasen kann ein Coaching im Projekt sinnvoll sein, z. B. dann, wenn ein Projekt in eine kritische Phase gerät: • • • • • Probleme bei der Meilensteineinhaltung Ressourcen-Engpässe Qualitätsprobleme Konflikte im Projekt Eskalationen u. ä. Auch wenn dem Projektleiter eine bestimmte, dringend benötigte Kompetenz beziehungsweise Erfahrung im Laufe des Projektes fehlt, ist das Einschalten eines PM-Coaches sinnvoll, z. B. für • das Change Request Management bei • ständigen Änderungswünschen des Auftraggebers das Change Management bei absehbar großen Veränderungen für die Nutzer des neuen Systems ORDIX News 2/2006 Projektmanagement • das PM-Controlling bei fehlender Kosten• • • und Leistungstransparenz die Team-Entwicklung bei heterogener Pro­ jektorganisation das Konfliktmanagement bei wachsenden Konflikten im Projekt das Risikomanagement bei drohenden Gefahren im Projekt Die Grundregel beim Coaching Projekt übernehmen. Ansonsten hätte das genauso fatale Auswirkungen, wie wenn sich ein Fußballtrainer selbst einwechseln würde. Der PM-Coach soll coachen und keine Tore schießen. Hindernisse überwinden Manchmal gibt es Hindernisse zu überwinden, wenn angehende Projektleiter sich fehlende Kompetenzen nicht eingestehen können oder glauben, das bisschen Projektmanagement nebenher schon leisten zu können. Eine Grundregel muss der Coach stets be­­­ach­ ten: Er arbeitet grundsätzlich und ausschließ­ lich nur mit dem Projektleiter zusammen. Gegen­ über dem Projektteam und der restlichen Projektorganisation tritt er nicht in Erscheinung und überlässt dem Projektleiter das Feld. In solchen Fällen kommt die Einsicht einer Überforderung meistens zu spät. Hier ist der Vorgesetzte gefordert, den Mitarbeiter zu überzeugen, dass es keine Form von Schwäche ist, sich professio­ nell unterstützen zu lassen. Andernfalls wird der PM-Coach schnell zum heimlichen Projektmanager und untergräbt die Entscheidungskompetenz und Autorität des offiziellen Projektleiters. Projektmanagement ist eine Kompetenz, die letztlich nur durch Praxis und Erfahrung erreichbar ist. Damit der Lernprozess nicht durch gescheiterte Projekte zu teuer wird, empfiehlt es sich, PMCoaching als risikominderndes Instrument einzusetzen. Insofern ist es insbesondere wichtig, gleich zu Beginn des Coachings die Art der Zusammenarbeit zwischen Coach und Projektleiter eindeutig zu regeln. Wichtig ist, dass beidseitig die Erwartungen, Kompetenzen und die Organisation der Zusammenarbeit geklärt sind. Grundsätzlich legt ORDIX großen Wert darauf, das Wissen schrittweise auf die Mitarbeiter des Kunden zu übertragen. Coaching ist hierfür – nicht nur im Projektmanagement – ein hervorragendes Mittel. Auch wenn die Versuchung sehr groß ist, darf der Coach niemals direkte PM-Aufgaben im Fazit Fordern Sie uns! Benedikt Georgi ([email protected]). Impressum Autoren dieser Ausgabe: Herausgeber: Sascia Brinkmann, Markus Fiegler, Andreas ORDIX AG Flügge, Benedikt Georgi, Klaus Günther, Aktiengesellschaft für Software­ent­wick­lung, Informationen zu den Chess Classic Mainz Sie unter www.chesstigers.de. Stefanie Hei­2005 ther, finden Michael Heß, Matthias Jung, Beratung,Weitere Schulung und Systemintegration, Wolf­gang Kög­ler, Andreas Kother, Beate Paderborn Stefanie Heither ([email protected]). Künneke, Michael Lindermann, Rainer Restat, Redaktion: Thorsten Schumacher Helma Jenniches, Sascia Brinkmann Copyright: V.i.S.d.P.: Wolfgang Kögler ORDIX AG. Alle Rechte vorbehalten. Eine Haftung für die Richtigkeit der Veröffentlichungen kann trotz sorgfältiger Prüfung durch die Redaktion Anschrift der Redaktion: vom Herausgeber nicht übernommen werden. ORDIX AG Westernmauer 12 - 16 Die Zeitschrift ORDIX News wird von der ORDIX AG an ausgesuchte 33098 Paderborn Kunden verteilt und kann für 2,20 Euro bestellt werden. Sie finden sowohl Tel.: 05251 1063-0 die neueste Ausgabe als auch ältere Ausgaben im Archiv der ORDIX Fax: 0180 1673490 News im Internet unter: http://www.ordix.de. Schauen Sie mal rein! Gestaltung/Layout: Sascia Brinkmann Der Kontakt zu unseren Lesern ist uns sehr wichtig. Für An­regungen, Kritik und Anmerkungen zu den Themen, aber auch für interessante Auflage: 8.900 Ideen sind wir immer offen und dankbar. Sie erreichen die Redaktion Druck: auch per E-Mail unter [email protected]. Druckerei Reike GmbH, Wir freuen uns auf Ihr Feedback. Paderborn ORDIX News 2/2006 41 Java/XML – Titelthema Hibernate Wenn der Vater mit dem Sohne ... Vererbung mit Hibernate Dass Hibernate die Persistierung von Java-Objekten in einer relationalen Datenbank wie im (Winter-)Schlaf beherrscht, zeigte der einführende Artikel in der ORDIX News 4/2005. Dass Hibernate aber nicht nur einfache Objekte, sondern auch ganze Objekthierarchien abbilden kann, zeigen wir in diesem Artikel. Der Artikel richtet sich an Softwarearchitekten und Java-Entwickler, die sich mit Vererbung und Hibernate beschäftigen. Die Klassen innerhalb einer objektorientierten Programmiersprache sind nicht nur die Summe ihrer Attribute. Die Objekte stehen auch in Beziehung zueinander, so dass es Basisklassen und davon abgeleitete Subklassen gibt. Und so ist eine Klasse nicht nur durch ihre eigenen Attribute, sondern auch durch die der Elternklasse definiert. Hibernate unterstützt als vollwertiger O/R-Mapper natürlich auch bei der Abbildung dieser Beziehungen. Die drei folgenden Ansätze werden von Hibernate zur Verfügung gestellt. • Eine Tabelle pro Klassenhierarchie • Eine Tabelle pro Subklasse • Eine Tabelle pro konkreter Klasse Für welchen Weg man sich entscheidet, hängt davon ab, wie komplex die abzubildenden Hierarchien sind. Des Weiteren bringen die verschiedenen Vorgehensweisen auch gewisse Einschränkungen mit sich, die man bei seiner Entscheidung in Betracht ziehen muss. Für die weitere Vorstellung sei die in Abbildung 1 gezeigte Hierarchie von Zahlungsarten gegeben. Zunächst gibt es eine Basisklasse Zahlung (siehe Abbildung 2), die Zahlungen im Allgemeinen beschreibt. Da ein Betrag in allen Zahlungsformen vorhanden ist, ist das Attribut Betrag innerhalb der Basisklasse zu finden. Ferner gibt es noch zwei Subklassen KreditkartenZahlung (siehe Abbildung 3) und BarZahlung (siehe Abbildung 4). In einer objektorientierten Welt erscheint dies trivial. In der Welt relationaler Datenbanken ist es grundsätzlich nicht vorgesehen. Jeder auf seine Art In diesem Zusammenhang sind daher drei beispielhafte Szenarien interessant: • Eine einfache Verknüpfung zwischen ei­nem Auftrag und einer Zahlung. • Eine Liste von Zahlungen für eine Rechnung; d. h. eine Rechnung wird nicht einmalig, sondern z. B. in Raten beglichen. public class Zahlung { protected int id; protected int betrag; protected int getId ( ) { return id; } protected void setId (int value) { id=value; } } protected int getBetrag ( ) { return betrag; } protected void setBetrag (int value) { betrag=value; } Abb. 2: Die Basisklasse Zahlung. 42 Abb. 1: Beispiel einer einfachen Vererbungshierarchie. • Eine Suche nach Zahlungen, die einen bestimmten Wert übersteigen. Wichtig ist dabei das polymorphe Verhalten einer Zahlung, wenn wir auf sie zugreifen. D. h. wenn eine Zahlung eine Kreditkartenzahlung ist, möchten wir auch direkt den Zugriff auf die Kreditkartenart haben, während bei einer Barzahlung aufgrund des Geldwäschegesetzes ab einer gewissen Höhe der Einzahler von Bedeutung ist. In den oben beschriebenen Szenarien bedeutet das, dass beim Erzeugen der Verknüpfung, der Liste und der Ergebnismenge polymorphe Objekte verwendet werden. D. h. es handelt sich dabei zwar grundsätzlich immer um Zahlungen, aber entsprechend der noch zu beschreibenden Vererbungsdefinition legt Hibernate Instanzen der entsprechenden Subklassen an. In einem Auftrag kann also hinter der Zahlung eine Kreditkarten- oder eine Barzahlung stecken. In der Liste von Zahlungen einer Rechnung und in der Ergebnismenge der Suche können dann sogar Objekte aller möglichen Ausprägungen kombiniert sein: Es finden sich in der Liste bzw. in der Ergebnismenge Objekte vom Typ KreditkartenZahlung genauso wieder wie Objekte vom Typ BarZahlung. Eine für Alle Die einfachste Art, eine Vererbungshierarchie abzubilden, ist der Ansatz der „Tabelle pro Klassenhierarchie“. Hierbei werden alle Attribute (gemeinsame, wie individuelle) innerhalb der Hierarchie in einer einzigen Tabelle gespeichert. Wie Abbildung 5 zeigt, erfolgt die Unterscheidung der Subklassen an Hand einer Discrimina- ORDIX News 2/2006 Java/XML tor-Spalte (engl. „Unterscheider“). Die Subclass-Elemente definieren dann den für sie spezifischen Wert des Discriminators. Auch wenn dies wenig administrativen Auf­wand innerhalb der Datenbank bedeutet, sollte man doch einiges beachten. So steht dieses Modell im Gegensatz zur Normalisierung, welche in relationalen Datenbanken angestrebt wird. Statt dessen werden hierbei unter Umständen sogar bewusst Daten redundant gehalten. Des Weiteren erzwingt dieser Ansatz, dass alle Attribute der Subklassen „nullable“ sind. Eine Prüfung der Datenkonsistenz für die Pflichtfelder durch einen entsprechenden „not null“-Constraint auf Datenbankebene ist also nicht möglich. Ein Vorteil ist die Tatsache, dass beim Einlesen von Daten aus der Persistenzschicht keine Tabellen miteinander verknüpft werden müssen. Fair geteilt Auch wenn der zuvor gezeigte Ansatz sehr einfach zu implementieren ist, hat er doch einige Nachteile. Insbesondere die Verletzung des Normalisierungsgrundsatzes ist ein gutes Gegenargument. Um dem Anspruch einer korrekten Normalisierung auf Datenbankseite gerecht zu werden, kann Hibernate auch individuelle Tabellen pro Subklasse einsetzen. Das Datenbankmodell entspricht dabei dann den javaseitigen Klassen. Gemeinsame Attribute der Vaterklasse liegen in der ihr zugeordneten Tabelle, die individuellen Eigenschaften der Subklassen liegen in jeweils eigenen Tabellen. Es werden insgesamt <Anzahl-Subklassen+1> Tabellen benötigt. Bei der Instanziierung lädt Hibernate dann die Daten aus der gemeinsamen wie auch aus der jeweils individuellen Tabelle. Abbildung 6 zeigt ein solches Beispiel. Innerhalb der „joined-subclass“-Elemente gibt es jeweils einen Verweis auf die Tabellen der Subklassen. Das Key-Element der Subklassen verweist jeweils auf die Spalte in der die Vaterklasse ihre ID ablegt. Innerhalb der Datenbank haben die Einträge für Subklassen jeweils immer den gleichen Primärschlüssel wie die Einträge für die Vaterklasse. Es handelt sich um 1:1-Relationen. ORDIX News 2/2006 import Zahlung; public class KreditkartenZahlung extends Zahlung { protected String kartennummer; protected String getKartennummer ( ) { return kartennummer; } protected void setKartennummer ( String value ) { kartennummer = value; } } Abb. 3: Die Subklasse KreditkartenZahlung. import Zahlung; public class BarZahlung extends Zahlung { protected String einzahler; protected String getEinzahler ( ) { return einzahler; } protected void setEinzahler ( String value ) { einzahler = value; } } Abb. 4: Die Subklasse BarZahlung. <class name="Zahlung" table="ZAHLUNG"> <id name="id" type="long" column="ZAHLUNGS_ID"> <generator class="native"/> </id> <discriminator column="ZAHLUNGS_TYP" type="string"/> <property name="betrag" column="BETRAG"/> ... <subclass name="KreditkartenZahlung" discriminator-value="KREDIT"> <property name="kartennummer" column="KARTENNUMMER"/> ... </subclass> <subclass name="BarZahlung" discriminator-value="BAR"> ... </subclass> </class> Abb. 5: Auszug aus der Zahlung.hbm.xml bei dem gewählten Ansatz „Tabelle pro Klassenhierarchie“. <class name="Zahlung" table="ZAHLUNG"> <id name="id" type="long" column="ZAHLUNGS_ID"> <generator class="native"/> </id> <property name="betrag" column="BETRAG"/> ... <joined-subclass name="KreditkartenZahlung" table="KREDITKARTENZAHLUNG"> <key column="ZAHLUNGS_ID"/> <property name="kartennummer" column="KARTENNUMMER"/> ... </joined-subclass> <joined-subclass name="BarZahlung" table="BARZAHLUNG"> <key column="ZAHLUNGS_ID"/> ... </joined-subclass> </class> Abb. 6: Auszug aus der Zahlung.hbm.xml bei dem gewählten Ansatz „Tabelle pro Subklasse“. <class name="Zahlung"> <id name="id" type="long" column="ZAHLUNGS_ID"> <generator class="sequence"/> </id> <property name="betrag" column="BETRAG"/> ... <union-subclass name="KREDITKARTENZAHLUNG" table="KREDITKARTENZAHLUNG"> <property name="kartennummer" column="KARTENNUMMER"/> ... </union-subclass> <union-subclass name="BarZahlung" table="BARZAHLUNG"> ... </union-subclass> </class> Abb. 7: Auszug aus der Zahlung.hbm.xml bei dem gewählten Ansatz „Tabelle pro konkreter Klasse“. 43 Java/XML Jeder bekommt Alles Der Ansatz „Tabelle pro konkreter Klasse“ stellt die Umkehr des eingangs vorgestellten Ansatzes „Tabelle pro Klassenhierarchie“ dar. Hierbei werden so viele Tabellen benötigt, wie es konkrete (Sub-)Klassen gibt (siehe Abbildung 7). Die vererbten Attribute werden jeweils mit in der Tabelle der Subklasse gespeichert. Wenn die Vaterklasse nicht abstrakt ist, und es folglich von ihr auch eigenständige Instanzen geben kann, wird für diese ebenfalls eine Tabelle benötigt. Glossar Hibernate Framework zur Speicherung von Daten. Als Backend-System dient eine Datenbank (siehe ORDIX News 04/2005). null Beschreibt eine Datenbank Spalte die „nichts“, also den Wert „null“ annehmen kann. Nicht zu verwechseln mit dem numerischen Wert Null (0). not-null Gegenteil von null, d. h. es muss immer ein konkreter Wert abgespeichert werden. Constraint Beschreibt Bedingungen für den Inhalt von Tabellenspalten. Wird typischerweise verwendet, um eine Prüfung auf „notnull“ oder eine korrekte Fremdschlüsselbeziehung durchzuführen. Da die Bedingungen in der Datenbank formuliert sind, verhindern sie das Einpflegen „ungültiger“ Daten. NormaliVermeidet das mehrfache Speichern von konkreten Datensätzen. Anstatt z. B. einen Ortsnamen mehrfach zu sierung speichern, wird dieser nur einmalig unter einem Schlüssel abgelegt. Ebenso wie der erste Ansatz erzeugt auch dieser Ansatz Redundanzen auf der Datenbankseite und widerspricht somit dem Normalisierungsgedanken. Eine Einschränkung ist, dass die Spaltennamen der gemeinsamen Attribu­ te in allen Subklassentabellen identisch sein müssen. Ein weiterer Nachteil dieses Ansatzes ist, dass Hibernate in diesem Fall nur eingeschränkte polymorphe Abfragen unterstützt. Wer sich nach dem Sinn eines solchen Mappings fragt, sollte immer an die unterschiedlichen Einsatzmöglichkeiten von Hibernate denken. Die meisten Projekte fangen nicht auf der Grünen Wiese an. Und wer noch nie – aus welchen Gründen auch immer, insbesondere in seinem vorherigen Leben als nicht-objekt­ orientierer Entwickler – beim Datenbankde­ sign die Normalisierungsregeln verletzt hat, der werfe den ersten Stein. Den weiteren Möglichkeiten von Hibernate werden wir uns in einer der kommenden Ausgaben der ORDIX News widmen. Wer seine Neugier eher stillen möchte, wird im ORDIX Seminarprogramm fündig. Dort gibt es ab sofort auch ein Seminar zum Thema Hibernate. Michael Heß ([email protected]). Rätsel Alles neu macht der Mai ... Das ORDIX Web wurden neu gestaltet, um Sie noch besser zu informieren! Der Relaunch gibt den Seiten ein frisches Gesicht. – Und Sie profitieren von noch mehr Übersichtlichkeit und einem vielfältigen, vernetzten Informationsangebot. Machen Sie sich selbst ein Bild! Und lösen Sie ganz nebenbei unser kleines Interneträtsel*. Dem Gewinner winkt ein „frisches“ Überraschungspaket. Senden Sie das Lösungswort bis zum 24.07.2006 mit dem Stichwort „Klickfrisch“ an [email protected]. 1. Welches Fachthema stellen wir als erstes auf der 1. ORDIX Homepage vor? 2. 2. Erklärtes Unternehmensziel ist, Kundenmehrwert zu schaffen. Welchen Grund für eine Zusammenarbeit 3. führen wir als zweites auf? 4. 3. Von wem (Nachname) stammt der Kundenkommentar 5. auf der Portfolio-Seite „Beratung“? 4. Der nördlichste ORDIX Standort 6. 5. Wir stellen einige ausgewählte Referenzen genauer vor. 7. Von welchem Kunden, dessen Logo einen gelben 8. Hintergrund hat, stammt das Projekt ZEM? 6. Wo können Sie unsere Seminare direkt online buchen? 9. 7. Wo werden viele Fachbegriffe/Abkürzungen aus 10. der ORDIX News erklärt? 8. Wie hieß der Vortrag, den ORDIX im Mai auf 11. der Jax gehalten hat? 12. 9. Wofür steht das „E“ in BEST-Practice? 10. Für welchen Ausbildungsberuf sucht ORDIX Azubis? 11. Welcher Produktpartner steht an 6. Stelle der alphabetischen Liste? 12. Wie viele Kunden im Bereich Training werden symbolisch durch Kundenlogos dargestellt? 44 * Der Rechtsweg sowie die Teilnahme von ORDIX Mitarbeitern und deren Angehörigen sind ausgeschlossen. ORDIX News 2/2006 Datenbanken Larry E. auf der Apfelplantage Oracle unter Mac OS X Wer den Begriff Apple hört, denkt entweder an iPods und iTunes oder an Golden Delicious, Boskop und Cox Orange. Dieser Artikel wird allerdings weder eine Reise zu den unterschiedlichen Apfelplantagen in dieser Welt, noch eine Abhandlung über Apples kleines „Kultobjekt“. Vielmehr soll die produktive Seite des Apfels gezeigt werden, der Einsatz von Mac OS X als Oracle Datenbankserver. Mac OS X und Datenbanken Schon seit der Oracle Version 9i existiert ein Release für das Betriebssystem Mac OS X, das jedoch nie den Entwicklungsstatus verlassen hat. Erst mit Version 10 schaffte Oracle den kompletten Sprung auf den Mac. Zuvor hatten Anwender nur die Wahl zwischen den beiden „Datenbanksystemen“: FileMaker Pro und Sybase. Um der Konkurrenz das Feld nicht kampflos zu überlassen, fiel bei Or acle Anfang 2000 die Entscheidung, auch Mac OS X in das Portfolio der zu unterstützenden Architekturen aufzunehmen. Ob Larry Ellison schon damals von Steve Jobs Plänen wusste, zur Intel Plattform zu wechseln, bleibt wohl ein Geheimnis der beiden Freunde und Geschäftspartner. StartService() ( if [ -a /etc/com.apple.named.conf.proxy ] then echo "Starting Internet address sharing" /usr/libexec/InternetSharing fi ulimit -Hu 2068 ulimit -Su 2068 ulimit -Hn 65536 ulimit -Sn 65536 } Abb. 1: Das Setzen der Shell Limits. Die Erweiterungen sind farblich hinterlegt. Der Artikel richtet sich an Oracle Datenbankadministratoren, die den Mac für ihre Oracle Datenbanken nutzen. Vorbereitungen für die Installation Zur Zeit ist ausschließlich Oracle 10g Release 1 für Mac OS Server 10.3 verfügbar. Doch auch die Installation unter der Standard Mac OS 10.4 Version ist möglich, wenngleich diese nicht vom Oracle Support abgedeckt wird. Vorausgesetzt wird die Installation der Apple Developer Tools [1]. Die Installation von Oracle auf Mac OS X unterscheidet sich nicht fundamental von der bisherigen Herangehensweise. Vielmehr gibt es kleine Unterschiede, vergleichbar mit einer Installation unter Windows zu einer Installation unter Solaris. Dies fängt beim Einrichten der Benutzer gleich an. Mac OS X verwaltet die lokalen Benutzer-Accounts und Gruppen nicht, wie üblich, in der /etc/passwd bzw. der /etc/group. Diese werden bei Mac OS zentral in einem Verzeichnis (NetInfo Directory) hinterlegt, vergleichbar mit einem LDAP3-Dienst. Zum Erstellen des Benutzers „oracle“ und der beiden Gruppen „oinstall“ und „dba“ kann die grafische Oberfläche „NetInfo Manager“ her angezogen werden. Effizienter geschieht dies über das Terminal. Anlegen der Gruppen „oinstall“ und „dba“: sudo sudo sudo sudo sudo sudo nicl nicl nicl nicl nicl nicl . . . . . . -create -append -append -create -append -append /groups/oinstall /groups/oinstall gid 600 /groups/oinstall passwd "*" /groups/dba /groups/dba gid 600 /groups/dba passwd "*" Anlegen des Benutzers Oracle: sudo sudo sudo sudo sudo nicl nicl nicl nicl nicl . . . . . -create -append -append -append -append /users/oracle /users/oracle /users/oracle /users/oracle /users/oracle uid 500 gid 600 shell /bin/bash home /Users/oracle Dem Benutzer Oracle die Gruppe „dba“ zuteilen: sudo nicl . -append /groups/dba users oracle Im Anschluss erfolgt das Erstellen des Home-Verzeichnisses unter /Users/oracle und die Zuweisung eines Passworts in gewohnter Unix-Manier. Abb. 2: Der bekannte Oracle Installer. ORDIX News 2/2006 sudo mkdir /Users/oracle sudo chown oracle:oinstall /Users/oracle sudo passwd oracle 45 Datenbanken Wurm im Apfel - Mögliche Fehler während der Installation Bei der Installation von Oracle, insbesondere beim Erstellen der Datenbank mit Hilfe des Database Configuration Assistants, kann es unter Mac OS X 10.4 zu Problemen kommen. Bricht der Installer mit einer Fehlermeldung ab, so kann dies über die Wahl des richtigen CCompilers „gefixt“ werden. Hierfür ist vor der Installation von Oracle der folgende Befehl abzusetzen: sudo gcc_select 3.3 Da Oracle die Version 10g offiziell nur bis Mac OS Server 10.3.4 unterstützt, kommt es beim Linken zu Problemen mit der gcc Version 4, die den Mac OS X Versionen > 10.4.x beiliegt. Danach sollte die Installation sauber verlaufen. Treten dann beim Erstellen der Datenbank folgende charakteristische Fehler auf, dyld: Symbol not found: _SSL_ALG_CLIENT_AUTH_MODE_RSA_SIGN_CLIENTSIDE_BS Referenced from: /oracle/product/10g/lib/libnnz10.dylib Expected in: flat namespace ORA-12547: TNS: lost contact error so kann dies durch einen kleinen Workaround behoben werden: mv $ORACLE_HOME/lib/libnnzLC.dylib $ORACLE_HOME/lib/ libnnzLC.dylib.bak cd $ORACLE_HOME/bin relink all mv $ORACLE_HOME/lib/libnnzLC.dylib.bak $ORACLE_HOME/lib/ libnnzLC.dylib Dieses Problem taucht jedoch nur bei Mac OS X Version 10.4.x auf und wird hoffentlich durch das nächste Oracle Release behoben. Ein bekannter Fehler schlägt beim Stoppen des Listeners zu. Der Befehl wird abgesetzt, bleibt jedoch hängen. Der Listener ist anschließend in einem unbrauchbaren Zustand. Er lässt sich weder Stoppen noch Starten. Auch hierfür gibt es einen Workaround: onsctl start lsnrctl stop onsctl stop Links ► [1] http://developer.apple.com/tools/ ► [2] http://www.oracle.com/technology/software/htdocs/devlic.html ?http://otn.oracle.com/software/products/database/oracle10g/htdocs/macsoft.html Zu den weiteren Vorbereitungen zählen das Anlegen der OFA-Verzeichnisstruktur und das Überprüfen von Kernel-Parametern. Vorgaben für letztere können dem Dokument „Oracle Installation Guide for Mac OS X“ entnommen werden, welches im Installationsarchiv liegt und unter [2] heruntergeladen werden kann. Die Kernel-Parameter können mit dem Kommando sysctl abgefragt und gesetzt werden, wie auf den meisten Unix-Systemen. Auf unserem Testrechner mussten nur zwei Parameter erhöht werden: sudo sysctl -a | grep maxproc sudo sysctl -w kern.maxproc=2048 sudo sysctl -w kern.macprocperuid=2048 Damit die Änderungen auch nach einem Reboot gesetzt bleiben, ist es ratsam, diese unter /etc/sysctl.conf zu hinterlegen. Das Setzen der Shell Limits ist wiederum Mac OS spezifisch. Die Limits werden in der Datei /System/Library/StartupItems/IPServices eingetragen. Abbildung 1 zeigt diese Datei. Die eingetragenen Erweiterun­gen sind rot markiert. Damit ist der größte Teil der Vorbereitungen getroffen. Als nächstes sollte nach Möglichkeit die Benutzerumgebung des Benutzers Ora­cle definiert werden, indem die folgenden Variabeln in der Konfigurationsdatei .bash_profile gesetzt werden: umask 022 export ORACLE_BASE=/Users/oracle/install export ORACLE_HOME=/oracle/product/10g export ORACLE_SID=BOSKOP export PATH=$PATH:$ORACLE_HOME/bin Installation der Software Nun kann die Installation der Software unter dem Benutzer Oracle erfolgen. Dazu muss man das heruntergeladene cpio-Archiv entpacken und den Installer starten. Die nachfolgenden Java Dialoge dürften nun jedem DBA vertraut sein (siehe Abbildung 2). Abb. 3: Nach der Installation: Oracle unter Mac OS X in Aktion. 46 Die einzelnen Schritte der Installation sind identisch mit denen unter Unix bzw. Windows. Ist die Software erfolgreich installiert, kann anschließend mit Hilfe des Database Configuration Assistant (dbca) die Datenbank erstellt werden. Das Einrichten von Oracle Net wird vom Net Configuration Assistant (netca) im Anschluss übernommen. Abbildung 3 zeigt Oracle unter Mac OS X im Einsatz. ORDIX News 2/2006 Datenbanken Glossar NetInfo Directory Interner Verzeichnisdienst, der unter Mac OS unter anderem zur Verwaltung der lokalen Benutzer und Gruppen dient. LDAP3 Verzeichnisdienst unter Unix, ähnlich NetInfo Directory unter Mac OS. Open Flexible Genormte VerzeichnisstrukArchitecture tur für den Aufbau eines (OFA) Oracle DB Servers. SystemStarter Daemon unter Mac OS zum Star­ten von Diensten, vergleichbar mit inetd unter Unix. SystemStarter statt inet Daemon Mac OS X nutzt für das Starten und Stoppen von Diensten den SystemStarter und nicht, wie auf anderen Unix Systemen, den inet Daemon. Der SystemStarter sucht die Start-/Stoppskripte unter den folgenden Verzeichnissen: • /Library/Startup­Items • /System/Library/Startup­Items. Um eine Oracle Instanz nun automatisch beim Booten hochzufahren, können die in Abbildung 4 und 5 abgedruckten Beispielskripte verwendet werden. Hierfür müssen diese im Verzeichnis /Library/StartupItems/Oracle/ abgelegt werden. Fazit Während ich diesen Artikel schreibe, läuft die Datenbank nun schon seit drei Wochen unter Mac OS X. Bis auf die Schwierigkeiten bei der Installation (siehe Kasten „Wurm im Apfel“), läuft das System stabil. Zu wünschen wäre, dass Oracle die Weiterentwicklung vorantreibt, so dass auch das zweite Release von Oracle 10g für die Mac Plattform erscheint – ohne die Kinderkrankheiten eines ersten Releases. Die Zahlen sprechen dafür: Apple konnte nicht nur im Konsumentenbereich bei Desktop-Systemen und iPods einen Zuwachs verzeichnen, sondern auch im Storage- und Server-Markt. Wie Gartner berichtete, hat Apple den Umsatz mit Speichersystemen im letzten Jahr verdoppeln können und liegt damit auf Platz 10 der Rangliste. Der Umstieg von Apple zur Intel Architektur könnte weitere Portierungen bei Oracle vereinfachen und gleichzeitig die Kosten hierfür senken. Michael Lindermann ([email protected]). ORDIX News 2/2006 #!/bin/bash # Globale Variabeln ORACLE_HOME=/oracle/product/10g PATH=$PATH:$ORACLE_HOME/bin ORACLE_OWNER=oracle ORACLE_OWNER_PATH=/Users/oracle ORACLE_SID=BOSKOP LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export ORACLE_HOME PATH ORACLE_SID LD_LIBRARY_PATH StartService() { ConsoleMessage 'Starting Oracle listener...' su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl start" ConsoleMessage 'Started Listener.' ConsoleMessage 'Starting Oracle databases...' su - $ORACLE_OWNER -c $ORACLE_HOME/bin/dbstart ConsoleMessage 'Started Oracle database.' } StopService() { ConsoleMessage 'Stopping Oracle databases...' su - $ORACLE_OWNER -c $ORACLE_HOME/bin/dbshut ConsoleMessage 'Stopped Oracle database.' ConsoleMessage 'Stopping Oracle listener...' su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/onsctl start" su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop" su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/onsctl stop" ConsoleMessage 'Stopped Listener.' } RestartService() { StopService StartService } RunService "$1" Abb. 4: Ein Beispielskript zum automatischen Starten und Stoppen von Oracle (/Library/StartupItems/Oracle/Oracle). <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList1.0.dtd"> <plist version="1.0"> <dict> <key>Description</key> <string>Oracle 10g Database Server</string> <key>Provides</key> <array> <string>Oracle 10g Database</string> </array> <key>Requires</key> <array> <string>Disks</string> </array> <key>Uses</key> <array> <string>Disks</string> <string>Network</string> <string>NFS</string> </array> <key>OrderPreference</key> <string>Late</string> </dict> </plist> Abb. 5: Die zum Start- und Stoppskript dazugehörige plist Datei (/Library/StartupItems/Oracle/StartupParameter.plist). 47 Ohne Taktik ... Die ORDIX Taktik ... ... mit System ans Ziel! • Optimales Zusammenspiel in einem hochmotivierten Team • 600 Personenjahre Spielpraxis auch in „torgefährlichen“ Situationen • Hohe Flexibilität auch „abseits“ der 90 Minuten Wir machen Sie zum Matchwinner! Fordern Sie uns!