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