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.

Konvertierung von Oracle-Zeichensätzen (7): 5.4. KO16MSWIN949 CSSCAN-Ausführungsergebnis der Umgebung

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.

WegVorteileNachteile
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.

  1. KO16MSWIN949 bis AL32UTF8
  2. US7ASCII zu AL32UTF8 (2 Pfade)
  3. 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

1. KO16MSWIN949 to AL32UTF8 개념도
1. KO16MSWIN949 bis AL32UTF8 Konzeptdiagramm

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)

2. US7ASCII to AL32UTF8 (2 path) 개념도
2. Konzeptdiagramm von 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)

3. US7ASCII to AL32UTF8 (1 path) 개념도
3. US7ASCII zu AL32UTF8 (1 Pfad) Konzeptdiagramm

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

de_DEDeutsch