DOAG2013: Datenbankmigration nach Unicode - Blogs

Werbung
Datenbankmigration nach Unicode mit dem
DMU-Tool
Erfahrungen bei der Migration für ein großes Logistikunternehmen
© CGI Group Inc. & loopback.org
Wer sind wir?
– Hamburg
(Germany) GmbH & Co. KG
• IT-Consulting seit 2003
• Spezialist für individuelle
• Business & IT Consulting
• Systemintegration und
Lösungen
Outsourcing Services
Jan Schreiber
• Senior Consultant
• Oracle DBA seit 1998
Wolfgang Schick
• Senior Consultant
• Oracle Developer seit 1997
2
&
Motivation
Warum Unicode?
Kunde und Anwendung
• International aufgestelltes LogistikUnternehmen mit Ländergesellschaften
im osteuropäischen Raum
• Mandantenfähiges Rechnungswesen mit
in Österreich
entwickelter Oracle Forms -basierter
Anwendung
• Verschiedene, heterogene Schnittstellen
• Datenbank im Zeichensatz
WE8ISO8859P15
4
&
Warum Unicode?
• Zukunftssichere Nutzung der Anwendung in allen
Ländergesellschaften, im besonderen in Osteuropa
• Kyrillischer Zeichensatz wird in Adressen, Waren, Firmennamen
verwendet
• Unicode ist Standard
• Für XML, Java und neue Oracle-Datenbanken
• Geeignetes Superset, mit dem alle gängigen Zeichensätze gespeichert
werden können
5
&
Unicode und Oracle
Unicode-Characteristics
• Globaler Zeichensatz für das Internet
• Beinhaltet nahezu alle „lebendigen“
Sprachen
• Existiert seit 1987
• Unicode 4.0 verwendet zwei 16-bit
Datensätze pro Zeichen
• Mögliche Menge: 1.048.576 Zeichen
• 110.000 Zeichen definiert in Unicode 6.2
7
&
Unicode in Oracle
• Standard bei neuen Oracle-Datenbanken: AL32UTF8 (NCHAR
•
•
•
•
•
•
AL32UTF16) (UTF-8)
Oracles „UTF8“ Zeichensatz ist etwas anderes!
CESU-8 Legacy-Zeichensatz
AL32UTF8 entspricht der Unicode-4.0 Konvention
Unicode-Support seit Oracle 8.1
AL32UTF8 seit Oracle 9i
Probleme mit 8i-Clients – Oracle UTF8 besser
8
&
MultiByte: Speicherbedarf pro Zeichen
• AL32UTF8 ist ein
dynamischer
MultiByte-Zeichensatz
• 1-4 Bytes pro
abzubildendem
Zeichen
Quelle: Oracle Globalization Support Guide 11.2
9
&
Migrationspfade
Migrationspfade: Neuaufbau
• Neue Datenbank parallel neu aufbauen
• Daten mit DataPump importieren
• Daten werden automatisch konvertiert
• Erfordert doppelte Ressourcen für Zweitsystem (Server,
Storage)
• Paralleler Aufbau & Test, aber Downtime abhängig von:
• Datenvolumen
• IO- und CPU-Performance
11
&
Migrationspfade: CSSCAN/CSALTER
•
•
•
•
•
•
Schnell
In-Place-Umstellung
CSSCAN prüft auf vorhandene Probleme
Umstellung kann evtl. nicht erfolgen
Evtl. partieller Re-Import nötig
Tools wurden länger nicht mehr weiterentwickelt
• Keine Data Dictionary Objekte
• Keine Änderung von Spaltenbreiten
• Nach 11.2 nicht mehr unterstützt
12
&
Migrationspfade: DMU
• Mit Release 11.1 verfügbar
• Java GUI-Tool, das Datenbank-Packages steuert
• Geführter Workflow für den gesamten Prozess:
• Scan, Reparatur, Konvertierung
• Anschauliche Berichte
• Abschließende Qualitätskontrolle
• Stabil ab 11.2.0.3 (vorher nur mit Patches)
• Java JDK 1.6
13
&
Migrationspfade:
Abgehängte Migration mit Streams
• Neuaufbau
• Streams-Replikation einrichten
• Anhalten & mit DMU konvertieren
• Replikation wieder aufnehmen & Änderungen übertragen:
Streams konvertiert
• Umschalten
Sehr gut testbar, geringe Umschaltzeit, fast keine Downtime
14
&
Methodenauswahl
• Constraints:
• Enge Lieferzyklen: Umstellung am Wochenende
• Neuaufbau Parallelumgebung nicht um Budget
• 800GB Datenvolumen: Data Pump Import
nicht im vorgesehenen Downtime Zeitfenster
machbar
• Recovery Zeitfenster muss berücksichtigt
werden
• => CSSCAN und DMU bleiben in der Auswahl
16
&
Entscheidungsmatrix und Risiken
Methode / Risiko
Export / Import
CSALTER
DMU
Parallelumgebung
Aufwand und
Vorarbeiten
Mittel
Mittel
Mittel
Hoch
Dauer des DowntimeFensters
Lange
Mittel
Mittel
Sehr kurz
Kosten für HardwareRessourcen
Hoch
Gering
Gering
Sehr hoch
Risiko des nicht
Erreichens von
Meilensteinen vor der
Migration
Mittel
Groß
Mittel
Mittel
Risiko, das ein
Abbruch der
Migration während
Downtime
durchgeführt werden
muss
Mittel, wenn vorher
ausreichend getestet
Mittel, wenn vorher
ausreichend getestet
Mittel - Hoch
Gering
17
&
Analyse und
Durchführung der Migration
Analyse der Ausgangsdaten
• Analyse mittels CSSCAN
• Ausgangs-Datensatz: WE8ISO8859P15
• Sonderzeichen in der Anwendung
• Sonderzeichen im Data Dictionary
[Scan Summary]
All character type data in the data dictionary are convertible to the new character set
Some character type application data are not convertible to the new character set
[Data Dictionary Conversion Summary]
Data Dictionary Tables:
Datatype
Changeless
Convertible
Truncation
Lossy
--------------------- ---------------- ---------------- ---------------- ---------------Total
15,950,631
30,761
0
0
Total in percentage
99.808%
0.192%
0.000%
0.000%
The data dictionary can not be safely migrated using the CSALTER script
19
&
Analyse der Ausgangsdaten
• Spaltenbreiten reichen nicht aus, um
MultiByte-Zeichen aufzunehmen
• Definition erfolgte in BYTE
[Application Data Conversion Summary]
Datatype
Changeless
Convertible
Truncation
Lossy
--------------------- ---------------- ---------------- ---------------- ---------------VARCHAR2
14,023,323,258
210,956,840
41,156,679
0
CHAR
39,497,365
0
0
0
LONG
0
0
0
0
CLOB
240,622
27,185
0
0
VARRAY
0
0
0
0
--------------------- ---------------- ---------------- ---------------- ---------------Total
14,063,061,245
210,984,025
41,156,679
0
Total in percentage
98.239%
1.474%
0.288%
0.000%
20
&
Analyse mit DMU
• Database Scan Results - Current Data
Need No
Conversion
Need Conversion
Exceed Column
Limit
Exceed Data Type
Limit
Invalid Binary
Representation
Total
LONG
623467 cells
186 cells
0 cells
0 cells
0 cells
623653 cells
ANYDATA
362 cells
0 cells
0 cells
0 cells
0 cells
362 cells
VARRAY
23 cells
0 cells
0 cells
0 cells
0 cells
23 cells
VARCHAR2
25325470111 cells
235070069 cells
41143109 cells
72 cells
563 cells
25601683924 cells
CHAR
87276395 cells
0 cells
0 cells
0 cells
0 cells
87276395 cells
CLOB
1307377 cells
43758 cells
0 cells
0 cells
0 cells
1351135 cells
Total
25414677735 cells
235114013 cells
41143109 cells
72 cells
563 cells
25690935492 cells
Total %
98.925%
0.915%
0.160%
0.000%
0.000%
100%
Name
CPI SIT
Need No Change
(Scheduled)
25414677735
Need Conversion
(Scheduled)
235114013
Invalid Representation
(Scheduled)
563
Over Column Limit
(Scheduled)
41143109
563 Fälle „invalid
binary representation“
Over Type Limit
(Scheduled)
72
72 Fälle passen nicht
in die Spalten
21
&
Datentypen und Konvertierung
• Nicht zu konvertierende Daten
• Zahlen oder Zeichen, die im Ausgangs- und Ziel-Zeichensatz identisch
abgebildet werden
• 98,93%
• Konvertierbare Daten
• Eindeutige Konvertierung möglich
• VARCHAR2, LONG und CLOB
• 1%, 235 Mio. Zellen
• Invalid Binary Representation
• Over Type Limit
• Over Column Limit
22
&
Invalid Binary Representation
• Text entspricht keiner Repräsentation
• Binärer Wert macht weder im Ausgangs (-P15) noch ZielZeichensatz (AL32UTF8) Sinn
• Detektivarbeit nötig
Decimal-Wert
Hex-Wert
Win
8859-15
Erläuterung, wenn ersichtlich
142
8E
Ä
Ž
A accent grave, oder Z mit Umlauten
145, 146
91,92
æ,Æ
`, ´
Einfache Hochkommata oder skandinavisches AE
159
9F
ƒ
Y
Florin oder gespiegeltes Y mit Umlauten, oder „-„
133
85
à
…
Ellipsis (…) als Zeichen, oder a accent grave
149
95
ò
•
o accent grave oder Bullit Point °
151
97
ù
—
Doppeler Unterstrich (mdash) „__“, oder u accent grave
138
8A
è
Š
S mit Umlauten, oder e accent grave
130
82
é
,
Komma, oder e accent aigu
23
&
Sinnsuche bei invaliden Sonderzeichen
Tabelle
AR_UIC_MAN_AUSGL
KR_PROMPT_FRM
Erklärung
Nur eine Zeile betroffen
Offset
8E
Nur eine Zeile betroffen
91,92
Beispiel
RDE-H�,11/11
ortabhängig; �Y� bedeutet das das LOV
in Abhängigkeit von LAND, BHF_NR bzw.
TRADOTTA_ORTE im Kopfsatz zu füllen
ist. Hinweis: Mit CPI 2.0Q (WL09)
korrigiert
LS_GUETER
62 Zeilen in Bemerkungen
9F
und Beschreibungen betroffen
Schrottsorte:� Pakete Sorte 6, Oriented
strand board�-Platten "OSB", aus Holz
LS_REFERENZEN
LS_TEXTE
60 Zeilen in „Ref-Nr“
9F, 85
Passau � Nickelsdorf
130 Text-Zeilen
9F, 85
Frachtzahler: ZRS � Schenker Sarajevo
Straßennamen in 8 Zeilen
95, 97, 8A,
82
�CSAI �T, 137 RUE DE
L`UNIVERSIT�
Kurznamen in 17 Zeilen
97, 8D
EVRAZ V�TKOVICE STEEL, A.S
Bemerkung in 1 Zeile
82
TRINEC - STAR� M�STO
9 Zeilen, Bemerkungen und
Bezeichnung
8A, 82, 85
KUMMERL�STR. 1, 18, RUE DES
R�SINIERS, HOJE T�STRUP
ST_PA_ADRESSEN_JN
ST_PA_PARTNER_JN
ST_PA_STANDORTE
ST_PA_STANDORTE_JN
24
&
Over Column Limit
• Größtenteils BYTE-definierte Spalten
• Mit DMU automatisch konvertierbar
• Alternativ über ALTER TABLE MODIFY COLUMN Skript-basiert
ändern
• Für die Zukunft NLS_LENGTH_SEMANTICS=CHAR
• Oracle empfiehlt neuerdings Session-Parameter
25
&
Over Type Limit
• Inhalt passt im Multibyte-Zeichensatz nicht
mehr in Typ-Limit
• Zum Beispiel VARCHAR2 mit mehr als 4000 Byte
• Lösung erfordert Datenmodell-Änderung
• Aufteilung in zwei Felder
• Umwandlung in CLOB
• Meist Anpassung der Applikation erforderlich
26
&
Bereinigung durch Skripte
27
&
Sonderzeichen im Data Dictionary
Objekt
SYS.SOURCE$
Problem
-Invalid binary representation
Beschreibung
(PL/SQL-)Quelltexte
-Requiring conversion
SYS.TRIGGER$
-Requiring conversion (17 Zeilen)
Quelltexte der Datenbank-Trigger
• müssen separat behandelt werden
• Im PL/SQL Source Code
• In Triggern
1
--st20110902 #12468 � CPI: Änderung der Zuordnung des GNRMB und ERLMB über die 6steligge NHM Nr
AR$LS_UTILS
2
/* �ber die VAL_NUMBER_LOW (1..n) die SATZ-ID fÿr das jeweilige Kennzeichen
ST$IO_DIUM_DELTA_EXPORT
3
SELECT REPLACE (p_bezeichnung, '�', 'ö')
ST$IO_DIUM_DELTA_EXPORT
4
SELECT REPLACE (v_convert_name, '�', 'L')
ST$IO_DIUM_DELTA_EXPORT
5
SELECT REPLACE (v_convert_name, '�', 'l') INTO v_convert_name FROM DUAL;
ST$IO_DIUM_DELTA_EXPORT
6
SELECT REPLACE (v_convert_name, '�', 'e') INTO v_convert_name FROM DUAL;
ST$IO_DIUM_DELTA_EXPORT
7
SELECT REPLACE (v_convert_name, '�', 'E') INTO v_convert_name FROM DUAL;
ST$IO_DIUM_DELTA_EXPORT
8
SELECT REPLACE (v_convert_name, '�', 'S') INTO v_convert_name FROM DUAL;
ST$IO_DIUM_DELTA_EXPORT
28
&
Sonderzeichen im Data Dictionary
• Sonderzeichen im Dictionary kann auch der DMU nicht heilen
• Umlaute in den PL/SQL-Kommentaren reichen
• Anpassung per Hand wäre möglich
• …wenn nicht zu viele Stellen betroffen sind
• Deinstallation der Software wäre gut
• Wenn es einen Installer gäbe
• Export-, Import wäre gut
• Wenn es ein Applikations-Schema gäbe
• Lösung:
• Auslesen der Trigger und Packages mit DBMS_METADATA.GET_DDL
29
&
Datenbankwachstum
Tablespace
Used
Free
Total
AUTOEXTEND
SYSTEM
5,515.69 MB
4,634.31 MB
10,150 MB
Yes
XDB
0.06 MB
104.94 MB
105 MB
Yes
K064_T_ST
96.94 MB
53.06 MB
150 MB
Yes
K256_I_AR_MIG
0.06 MB
13.94 MB
14 MB
Yes
K256_I_DEFAULT
0.12 MB
3.88 MB
4 MB
Yes
M004_I_BW
14,609.19 MB
654.81 MB
15,264 MB
Yes
M004_I_LS
33,212.12 MB
1,237.88 MB
34,450 MB
Yes
M004_I_ST
83 MB
46 MB
129 MB
Yes
M004_I_TW
1,736.06 MB
563.94 MB
2,300 MB
Yes
M004_J_TW
3,399.12 MB
Minimum
Extension
Maximum
Extension
0 MB
0 MB
0 MB
0 MB
216.88 MB
3,616 MB
Yes
205.99 MB
205.99 MB
M004_T_ST_WDP 0.62 MB
69.38 MB
70 MB
Yes
0 MB
0 MB
M004_T_TW
3,387.38 MB
212.62 MB
3,600 MB
Yes
482.99 MB
482.99 MB
M008_I_RK_SEER 1,952.12 MB
247.88 MB
2,200 MB
Yes
M016_J_TW
7,208.06 MB
361.94 MB
7,570 MB
Yes
967.17 MB
967.17 MB
M064_I_KR_LOG
26,495.12 MB
83.88 MB
26,579 MB
Yes
TOOLS
0.38 MB
3,999.62 MB
4,000 MB
Yes
0 MB
0 MB
Insgesamt 60GB zusätzlich, < 10%
30
&
Scan mit DMU
• 16 Prozesse
• Dauer 3h
• Kann abstürzen
• Drop_repository.sql
31
&
Status
32
&
Bereinigung in der DMU GUI
33
&
Abschluss der Bereinigungsphase
34
&
Konvertierungsphase
• Konvertierung nicht per Skript lieferbar
• DMU erfordert SYSDBA-Rechte
• wurden in diesem Fall temporär eingeräumt
• Bereinigung war zu 90% per Skript machbar
• ARCHIVELOG abschalten
• AUTOEXTEND ON
• alter system set job_queue_processes=0
• alter system set events ’22838 TRACENAME CONTEXT LEVEL 1,
FOREVER’
• …sonst ORA-22839: Direct updates on SYS_NC columns are disallowed
35
&
Konvertierungsphase
• 17 Stunden Laufzeit
• DMU setzt bei voller FRA oder fehlendem AUTOEXTEND sauber
wieder auf
36
&
Nachbereitung der Migration
Nacharbeiten: SQL Developer
38
&
Umschreiben von Packages
• XML-Ausgabe mit UTL_FILE.PUT_RAW anpassen
/* n/a
Test fur UTF8-XML-Erzeugung
20120518
Jan Schreiber */
vv_xml_kopf CONSTANT VARCHAR2(200) := '<?xml version="1.0" ' ||
'encoding="UTF-8"?>'; --> Header vom XML-Datei
-- Angepasst an UTF8 Ausgabe jschreib 20120508
WHILE v_pos < v_clob_len
LOOP
BEGIN
dbms_lob.read(lclob_xml_file, v_amount, v_pos, v_buffer);
utl_file.put_raw(v_file
,utl_i18n.string_to_raw(v_buffer, 'AL32UTF8'));
utl_file.fflush(v_file);
v_pos := v_pos + v_amount;
• Inkompatible Clients auf WE8ISO8859P15 belassen
39
&
Probleme im Mischbetrieb Unicode / -P15
• Sobald kyrillische Zeichen in die Datenbank gelangen, ist eine
Abwärtskonvertierung in –P15 nicht mehr möglich
• Nicht im Zeichensatz enthaltene Zeichen werden
standardmäßig mit einem „¿“ dargestellt.
40
&
Rekompilieren aller Packages
• Unbedingt alle Software mit NLS_SEMANTICS=CHAR
rekompilieren
• Vorher auf noch vorhandene Spalten in BYTE-Syntax prüfen:
CHAR_USED=C in DBA_TAB_COLUMNS und
dba_plsql_object_settings (nls_length_semantics)
• Views und Materialized Views kompilieren
41
&
Anpassungen in Oracle Forms
• Alle Forms-Module neu übersetzen
• Signatur der Datenbank-Objekte hat sich geändert
42
&
Fazit
Fazit zur Migration nach Unicode
• Die Unicode-Konvertierung mit schlankem Budget und engem
Downtime-Fenster konnte mit dem Oracle DMU-Tool erfolgreiches
abgeschlossen werden.
• Die Datenbereinigung wurde gut unterstützt und die Konvertierung lief
bei allen Datenbanken zuverlässig und schnell ab.
• Wir empfehlen die mit der Migration betrauten Personen und deren
Vertreter von Anfang bis Ende in das Projekt einzubinden, weil die
Einarbeitung in das Tool umfangreich und aufwendig ist.
• Besonders aufwändig ist die Bereinigung von in der Ausgangsdatenbank vorhandenen Zeichen, die nicht zum Zeichensatz passen.
• Bei Schnittstellen lohnt sich ein Blick auf selbst erstellte dateibasierte
Verfahren, die sich bzgl. Zeichensatz als problematisch erweisen
könnten.
44
&
Weiterführende Links
• Blogpost zu dieser Migration
•
•
•
•
•
•
•
•
•
http://blogs.loopback.org/2013/02/datenbankmigration-nach-unicode-2/
Oracle® Database Globalization Support Guide
http://docs.oracle.com/cd/E11882_01/server.112/e10729/toc.htm
Oracle® Database PL/SQL Packages and Types Reference
Oracle Database Migration Assistant for Unicode:
http://docs.oracle.com/cd/E26101_01/doc/doc.11/e26097/ch4scenarios.htm#BACC
EDBH
Changing the NLS_CHARACTERSET to AL32UTF8 / UTF8 (Unicode) (MOS Note:
260192.1)
CSSCAN output explained (MOS Note: 444701.1)
Wikipedia: Anführungszeichen
Oracle Database Migration Assistant for Unicode:
Near-Zero Downtime Migration Model
45
&
Vielen Dank für Ihre Aufmerksamkeit!
Jan Schreiber
Wolfgang Schick
Position
Geschäftsführer
Position
Unit Manager
Straße
PLZ Ort
An der Alster 83
D-20099 Hamburg
Straße
PLZ Ort
Am Limespark 2
D-65843 Sulzbach
Telefon
Telefax
+49 (0) 40-2263236 0
+49 (0) 40-2263236 99
Telefon
Telefax
+49 178 9277 807
+49 (0) 6196 7742 555
E-Mail
[email protected]
E-Mail
[email protected]
46
&
Backup Folien
© CGI Group Inc. & loopback.org
Oracle Unicode
Support
48
&
Herunterladen