Archivo de la etiqueta: csalter

Cómo cambiar CHARACTER SET en ORACLE en versiones 10G y posterior

En otro artículo del blog ya expliqué como cambiar el CHARACTER SET de una Base de datos Oracle hasta la versión 8i. En este artículo explicaré como hacerlo en versiones posteriores. Yo lo he probado en versión 11GR2. He de comentar, que si por el motivo que sea, nos vemos obligados a cambiar el CHARACTER SET de una base de datos Oracle, lo más recomendable es iniciar la instalación del servidor Oracle de nuevo y crear la base de datos con el CHARACTER SET adecuado durante el mismo proceso de instalación. Esto nos evitará futuros quebraderos de cabeza. Pero si es inevitable tener que “recrear” este cambio porque ya tenemos información en la Base de datos, no nos queda más remedio que utilizar el siguiente método y “cruzar los dedos” para que el cambio sea lo más exitoso posible.

El proceso de cambio consta de dos etapas: El escaneado de los datos y la conversión de los datos. Para ello utilizaremos la utilidad CSSCAN para la primera etapa y el script CSALTER (csalter.plb) para la segunda.

 La utilidad CSSCAN se utiliza para descartar de la base de datos posibles problemas de conversión de juegos de caracteres y truncamiento de datos. Los datos de escaneo identifica la “cantidad de esfuerzo” necesario para migrar los datos en el nuevo esquema de caracteres antes de realizar el cambio. Esta información nos ayudará a determinar el mejor enfoque antes de realizar la conversión.

El script CSALTER es parte de la utilidad de escaneo  mencionada y es la forma más directa para migrar el juego de caracteres (character set), pero puede ser utilizado de manera independiente si el juego de caracteres de la bases de datos es un subconjunto del nuevo juego de caracteres.

Por tanto, se puede decir que el nuevo juego de caracteres es un “superset” o superconjunto del conjunto de caracteres actual si:

- Todos y cada carácter en el conjunto de caracteres actual está disponible en el nuevo conjunto de caracteres.

 - Todos y cada carácter en el conjunto de caracteres actual  tiene el mismo valor de cógido (code point) en el nuevo conjunto de caracteres.

Los pasos para migrar son los siguientes:

Hecho en esta  versión:

Database Version: Oracle 11g Database R2 (11.2.0.3)
Source Character Set: AL32UTF8
Target Character Set: WE8ISO8859P1

- Parar la Base de datos en modo inmediato o normal. (Recomiendo mejor immediate)

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

- Realizar un Backup completo de la Base de datos. Yo recomiendo realizarla en “frio” y también realizar una copia con la utilidad (expdp /impdp).

A veces, la conversión de datos incorrectos puede provocar daños en los datos, por lo que realizar una copia de seguridad completa de la base de datos antes de intentar migrar los datos a un nuevo conjunto de caracteres es imprescindible. La base de datos puede ser reconstruida posteriormente utilizando la copia de seguridad realizada antes de esta acción, si algo sale mal.

- Volver a poner en marcha la Base de datos

SQL> startup;
ORACLE instance started.

Total System Global Area 2097152000 bytes
Fixed Size 2074120 bytes
Variable Size 771754488 bytes
Database Buffers 1308622848 bytes
Redo Buffers 14700544 bytes
Database mounted.
Database opened.

 - Ejecutar la utilidad de scaner (CSSCAN)

El ejecutable de esta utilidad se ubica en el directorio $ORACLE_HOME/bin

$ csscan “sys/password@mibd as sysdba” full=y

donde midb corresponde al nombre de mi base de datos.

Character Set Scanner v2.1 : Release 11.2.0.3.0 – Production on Sat Sep 13 15:58:28 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
With the Partitioning, OLAP and Data Mining options
Current database character set is AL32UTF8.
Enter new database character set name: > WE8ISO8859P1 (Especificar el nuevo juego de caracteres)
Enter array fetch buffer size: 1024000 >
Enter number of scan processes to utilize(1..32): 1 > 32
Enumerating tables to scan…
. process 1 scanning SYS.SOURCE$[AAAABIAABAAAAIRAAA]
. process 2 scanning SYS.SOURCE$[AAAABIAABAAAHCJAAA]
. process 3 scanning SYS.ATTRIBUTE$[AAAAC1AABAAAAURAAA]
…………………………………………………………………………….
…………………………………………………………………………….
…………………………………………………………………………….

Creating Database Scan Summary Report…
Creating Individual Exception Report…
Scanner terminated successfully.
$

Si se necesita más información de cómo funciona la utilidad CSSCAN se puede invocar a la ayuda en línea de la misma herramienta:

$ csscan help=y

- Ejecución del script de conversión CSALTER

Una vez se ha pasado la utilidad CSSCAN y se ha completado con éxito, debemos volver a parar la Base de datos y volverla a abrir pero esta vez en modo restringido, ya que ningún usuario normal debe poder acceder durante la taréa de conversión. Por tanto conectados como el usuario SYS ejecutaremos el script csalter.plb como sigue. Tened en cuenta que el script se encuentra ubicado en el directorio $ORACLE_HOME/RDBMS/admin.

$ sqlplus /nolog

$ connect /as sysdba;

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

Start Up the Database in Restricted Mode.

SQL> startup restrict;
ORACLE instance started.

Total System Global Area 2097152000 bytes
Fixed Size 2074120 bytes
Variable Size 771754488 bytes
Database Buffers 1308622848 bytes
Redo Buffers 14700544 bytes
Database mounted.
Database opened.

Ejecutar el script csalter.plb …

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 ( Contestar que sí “y”)
old 6: if (UPPER(‘&conf’) <> ‘Y’) then
new 6: if (UPPER(‘y’) <> ‘Y’) then
Checking data validility…
begin converting system objects
12 rows in table SYS.WRI$_ADV_RATIONALE are converted
1 row in table MDSYS.SDO_GEOR_XMLSCHEMA_TABLE is converted
80 rows in table SYS.METASTYLESHEET are converted
17 rows in table SYS.WRI$_DBU_HWM_METADATA are converted
79 rows in table SYS.WRI$_DBU_FEATURE_METADATA are converted
4 rows in table SYS.RULE$ are converted
78 rows in table MDSYS.SDO_STYLES_TABLE are converted
10576 rows in table SYS.WRH$_SQL_PLAN are converted
21 rows in table SYS.WRI$_DBU_FEATURE_USAGE are converted
19 rows in table SYS.WRI$_ADV_ACTIONS are converted
4 rows in table MDSYS.SDO_XML_SCHEMAS are converted
2308 rows in table MDSYS.SDO_COORD_OP_PARAM_VALS are converted
578 rows in table SYS.WRI$_ADV_OBJECTS are converted
789 rows in table SYS.WRH$_SQLTEXT are converted

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.

- Una vez acaba la ejecución del script volver a parar la base de datos y volver a arrancarla para comprobar que los cambios se han realizado correctamente.

Parar la base de datos ..

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

Volver a arrancarla …

SQL> startup;
ORACLE instance started.

Total System Global Area 2097152000 bytes
Fixed Size 2074120 bytes
Variable Size 771754488 bytes
Database Buffers 1308622848 bytes
Redo Buffers 14700544 bytes
Database mounted.
Database opened.
SQL>

Asegurarse/Comprobar que se han realizado los cambios …

SQL> SELECT * FROM nls_database_parameters;

 Debe aparecer el nuevo juego de caracteres … WE8ISO8859P1 en este ejemplo.

CÓMO CAMBIAR CHARACTER SET EN ORACLE hasta versión 8i

Los pasos para cambiar el character set de una base de datos Oracle hasta la versión 8i se hace de la siguiente manera:

 Desde la consola de SQLPLUS:

1) shutdown immediate;
2) startup mount;
3) alter system enable restricted session;
4) alter system set job_queue_processes=0;
5) alter database open;
6) alter database character set WE8ISO8859P1; (en esta línea, va el juego de caracteres al que queremos pasar nuestra BD)
7) shutdown immediate;
8) startup;

¡Y con eso es todo!

Hay que tener en cuenta que si la BD ya tiene información almacenada pueden salir registros con carácteres “extraños” que se tendrían que modificar y puede ser bastante engorroso. Yo recomiendo estos pasos para BD que se pueden modificar esos carácteres extraños de manera fácil, o BD que no tienen información y que hemos creado con un CHARACTER SET erróneo.

Para VER que  CHARACTER SET tenemos instalado podemos ejecutar:

SQL> select * from nls_database_parameters; 
 

Para versiones posteriores crearé otro post con todos los pasos necesarios.