Standen Sie auch schon mal vor dem Problem, auf einer bestehenden Datenbank den Zeichensatz wechseln zu müssen?
Eigentlich wird das Charset bei der Installation der Datenbank festgelegt. Es gibt aber drei Möglichkeiten es auch noch nachträglich zu ändern. Oracle spricht an dieser Stelle von einer Characterset Migration.
Wir wollen in diesem Tipp die Möglichkeit den Zeichensatz, mithilfe des von Oracle gelieferten Skript CSALTER, zu ändern näher beleuchten.
In den Datenbank Versionen 8i und 9i konnte über den Befehl ALTER DATABASE CHARACTER SET der Zeichensatz geändert werden. Dieser Befehl wird ab Version 10g nicht mehr unterstützt. Seit der Version 10g gibt es dafür das Skript CSALTER, das ohne eine vorherige Prüfung auf Fehler nicht läuft.
Bevor wir richtig starten sind noch einige Vorbereitungen bzw. Überlegungen notwendig:
Die erste und wichtigste Überlegung ist, welches Characterset soll verwendet werden.
Für die Migration ist entscheidend, ob das neue Charset ein Superset des alten ist.
Es gibt zwei Arten von Supersets:
- Ein logisches Superset bedeutet, dass alle Zeichen in beiden Charactersets vorhanden sind, plus neue Zeichen in einem der beiden.
- Ein binäres Superset hat die gleichen Eigenschaften des logischen mit dem Zusatz, dass in beiden Charactersets die Zeichen den gleichen Binärcode haben.
Mit dem CSALTER Skript kann nur dann ein Wechsel stattfinden, wenn es sich bei dem neuen Zeichensatz um ein binäres Superset handelt oder keine Zeichen gespeichert sind die anders codiert sind. Mit dem Skript werden, genau wie mit dem Befehl ALTER DATABASE CHARACTER SET, keine Änderungen an der Speicherung der Zeichen vorgenommen.
Doch nun zu den Vorarbeiten. Als erstes muss ein Schema angelegt werden damit die Skripte funktionieren. Dieses Schema und die benötigten Objekte werden mit dem CSMINST Skript angelegt. Verbinden Sie sich über SQL*PLUS mit der Datenbank als SYSDBA und führen Sie das CMSINST Skript aus.
@?\rdbms\admin\CSMINST.SQL
Wenn das Schema installiert ist wird als nächster Schritt eine Prüfung durchgeführt, ob eine Migration möglich ist. Das Skript kann interaktiv gestartet werden oder alternativ mit einem Parameterfile.
Hier die Interaktive Variante, der Aufruf aus der DOS Umgebung mit CSSCAN. Dann werden der Reihe nach Username und Passwort, die Art des Scans, das neue Characterset, die Arraysize und die Anzahl an Prozessen abgefragt.
C:\>csscan
Character Set Scanner v2.2 : Release 11.2.0.1.0 - Production on Fr Okt 22 11:06:16 2010
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
Username: sys as sysdba
Password:
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
(1)Full database, (2)User, (3)Table, (4)Column: 1 > 1
Current database character set is WE8MSWIN1252.
Enter new database character set name: > WE8ISO8859P15
Enter array fetch buffer size: 1024000 >
Enter number of scan processes to utilize(1..64): 1 > 8
Enter number of scan processes to utilize(1..64): 1 > 8
Enumerating tables to scan...
. process 1 scanning SYS.SOURCE$[AAAADfAABAAAAXYAAA]
. process 2 scanning SYS.SOURCE$[AAAADfAABAAASOAAAA]
. process 3 scanning SYS.PARAMETER$[AAAAH3AABAAAAzgAAA]
.....
Von dem Scanskript werden drei Ausgabedateien angelegt:
scan.out
In dieser Datei werden alle Ausgaben des Scans mitprotokolliert.
scan.txt
Ist eine Auswertung der Scanergebnisse. Hier steht drin, ob und was sich ändert. Ob die Daten und das Dictionary geändert werden können.
scan.err
In dieser Datei stehen alle Fehler, die behandelt werden müssen bevor eine Migration des Charactersets möglich ist. Es gibt in der Oracle Doku bzw. auf der Oracle Support Seite viele Anweisungen wie auf unterschiedliche Fehlermeldungen reagiert werden kann.
Das Skript CSSCAN muss nach Beseitigung eventueller Fehler nochmals ausgeführt werden sonst ist keine Migration durch das CSALTER möglich.
Sind alle Fehler beseitigt kann mit der Migration begonnen werden. Dazu muss die Datenbank in den RESTRICTED Modus gefahren werden.
Es wird dringend empfohlen spätestens an dieser Stelle eine komplette Datenbank Sicherung zu machen!Die folgenden Änderungen können nicht rückgängig gemacht werden!
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup restrict
ORACLE instance started.
Total System Global Area 855982080 bytes
Fixed Size 2180544 bytes
Variable Size 587205184 bytes
Database Buffers 264241152 bytes
Redo Buffers 2355200 bytes
Database mounted.
Database opened.
SQL> @@?\rdbms\admin\csalter.plb
0 rows created.
Function created.
Function created.
Procedure created.
This script will update the content of the Oracle Data Dictionary.
Please ensure you have a full backup before initiating this procedure.
Would you like to proceed (Y/N)?Y
old 6: if (UPPER('&conf') <> 'Y') then
new 6: if (UPPER('Y') <> 'Y') then
Checking data validity...
begin converting system objects
PL/SQL procedure successfully completed.
Alter the database character set...
CSALTER operation completed, please restart database
PL/SQL procedure successfully completed.
0 rows deleted.
Function dropped.
Function dropped.
Procedure dropped.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 855982080 bytes
Fixed Size 2180544 bytes
Variable Size 587205184 bytes
Database Buffers 264241152 bytes
Redo Buffers 2355200 bytes
Database mounted.
Database opened.
SQL> select parameter, value from nls_database_parameters where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
------------------- ----------------------------------------
NLS_CHARACTERSET WE8ISO8859P15
Damit wurde die Characterset Migration erfolgreich durchgeführt.
Das Ausführen des CSSCAN Skript ist auch für die anderen Migrationsarten ein wichtiger erster Schritt. Damit wird z.B. auch festgestellt, ob Tabellenspalten vergrößert werden müssen, um Umlaute in einem Multibyte Zeichensatz aufnehmen zu können.
Eine weitere Option, wann eine solche Migration durchzuführen ist, wäre:
Eine neue Datenbank mit dem richtigen Zeichensatz ist zu erstellen und die Daten werden mittels Export und Import transportiert. Das ist notwendig wenn, z.B. von einem Singlebyte zu einem Multibyte Zeichensatz migriert werden soll.
Als Mittelweg, wenn es sich nur um wenige Objekte handelt die nicht mit dem Skript migriert werden können, ist es möglich, diese Objekte erst zu exportieren. Dann werden die Objekte gelöscht und die Migration mit dem Skript durchgeführt. Im Anschluss daran werden die Objekte wieder importiert.
Diese und andere Fragen rund um Oracle werden natürlich auch in unseren Schulungen bzw. von unserem Consulting- und Supportteam beantwortet.