Oracle-Importproblem durch unterschiedliche Zeichensätze

11

Ich versuche, einen Oracle 11-Export in Oracle 11 XE zu importieren.

Ich erhalte folgende Meldungen:

Import in XE Fehlerhaft Import in WE8MSWIN1252 Zeichensatz und AL16UTF16 NCHAR Zeichensatz
Importserver verwendet AL32UTF8 Zeichensatz (mögliche Zeichensatzkonvertierung)

Irgendwelche Ideen, wie ich diesen Dump in Oracle 11 XE importieren kann?

Bearbeiten:

Gegeben eine Tabelle

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

Ich bekomme solche Fehler

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ö

Einige Zeilen fehlen beim Import.

bernd_k
quelle

Antworten:

8

Wenn dies die tatsächliche DDL ist, die Sie zum Erstellen der Tabelle verwenden, können Sie den Parameter NLS_LENGTH_SEMANTICS verwenden . Wenn Sie dies auf CHAR anstatt auf die Standardeinstellung von BYTE setzen, wird einem VARCHAR2 (5) genügend Speicherplatz zugewiesen, um 5 Zeichen im Datenbankzeichensatz (möglicherweise bis zu 20 Byte) anstelle von 5 Byte (möglicherweise nur 1 Zeichen) zu speichern ).

Leider ist das Ändern des NLS_LENGTH_SEMANTICSwahrscheinlich nicht besonders hilfreich, wenn Sie sich beim Erstellen der Tabelle auf den Importvorgang verlassen. Die Dump-Datei fügt von Natur aus das Schlüsselwort CHAR oder BYTE hinzu, sodass die Anweisung tatsächlich ausgegeben wird

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3 BYTE)  NOT NULL,
    Name                  VARCHAR2(60 BYTE) NOT NULL,
    Abkuerzung            VARCHAR2(5 BYTE)  NOT NULL
);
Justin Cave
quelle
Ich habe das Skript zum Erstellen einer Tabelle und kann es gemäß Ihrem Vorschlag ändern. Wenn imp funktioniert, wenn die Tabellen bereits erstellt wurden, ist alles in Ordnung.
Bernd_k
@bernd_k - Cool. Anschließend können Sie entweder NLS_LENGTH_SEMANTICS festlegen, bevor Sie die DDL ausführen, oder Sie können die DDL so ändern, dass jeder VARCHAR2-Spaltendeklaration CHAR hinzugefügt wird. Wenn Sie den Import durchführen, müssen Sie ihn nur anweisen, den Fehler der CREATE TABLE-Anweisungen zu ignorieren, da die Tabellen bereits vorhanden sind.
Justin Cave
Ich habe meine Tabellendefinition geändert ... VARCHAR2 (60 CHAR) NOT NULL ... und IMP mit IGNORE = Y verwendet und Import erfolgreich mit Warnungen beendet.
Bernd_k
4

Sie haben in XE keine Auswahl an Zeichensätzen, sodass Sie diese nicht an die Datenbank anpassen können, die Sie importieren möchten. Wäre es praktisch, die Quellendatenbank vor dem Export zu migrieren ?

Der Import sollte funktionieren, aber die Konvertierung von Zeichensätzen kann bedeuten, dass einige Textspalten mit Nicht-ASCII-Zeichen nach dem Import nicht gleich aussehen. Und Zeilen können abgelehnt werden, wenn sie im neuen Zeichensatz zu lang sind.

In Ihrem Fall konvertieren Sie in UTF8, was bedeutet, dass ein einzelnes Bytezeichen während der Konvertierung in 2 ( oder theoretisch mehr ) wachsen kann . Möglicherweise müssen Sie die Spaltengröße vor dem Export erhöhen oder das Zielschema anpassen und die Daten in einem separaten Schritt importieren. Weitere mögliche Probleme beim Abschneiden von Daten finden Sie hier

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle
Siehe meine Bearbeitung. Meine einzige Hoffnung besteht darin, zuerst die Tabellen mit erweiterter Breite zu erstellen und dann die Daten zu importieren, wobei die Erstellungstabellen aus dem Import ignoriert werden.
Bernd_k
Verwenden Sie impdp? siehe hier für wie
Jack sagt versuchen topanswers.xyz
noch nicht, aber vielleicht ein guter Zeitpunkt zum Lernen.
Bernd_k
Beachten Sie jedoch, dass impdp nur für Exporte verwendet werden kann, die mit expdp erstellt wurden
Jack sagt, versuchen Sie es mit topanswers.xyz
2

Der einfachste Weg: (Herunterfahren erforderlich) :

Verbinden Sie sich zunächst als sysdba:

sqplus / as sysdba

Führen Sie als Nächstes das folgende Skript aus:

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

Es hat bei mir in einer Oracle 12c Standard Two Edition funktioniert

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

Walter Colchado
quelle
0

Das hat bei mir funktioniert. An Stelle von:

imp u/p@db file=data.dmp

Versuchen Sie so etwas in Bash:

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

Dies ändert col1 VARCHAR2(n)sich col1 VARCHAR2(n CHAR)in Zeilen, die mit beginnen CREATE TABLE. Sie können auch Änderungen data.dmpvornehmen , bevor Sie imp ausführen, wenn Sie beispielsweise nicht in der Lage sind, <(...)Folgendes in Ihrer Shell zu tun :

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

... aber es ist nicht notwendig in Bash und etwas könnte bei der Konvertierung oder beim Erstellen des Backups schief gehen, wie von angegeben -i.bk.

Kjetil S.
quelle