Migrer le characterset de la base avec CSSCAN et CSALTER

Vous envisagez de migrer le characterset de la base. Mais il y a un risque potentiel de conversion ou de perte de caractères.
Oracle fournit des packages permettant de réaliser cette opération de conversion. Deux packages sont mis à disposition lors de l’installation du moteur de la base de données, CSSCAN et CSALTER.
CSSCAN permet de scanner les données de la base et de remonter toute possibilité de perte de données ou de problème lors du changement d’encodage. Il s’agit en fait d’une étape de vérification et de validation pour la migration vers le nouveau characterset. A la fin de l’exécution, un rapport est créé et résume les risques potentiels par type de données.

Après exécution du script CSSCAN et analyse des risques, vous aurez trois possibilités pour migrer l’encodage de la base :

  • Via l’utilitaire export / import
  • Avec le script CSALTER
  • Avec le script CSALTER et l’utilitaire export / import pour certaines tables.

L’export / import est la méthode la plus souvent utilisée, notre objectif ici est de tester le script CSALTER.
Le script CSALTER est un outil mis à disposition du DBA pour réaliser la migration vers le nouveau jeu de caractère. Il remplace la commande obsolète SQL « ALTER DATABASE CHARACTER SET ».
Avant d’exécuter ce package, il faut impérativement au préalable avoir lancé l’utilitaire CSSCAN.
Cet article vous guide dans la migration de characterset via les scripts CSSCAN et CSALTER. Dans l’exemple ci-dessous, la base est codée en AL32UTF8, et l’objectif est de migrer en UTF8.
1. Installer les prérequis avant d’exécuter CSSCAN
Le script va scanner l’ensemble des données de la base et remonter les résultats. Pour cela, il est nécessaire de stocker les données dans des tables. Ces tables appartiennent à un schema bien précis, CSMIG. Le script « csminst.sql » crée cet utilisateur et les objets qui y sont associés.

$ cd $ORACLE_HOME/rdbms/admin
$ sqlplus / as sysdba
SQL> @csminst.sql
User created.
Grant succeeded.
...
Grant succeeded.
SQL> select username from dba_users where username like 'CSMIG%';
USERNAME
------------------------------
CSMIG
SQL> select parameter,value from v$nls_parameters
  2  where parameter='NLS_CHARACTERSET';
PARAMETER             VALUE
--------------------- ------------------------
NLS_CHARACTERSET      AL32UTF8
SQL>

2. Sauvegarde de la base et exécution du CSSCAN
Le schéma étant créé, l’exécution du script CSSCAN peut se dérouler. Soit vous scanner toute la base (ce qui est plus judicieux), soit des schémas bien spécifiques.
Ici, toute la base (option FULL) est analysée. Mais avant de réaliser cette opération, il est primordial de sauvegarder la base. Une sauvegarde full RMAN a été réalisé au préalable.

$ csscan "'sys as sysdba'"  full=y TOCHAR=UTF8 PROCESS=7 FEEDBACK=1000
Character Set Scanner v2.2 : Release 11.2.0.1.0 - Production on Mon Dec 31 15:58
:29 2012
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
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
Enter array fetch buffer size: 1024000 >
Enumerating tables to scan...
. process 4 scanning EXFSYS.RLM$DMLEVTTRIGS
. process 1 scanning EXFSYS.RLM$VALIDPRIVS
. process 6 scanning EXFSYS.RLM$INCRRRSCHACT.
Creating Database Scan Summary Report...
Creating Individual Exception Report...
Scanner terminated successfully.

3. Analyser les rapporst de scan
L’exécution du CSSCAN génère trois fichiers :

  • Un fichier scan.txt résumant les scan effectués sur les différents objets.
  • Un fichier scan.out montrant les tables scannés.
  • Un fichier scan.err fournissant les exceptions rencontrées lors du scan.

Le premier fichier est un reporting donnant les statistiques de pertes de données si la conversion est faite. La colonne ‘LOSSY’ indique les potentielles pertes de données.
En vérifiant le fichier des exceptions, rien n’est remonté. Vous décidez donc de réaliser la migration du characterset.
4. CSALTER
Redémarrez la base en mode restrict afin d’éviter toute transaction.

SQL> shutdown immediate
ORACLE instance shut down.
SQL> startup restrict
ORACLE instance started.
Database opened.
SQL>
SQL> @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>

5. Reboot de la base et vérification du nouvel encodage

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Database opened.
SQL>
SQL> select parameter,value from v$nls_parameters
  2  where parameter='NLS_CHARACTERSET';
PARAMETER             VALUE
--------------------- ------------------------
NLS_CHARACTERSET      UTF8

Pour plus d’informations :

Changing the Database Character Set ( NLS_CHARACTERSET ) [ID 225912.1]
Globalization (NLS) – Frequently Asked Questions [ID 60134.1]
Which Character Set Supports Which Language [ID 62421.1]

http://docs.oracle.com/cd/E11882_01/server.112/e10729/ch12scanner.htm#i1006023