viernes, 16 de septiembre de 2011

cambiar NLS_CHARACTERSET oracle 11g

1. habian instalado el sistema operativo ORACLE LINUX en otro idioma, dando estos valores

[oracle@dbs]$ echo $LANG
es_ES.UTF-8
[oracle@dbs]$ locale
LANG=es_ES.UTF-8
LC_CTYPE="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_ALL=

lo cambien siguiedo los consejos en http://linuxeros-faq.blogspot.com/2010/06/como-cambiar-el-idioma-en-sistemas.html para centos system-config-language u en forma grafica Sistema --> Administracion --> idiomas

2. Lo siguiente era cambiar el set de caracter ya que esta no pasaba la importacion de una base de datos en 9i

ERROR AL IMPORTAR LOS DATOS:
IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: el valor es demasiado grande para la columna "USUARIO"."TABLA"."CAMPO_NOMCTO" (real: 31, maximo: 30)
Column 1 304
Column 2 205732
Column 3 CAMPOS
Column 4 YA?EZ
Column 5 MARIA LUPE
Column 6 CAMPOS YA?EZ MARIA LUPE

parametro que tenia en archivo init*.ora en la base oracle 11g
*.nls_language='SPANISH'
*.nls_territory='SPAIN'
lo cambien a
*.nls_language='MEXICAN SPANISH'
*.nls_territory='MEXICO'

Baje la base lo subi y no funciona la importacion de datos

Opte por cambiar variables de ambiente
La exportacion de datos del dmp se hace con la varaible al valor:
export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1;
y se intento importar de esta forma y tambien de export NLS_LANG=SPANISH_SPAIN.WE8ISO8859P1 dando el mismo error de importacion de datos

Verifique juego de caracteres en ambas bases 9i y 11g
Juego de caracteres en ORACLE 9I
dbnorte/ oracle@itanium_:~$ sqlplus /nolog
SQL*Plus: Release 9.2.0.5.0 - Production on Vie Sep 16 12:54:17 2011
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
VALUE
----------------------------------------
WE8PC850

Juego de caracter en base oracle 11g
SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';
VALUE
---------------------------------------------------------
AL32UTF8


se siguieron los pasos que estan en el link
http://oracle.ittoolbox.com/groups/technical-functional/oracle-db-l/changing-character-set-of-oracle-database-87376
en especial estos:
SQL> SHUTDOWN IMMEDIATE; -- or NORMAL

SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE CHARACTER SET ;
SQL> SHUTDOWN IMMEDIATE; -- or NORMAL
SQL> STARTUP;

error al ejecutar la sentencia
SQL> alter database character set WE8MSWIN1252
2 ;
alter database character set WE8MSWIN1252
*
ERROR en linea 1:
ORA-12712: el juego de caracteres nuevo debe ser un superjuego del juego de
caracteres antiguo

Entonces segui la recomendacion de este link estando la base en modo restringido para processos y sesiones tal como se indico arriba

SQL> shutdown immediate;
Base de datos cerrada.
Base de datos desmontada.
Instancia ORACLE cerrada.
SQL> startup;
Instancia ORACLE iniciada.

Total System Global Area 2.0310E+10 bytes
Fixed Size 2212976 bytes
Variable Size 1.1006E+10 bytes
Database Buffers 9126805504 bytes
Redo Buffers 175132672 bytes
Base de datos montada.
Base de datos abierta.
SQL> alter database character set WE8MSWIN1252
2 ;
alter database character set WE8MSWIN1252
*
ERROR en linea 1:
ORA-12712: el juego de caracteres nuevo debe ser un superjuego del juego de
caracteres antiguo


SQL> exit
Desconectado de Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@siilprueba dbs]$ exit
logout

Connection to 172.30.10.65 closed.
heli@centauro:~$ ssh oracle@172.30.10.65
oracle@172.30.10.65's password:
Last login: Fri Sep 16 12:15:26 2011 from 193.0.0.160
[oracle@siilprueba ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Fri Sep 16 14:32:13 2011

Copyright (c) 1982, 2009, Oracle. All rights reserved.


Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

VALUE
--------------------------------------------------------------------------------
AL32UTF8
}

SOLUCION SQL> shutdown immediate;
Base de datos cerrada.
Base de datos desmontada.
Instancia ORACLE cerrada.
SQL> startup mount;
Instancia ORACLE iniciada.

Total System Global Area 2.0310E+10 bytes
Fixed Size 2212976 bytes
Variable Size 1.1006E+10 bytes
Database Buffers 9126805504 bytes
Redo Buffers 175132672 bytes
Base de datos montada.
SQL> ALTER SYSTEM ENABLE RESTRIcted session;
Sistema modificado.

SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
Sistema modificado.

SQL> alter database open;
Base de datos modificada.

SQL> ALTER DATABASE NATIONAL CHARACTER SET WE8MSWIN1252;
ALTER DATABASE NATIONAL CHARACTER SET WE8MSWIN1252
*
ERROR en linea 1:
ORA-12714: juego de caracteres nacional especificado no valido


SQL> ALTER DATABASE CHARACTER SET WE8MSWIN1252;
ALTER DATABASE CHARACTER SET WE8MSWIN1252
*
ERROR en linea 1:
ORA-12712: el juego de caracteres nuevo debe ser un superjuego del juego de
caracteres antiguo


SQL> UPDATE PROPS$ SET VALUE$ = 'WE8MSWIN1252' WHERE NAME = 'NLS_CHARACTERSET';

1 fila actualizada.

SQL> commit;

Confirmacion terminada.

SQL> shutdown immediate;
Base de datos cerrada.
Base de datos desmontada.
Instancia ORACLE cerrada.
SQL> startup;
Instancia ORACLE iniciada.

Total System Global Area 2.0310E+10 bytes
Fixed Size 2212976 bytes
Variable Size 1.1006E+10 bytes
Database Buffers 9126805504 bytes
Redo Buffers 175132672 bytes
Base de datos montada.
Base de datos abierta.
SQL> select value from nls_database_parameters where parameter = 'NLS_CHARACTERSET';

VALUE
----------------------------------------
WE8MSWIN1252

--La base nuevamente y la volvi a subir par aver que hubiera tomado los cambios permanentemente

Lance nuevamente la importacion , ya NO ambiente la variable NLS_LANG
imp usuario/contraseña file=archivo.dmp log=imp_110916_1439_archivo.log ignore=y statistics=none fromuser=deusaurio touser=ausuario

Import terminated successfully with warnings.

15 comentarios:

Unknown dijo...

Gran explicacion.
Tenia el mismo problema y siguiendo los pasos, ya esta solucionado.
Gracias!!

Unknown dijo...

Master el unico que lo ha solucionado los demas foros puras pajas

They dijo...

Gracias por las indicaciones, tal cual modificado.

Un saludo!

They dijo...

Buen detalle, perfecto, modificado correctamente.

Un saludo.

Unknown dijo...

Sencillamente sensacional. Siempre he pensado que cuando tienes este tipo de problemas, encontrar un comentario como este no tiene precio... solo depende del tiempo que te haya costado encontrarlo!!!

Mil gracias

Unknown dijo...

72 Horas después, no sirvieron ni 14 años de experiencia en Oracle ni el servicio de soporte ni buscar en google hasta el cansancio.
Gracias de verdad.

jeavendano dijo...

Excelente post, realmente lo que otras personas comentan son ciertas, a veces ciertos trucos le pasan por encima a años de experiencia. Muchas gracias

Unknown dijo...

Excelente amigo, muchisimas gracias. Funciono a la primera. Es la unica solucion!

Unknown dijo...

Excelente amigo, muchisimas gracias. Funciono a la primera. Es la unica solucion!

osioso16 dijo...

Excelente, y había intentado hacerlo por el regedit pero no me funcionó, muchas gracias por tu aporte.

Unknown dijo...

hola buen dia despues de ese procedimiento ¿se tendria que ejecutar los scripst para actualizar el diccionario de datos?

Unknown dijo...

hola buen dia despues de ese procedimiento ¿se tendria que ejecutar los scripst para actualizar el diccionario de datos?

Unknown dijo...

Muchisimas Gracias: Me ahorraste un tedioso y odioso trabajo, ahora solo debo analizar porque el 11g no reconoce la "..Ñ.." y me pone un "..?.." pero bueno eso esta mas facil ..creo, Gracias nuevamente eres genial.

Unknown dijo...

Funciona muy bien !!... gracias!

Unknown dijo...

Excelente, gracias