Bueno, bien claro lo dice la nota introductoria, esta versión no debe ser puesta en ambiente productivos.
A partir de la disponibilidad para hacer despliegue en la plataforma de "Always Free Services" de Oracle, de la nueva versión de base de datos Oracle 20c, he empezado a tener las primeras desaventuras
Mi laboratorio inicia con la creación de una VM en el área de Hardware dedicado, VM y Exadata del servicio Cloud de Oracle.
El despliegue del servicio, fue muy rápido para tratarse de una plataforma gratuita.
El tema de conexión vía PUTTY, no tuve ningún inconveniente en especial.
Como cualquier servicio de Oracle Cloud, es necesario conectarse con el usuario OPC, para luego hacer un sudo al usuario "root" y cambiar la contraseña del usuario "oracle".
Hasta aquí nada especial. Verificamos y tenemos configurado de antemano ( de facto ), las variables de ambiente de Oracle.
Reviso el estado del servicio LISTENER y el mismo me presenta la siguiente información:
[oracle@oracledbacr admin]$ env|grep ORACLE
ORACLE_UNQNAME=DB20c_iad12j
ORACLE_SID=DB20c
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=/u01/app/oracle/product/20.0.0/dbhome_1
Casi siempre me conecto como SYSDBA para verificar que realmente la instancia del contenedor esta arriba y los servicios acoplados disponibles para ser utilizados.
[oracle@oracledbacr admin]$ sqlplus /nolog
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:41:22 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> desc v$version
Name Null? Type
----------------------------------------- -------- ----------------
BANNER VARCHAR2(80)
BANNER_FULL VARCHAR2(160)
BANNER_LEGACY VARCHAR2(80)
CON_ID NUMBER
SQL> select BANNER_FULL from v$version;
BANNER_FULL
--------------------------------------------------------------------
Oracle Database 20c EE Extreme Perf Release 20.0.0.0.0 - Production
Version 20.2.0.0.0
SQL> col name format a30
SQL> select con_id, name, open_mode from v$pdbs;
CON_ID NAME OPEN_MODE
---------- ------------------------------ ----------
2 PDB$SEED READ ONLY
3 LAB2 READ WRITE
Como observan, no hay nada especial, todo parece estar bien.
Me traslado en el sistema operativo al directorio "network/admin", en la ruta del $ORACLE_HOME, para crear el archivo de configuración de conexiones de la base de datos.
[oracle@oracledbacr admin]$ more tnsnames.ora
lab2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = lab2.sub04081356520.vncoracledbacr.oraclevcn.com)
)
)
cdb =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = DB20c_iad12j.sub04081356520.vncoracledbacr.oraclevcn.com)
)
)
Este archivo lo he creado a partir de la información que me muestra el servicio LISTENER que se encuentra arriba.
Procedo a realizar la prueba de conexión a las cadenas definidas de servicio.
[oracle@oracledbacr admin]$ tnsping cdb
TNS Ping Utility for Linux: Version 20.0.0.0.0 - Production on 10-APR-2020 23:06:38
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/u01/app/oracle/homes/OraDB20Home1/network/admin/sqlnet.ora
TNS-03505: Failed to resolve name
Demonios algo no esta funcionando correctamente. Reviso una y otra vez la configuración del tnsnames.ora y no veo nada malo en el archivo. Que cambió en la sintaxis de configuración del tnsnames, me pregunto.?
Claro, una de las nuevas características de Oracle Database 20c, en el proceso de instalación; todos los Oracle Homes a partir de esta versión, son en modo READ-ONLY de facto.
Vuelvo a revisar el contenido del servicio LISTENER y recién percato, que la ruta de configuración del archivo del servicio, esta en una ruta distinta a la del $ORACLE_HOME
Vaya sorpresa, lo que hace la costumbre. Por eso es tan importante el proceso de estudio, las cosas cambian y en Oracle, con cada versión, hay cambios significativos, que nos pueden volver locos.
Me voy al directorio indicado en el estado del LISTENER y EUREKA, me encuentro con los archivos de configuración de listener, el sqlnet y el tnsnames. En la ruta del $ORACLE_HOME/network/admin, el directorio estaba vacío.
[oracle@oracledbacr admin]$ pwd
/u01/app/oracle/homes/OraDB20Home1/network/admin
[oracle@oracledbacr admin]$ ls -la
total 20
drwxr-xr-x. 2 oracle oinstall 4096 Apr 10 23:37 .
drwxr-xr-x. 5 oracle oinstall 4096 Jan 29 09:21 ..
-rw-r----- 1 oracle oinstall 378 Apr 9 23:18 listener.ora
-rw-r----- 1 oracle oinstall 666 Apr 9 23:22 sqlnet.ora
-rw-r----- 1 oracle oinstall 809 Apr 10 23:37 tnsnames.ora
Vuelvo a crear las cadenas de conexión con la información que me muestra en la primera entrada el tnsnames.
[oracle@oracledbacr admin]$ more tnsnames.ora
LISTENER_DB20C=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521))
DB20c_iad12j=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME
=DB20c_iad12j.sub04081356520.vncoracledbacr.oraclevcn.com)))
CDB=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED)
(SERVICE_NAME=DB20c_iad12j.sub04081356520.vncoracledbacr.oraclevcn.com)
)
)
LAB2=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED)
(SERVICE_NAME=lab2.sub04081356520.vncoracledbacr.oraclevcn.com)
)
)
Ahora si, vamos a probar la conexión a los servicios y veremos que pasa.
[oracle@oracledbacr admin]$ tnsping cdb
TNS Ping Utility for Linux: Version 20.0.0.0.0 - Production on 10-APR-2020 23:46:20
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/u01/app/oracle/homes/OraDB20Home1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED) (SERVICE_NAME=DB20c_iad12j.sub04081356520.vncoracledbacr.oraclevcn.com)))
OK (0 msec)
[oracle@oracledbacr admin]$ tnsping lab2
TNS Ping Utility for Linux: Version 20.0.0.0.0 - Production on 10-APR-2020 23:46:25
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/u01/app/oracle/homes/OraDB20Home1/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=oracledbacr.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED) (SERVICE_NAME=lab2.sub04081356520.vncoracledbacr.oraclevcn.com)))
OK (0 msec)
Listo, hemos superado el primer problema encontrado.
Vamos ahora con la conexión de forma directa a los servicios con la herramienta SQL*Plus.
Si SQL*Plus, aun existe en esta versión, a pesar de los rumores de su desaparición.
[oracle@oracledbacr admin]$ sqlplus /nolog
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:41:22 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> desc v$version
Name Null? Type
----------------------------------------- -------- ----------------
BANNER VARCHAR2(80)
BANNER_FULL VARCHAR2(160)
BANNER_LEGACY VARCHAR2(80)
CON_ID NUMBER
SQL> select BANNER_FULL from v$version;
BANNER_FULL
--------------------------------------------------------------------
Oracle Database 20c EE Extreme Perf Release 20.0.0.0.0 - Production
Version 20.2.0.0.0
SQL> col name format a30
SQL> select con_id, name, open_mode from v$pdbs;
CON_ID NAME OPEN_MODE
---------- ------------------------------ ----------
2 PDB$SEED READ ONLY
3 LAB2 READ WRITE
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 LAB2 READ WRITE NO
SQL>
Como ven, tenemos el servicio LAB2 que es una instancia de base de datos acoplada o PDB (Pluggable Database), la cuál quiero utilizar para realizar algunas pruebas.
Así que vamos a crear un vulgar y simple usuario, como lo hemos hecho en los últimos 8 años en una base de datos de CONTENEDOR de Oracle.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 LAB2 READ WRITE NO
SQL> alter session set container=LAB2;
Session altered.
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
DB20c
SQL> create user aprendizaje identified by oracle;
create user aprendizaje identified by oracle
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20000: password length less than 9 characters
SQL> create user aprendizaje identified by Oracle$2020;
create user aprendizaje identified by Oracle$2020
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20000: password must contain 2 or more uppercase characters
SQL> create user aprendizaje identified by ORacle;
create user aprendizaje identified by ORacle
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20000: password length less than 9 characters
SQL> create user aprendizaje identified by ORacle$20_20;
User created.
Como observan, tuvimos algunos inconvenientes para la definición de la contraseña del usuario. El PROFILE de facto y las reglas establecidas para control de contraseñas, pide más de lo que estamos acostumbrados a configurar para un ambiente de pruebas.
Sigamos y brindemos algunos privilegios a nivel de sistema, para poder crear tablas y conectarnos a la base de datos con nuestro usuario nuevo "APRENDIZAJE".
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
SQL> create tablespace TBS_DATA;
Tablespace created.
SQL> alter user aprendizaje quota unlimited on TBS_DATA;
User altered.
SQL> grant create table to aprendizaje;
Grant succeeded.
SQL> grant create session to aprendizaje;
Grant succeeded.
Todo listo entonces, vamos a conectarnos a la instancia PDB.
[oracle@oracledbacr admin]$ sqlplus aprendizaje/ORacle$20_20@lab2
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:47:35 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: ^C
Diablos, por las barbas de mercurio, que esto. me da error de clave o usuario inválido al conectarme y si lo hago con el usuario SYSTEM, también.
[oracle@oracledbacr admin]$ sqlplus system/ORacle$20_20@lab2
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:48:32 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name: ^C
Algo hice mal, puede ser que escribí mal la contraseña. Voy a cambiarla y probar nuevamente la conexión.
[oracle@oracledbacr admin]$ sqlplus /nolog
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:48:41 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> alter user system identified by ORacle$20_20;
alter user system identified by ORacle$20_20
*
ERROR at line 1:
ORA-28007: the password cannot be reused
Disconnected from Oracle Database 20c EE Extreme Perf Release 20.0.0.0.0 - Production
Version 20.2.0.0.0
Demonios, a la hora de querer cambiar la contraseña, me dice que esa contraseña no puede ser reutilizada.
Entonces la contraseña esta bien. Debo estarme volviendo loco. Probemos nuevamente.
[oracle@oracledbacr admin]$ sqlplus system/ORacle$20_20@cdb
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:49:20 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Nada, no tiene sentido, será que ...
Algo me acuerdo de haber leído por ahí, sobre una dependencia de asignar claves a usuarios dentro del contexto del Contenedor o del PDB.
Voy a probar cambiando la clave a SYSTEM y agregando ahora la cláusula que sea para el contenedor y todos los PDBs creados en el contenedor.
[oracle@oracledbacr admin]$ sqlplus /nolog
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:49:36 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
SQL> connect / as sysdba
Connected.
SQL> alter user system identified by ORacle_20_21 container=all;
User altered.
Voy a probar inicialmente que pueda conectar al contenedor con la clave.
SQL> connect system/ORacle_20_21
Connected.
SQL> show user
USER is "SYSTEM"
Ahora pruebo utilizando la cadena de conexión definida en el tnsnames.
SQL> connect system/ORacle_20_21@lab2
Connected.
SQL> show user
USER is "SYSTEM"
Listo, parece que ahora si esta funcionando, vamos con el usuario de pruebas. Cambiemos ahora que estamos dentro del PDB, la contraseña al usuario APRENDIZAJE.
SQL> alter user aprendizaje identified by ORacle_20_21;
User altered.
SQL> exit
Disconnected from Oracle Database 20c EE Extreme Perf Release 20.0.0.0.0 - Production
Version 20.2.0.0.0
Vamos a probar la conexión a la base de datos a ver que sucede.
[oracle@oracledbacr admin]$ sqlplus aprendizaje/ORacle_20_21@lab2
SQL*Plus: Release 20.0.0.0.0 - Production on Fri Apr 10 23:51:24 2020
Version 20.2.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 20c EE Extreme Perf Release 20.0.0.0.0 - Production
Version 20.2.0.0.0
SQL> show user
USER is "APRENDIZAJE"
SQL> show con_id
CON_ID
------------------------------
3
SQL>
Listo, el primer escollo ha sido superado. Ahora ya puedo hacer mis primeras pruebas con la nueva versión de base de datos.
No olvides que también estamos en Facebook/oracledbacr