DOAG Oracle Jahrbuch 2007/2008 Praxisleitfaden und Partnerkatalog für die Oracle-Community Herausgegeben von DOAG e.V. ISBN-10: 3-446-41375-8 ISBN-13: 978-3-446-41375-7 Leseprobe Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41375-7 sowie im Buchhandel Neue Features für den CBO in Oracle 11g Von Lutz Hartmann, sysdba database consulting GmbH Dieser Artikel behandelt eine Reihe von neuen und sehr verheißungsvollen Features für den Query Optimizer in Oracle 11g. Nachdem der Autor schon eine ganze Zeit mit der Beta-Version von 11g testen konnte, sind hier seine ersten Eindrücke zusammengefasst. Er hat sich dabei auf fünf Features beschränkt, die alle mit dem CBO und Statistiken in Verbindung stehen. Diese Features sind sehr vielversprechend und scheinen eine ganze Reihe von ernsthaften Problemen, die in 9i und 10g mit dem CBO auftraten, zu beheben. Individuelle Thresholds für Statistiken auf Tabellen-Level Seit 10g sammelt der Server Optimizer Statistiken für neu angelegte Segmente sowie für Objekte deren Statistiken veraltet sind und ein Stale-Flag im Data Dictionary haben. Oracle hat das im GATHER_STATS_ JOB per Default implementiert; der Job ist in jeder 10g-Datenbank sofort enabled und läuft jede Nacht sowie am Wochenende. Die zugrunde liegende Technologie heißt TableMonitoring und ist für alle Tabellen aktiviert. Das bedeutet, dass Oracle Tabellen beobachtet, in denen sich mindestens 10 Prozent aller Werte seit dem letzten Analysieren geändert haben. Diese Objekte werden dann als Kandidaten für das Erneuern der Statistiken markiert. Dieser Job-Mechanismus ist nun in 11g geändert worden. Oracle verwendet jetzt ein anderes Package als Auto-Task-Framework. Dem DBA wird damit einige Last von den Schultern genommen. Zudem haben einige Anwender festgestellt, dass der Schwellwert von 10 Prozent bei manchen Objekten nicht ideal gesetzt ist und man lieber einen kleineren Wert auf Segment-Ebene verwenden möchte. Lutz@orcl11 SQL> desc dba_tab_stat_prefs Name Null? Type ------------------OWNER NOT NULL VARCHAR2(30) TABLE_NAME NOT NULL VARCHAR2(30) PREFERENCE_NAME VARCHAR2(30) PREFERENCE_VALUE VARCHAR2(1000) Lutz@orcl11 SQL> exec dbms_stats.set_table_prefs(ʻSYSTEMʼ,ʼTʼ, ʻSTALE_PERCENTʼ, ʻ15ʼ) PL/SQL procedure successfully completed. Lutz@orcl11 SQL> SELECT FROM dba_tab_stat_prefs WHERE owner=ʼLUTZʼ AND table_name=ʼTʼ; OWNER TABLE_NAME PREFERENCE_NAME REFERENCE_VALUE ------ ----------------------- --------------SYSTEM T STALE_PERCENT 15 71 Buch Partnerkatalog.indb 71 24.10.2007 9:51:29 Uhr Produktlinie Database – Aus der Praxis – Schwerpunkt 11g Diese Problematik ist Oracle ebenfalls in 11g angegangen. Jetzt kann der DBA individuelle Thresholds für Statistiken auf Tabellen-Level setzen. Dazu gibt es jetzt in DBMS_STATS neue Prozeduren und Funktionen sowie eine Reihe von Data Dictionary Views (Siehe Beispiel auf Seite 71). Verzögerte Veröffentlichung von neu gesammelten Statistiken Ein weiteres Highlight von 11g ist die verzögerte Veröffentlichung von neu gesammelten Statistiken. Der DBA kann bestimmen, wann neue Statistiken für den Optimizer sichtbar werden. Das ist zum Beispiel sehr interessant, wenn für alle abhängigen Objekte die Berechnung neuer Statistiken bereits abgeschlossen sein soll, bevor der Report anläuft, damit nicht ein Teil der Objekte noch alte Statistiken verwendet und ein anderer bereits die neuen. Der DBA kann Statistiken im PENDING-Zustand halten und damit beeinflussen, wann sie verwendet werden sollen. DBMS_STATS.RESUME_GATHER_STATS ist die Prozedur, die es ermöglicht, sogar mit dem Sammeln der neuen Statistiken genau an der Stelle wieder aufzusetzen, an dem der vorherige Job-Run, aus welchen Gründen auch immer, erfolglos abgebrochen wurde. Es ist auch möglich, die noch unveröffentlichten Statistiken an eine Test-Umgebung zu senden und dort erst einmal ihre Auswirkungen auf den Workload auszuprobieren, bevor sie in der Produktion verwendet werden. Sie werden als PENDING STATISTICS bezeichnet und in speziellen Tabellen zwischengelagert. Die entsprechenden Views im Data Dictionary haben Namen wie beispielsweise *_PENDING_STATS. Multi Colums Statistics Ein weiteres, sehr interessantes Feature in 11g sind Multi Colums Statistics: Man kann damit Statistiken für Gruppen von korrelierten Spalten sammeln und verwenden. Damit werden gleich mehrere Probleme ausgemerzt, die der Optimizer noch in 10g hatte, als die ersten dieser Funktionalitäten eingeführt wurden. Der Optimizer hatte damals zwar bereits die Möglichkeit, mit korrelierten Werten umzugehen, allerdings beschränkt auf einige wenige Spezialfälle. Jonathan Lewis hat dem ein ganzes Kapitel in seinem Buch gewidmet [1]. Warten wir ab, was der Meister des CBO mit seinen Test-Cases herausfinden wird. Inkrementell aktualisierte globale Statistiken für partitionierte Tabellen Oracle 10g sammelt Statistiken für partitionierte Objekte auf drei Ebenen: • Global-Table • Partition-Level • Sub-Partition-Level Table Monitoring ist daher auch auf Partitionsebene eingeschaltet. Das Problem vor 11g bestand darin, dass das Sammeln der Global Level Statistics einen Full Table Lock benötigt und damit einen erheblichen Overhead verursachen kann. Die Partition Level Statistics werden dagegen nur auf den Partitionen gesammelt, für die mehr als 10 Prozent der Werte geändert wurden. In den meisten Fällen sind es nur ein paar Partitionen, auf denen DMLs stattfinden, während die restlichen stabil sind – zumindest bei der Verwendung von Range Base Partitioning. In 11g wird eine neue Technologie namens Synopsen für einige Statistiken wie number of distinct values verwendet. Damit kann Oracle die globalen Statistiken inkrementell aktualisieren, indem neue Statistiken in den dynamischen Partitionen mit den alten Statistiken aus den statischen Partitionen gemerged werden. Diese Synopsen belegen jedoch zusätzlichen Plattenplatz im SYSAUX Tablespace, was zusätzliche I/Os bedeutet. Dafür ist aber das Sammeln der globalen Statistiken erheblich schneller. Noch ein Hinweis: Histogramme werden übrigens nicht inkrementell gepflegt. Weitere Information stehen im Performance Tuning Guide für 11g. Extended Statistics on expressions Als Beispiel dient eine Where Clause wie die Folgende: WHERE UPPER(last_name) = ‹King› Hier verwendet der Optimizer 1 Prozent als Wert für SELECTIVITY, sofern kein Function Based Index vorhanden ist: Das führt natürlich in den meisten Fällen zu einem sehr schlechten Execution-Plan. In 10g kann der Optimizer bereits mit ein paar Built-In-Functions umgehen, etwa TO_NUMBER. Mit 72 Buch Partnerkatalog.indb 72 24.10.2007 9:51:29 Uhr Neue Features für den CBO in Oracle 11g 11g können wir nun erweiterte Statistiken für Funktionen sammeln: exec DBMS_STATS.GATHER_TABLE_STATS(‹HR›, ‹EMPLOYEES›, METHOD_OPT => ‹for all columns size 1 columns (upper(last_ name)) size 5ʼ) Fazit Es gilt jetzt, die neuen Features intensiv zu testen und Erfahrungen damit zu sammeln. Die Richtung, in die Oracle sich hier bewegt, ist sicherlich richtig. Literatur [1] Jonathan Lewis, Cost-Base Oracle Fundamentals, ISBN: 1590596366. 73 Buch Partnerkatalog.indb 73 24.10.2007 9:51:30 Uhr Erstellen einer Oracle 11g RAC-Datenbank per Skript Von Dierk Lenz, Herrmann & Lenz Services GmbH Die Oracle Datenbank 11g ist seit Ende August für die Linux-Plattform verfügbar. Wie in vielen anderen Bereichen wurde auch bei der RAC-Option an einigen Stellen Feinschliff betrieben, sodass die Aufgabe einfacher geworden ist, eine RAC-Datenbank manuell beziehungsweise per Skript aufzusetzen. Oracle propagiert bei der Erstellung von Datenbanken einen Konfigurationsassistenten – in diesem Fall den DBCA. Dessen Einsatz hat den Vorteil, dass das Ziel schneller und einfacher erreicht werden kann als bei der Verwendung von Skripten. Nachteilig sind die fehlende Nachvollziehbarkeit (Sitchwort: Erstelle die gleiche Datenbank für eine weitere Testumgebung!) sowie die Unklarheit über einige Details. Die Installation Die eigentliche Installation selbst soll hier nicht beschrieben werden – das tun die entsprechenden Handbücher sehr gut. Allerdings an dieser Stelle der Hinweis, bitte nicht mit dem Aufruf des Installers anzufangen, bevor die Installationsvoraussetzungen für die Clusterware erledigt sind. In den Bereichen Betriebssystem, Security, Netzwerk und Shared Storage ist zuvor einiges zu tun. Es ist im Übrigen sehr empfehlenswert, die Möglichkeit zu nutzen, Clusterware und Datenbank-Software für ASM und DB-Instanzen jeweils unter einem eigenen Benutzer zu installieren (beispielsweise crs, asm und oracle). Clusterware und Cluster Registry Nach der Installation aller Software-Komponenten werden die aktiven Komponenten eingerichtet. In einer RAC-Umgebung reicht es jedoch nicht, etwa einen Listener wie gewohnt zu konfigurieren. Zusätzlich muss der Listener der Cluster Registry bekanntgemacht werden, damit diese den Listener nach einem Knoten-Reboot wieder starten kann. Für die Cluster Registry sind die Beziehungen zwischen den Komponenten wichtig – etwa die Abhängigkeit einer DB-Instanz von einer ASM-Instanz. Nur bei einer korrekt definierten Abhängigkeit lassen sich die Komponenten in der richtigen Reihenfolge starten. Somit sind für eine RAC-Konfiguration immer zwei Dinge wichtig: Einerseits die Konfiguration einer Komponente und andererseits die Definition der Komponente in der Cluster Registry. Dafür wird grundsätzlich das Werkzeug srvctl genutzt. Der Listener Beim Listener ist der erste Unterschied zum Vorgänger festzustellen: Mit Oracle 10gR2 war die ClusterKonfiguration der Listener ausschließlich mit dem Net-Konfigurationsassistenten netca möglich. Für 11g wurde srvctl um das Kommando „add listener“ erweitert. Im folgenden Beispiel wird je ein Listener auf einem Knoten angelegt. srvctl add listener product/11.1.0/db srvctl add listener product/11.1.0/db -n -l -n -l rac1 -o /orabase/ LISTENER_RAC1 rac2 -o /orabase/ LISTENER_RAC2 Für das Starten der Listener muss die Konfiguration im Verzeichnis $ORACLE_HOME/network/admin verfügbar sein; die Variable $TNS_ADMIN wird nicht ausgewertet. Für die Konfiguration der Listener gilt, dass sie auf einer Adressliste mit den public und virtuellen Adressen starten sollten, damit sie ausschließlich auf dem „richtigen” Knoten starten. Weiterhin sollte jeder ADDRESS-Eintrag die Klausel (IP = FIRST) beinhalten. Die Listener sollten aus dem Database-Installationsverzeichnis (hier unter dem Benutzer oracle) starten. Alle später konfigurierten Instanzen (sowohl ASM als auch DB) sollten mit dem Initialisierungspara- 75 Buch Partnerkatalog.indb 75 24.10.2007 9:51:31 Uhr Produktlinie Database – Aus der Praxis – Schwerpunkt 11g meter remote_listener eine über die Datei tnsnames. ora aufgelöste Adressliste mit den virtuellen Adressen aller Listener erhalten, damit die dynamische ServiceRegistrierung funktioniert. ASM-Instanzen Als Basis für eine RAC-Datenbank dient grundsätzlich ein Shared-Disk-IO-Subsystem. Der Zugriff kann dabei über Raw Devices, ein Cluster-File-System oder auch ASM erfolgen. ASM hat sich hier mittlerweile gut bewährt, sodass wir es für dieses Beispiel nutzen. Unter Linux ist weiterhin die Verwendung der ASMLIB-Treiber empfehlenswert – beim Oracle Enterprise Linux werden diese sogar direkt mitgeliefert. Die Konfiguration der ASM-Instanzen erfolgt über eine init.ora-Datei (Ein SPFILE muss im RAC „shared“ zur Verfügung stehen; da ASM jedoch unser Mechanismus für shared files ist, kann er dafür nicht genutzt werden …) und enthält nur wenige Parameter: instance_type = asm asm_diskgroups = DATA asm_diskstring = /dev/oracleasm/disks/* cluster_database = true instance_number = 1 remote_listener = listeners.hl.de Die instance_number unterscheidet sich natürlich für alle angelegten Instanzen; die Instanznamen sind typischerweise +ASM1, +ASM2, … Das Bekanntmachen der Instanzen für die Cluster Registry geschieht wiederum mit srvctl: srvctl add asm -n rac1 -i +ASM1 -o /orabase/product/11.1.0/asm srvctl add asm -n rac2 -i +ASM2 -o /orabase/product/11.1.0/asm In unserem Beispiel wurden die ASM-Instanzen unter dem Benutzer asm in einem eigenen ASM-Home konfiguriert. Das Anlegen der Diskgruppe DATA erfolgt beispielsweise unter SQL*Plus mit folgendem Befehl: CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK ‚/dev/oracleasm/disks/ASM_01ʻ / Die Disk ASM_01 muss vorher mit ASMLIB erstellt werden; hierzu wird das Skript /etc/init.d/oracleasm genutzt: /etc/init.d/oracleasm createdisk ASM_01 /dev/sd<d><n> DB-Instanzen Auch in diesem Fall wird die Datenbank zunächst erstellt und dann mit srvctl der Cluster Registry bekannt gemacht. Beim CREATE DATABASE arbeitet man zunächst mit cluster_database = false; erst später werden die entsprechenden Voraussetzungen geschaffen und die Instanzen mit cluster_database = true erneut gestartet. Eine init.ora-Datei existiert für die DB-Instanz, jedoch nur zur initialen Erstellung des SPFILEs. Für eine einfache Test-DB sehen die Parameter wie folgt aus: db_name = RACDB db_domain = hl.de db_create_file_dest = +DATA db_cache_size = 300M shared_pool_size = 300M large_pool_size = 100M java_pool_size = 100M pga_aggregate_target = 500M fast_start_mttr_target = 300 remote_listener = listeners.hl.de undo_tablespace = undots1 Das CREATE DATABASE-Kommando sowie der Aufbau des Data Dictionaries entsprechen dem Standard und werden aus Platzgründen hier nicht gezeigt. Interessant ist eine neue FROM-MEMORY-Klausel des CREATESPFILE-Kommandos, mit dem danach das SPFILE im ASM angelegt werden kann – inklusive des control_ files-Parameters, der als Oracle-managed-Filename beim CREATE DATABASE automatisch hinzukommt: CREATE SPFILE = ‚+DATA/RACDB/PARAMETERFILE/SPFILERACDB.ORAʻ FROM MEMORY / Damit die DB-Instanzen ordnungsgemäß starten, wird im Verzeichnis $ORACLE_HOME/dbs die Datei 76 Buch Partnerkatalog.indb 76 24.10.2007 9:51:31 Uhr Erstellen einer Oracle 11g RAC-Datenbank per Skript initRACDB<n>.ora angelegt, die einen einzigen Parameter enthält: spfile = ‚+DATA/RACDB/PARAMETERFILE/SPFILERACDB.ORAʻ spfile = ‚+DATA/RACDB/PARAMETERFILE/SPFILERACDB.ORAʻ Hier ist mit $ORACLE_HOME das DB-Home gemeint, die zweite Installation der DB-Software unter dem Benutzer oracle. Per Skript werden nach einem Neustart der Instanz die für RAC erforderlichen Änderungen im SPFILE erzeugt, ein weiterer UNDO-Tablespace erzeugt sowie ein weiterer Log-Thread angelegt: ALTER SYSTEM SET cluster_database = true SCOPE = SPFILE SID = ‚*ʻ / ALTER SYSTEM SET instance_number = 1 SCOPE = SPFILE SID = ‚RACDB1ʻ / ALTER SYSTEM SET instance_number = 2 SCOPE = SPFILE SID = ‚RACDB2ʻ / ALTER SYSTEM SET thread = 1 SCOPE = SPFILE SID = ‚RACDB1ʻ / ALTER SYSTEM SET thread = 2 SCOPE = SPFILE SID = ‚RACDB2ʻ / ALTER SYSTEM SET undo_tablespace = ‚undots1ʻ SCOPE = SPFILE SID = ‚RACDB1ʻ / ALTER SYSTEM SET undo_tablespace = ‚undots2ʻ SCOPE = SPFILE SID = ‚RACDB2ʻ / CREATE UNDO TABLESPACE undots2 DATAFILE SIZE 300M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED / ALTER DATABASE ADD LOGFILE INSTANCE ‚RACDB2ʻ GROUP 4 SIZE 100M, GROUP 5 SIZE 100M, GROUP 6 SIZE 100M / ALTER DATABASE ENABLE INSTANCE ʻRACDB2ʼ / Abschließend werden mit srvctl die DB-Instanzen bei der Cluster Registry bekanntgemacht sowie die Abhängigkeiten zu den ASM-Instanzen definiert: srvctl srvctl srvctl srvctl add database -d add instance -d add instance -d modify instance RACDB -o RACDB -i RACDB -i -d RACDB /orabase/product/11.1.0/db RACDB1 -n rac1 RACDB2 -n rac2 -i RACDB1 -s +ASM1 77 Buch Partnerkatalog.indb 77 24.10.2007 9:51:31 Uhr Produktlinie Database – Aus der Praxis – Schwerpunkt 11g srvctl modify instance -d RACDB -i RACDB2 -s +ASM2 srvctl start database -d RACDB Fazit Nun ist es geschafft! Die RAC-Datenbank läuft und kann getestet werden. Sicherlich ist der Aufruf des DB-Konfigurationsassistenten einfacher – das Skripten des DB-Aufbaus hat jedoch den Vorteil, dass Abhängigkeiten zwischen den Komponenten und das RACZusammenspiel besser verstanden werden. Natürlich sind die Möglichkeiten damit noch lange nicht ausgeschöpft: srvctl bietet beispielsweise einige Kommandos zur Konfiguration von Services an, die zur Aufteilung der Anwendungen auf die einzelnen RAC-Knoten genutzt werden können. Auch die Konfiguration des Enterprise Managers fehlt noch, sie lässt sich jedoch auch per Skript mit dem emca-Kommando durchführen. 78 Buch Partnerkatalog.indb 78 24.10.2007 9:51:31 Uhr