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