lunes, 7 de septiembre de 2015

ERROR ORA-01017: invalid username/password; logon denied

Si estamos intentando logarnos en una base de datos Oracle y por desconocer la contraseña o el usuario no podemos realizarlo, necesitaremos acceder a ella de una manera especial para poder cambiar la password de usuario en cuestión o chequear su nombre. Esto vale para cualquier usuario incluidos los usuarios SYS y SYSTEM.
Cuando se realiza la instalación de Oracle XE en linux, se añade al sistema el usuario oracle pero sin contraseña. Lo primero que tendremos que hacer es ponerle una contraseña al usuario, si no se la hemos puesto, realizando lo siguiente:

1-Nos logamos como root en el sistema.
[root@oracle ~]#su -
Password:

2-Ahora nos logamos con el usuario oracle
[root@oracle ~]#su - oracle

3-Le cambiamos la contraseña con el comando passwd
-bash-3.2$  passwd oracle
Changing password for user oracle.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

Antes de continuar deberemos tener bien definidas las variables de entorno si no nos dará errores tales como SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory, SP2-0667: Message file sp1<lang>.msb not found, ...etc. Para definirlas deberemos lanzar las siguientes sentencias:

-bash-3.2$ export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
-bash-3.2$ export ORACLE_SID=XE
-bash-3.2$ export PATH=$ORACLE_HOME/bin:$PATH

Tras esto entramos en el directorio donde se encuentra el comando sqlplus y lo lanzamos con los parámetros que a continuación se indican:

-bash-3.2$ cd /u01/app/oracle/product/11.2.0/xe/bin/
-bash-3.2$ ./sqlplus / as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on Mon Aug 31 15:22:20 2015
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> 

Una vez estemos dentro podremos realizar cualquier acción sobre la base de datos (cambiar la contraseña de un usuario, darle permisos sobre un tablespace,...etc). Como en la mayoría de los casos el error "ORA-01017: invalid username/password; logon denied" se debe a no conocer el nombre correcto o la contraseña correcta de un usuario realizaremos lo siguiente:

1-Lanzamos la consulta que pongo a continuación para ver los usuarios dados de alta en el servidor de base de datos (en mi caso están solo los usuarios que se generan por defecto en todas las instalaciones).

SQL> SELECT USERNAME FROM DBA_USERS;

USERNAME
------------------------------
SYSTEM
SYS
ANONYMOUS
APEX_PUBLIC_USER
APEX_040000
OUTLN
XS$NULL
XDB
CTXSYS
MDSYS
FLOWS_FILES
HR

2-Cambiamos la contraseña que tiene el usuario system por la que queramos. En mi caso estableceré 12345678 como nueva contraseña con la siguiente consulta (la estructura es alter user usuario identified by “password”; ):

SQL> alter user system identified by “12345678”;
User altered.

Tras esto podremos realizar login con el siguiente comando si ningún problema:
-bash-3.2$ ./sqlplus system/12345678

martes, 1 de septiembre de 2015

ERROR ORA-12705: Cannot access NLS data files or invalid environment specified

Si al lanzar el comando sqlplus para conectarnos a una base de datos Oracle nos da el error "ERROR: ORA-12705: Cannot access NLS data files or invalid environment specified" tendremos un problema con el valor que le hemos asignado a la variable ORACLE_SID. Para conocer el SID de una base de datos Oracle deberemos entrar al archivo tnsnames.ora (por defecto está en el directorio /u01/app/oracle/product/11.2.0/xe/network/admin/tnsnames.ora) y miraremos el valor de la etiqueta SID = . El fichero tnsnames.ora será parecido al que pongo a continuación:

# tnsnames.ora Network Configuration File:XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = predb01.lapsusmentis.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )
EXTPROC_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
    )
    (CONNECT_DATA =
      (SID = PXSExtProc)
      (PRESENTATION = RO)
    )
  )


Como podemos comprobar en este caso la variable ORACLE_SID debería tener el valor PXSExtProc. Para establecerlo solo tenemos que lanzar un export de la variable ORACLE_SID de la siguiente manera:

-bash-3.2$ export ORACLE_SID=PLSExtProc

Para hacerlo persistente deberemos incluir el comando export ORACLE_SID=PLSExtProc al final del fichero /etc/profile.