Oracle-Zeichensatzkonvertierung(8): 6. So konvertieren Sie einen vom Benutzer implementierten Zeichensatz (1)
Werfen wir einen Blick auf die vom Benutzer implementierte Zeichensatz-Konvertierungsmethode. Sie können überprüfen, wie Sie von KO16MSWIN949, US7ASCII in AL32UTF8 konvertieren, indem Sie Oracle Utitlity Data Pump Export, Import verwenden.
Für Methoden, die eine separate Implementierung erfordern, garantiert Oracle keine Konvertierung, und der Implementierer muss die Konvertierung sicherstellen, sodass die Genauigkeit durch technische Überprüfung und Tests für verschiedene Fälle verifiziert werden muss.
Dies ist eine Fortsetzung des vorherigen Artikels.
6. So konvertieren Sie den vom Benutzer implementierten Zeichensatz
6.1. So wenden Sie Tools von Drittanbietern an – ETL usw.
Dies ist eine Methode zur Implementierung der Zeichensatzkonvertierung unter Verwendung von ETL-Tools, die auf dem Markt bekannt sind (z. B. Informatica PowerCenter, IBM DataStage usw.).
Es ist eine Methode, mit der ich keine direkte Erfahrung habe, und ich weiß nur, dass sie möglich ist, daher werde ich die detaillierte Methode nicht beschreiben.
Beachten Sie jedoch bitte nur die folgenden Überlegungen.
- Für jedes Produkt fallen Anschaffungskosten an, oder es sind zusätzliche Entwicklungsarbeitskosten erforderlich, selbst wenn es bereits gekauft wurde.
- Open Source TOS (Talend Open Studio)-DI, Pentaho Kettle etc. kommen ebenfalls in Betracht.
- Beim Schreiben von Daten aus der Quell-DB in eine Datei und beim Lesen und Einfügen der Datei in die Ziel-DB werden das Spaltentrennzeichen und das Zeilentrennzeichen in den Datenwert aufgenommen und behandeln Fehler, z. B. das Pushen von einer Spalte oder einer Zeile fälschlicherweise mehrzeilig gespeichert ist unbedingt erforderlich
- Bei der Auswahl eines ersten Tools ist es notwendig, einen Pilotversuch auf einem Großraumtisch durchzuführen, um ein geeignetes Tool auszuwählen, und es ist wichtig, ETL-Entwicklungspersonal mit viel Erfahrung zu sichern.
6.2. So verwenden Sie das Oracle-Dienstprogramm
Wir werden drei Möglichkeiten zur Implementierung der Zeichensatzkonvertierung durch die Nutzung von Oracle-Funktionen und -Dienstprogrammen betrachten.
1. Verwenden Sie Data Pump Export/Import
- Zeichensatzwechsel erzwingen: ALTER DATABASE CHARACTER SET INTERNAL
- Export/Import ausführen: Wenden Sie dieselbe NLS_LANG als Zielzeichensatz an
2. Verwendung von SQL*Loader
- Entladen der Daten aus der Quell-DB: Format verwendbar in SQL*Loader, Entwicklung erforderlich in PL/SQL, Pro*C, Java usw.
- Laden Sie Daten mit SQL*Loader in die Zieldatenbank
3. Verwenden von DB Link & CTAS & UTL_RAW
(Siehe separaten Artikel: Oracle-Zeichensatzkonvertierung (9): 6. So konvertieren Sie vom Benutzer implementierte Zeichensätze (2))
- DB-Link erstellen: Erstellen Sie einen DB-Link, der vom Ziel zur Quelle zeigt
- Ansichtserstellung: Ansichtskonvertierung von CHAR-, VARCHAR2-Spalten aus der Quelle in UTL_RAW.CAST_TO_RAW
- Daten in CTAS laden: UTL_RAW.CAST_TO_VARCHAR2 und CONVERT-Funktion anwenden, während CTAS (Create Table As Select) vom Ziel zum DB-Link ausgeführt wird
Die Vor- und Nachteile der einzelnen Methoden sind wie folgt zusammengefasst.
Weg | Vorteile | Nachteile |
1. Data Pump Export/Import | – Parallelverarbeitung möglich – Ausnahmeverarbeitung wie Zeilenumbruchzeichen, Sonderzeichen, Nullzeichen ist nicht erforderlich | – Erforderliche Datenentladezeit – Falls die Quell-DB US7ASCII ist . Zeichensatzwechsel erforderlich (Originalerhalt erforderlich) . Eine zusätzliche Konvertierung von Daten vom Typ CLOB ist erforderlich |
2. SQL*Loader | – Parallelverarbeitung möglich | – Es muss eine Funktion zum Erstellen (Entladen) einer Datendatei entwickelt werden – Ausnahme-/Fehlerbehandlung während der Dateiverarbeitung beim Entladen/Laden erforderlich (Zeilenumbruchzeichen, Sonderzeichen, Nullzeichen usw.) – Erforderliche Datenentladezeit |
3. DB-Link & CTAS & UTL_RAW | – Keine Datenentladezeit erforderlich | – Parallele Verarbeitung schwierig mit parallelem Hinweis (Verarbeitung durch direktes Teilen des Datenbereichs erforderlich) – Gilt nicht für Daten, die 2000 Bytes überschreiten (die maximale Länge des RAW-Typs beträgt 2000 Bytes) |
Berücksichtigen Sie bei der Überprüfung dieser Methoden die folgenden Überlegungen:
- Beim Konvertieren von US7ASCII in AL32UTF8 mit der Data Pump Export/Import-Methode Der Zeichensatz des Original-DB muss mit DDL geändert werden
- Es wird nicht empfohlen, den Original-DB direkt zu ändern. Wenn es schief geht, kann es sehr schwierig sein, es rückgängig zu machen.
- Wenn bereits eine DB für Failover konfiguriert ist, ist es wünschenswert, diese zu verwenden oder eine separate Replikations-DB zu konfigurieren und zu ändern.
- Alternativ ist es möglich, die Sicherungsdaten der Original-DB auf einem separaten Server wiederherzustellen und zu verwenden.
- Außerdem ist es wünschenswert, verschiedene Methoden (Plattenreplikation usw.) zum Konfigurieren einer Replikations-DB zu prüfen und eine Methode unter Berücksichtigung von Kosten und Zeit auszuwählen.
- Wenn es schwierig ist, eine Replikationsdatenbank zu konfigurieren, kann sie nach einer vollständigen Sicherung durchgeführt werden, aber wenn eine Wiederherstellung erforderlich ist, kann die Ausfallzeit des Dienstes je nach Datenmenge lang sein.
- Sofern der Dienst nicht gestoppt wird, muss unabhängig davon, welche Methode angewendet wird, der Extraktionspunkt aus der ursprünglichen DB angepasst werden, um die Datenkonsistenz zu gewährleisten (verwenden Sie FLASHBACK_SCN, FLASHBACK_TIME).
- Darüber hinaus muss die Methode zur Abbildung der geänderten Daten nach dem Zeitpunkt der Extraktion im Voraus getestet und vorbereitet werden (Einsatz von CDC usw.).
6.2.1. Methode 1) Data Pump Export/Import
Vorbereitung: Verwenden Sie das folgende Skript, um Verzeichnisobjekte zu erstellen und Berechtigungen zu erteilen, die beim Ausführen von Data Pump Export/Import erforderlich sind.
Führen Sie für jede zu testende Oracle-Instanz aus: ORAUS7, ORAMSWIN949 und ORAUTF.
▼ Gewähren Sie Berechtigungen für die ORAUS7-Instanz
-- ORAUS7 instance에 권한 부여 title ORAUS7 set NLS_LANG=AMERICAN_AMERICA.US7ASCII sqlplus sys/________@oraus7 as sysdba CREATE OR REPLACE DIRECTORY PUMP_DIR AS 'D:\Temp\datapump'; GRANT READ, WRITE ON DIRECTORY PUMP_DIR TO LEG; EXIT
▼ Gewähren Sie der ORAMSWIN949-Instanz Berechtigungen
-- ORAMSWIN949 instance에 권한 부여 title ORAMSWIN949 set NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949 sqlplus sys/________@oramswin949 as sysdba CREATE OR REPLACE DIRECTORY PUMP_DIR AS 'D:\Temp\datapump'; GRANT READ, WRITE ON DIRECTORY PUMP_DIR TO LEG; EXIT
▼ Autorisieren Sie die ORAUTF-Instanz
-- ORAUTF instance에 권한 부여 title ORAUTF set NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949 sqlplus sys/________@orautf as sysdba CREATE OR REPLACE DIRECTORY PUMP_DIR AS 'D:\Temp\datapump'; GRANT READ, WRITE ON DIRECTORY PUMP_DIR TO LEG; EXIT
Werfen wir einen Blick auf jeden der folgenden drei Fälle.
- KO16MSWIN949 bis AL32UTF8
- US7ASCII zu AL32UTF8 (2 Pfade)
- US7ASCII zu AL32UTF8 (1 Pfad)
Als Referenz: Bei der Konvertierung von US7ASCII in AL32UTF8 werden Spalten vom Typ CLOB nicht normal konvertiert, sodass eine separate Verarbeitung erforderlich ist.
Es wird im nächsten Artikel erklärt.
1. KO16MSWIN949 bis AL32UTF8
In diesem Fall werden die Typen CHAR, VARCHAR2 und CLOB alle normal konvertiert.
Das Ausführungsskript für jeden Schritt ist wie folgt.
-------------------------------------------------------------------- -- 단계1 -- 실행 Instance: ORAMSWIN949 -- NLS_LANG: KO16MSWIN949 -- 작업명: Datapump Export -- Tool: expdp set NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949 expdp leg/leg@oramswin949 directory=PUMP_DIR dumpfile=oramswin949_leg.dmp logfile=oramswin949_leg_exp.log schemas=leg -------------------------------------------------------------------- -- 단계2 -- 실행 Instance: ORAUTF -- NLS_LANG: KO16MSWIN949 -- 작업명: Table 생성 -- Tool: SQL*Plus -- Target table을 미리 생성 -- LINE_NUM, SUB_STA_NM 컬럼 길이 증가 -- COMMT 컬럼 데이터 타입 변경(VARCHAR2 -> CLOB) CREATE TABLE SUB_MON_STAT ( USE_MON VARCHAR2(8), LINE_NUM VARCHAR2(50), -- 14 -> 50 SUB_STA_ID VARCHAR2(4), SUB_STA_NM VARCHAR2(100), -- 20 -> 100 RIDE_PASGR_NUM NUMBER(10), ALIGHT_PASGR_NUM NUMBER(10), WORK_DT VARCHAR2(8), COMMT CLOB, -- VARCHAR2 -> CLOB REF_DES CLOB, REF_IMG BLOB ); -------------------------------------------------------------------- -- 단계3 -- 실행 Instance: ORAUTF -- NLS_LANG: KO16MSWIN949 -- 작업명: Datapump Import -- Tool: impdp set NLS_LANG=AMERICAN_AMERICA.KO16MSWIN949 impdp leg/leg@orautf directory=PUMP_DIR dumpfile= oramswin949_leg.dmp logfile=orautf_leg_imp.log content=data_only
2. US7ASCII zu AL32UTF8 (2 Pfade)
Beachten Sie das Folgende:
- Der temporäre Replikations-DB-Server ist eine Datenbank, die die Datenbank für den Ist-Betrieb in der gleichen Form wie das Original repliziert.
- In der Testumgebung wurde die ORAMSWIN949-Instanz als temporäre Replikations-DB verwendet und die Daten werden mit Data Pump repliziert.In diesem Fall muss der Zeichensatz vor der Replikation auf US7ASCII geändert werden.
- In der tatsächlichen Anwendung ist es wünschenswert, den temporären Replikations-DB-Server mit dem US7ASCII-Zeichensatz separat zu konfigurieren und zu verwenden.
Diese Methode wird von ORACLE nicht empfohlen und erfordert eine separate Konvertierungsverarbeitung, da Daten vom Typ CLOB normalerweise nicht konvertiert werden.
Das Ausführungsskript für jeden Schritt ist wie folgt.
-------------------------------------------------------------------- -- 단계1-1 -- 실행 Instance: ORAUS7 -- NLS_LANG: US7ASCII -- 작업명: Datapump Export -- Tool: expdp set NLS_LANG=US7ASCII expdp leg/leg@oraus7 directory=MIG_DIR dumpfile=oraus7_leg_exp.dmp logfile=oraus7_leg_exp.log schemas=leg -------------------------------------------------------------------- -- 단계1-2 -- 실행 Instance: ORAMSWIN949 -- NLS_LANG: US7ASCII -- 작업명: Datapump Import -- Tool: impdp set NLS_LANG=US7ASCII impdp leg/leg@oramswin949 directory= MIG_DIR dumpfile=oramswin949_leg_exp.dmp logfile=oramswin949_leg_imp.log -------------------------------------------------------------------- -- 단계2 -- 실행 Instance: ORAMSWIN949 -- NLS_LANG: US7ASCII -- 작업명: Character Set 변경 -- Tool: SQL*Plus SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949; SHUTDOWN IMMEDIATE; STARTUP; -------------------------------------------------------------------- -- 단계3 -- 실행 Instance: ORAMSWIN949 -- NLS_LANG: KO16MSWIN949 -- 작업명: Datapump Export -- Tool: expdp -- sql*plus에서 한글 표시 되는지 확인 후 다음 실행 set NLS_LANG=KO16MSWIN949 expdp leg/leg@oramswin949 directory=MIG_DIR dumpfile=oramswin949_leg_exp.dmp logfile=oramswin949_leg_exp.log schemas=leg -------------------------------------------------------------------- -- 단계4 -- 실행 Instance: ORAUTF -- NLS_LANG: AL32UTF8 -- 작업명: Table 생성 -- Tool: SQL*Plus -- Target table을 미리 생성 -- LINE_NUM, SUB_STA_NM 컬럼 길이 증가 -- COMMT 컬럼 데이터 타입 변경(VARCHAR2 -> CLOB) CREATE TABLE SUB_MON_STAT ( USE_MON VARCHAR2(8), LINE_NUM VARCHAR2(50), -- 14 -> 50 SUB_STA_ID VARCHAR2(4), SUB_STA_NM VARCHAR2(100), -- 20 -> 100 RIDE_PASGR_NUM NUMBER(10), ALIGHT_PASGR_NUM NUMBER(10), WORK_DT VARCHAR2(8), COMMT CLOB, -- VARCHAR2 -> CLOB REF_DES CLOB, REF_IMG BLOB ); -------------------------------------------------------------------- -- 단계5 -- 실행 Instance: ORAUTF -- NLS_LANG: AL32UTF8 -- 작업명: Datapump Import -- Tool: impdp impdp leg/leg@orautf directory=MIG_DIR dumpfile=oramswin949_leg_exp.dmp logfile=oramswin949_leg_imp.log content=data_only
3. US7ASCII zu AL32UTF8 (1 Pfad)
Diese Methode wird von ORACLE nicht empfohlen und erfordert eine separate Konvertierungsverarbeitung, da Daten vom Typ CLOB normalerweise nicht konvertiert werden.
Da zudem der Zeichensatz des Betriebs-DB geändert wird, bleiben die Originaldaten nicht erhalten, was ein Rollback im Fehlerfall erschwert und sollte daher möglichst nicht auf die Betriebsumgebung übertragen werden.
Wenn Sie diese Methode zwangsläufig verwenden, wenden Sie sie bitte auf die Produktionsumgebung an, nachdem Sie sie in der Testumgebung ausreichend verifiziert haben.
Das Ausführungsskript für jeden Schritt ist wie folgt.
-------------------------------------------------------------------- -- 단계1 -- 실행 Instance: ORAUS7 -- NLS_LANG: US7ASCII -- 작업명: Character Set 변경 -- Tool: SQL*Plus SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE CHARACTER SET INTERNAL_USE KO16MSWIN949; SHUTDOWN IMMEDIATE; STARTUP; -------------------------------------------------------------------- -- 단계2 -- 실행 Instance: ORAMSWIN949(=ORAUS7) -- NLS_LANG: KO16MSWIN949 -- 작업명: Datapump Export -- Tool: expdp -- sql*plus에서 한글 표시 되는지 확인 후 다음 실행 set NLS_LANG=KO16MSWIN949 expdp leg/leg@oramswin949 directory=MIG_DIR dumpfile=oramswin949_leg_exp.dmp logfile=oramswin949_leg_exp.log schemas=leg -------------------------------------------------------------------- -- 단계3 -- 실행 Instance: ORAUTF -- NLS_LANG: AL32UTF8 -- 작업명: Table 생성 -- Tool: SQL*Plus -- Target table을 미리 생성 -- LINE_NUM, SUB_STA_NM 컬럼 길이 증가 -- COMMT 컬럼 데이터 타입 변경(VARCHAR2 -> CLOB) CREATE TABLE SUB_MON_STAT ( USE_MON VARCHAR2(8), LINE_NUM VARCHAR2(50), -- 14 -> 50 SUB_STA_ID VARCHAR2(4), SUB_STA_NM VARCHAR2(100), -- 20 -> 100 RIDE_PASGR_NUM NUMBER(10), ALIGHT_PASGR_NUM NUMBER(10), WORK_DT VARCHAR2(8), COMMT CLOB, -- VARCHAR2 -> CLOB REF_DES CLOB, REF_IMG BLOB ); -------------------------------------------------------------------- -- 단계4 -- 실행 Instance: ORAUTF -- NLS_LANG: AL32UTF8 -- 작업명: Datapump Import -- Tool: impdp impdp leg/leg@orautf directory=MIG_DIR dumpfile=oramswin949_leg_exp.dmp logfile=oramswin949_leg_imp.log content=data_only
6.2.2. Methode 2) SQL*Loader
SQL*Loader benötigt eine Steuerdatei und eine Datendatei. Darunter enthält die Datendatei die eigentlichen Daten.
Um diese Datendatei zu erstellen, können Sie sie mit verschiedenen Tools wie PL/SQL, Pro*C und Java selbst erstellen oder sie so verwenden, wie sie ist, indem Sie auf den Quellcode verweisen, der die gleiche Funktion bereits implementiert hat, oder sie leicht erweitern es.
Hier stellen wir nicht vor, wie man es direkt macht, sondern nur die URL des implementierten Quellcodes.
Blog von Tom Kyte, Autor von Effective Oracle: https://asktom.oracle.com/Misc/httpasktomoraclecomtkyteflat.html
Wenn Sie bei Google suchen, finden Sie außerdem den Quellcode, auf den Sie verweisen können.
Führen Sie nach dem Erstellen von Datendateien in Einheiten von Tabellen oder Partitionen sqlldr gleichzeitig in mehreren Gruppen aus, um sie parallel zu laden, um die Ausführungszeit mit einem angemessenen Lastniveau zu minimieren.