Farklı karakter kümelerinin neden olduğu Oracle Import sorunu


11

Bir Oracle 11 ihracatını Oracle 11 XE'ye aktarmaya çalışıyorum.

Aşağıdaki mesajları alıyorum:

XE fehlerhaft içe aktarma WE8MSWIN1252 karakter kümesinde ve AL16UTF16 NCHAR karakter kümesinde
içe aktarma alma sunucusu AL32UTF8 karakter kümesini (olası karakter kümesi dönüştürme) kullanır

Herhangi bir fikir, bu dökümü Oracle 11 XE'ye nasıl aktarabilirim?

Düzenle:

Bir tablo verildi

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

Böyle hatalar alıyorum

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ö

İçe aktarma işleminde bazı satırlar eksik.

Yanıtlar:


8

Tabloyu oluşturmak için kullandığınız gerçek DDL ise, NLS_LENGTH_SEMANTICS parametresini kullanabilirsiniz . Bunu varsayılan BYTE yerine CHAR olarak ayarlarsanız, VARCHAR2 (5) 5 karakter yerine veritabanı karakter kümesinde (potansiyel olarak 20 bayta kadar) 5 karakter depolamak için yeterli alan ayrılır (yalnızca 1 karaktere izin verebilir) ).

Ne yazık ki, NLS_LENGTH_SEMANTICStabloyu oluşturmak için içe aktarma işlemine güveniyorsanız , büyük olasılıkla değiştirmek çok yararlı olmayacaktır - döküm dosyası, CHAR veya BYTE anahtar sözcüğünü doğal olarak ekler ve böylece ifadeyi yayınlar.

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

Ben tablo komut dosyası oluşturmak ve teklifinize göre değiştirebilirsiniz. Tablolar zaten oluşturulduğunda imp çalışıyorsa, her şey iyi olur.
bernd_k

@bernd_k - Güzel. Daha sonra DDL'yi çalıştırmadan önce NLS_LENGTH_SEMANTICS ayarlayabilir veya her VARCHAR2 sütun bildirimine CHAR eklemek için DDL'yi değiştirebilirsiniz. İçe aktarma işlemini gerçekleştirdiğinizde, tablolar zaten varolduğundan, CREATE TABLE ifadelerinin başarısızlığını yok saymasını söylemeniz gerekir.
Justin Cave

Tablo tanımımı değiştirdim ... VARCHAR2 (60 CHAR) NOT NULL ... ve IGNORE = Y ile IMP kullandım ve İçe Aktarma, uyarılarla başarıyla sonlandırıldı.
bernd_k

4

Sen XE karakter kümesinin bir seçenek yok Eğer ithalat çalıştığınız veritabanı uyacak şekilde değiştiremezsiniz bu yüzden. O pratik olurdu göç ihracat öncesi kaynak veritabanı?

İçe aktarma işleminin çalışması gerekir, ancak karakter kümesi dönüşümü, ASCII olmayan karakterler içeren bazı metin sütunlarının içe aktarma işleminden sonra aynı görünmeyeceği anlamına gelebilir. Ve yeni karakter kümesinde çok uzunlarsa satırlar reddedilebilir.

Sizin durumunuzda, UTF8'e dönüştürüyorsunuz, bu da tek bir bayt karakterinin 2'ye ( veya teoride daha fazlasına ) dönüşüm sırasında büyümesinin mümkün olduğu anlamına gelecektir . Dışa aktarmadan önce sütun boyutunu artırmanız veya hedef şemayı ayarlamanız ve verileri ayrı bir adımda içe aktarmanız gerekebilir. Diğer olası veri kesme sorunları için buraya bakın


Düzenlememe bakın. Benim tek umudum ilk önce genişletilmiş genişlikte tablolar oluşturmak ve daha sonra oluşturma tabloları alma görmezden veri almaktır.
bernd_k

impdp kullanıyor musunuz? nasıl olduğunu görmek için buraya bakın
Jack topanswers.xyz denemek diyor

henüz değil, belki de öğrenmek için iyi bir zaman.
bernd_k

ama impdp sadece expdp ile oluşturulan ihracatla kullanılabileceğini not
Jack diyor topanswers.xyz deneyin

2

En kolay yol: (Kapatma gerekli) :

İlk olarak, sysdba olarak bağlanın:

sqplus / as sysdba

Ardından, aşağıdaki komut dosyasını yürütün:

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

Benim için bir Oracle 12c Standard Two Edition'da çalıştı

Alındığı yer: http://www.blogdelpibe.com/2015/05/como-solucionar-el-error-ora-12899.html


0

Bu benim için çalıştı. Bunun yerine:

imp u/p@db file=data.dmp

Bash'da böyle bir şey deneyin:

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

Bu , ile başlayan satırlarda her col1 VARCHAR2(n)olarak değişir . Örneğin, kabuğunuzda bunu yapamıyorsanız, imp üzerinde çalıştırmadan önce de değiştirebilirsiniz :col1 VARCHAR2(n CHAR)CREATE TABLEdata.dmp<(...)

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

... ancak bash için gerekli değildir ve dönüşümde veya yedekleme tarafından belirtildiği gibi yedekleme yaparken bir şeyler ters gidebilir -i.bk.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.