Problema de importación de Oracle causado por diferentes conjuntos de caracteres

11

Estoy tratando de importar una exportación de Oracle 11 a Oracle 11 XE.

Recibo los siguientes mensajes:

la importación en XE fehlerhaft se realiza en el juego de caracteres WE8MSWIN1252 y el
servidor de importación de juego de caracteres AL16UTF16 NCHAR usa el juego de caracteres AL32UTF8 (posible conversión de juego de caracteres)

Alguna idea, ¿cómo puedo importar este volcado en Oracle 11 XE?

Editar:

Dada una mesa

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3)  NOT NULL,
    Name                  VARCHAR2(60) NOT NULL,
    Abkuerzung            VARCHAR2(5)  NOT NULL
);

Me salen errores como este

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "BDATA"."ARTIKEL"."ABKUERZUNG" (actual: 6, maximum: 5)
Column 1 ABL
Column 2 Aufbewahrungslösung
Column 3 AfbLö

Faltan algunas filas de la importación.

bernd_k
fuente

Respuestas:

8

Si ese es el DDL real que está utilizando para crear la tabla, puede usar el parámetro NLS_LENGTH_SEMANTICS . Si configura eso en CHAR en lugar del valor predeterminado de BYTE, a VARCHAR2 (5) se le asignará suficiente espacio para almacenar 5 caracteres en el conjunto de caracteres de la base de datos (potencialmente hasta 20 bytes) en lugar de 5 bytes (lo que podría permitir solo 1 carácter )

Desafortunadamente, cambiar el NLS_LENGTH_SEMANTICSprobablemente no será muy útil si confía en el proceso de importación para crear la tabla: el archivo de volcado agregará inherentemente la palabra clave CHAR o BYTE, por lo que realmente emitirá la declaración

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3 BYTE)  NOT NULL,
    Name                  VARCHAR2(60 BYTE) NOT NULL,
    Abkuerzung            VARCHAR2(5 BYTE)  NOT NULL
);
Justin Cave
fuente
Tengo el script de creación de tabla y puedo modificarlo de acuerdo con su propuesta. Si imp funciona cuando las tablas ya están creadas, todo estaría bien.
bernd_k
@bernd_k - Genial. Luego puede configurar NLS_LENGTH_SEMANTICS antes de ejecutar el DDL o puede modificar el DDL para agregar CHAR a cada declaración de columna VARCHAR2. Cuando realice la importación, solo tendrá que decirle que ignore el fallo de las instrucciones CREATE TABLE ya que las tablas ya existirán.
Justin Cave
Cambié la definición de mi tabla ... VARCHAR2 (60 CHAR) NOT NULL ... y usé IMP con IGNORE = Y y la importación finalizó con éxito con advertencias.
bernd_k
4

No tiene una opción de juego de caracteres en XE, por lo que no puede cambiarlo para adaptarlo a la base de datos que está intentando importar. ¿Sería práctico migrar la base de datos de origen antes de exportar?

La importación debería funcionar, pero la conversión del juego de caracteres puede significar que algunas columnas de texto con caracteres no ascii no se verán igual después de la importación. Y las filas se pueden rechazar si son demasiado largas en el nuevo conjunto de caracteres.

En su caso, está convirtiendo a UTF8, lo que significa que es posible que un carácter de un solo byte crezca durante la conversión a 2 ( o más en teoría ). Es posible que deba aumentar el tamaño de la columna antes de exportar o ajustar el esquema de destino e importar los datos en un paso separado. Vea aquí otros posibles problemas de truncamiento de datos.

Jack dice que intente topanswers.xyz
fuente
Mira mi edición. Mi única esperanza es crear primero las tablas con ancho extendido y luego importar los datos ignorando las tablas creadas desde la importación.
bernd_k
¿Estás usando impdp? mira aquí cómo
Jack dice que intente topanswers.xyz
Todavía no, pero quizás sea un buen momento para aprender.
bernd_k
pero tenga en cuenta que impdp solo se puede usar con exportaciones creadas con expdp
Jack dice que intente topanswers.xyz
2

La forma más fácil: (Apagado necesario) :

Primero, conéctese como sysdba:

sqplus / as sysdba

A continuación, ejecute el siguiente script:

alter system set nls_length_semantics=CHAR scope=both;
shutdown;
startup restrict;
alter database character set INTERNAL_USE WE8ISO8859P1;
shutdown;
startup;

Funcionó para mí en un Oracle 12c Standard Two Edition

Tomado de: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html

Walter Colchado
fuente
0

Esto funcionó para mí. En lugar de esto:

imp u/p@db file=data.dmp

Pruebe algo como esto en bash:

imp u/p@db file=<(perl -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp)

Esto cambia cada col1 VARCHAR2(n)a col1 VARCHAR2(n CHAR)en líneas que comienzan con CREATE TABLE. También puede cambiar data.dmpantes de ejecutar imp en él, si no puede hacerlo <(...)en su shell, por ejemplo:

perl -i.bk -pe'/^CREATE TABLE/&&s/(VARCHAR2\(\d+)\)/$1 CHAR)/g' data.dmp

... pero no es necesario en bash y algo podría salir mal en la conversión o al hacer la copia de seguridad como se indica en -i.bk.

Kjetil S.
fuente