Como cambiar el set de caracteres a una base de datos 12c

Por Ronald Vargas Quesada
Publicado en Abril 2016

Pasos para ejecutar el cambio del valor del parámetro. Leer el contenido completo de la guía. Al final se detalle algunos aspectos importantes para ambiente de RAC.

Recomendable realizar un full respaldo antes de continuar con este proceso.

Objetivo: Actualizar la tabla sys.prop$ del diccionario de la base de datos en donde se almacena el set de caracteres de la base de datos.

  • Validar el valor de los parámetros en la base de datos
    SQL> column VALUE format a10
    SQL> column PARAMETER format a30
    SQL> select * from v$nls_parameters;
    
    SQL> /
    
    PARAMETER                      VALUE                              CON_ID
    -----------------------------  ------------------------------  ---------
    NLS_LANGUAGE                   AMERICAN                                0
    NLS_TERRITORY                  AMERICA                                 0
    NLS_CURRENCY                   $                                       0
    NLS_ISO_CURRENCY               AMERICA                                 0
    NLS_NUMERIC_CHARACTERS         .,                                      0
    NLS_CALENDAR                   GREGORIAN                               0
    NLS_DATE_FORMAT                DD-MON-RR                               0
    NLS_DATE_LANGUAGE              AMERICAN                                0
    NLS_CHARACTERSET               WE8ISO8859P15                           0
    NLS_SORT                       BINARY                                  0
    NLS_TIME_FORMAT                HH.MI.SSXFF AM                          0
    NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM                0
    NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR                      0
    NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR            0
    NLS_DUAL_CURRENCY              $                                       0
    NLS_NCHAR_CHARACTERSET         AL16UTF16                               0
    NLS_COMP                       BINARY                                  0
    NLS_LENGTH_SEMANTICS           BYTE                                    0
    NLS_NCHAR_CONV_EXCP            FALSE                                   0
  • Bajar la base de datos y seguir los pasos indicados a continuación
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    
    SQL> startup mount
    ORACLE instance started.
    
    Total System Global Area 1895825408 bytes
    Fixed Size                  2925744 bytes
    Variable Size             570428240 bytes
    Database Buffers         1308622848 bytes
    Redo Buffers               13848576 bytes
    Database mounted.
    SQL> show parameter job_queue_processes
    
    NAME                  TYPE        VALUE
    --------------------- ----------- ----------------------
    job_queue_processes   integer     1000
    
    SQL> alter system set job_queue_processes=0;
    System altered.
    
    SQL> alter database open;
    Database altered.
    
    SQL> alter database character set WE8MSWIN1252;
    alter database character set WE8MSWIN1252
      *
    ERROR at line 1:
    ORA-12719: operation requires database is in RESTRICTED mode
     
    SQL> update sys.props$ set value$='WE8MSWIN1252' where name='NLS_CHARACTERSET';
    1 row updated.
    SQL> commit;
    Commit complete.
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
  • Volver a levantar la base de datos y aplicar los siguientes pasos.
    SQL> startup mount
    ORACLE instance started.
    
    Total System Global Area 1895825408 bytes
    Fixed Size                  2925744 bytes
    Variable Size             570428240 bytes
    Database Buffers         1308622848 bytes
    Redo Buffers               13848576 bytes
    Database mounted.
    SQL> alter system enable restricted session;
    
    System altered.
    
    SQL> alter database open;
    Database altered.
    
    SQL> alter database character set WE8MSWIN1252;
    Database altered.
    
    SQL> alter system set job_queue_processes=1000;
    System altered.
  • Bajar la base de datos y proceder a validar los cambios.
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    
    Total System Global Area 1895825408 bytes
    Fixed Size                  2925744 bytes
    Variable Size             570428240 bytes
    Database Buffers         1308622848 bytes
    Redo Buffers               13848576 bytes
    Database mounted.
    Database opened.
    
    SQL> select * from v$nls_parameters;
    
    PARAMETER                      VALUE          CON_ID
    -----------------------------  ----------  ---------
    NLS_LANGUAGE                   AMERICAN            0
    NLS_TERRITORY                  AMERICA             0
    NLS_CURRENCY                   $                   0
    NLS_ISO_CURRENCY               AMERICA             0
    NLS_NUMERIC_CHARACTERS         .,                  0
    NLS_CALENDAR                   GREGORIAN           0
    NLS_DATE_FORMAT                DD-MON-RR           0
    NLS_DATE_LANGUAGE              AMERICAN            0
    NLS_CHARACTERSET               WE8MSWIN12          0
    52
    NLS_SORT                       BINARY              0
    NLS_TIME_FORMAT                HH.MI.SSXF          0
    F AM
    . . . 
    19 rows selected.
  • Validar cambios con datos
    [oracle@dbvisit01 ~]$ env|grep NLS
    NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
    
    [oracle@dbvisit01 ~]$ sqlplus /nolog
    SQL*Plus: Release 12.1.0.2.0 Production on Thu May 14 14:10:31 2015
    Copyright (c) 1982, 2014, Oracle.  All rights reserved.
    
    SQL> connect / as sysdba
    Connected.
    SQL> truncate table t1;
    
    Table truncated.
    
    SQL> desc t1
    Name                       Null?    Type
    -------------------------- -------- ---------------------
    NOMBRE                              VARCHAR2(20)
    APELLIDO                            VARCHAR2(20)
    
    SQL> insert into t1 values ('Fabián','Nuñez');
    1 row created.
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from t1;
    
    NOMBRE               APELLIDO
    -------------------- --------------------
    Fabián               Nuñez
    SQL>

Aplicación en ambientes RAC

Para ambientes en RAC es necesario modificar algunos pasos al inicio del proceso y final.

  1. SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE;
  2. Bajar todas las instancias del RAC con el usuario GRID ( srvctl stop database –d <instancias>
  3. Levantar la base de datos en el nodo 1

Cuando se concluya el proceso es necesario volver a revertir los cambios iniciales.

En la base de datos del nodo1 configurar el parámetro de CLUSTER_DATABASE=TRUE

SQL> STARTUP MOUNT; 
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=true scope=spfile; 
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=1000;
SQL> SHUTDOWN IMMEDIATE;

Arrancar las instancias del RAC con el commando srvctl

Publicado por Ronald Vargas Quesada. Consultor, Profesor Universitario, Oracle Academy Instructor y Conferencista Internacional. Ronald tiene más de 25 años de experiencia en Oracle DBA. Él reside en Costa Rica y es responsable de la creación de las Centroamericano Oracle Usuarios Grupos y responsable de introducir OTN Tour a los países centroamericanos. Ronald es un participante activo en OracleMania, Comunidad Oracle Hispana y LAOUC y disfruta ayudando a sus compañeros para encontrar soluciones y respuestas en Oracle Technology. Ronald es también el director de tecnología para la LAOUC. Ronald es actualmente instructor de Oracle University y fue reconocido como uno de los 15 mejores instructores LAD por Oracle University.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.