Conversión de conjuntos de caracteres de Oracle(8): 6. Cómo convertir un conjunto de caracteres implementado por el usuario (1)

Echemos un vistazo al método de conversión de conjunto de caracteres implementado por el usuario. Puede comprobar cómo convertir de KO16MSWIN949, US7ASCII a AL32UTF8 utilizando Oracle Utility Data Pump Export, Import.

Para los métodos que requieren una implementación separada, Oracle no garantiza la conversión y el implementador debe garantizar la conversión, por lo que la precisión debe verificarse mediante verificación técnica y pruebas para varios casos.

Esta es una continuación del artículo anterior.

Conversión de juego de caracteres de Oracle (7): 5.4. KO16MSWIN949 Entorno CSSCAN Resultado de ejecución

6. Cómo convertir un juego de caracteres implementado por el usuario

6.1. Cómo aplicar herramientas de terceros – ETL, etc.

Este es un método para implementar la conversión de conjuntos de caracteres utilizando herramientas ETL que son bien conocidas en el mercado (por ejemplo, Informatica PowerCenter, IBM DataStage, etc.).

Es un método con el que no tengo experiencia directa, y solo sé que es posible, por lo que no describiré el método detallado.

Sin embargo, revise solo las consideraciones a continuación.

  • Cada producto incurre en un costo de compra, o se requieren costos adicionales de mano de obra de desarrollo, incluso si ya se ha comprado.
  • También se pueden considerar TOS de código abierto (Talend Open Studio)-DI, Pentaho Kettle, etc.
  • En el caso de escribir datos de la base de datos de origen en un archivo y leer e insertar el archivo en la base de datos de destino, el separador de columnas y el separador de filas se incluyen en el valor de los datos y manejan errores como ser empujado por una columna o una fila siendo guardado incorrectamente como varias filas. es absolutamente necesario
  • Al seleccionar una herramienta inicial, es necesario realizar una prueba piloto en una mesa de gran capacidad para seleccionar una herramienta adecuada, y es importante asegurar personal de desarrollo de ETL con mucha experiencia.

6.2. Cómo utilizar la utilidad de Oracle

Veremos tres formas de implementar la conversión de juegos de caracteres aprovechando las funciones y utilidades de Oracle.

1. Utilizar la exportación/importación de la bomba de datos

  • Forzar cambio de conjunto de caracteres: ALTER DATABASE CHARACTER SET INTERNAL
  • Ejecutar exportación/importación: aplicar el mismo NLS_LANG que el conjunto de caracteres de destino

2. Uso de SQL*Loader

  • Descarga de datos de la base de datos fuente: formato utilizable en SQL*Loader, requiere desarrollo en PL/SQL, Pro*C, Java, etc.
  • Cargue datos en la base de datos de destino con SQL*Loader

3. Usando DB Link y CTAS y UTL_RAW
(Ver artículo separado: Conversión de juegos de caracteres de Oracle (9): 6. Cómo convertir juegos de caracteres implementados por el usuario (2))

  • Crear enlace de base de datos: cree un enlace de base de datos que apunte desde el destino al origen
  • Creación de vista: conversión de vista de columnas CHAR, VARCHAR2 desde el origen a UTL_RAW.CAST_TO_RAW
  • Cargue datos en CTAS: aplique la función UTL_RAW.CAST_TO_VARCHAR2 y CONVERT mientras ejecuta CTAS (Crear tabla como selección) desde Target a DB Link

Las ventajas y desventajas de cada método se resumen a continuación.

ManeraVentajasDesventajas
1. Exportación/Importación de bomba de datos– Procesamiento paralelo posible
– El procesamiento de excepciones, como carácter de nueva línea, carácter especial, carácter nulo, no es necesario
– Tiempo de descarga de datos requerido
– En caso de que la base de datos de origen sea US7ASCII
  . Se requiere cambio de juego de caracteres (se requiere preservación original)
  . Se requiere conversión adicional de datos de tipo CLOB
2. Cargador SQL*– Procesamiento paralelo posible– Necesidad de desarrollar una función para crear (descargar) un archivo de datos
– Manejo de excepciones/errores requerido durante el procesamiento de archivos de descarga/carga (carácter de nueva línea, carácter especial, carácter nulo, etc.)
– Tiempo de descarga de datos requerido
3. Enlace de base de datos y CTAS y UTL_RAW– No se requiere tiempo de descarga de datos– El procesamiento en paralelo es difícil con la sugerencia Parallel (necesidad de procesar dividiendo directamente el rango de datos)
– No aplicable a datos que excedan los 2000 bytes (la longitud máxima del tipo RAW es de 2000 bytes)

Mientras revisa estos métodos, tenga en cuenta las siguientes consideraciones:

  • Al convertir de US7ASCII a AL32UTF8 mediante el método de exportación/importación de bomba de datos, El juego de caracteres de la base de datos original debe cambiarse con DDL
    • No se recomienda cambiar la base de datos original directamente. Si sale mal, puede ser muy difícil revertirlo.
    • Si ya se configuró una base de datos para conmutación por error, es deseable utilizarla o configurar y cambiar una base de datos de replicación separada.
    • Alternativamente, es posible restaurar los datos de respaldo de la base de datos original en un servidor separado y usarlos.
    • Además, es conveniente revisar varios métodos (replicación de disco, etc.) para configurar una base de datos de replicación y seleccionar un método teniendo en cuenta el costo y el tiempo.
    • Si es difícil configurar una base de datos de replicación, puede continuar después de la copia de seguridad completa, pero si se requiere una recuperación, el tiempo de inactividad del servicio puede ser prolongado según la cantidad de datos.
  • A menos que se detenga el servicio, independientemente del método que se aplique, el punto de extracción de la base de datos original debe coincidir para garantizar la coherencia de los datos (use FLASHBACK_SCN, FLASHBACK_TIME)
  • Además, el método de reflejar los datos modificados después del punto de extracción debe probarse y prepararse con anticipación (uso de CDC, etc.)

6.2.1. Método 1) Exportación/importación de bomba de datos

Preparación: Use la siguiente secuencia de comandos para crear objetos de directorio y otorgar los permisos necesarios al ejecutar la exportación/importación de bombeo de datos. 

Ejecute para cada instancia de Oracle que se probará: ORAUS7, ORAMSWIN949 y ORAUTF.

▼ Otorgar permisos a la instancia ORAUS7

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

▼ Otorgar permisos a la instancia ORAMSWIN949

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

▼ Autorizar la Instancia ORAUTF

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

Echemos un vistazo a cada uno de los siguientes tres casos.

  1. KO16MSWIN949 a AL32UTF8
  2. US7ASCII a AL32UTF8 (2 rutas)
  3. US7ASCII a AL32UTF8 (1 ruta)

Como referencia, en el caso de la conversión de US7ASCII a AL32UTF8, las columnas de tipo CLOB no se convierten normalmente, por lo que se requiere un procesamiento por separado.

Se explicará en el siguiente artículo.

1. KO16MSWIN949 a AL32UTF8

1. KO16MSWIN949 to AL32UTF8 개념도
1. Diagrama conceptual de KO16MSWIN949 a AL32UTF8

En este caso, los tipos CHAR, VARCHAR2 y CLOB se convierten normalmente.

El script de ejecución para cada paso es el siguiente.

--------------------------------------------------------------------
-- 단계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 a AL32UTF8 (2 rutas)

2. US7ASCII to AL32UTF8 (2 path) 개념도
2. Diagrama conceptual de US7ASCII a AL32UTF8 (2 rutas)

Tenga en cuenta lo siguiente:

  • El servidor de base de datos de replicación temporal es una base de datos que replica la base de datos de operación tal como es en la misma forma que la original.
  • En el entorno de prueba, se utilizó la instancia ORAMSWIN949 como base de datos de replicación temporal y los datos se replican con Data Pump. En este caso, el juego de caracteres debe cambiarse a US7ASCII antes de la replicación.
  • En la aplicación real, es conveniente configurar y utilizar por separado el servidor de base de datos de replicación temporal con el conjunto de caracteres US7ASCII.

ORACLE no recomienda este método y requiere un proceso de conversión independiente porque los datos de tipo CLOB normalmente no se convierten.

El script de ejecución para cada paso es el siguiente.

--------------------------------------------------------------------
-- 단계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 a AL32UTF8 (1 ruta)

3. US7ASCII to AL32UTF8 (1 path) 개념도
3. Diagrama conceptual de US7ASCII a AL32UTF8 (1 ruta)

ORACLE no recomienda este método y requiere un proceso de conversión independiente porque los datos de tipo CLOB normalmente no se convierten.

Además, dado que se cambia el conjunto de caracteres de la base de datos operativa, los datos originales no se pueden conservar, lo que dificulta la reversión en caso de error. Por lo tanto, no se debe aplicar al entorno operativo si es posible.

Si usa este método inevitablemente, aplíquelo al entorno de producción después de verificarlo suficientemente en el entorno de prueba.

El script de ejecución para cada paso es el siguiente.

--------------------------------------------------------------------
-- 단계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. Método 2) SQL*Loader

SQL*Loader requiere un archivo de control y un archivo de datos. Entre ellos, el archivo de datos contiene los datos reales.

Para crear este archivo de datos, puede crearlo usted mismo utilizando varias herramientas, como PL/SQL, Pro*C y Java, o utilizarlo tal como está haciendo referencia al código fuente que ya ha implementado la misma función, o ampliar ligeramente eso.

Aquí, no presentamos cómo hacerlo directamente, sino solo la URL del código fuente implementado.

Blog de Tom Kyte, autor de Oracle efectivo: https://asktom.oracle.com/Misc/httpasktomoraclecomtkyteflat.html

Además, si busca en Google, encontrará el código fuente que puede consultar.

Después de crear archivos de datos en unidades de tabla o partición, ejecute sqlldr simultáneamente en varios grupos para cargarlos en paralelo y minimizar el tiempo de ejecución con un nivel de carga adecuado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

es_ESEspañol