다른 문자 세트로 인한 Oracle Import 문제


11

Oracle 11 내보내기를 Oracle 11 XE로 가져 오려고합니다.

다음과 같은 메시지가 나타납니다.

WE8MSWIN1252 문자 세트 및 AL16UTF16 NCHAR 문자 세트
가져 오기 서버 에서 수행 된 XE fehlerhaft 가져 오기에서 가져 오기는 AL32UTF8 문자 세트를 사용합니다 (문자 세트 변환 가능)

이 덤프를 Oracle 11 XE로 가져올 수있는 아이디어가 있습니까?

편집하다:

주어진 테이블

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

이런 오류가 발생합니다

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ö

가져 오기에서 일부 행이 누락되었습니다.

답변:


8

이것이 테이블 작성에 사용중인 실제 DDL 인 경우 NLS_LENGTH_SEMANTICS 매개 변수를 사용할 수 있습니다 . 기본 BYTE가 아닌 CHAR로 설정하면 VARCHAR2 (5)에 5 바이트가 아닌 데이터베이스 문자 세트 (잠재적으로 최대 20 바이트)에 5자를 저장할 수있는 충분한 공간이 할당됩니다 (1 자만 허용 할 수 있음). ).

불행히도 테이블 NLS_LENGTH_SEMANTICS을 만들기 위해 가져 오기 프로세스에 의존하는 경우 아마도 변경하는 것이 도움이되지 않을 것입니다. 덤프 파일은 본질적으로 CHAR 또는 BYTE 키워드를 추가하여 실제로 명령문을 발행합니다.

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

테이블 작성 스크립트가 있으며 제안에 따라 수정할 수 있습니다. 테이블이 이미 작성되었을 때 imp가 작동하면 모두 정상입니다.
bernd_k

@bernd_k-멋지다. 그런 다음 DDL을 실행하기 전에 NLS_LENGTH_SEMANTICS를 설정하거나 모든 VARCHAR2 열 선언에 CHAR를 추가하도록 DDL을 수정할 수 있습니다. 가져 오기를 수행 할 때 테이블이 이미 존재하므로 CREATE TABLE 문의 실패를 무시하도록 지시하면됩니다.
저스틴 동굴

테이블 정의 ... VARCHAR2 (60 CHAR) NOT NULL ...을 변경하고 IGNORE = Y와 함께 IMP를 사용했으며 경고와 함께 가져 오기가 성공적으로 종료되었습니다.
bernd_k

4

당신은 XE에 문자 집합의 선택의 여지가 없어 당신이 수입하려고하는 데이터베이스에 맞게 변경할 수 없습니다 그래서. 내보내기 전에 소스 데이터베이스 를 마이그레이션 하는 것이 실용적 입니까?

가져 오기는 작동하지만 문자 집합 변환은 ASCII가 아닌 문자가있는 일부 텍스트 열이 가져 오기 후에 동일하게 보이지 않을 수 있음을 의미 할 수 있습니다. 새 문자 세트에서 행이 너무 길면 거부 될 수 있습니다.

귀하의 경우 UTF8로 변환 중이므로 2 바이트로 변환하는 동안 단일 바이트 문자가 증가 할 수 있습니다 ( 이론적으로는 이상 ). 대상 스키마를 내보내거나 조정하고 별도의 단계에서 데이터를 가져 오기 전에 열 크기를 늘려야 할 수도 있습니다. 다른 가능한 데이터 잘림 문제는 여기 를 참조 하십시오


내 편집을 참조하십시오. 내 유일한 희망은 먼저 너비가 확장 된 테이블을 만들고 가져 오기에서 테이블 생성을 무시하고 데이터를 가져 오는 것입니다.
bernd_k

impdp를 사용하고 있습니까? 참조 여기 방법은
잭 topanswers.xyz 시도라고

아직은 아니지만 배우기에 좋은 시간입니다.
bernd_k

하지만 impdp 만 expdp를 만들어 수출로 사용될 수 있음을 노트
잭 말한다 topanswers.xyz 시도


0

이것은 나를 위해 일했습니다. 이 대신에 :

imp u/p@db file=data.dmp

bash에서 다음과 같이 시도하십시오.

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

이것은로 시작하는 줄 마다 col1 VARCHAR2(n)로 바뀝니다 . 예를 들어 쉘에서 할 수 없다면 imp를 실행하기 전에 변경할 수도 있습니다 .col1 VARCHAR2(n CHAR)CREATE TABLEdata.dmp<(...)

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

...하지만 bash에서는 필요하지 않으며 변환 또는 백업에서 언급 한대로 백업에 문제가 발생할 수 -i.bk있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.