Automatisiertes Deployment von Datenbankobjekten im Data Warehouse: Ein Erfahrungsbericht Dr. Martin Jursch, WestLB AG Dr. Olaf Jessensky, OPITZ CONSULTING Gummersbach GmbH DOAG SIG Development Köln, 22. September 2011 Agenda Übersicht PCR NG Funktionsweise OC Schemaverwaltung Performanceoptimierung Seite 2 Agenda Übersicht PCR NG Funktionsweise OC Schemaverwaltung Performanceoptimierung Seite 3 Übersicht PCR NG PCR NG WestLB Landschaft Eco. P&L FO-Systeme ALADIN PRIME SUMMIT RECONCILIATION BO-Systeme PCR NG UBIX BASE HGB DWH WERS General Ledger CDP SAP FI IFRS DWH SAP BA Seite 4 Übersicht PCR NG BASEOS TT SSL PCR NG Applikation PCR = Product Control Reporting (next generation) Abgleich von Daten aus den Handelssystemen, Abwicklungssystemen und Buchhaltungssystemen (National / International) Qualitätssicherung der Monthly P&L für Handelsprodukte Tägliche Aktualisierung der Buchhaltungsdaten Reporting für Analyse von Differenzen zwischen den vier Liefersystem-Typen Realtime Korrekturfunktionalität der Reports Erstellung von Buchungen für Korrekturbedarf in Buchungssystemen Datamart zur Analyse von Differenzen zwischen Daily- und Monthly-P&L Backend Oracle Datenbank Frontend für Reporting und Korrekturen MSAccess-Applikation Frontend für P&L Reporting Cognos Seite 5 PCR NG Applikation Datenbank Objekte 900 Tabellen 1550 Indizes 340 Views 145 Packages 40 Prozeduren und Funktionen 640 Trigger 50 Java-Klassen 5 Materialized Views 90 Types 1 Advanced Queue 1,2 TB Gesamtgröße Seite 6 PCR NG Infrastruktur TEST Instanz PRODUKTIONS Instanz Entwicklung (DEV) Produktion (QA) RDS RDS ODS ODS STG SVN STG RDS RDS ODS ODS STG STG Test (BCK) Simulation (BE) Es gibt die Datenbank-Instanzen Test und Produktion In einer Instanz gibt es mehrere Environments (DEV, BCK, …) Ein Environment besteht aus den Schemata RDS_NG_..., ODS_NG_... und STG_NG_... Die Applikation ist in verschiedene Module / Komponenten unterteilt Module / Komponenten bestehen aus Datenbank-Objekten Seite 7 PCR NG Deployment Anforderungen Allgemein Datenbank Objekte Alle Sourcen in SubVersion (zentrale Quelle) Tabellen mit sicherer Beibehaltung der Daten Einsatz von generischen nicht produkt-spezifischen Source-Formaten und Tools Grosse Tabellen mit einigen GB an Volumen Deployment auf einen beliebigen Stand Deployment mit geringer Downtime Deployment flexibel neuen Datenbank-Objekten oder neuen Attributen anpassbar Flexible Festlegung von Datenbank Objekt Attributen wie Tablespace, Buffer Cache, Compression,… Indizes und FKs auf großen Tabellen Tabellen, die dynamisch von der Applikation erweitert werden SQL-Typen für Tabellen und Packages Repositories Seite 8 PCR NG Deployment Cognos (Deployment über Cognos) Framework Manager Model Reports (Report Studio) Reports (Query Studio) XML-Dateien XML-Dateien XML-Dateien VBA (Deployment über VBA-Deployment-Tool (Eigenentwicklung WestLB)) Module TXT-Dateien Formulare TXT-Dateien Tabellen TXT-Dateien Properties TXT-Dateien Oracle (Deployment Framework OC Schemaverwaltung) Tabellen SQL*Plus Scripte Typen SQL*Plus Scripte Views SQL-Dateien Packages, Prozeduren, Funktionen SQL-Dateien Trigger SQL-Dateien Sequences SQL*Plus Scripte Grants SQL*Plus Scripte Synonyme SQL*Plus Scripte Java Sourcen Java-Dateien Repositories SQL-Dateien Seite 9 Agenda Übersicht PCR NG Funktionsweise OC Schemaverwaltung Performanceoptimierung Seite 10 Funktionswei se OC Schemaverw altung Motivation Sourcecode/ Datenbankobjekte manuell Entwicklung automatisiert Test automatisiert Produktion Seite 11 Kategorien Kategorie 1 Datenbankobjekte die problemlos gelöscht und wieder neu angelegt werden können. z.B.: PL/SQL (Trigger, Functions, Procedures, Packages …), Views, … Seite 12 Kategorien Kategorie 2 Datenbankobjekte die nicht einfach gelöscht werden dürfen. Löschen verbietet sich aus 2 Gründen: Datenerhalt z.B.: Tabellen, Types Performance z.B.: Indizes, Constraints Seite 13 Kategorien Kategorie 2 Datenbankobjekte deren Eigenschaften von der Umgebung (Test, Produktion, …) abhängen: Grants (ods_ng_qa -> rds_ng_qa) Synonyme Seite 14 Kategorien Kategorie 1 Skripte können normale „create or replace“-Skripte sein. Kategorie 2 Skripte benötigen eine Programmlogik, die diese z. B. mit den bestehenden Datenbankobjekten vergleicht und nur die tatsächlich nötigen Änderungen durchführt. Seite 15 Architektur Kategorie 1 ant pro Datenbankobjekt-Skript SQL*Plus ODS_NG_QA (schemaowner) Seite 16 Kategorie 1 Beispiel Via SQL*Plus alle Views einer Komponente aus einem Schema entfernen. begin for cur_sql in ( select 'drop view ' || OBJECT_NAME text from user_objects where object_type = 'VIEW' and object_name like 'SPL%' ) loop execute immediate cur_sql.text; end loop; end; / Seite 17 Beispiel Kategorie 1 Via ant alle View-Skripte ausführen. <!-- DB Views erstellen --> <target name="build_views" depends="show_location"> <for param="file"> <path> <fileset dir= "ODS" includes="**/views/*.sql"/> </path> <sequential> <sqlplus script="@{file}"/> </sequential> </for> </target> Hinweise: for-Konstrukt stammt von ant-contrib sqlplus ist ein ant-Makro Seite 18 Architektur Kategorie 2 ant pro Tabellen-Datei-Skript SQL*Plus pro Anweisung SQL*Plus Aufruf als User ODS_NG_QA der wiederum per Synonym auf das Package depl_module von DEPLOY_NG zugreift. Das Package läuft mit „authid current_user“. ODS_NG_QA (schemaowner) DEPLOY_NG (deployment) Seite 19 Beispiel Kategorie 2 @&util_path\set_table_structure no_id @&util_path\create_table spl_fact_trade_tab spfctr permanent @&util_path\alter_table_add_column spl_fact_trade_tab guv_ifrs_kz varchar2(1) mandatory "1" @&util_path\alter_table_add_column spl_fact_trade_tab cob date mandatory "" @&util_path\create_index spl_fact_trade_tab cob cob bitmap LOCAL "" @&util_path\alter_table_add_foreign_key spl_fact_trade_tab spl_em_legalentity NOTHING "LEGALENTITY_ID" @&util_path\clear_table spl_fact_trade_tab Seite 20 Kategorie 2 create table @&util_path\set_table_structure no_id (no_historization, standard) @&util_path\create_table spl_fact_trade_tab spfctr permanent Tabelle mit Spalte ID anlegen, wenn sie noch nicht existiert ID ist optional bei no_id, sonst not null No_historization, standard: PK-Constraint und Sequenz (spfctr_id_sq) werden erzeugt Standard: zusätzliche Felder cu, cmd, lu, lmd Seite 21 Kategorie 2 add_column @&util_path\alter_table_add_column spl_fact_trade_tab guv_ifrs_kz varchar2(1) mandatory "1" Spalte anlegen, wenn sie noch nicht existiert Datentyp prüfen Verlängerung mit alter table Sonstige Veränderungen Neue Spalte anlegen Daten kopieren (bei Fehler Abbruch) Alte Spalte löschen Neue Spalte umbenennen NOT NULL prüfen Default prüfen Seite 22 Kategorie 2 create index / add foreign key @&util_path\create_index spl_fact_trade_tab cob cob bitmap LOCAL "" Index anlegen, wenn noch nicht vorhanden Index ersetzen, wenn Name, Bitmap/Eindeutigkeit oder Partition Range falsch @&util_path\alter_table_add_foreign_key spl_fact_trade_tab spl_em_legalentity NOTHING "LEGALENTITY_ID " FK anlegen, wenn nicht vorhanden FK bezieht sich immer auf Spalte ID Delete Rule prüfen Seite 23 Kategorie 2: Clear Table @&util_path\clear_table spl_fact_trade_tab Aufgabe: Alle sonstigen Tabellenbezogenen Datenbankobjekte löschen. Problem: Das Skript muss „wissen“ welche Datenbankobjekte existieren sollen und welche nicht. Lösung: Alle Skripte registrieren die Datenbankobjekte die sie erzeugen sollen in einer Tabelle. Nach Verarbeitung einer Komponente werden die Einträge wieder gelöscht. Seite 24 Kategorie 2: Grants, Synonyme @&util_path\grant_object select,update spl_fact_version_tab VBA,COG "with grant option" Problem: Die User, an die gegrantet wird, sind je nach Umgebung variabel. Lösung: Das Framework kennt die Umgebung: COG -> COG_NG_QA für Umgebung QA @&util_path\create_synonyms ODS SPL Erzeuge gleichnamige Synonyme für alle Objekte von ODS -> ODS_NG_QA, die gegranted wurden und die zur Komponente SPL gehören (deren Name mit SPL beginnt). Seite 25 Reihenfolge pro Komponente und Schema Synonyme Pre-Skripte Pre-Skripte (Einmalausführung) Types Tabellen Java Package Header Functions, Procedures Views Type Bodies Package Bodies Trigger DML-Skripte Post-Skripte (Einmalausführung) Post-Skripte Grants [synonyms] [pre] [pre_once] [types, .tps] [tables] [java_sources] [packages, .pks] [functions], [procedures] [views] [types, .tpb] [packages, .pkb] [trigger] [scripts_dml] [post_once] [post] [grants] Seite 26 Kat. 2 Kat. 2 Kat. 2 Kat. 1 Kat. 1 Kat. 1 Kat. 1 Kat. 1 Kat. 1 Kat. 1 Kat. 1 Kat. 2 SVN-Integration Seite 27 Masterbuild-Konfiguration Seite 28 Agenda Übersicht PCR NG Funktionsweise OC Schemaverwaltung Performanceoptimierung Seite 29 Performanceo ptimierung Performanceproblematik Dauer eines kompletten Deployments ca. 1 Tag, Downtime bis zu 2 Tagen Anforderung: Daily P&L soll täglich erstellt werden können Performancekiller bei großen Tabellen Erstellung und Validierung von Constraints Erstellung und Rebuild von Indexen Droppen von Spalten Änderung des Spaltenformats Große Anzahl von Objekten Jeweils neue Session Vergleich mit Data Dictionary Seite 30 Lösungsansätze Ein-Pass Verfahren für Tabellen Delta-Deployment Separate Ausführung von Langläufern per Job Parallelisierung von langlaufenden SQL‘s Paralleles Deployment mehrerer Komponenten Seite 31 Ein-Pass vs. Zwei-Pass Verfahren Problem bei Foreign Key Constraints: Zieltabelle existiert noch gar nicht Lösung: Skripte werden 2 Mal ausgeführt Einmal ohne FK Constraints Zweiter Durchlauf mit FK Constraints Nachteile bei schon existenten großen Tabellen Constraints werden beim 2. Durchlauf jedesmal neu erstellt/validiert Performanceprobleme beim Deployment Lösung: Verhalten ist in Konfigurationsdatei umschaltbar Seite 32 Delta-Deployment Problem: Menge der deployten Elemente erzeugt hohe Laufzeiten Lösung: Delta-Deployment mit Vorgabe eines Referenzdatums Datum des Commits in SVN als Änderungsdatum der lokalen Datei Es werden nur Dateien mit Änderungsdatum >= Referenzdatum deployt Vorheriges Löschen der Kategorie 1 Objekte entfällt Ausnahmen bei aufeinander aufbauenden Objekten (z. B. Views) Optional: Komponente ohne Änderungen in SVN wird ignoriert Seite 33 Auslagerung von langlaufenden SQL‘s Sonderbehandlung für erfahrungsgemäß imperformante Operationen SQL‘s werden in einer Tabelle abgelegt (mit Build-Nr., Komponente, Tabellenname) Zu bestimmten Zeitpunkten wird für bestimmte Arten von Statements ein Job gestartet Bearbeitungsstatus und Fehler werden protokolliert Mail-Benachrichtigung bei Abschluss Drop column: set unused + alter table drop unused columns Verhalten ist auf Tabellenebene konfigurierbar @&util_path\set_table_column_drop_mode SETUNUSED @&util_path\set_table_index_create_mode DBJOB Seite 34 Parallelisierung von SQL‘s Erstellen von Indizes Create Index mit parallel 8 Alter index noparallel Setzen von Default-Werten Alter session enable parallel dml Update mit Parallel-Hint Seite 35 Paralleles Deployment Parallelisierung des Deployments mit Parallel – Tag in Ant Komponenten werden auf 2 Threads verteilt Feste Reihenfolge innerhalb der Threads Finaler Teil ohne Parallelisierung Ausführungszeit fast halbiert Seite 36 Zusammenfassung Deployment einer definierten Version aller Datenbankobjekte aus Subversion Deployment beliebiger Versionsstände in beliebige Zielumgebungen Downtime für Monatsdelta in Produktion 2-3 Stunden Standard-Werkzeuge Ant und SQL*Plus Flexibel änderbar und konfigurierbar Seite 37 & Fragen & Antworten Seite 38 Kontaktdaten Dr. Martin Jursch WestLB AG [email protected] Dr. Olaf Jessensky OPITZ CONSULTING Gummersbach GmbH [email protected] Vielen Dank für Ihre Aufmerksamkeit! Seite 39