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 IT-Consulting seit 2003 Spezialist für individuelle Lösungen (Germany) GmbH Co. KG Business IT Consulting Systemintegration und 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 Logistik- Unternehmen 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 Dauer des Downtime- Fensters Mittel Mittel Mittel Hoch Lange Mittel Mittel Sehr kurz Kosten für Hardware- Ressourcen 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 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% Total Name Need No Change (Scheduled) Need Conversion (Scheduled) Invalid Representation (Scheduled) Over Column Limit (Scheduled) CPI SIT 25414677735 235114013 563 41143109 72 Over Type Limit (Scheduled) 563 Fälle invalid binary representation 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 Ziel- Zeichensatz (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 Erklärung Offset Beispiel AR_UIC_MAN_AUSGL Nur eine Zeile betroffen 8E RDE-H,11/11 ortabhängig; Y bedeutet das das LOV KR_PROMPT_FRM in Abhängigkeit von LAND, BHF_NR bzw. Nur eine Zeile betroffen 91,92 TRADOTTA_ORTE im Kopfsatz zu füllen ist. Hinweis: Mit CPI 2.0Q (WL09) korrigiert LS_GUETER 62 Zeilen in Bemerkungen und Beschreibungen betroffen 9F Schrottsorte: Pakete Sorte 6, Oriented strand board -Platten "OSB", aus Holz LS_REFERENZEN 60 Zeilen in Ref-Nr 9F, 85 Passau Nickelsdorf LS_TEXTE 130 Text-Zeilen 9F, 85 Frachtzahler: ZRS Schenker Sarajevo ST_PA_ADRESSEN_JN ST_PA_PARTNER_JN ST_PA_STANDORTE 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 ST_PA_STANDORTE_JN 9 Zeilen, Bemerkungen und Bezeichnung 8A, 82, 85 KUMMERL STR. 1, 18, RUE DES R SINIERS, HOJE T STRUP 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 Problem Beschreibung SYS.SOURCE$ -Invalid binary representation (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 6- steligge 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 Minimum Extension SYSTEM 5,515.69 MB 4,634.31 MB 10,150 MB Yes 0 MB 0 MB XDB 0.06 MB 104.94 MB 105 MB Yes K064_T_ST 96.94 MB 53.06 MB 150 MB Yes 0 MB 0 MB 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 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 Maximum Extension 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 An der Alster 83 PLZ Ort D-20099 Hamburg Telefon +49 (0) 40-2263236 0 Telefax +49 (0) 40-2263236 99 Straße Am Limespark 2 PLZ Ort D-65843 Sulzbach Telefon +49 178 9277 807 Telefax +49 (0) 6196 7742 555 E-Mail jans@loopback.org E-Mail wolfgang.schick@cgi.de 46
Backup Folien CGI Group Inc. loopback.org
Oracle Unicode Support 48