domingo, 31 de mayo de 2020

Uso y ejecución de Flashback en Oracle Database 19c 19.3.0.0

Listo, veamos como funciona esta bien conocida característica en bases de datos Oracle, pero esta vez en la última versión en producción liberada.

Empecemos por conectarnos a la base de datos

[oracle@lab1 ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Nov 5 19:46:35 2019
Version 19.3.0.0.0

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

SQL> connect / as sysdba
Connected.
SQL> show sga

Total System Global Area 1912599952 bytes
Fixed Size                  8897936 bytes
Variable Size             436207616 bytes
Database Buffers         1459617792 bytes
Redo Buffers                7876608 bytes

Pueden apreciar, que la base de datos, esta en estado OPEN y que se encuentra bajo el rol de instancia primaria.

SQL> select instance_name, status, logins, INSTANCE_ROLE from v$instance;

INSTANCE_NAME    STATUS       LOGINS     INSTANCE_ROLE
---------------- ------------ ---------- ------------------
lab1             OPEN         ALLOWED    PRIMARY_INSTANCE

Al igual que en las anteriores versiones, no es posible poner la base de datos en modo archivelog, sin tener la instancia en estado MOUNT.

SQL> alter database archivelog;
alter database archivelog
*
ERROR at line 1:
ORA-01126: database must be mounted in this instance and not open in any
instance

Bajamos la instancia de base de datos de modo consistente y únicamente la montamos para activar el modo archivelog.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.

Total System Global Area 1912599952 bytes
Fixed Size                  8897936 bytes
Variable Size             436207616 bytes
Database Buffers         1459617792 bytes
Redo Buffers                7876608 bytes
Database mounted.
SQL> select instance_name, status, logins, INSTANCE_ROLE from v$instance;

INSTANCE_NAME    STATUS       LOGINS     INSTANCE_ROLE
---------------- ------------ ---------- ------------------
lab1             MOUNTED      ALLOWED    PRIMARY_INSTANCE

SQL> alter database archivelog;

Database altered.

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /opt/app/oracle/product/19.3.0/dbs/arch
Oldest online log sequence     3
Next log sequence to archive   5
Current log sequence           5
SQL> SELECT log_mode FROM v$database;

LOG_MODE
------------
ARCHIVELOG

Verificado que la base de datos esta en modo archivelog, vamos a force el registro de logging para todas las operaciones en la base de datos.

SQL> ALTER DATABASE FORCE LOGGING;

Database altered.

Verificamos que la funcionalidad se encuentra encendida y que no nos haga falta algo más. En este caso, nos hace falta configurar el área de Fast Recovery.

SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
ORA-38709: Recovery Area is not enabled.


SQL> show parameter recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------------------
db_recovery_file_dest                string
db_recovery_file_dest_size           big integer 0
recovery_parallelism                 integer     0
remote_recovery_file_dest            string
SQL> ^C

Configuramos el parámetro del tamaño de FAST RECOVERY AREA y lo hacemos persistente en el archivo de parámetros.

SQL> alter system set db_recovery_file_dest_size=5G scope=both;

System altered.

SQL> host
[oracle@lab1 ~]$ mkdir /opt/app/oracle/fast_recovery_area
[oracle@lab1 ~]$ exit
exit

SQL> alter system set db_recovery_file_dest='/opt/app/oracle/fast_recovery_area' scope=both;

System altered.

SQL> alter database flashback on;

Database altered.

SQL> host ls -la /opt/app/oracle/fast_recovery_area
total 4
drwxr-xr-x.  3 oracle oinstall   18 Nov  5 20:45 .
drwxr-xr-x. 10 oracle oinstall 4096 Nov  5 20:41 ..
drwxr-x---.  3 oracle oinstall   23 Nov  5 20:45 LAB1

SQL> host ls -la /opt/app/oracle/fast_recovery_area/LAB1
total 0
drwxr-x---. 3 oracle oinstall 23 Nov  5 20:45 .
drwxr-xr-x. 3 oracle oinstall 18 Nov  5 20:45 ..
drwxr-x---. 2 oracle oinstall 60 Nov  5 20:45 flashback

SQL> host ls -la /opt/app/oracle/fast_recovery_area/LAB1/flashback
total 409616
drwxr-x---. 2 oracle oinstall        60 Nov  5 20:45 .
drwxr-x---. 3 oracle oinstall        23 Nov  5 20:45 ..
-rw-r-----. 1 oracle oinstall 209723392 Nov  5 20:45 o1_mf_gw4dxt5o_.flb
-rw-r-----. 1 oracle oinstall 209723392 Nov  5 20:45 o1_mf_gw4dy1kf_.flb


SQL> show sga

Total System Global Area 1912599952 bytes
Fixed Size                  8897936 bytes
Variable Size             436207616 bytes
Database Buffers         1459617792 bytes
Redo Buffers                7876608 bytes
SQL> select instance_name, status, logins, INSTANCE_ROLE from v$instance;

INSTANCE_NAME    STATUS       LOGINS     INSTANCE_ROLE
---------------- ------------ ---------- ------------------
lab1             MOUNTED      ALLOWED    PRIMARY_INSTANCE

Vamos a abrir la base de datos y hacer algunas pruebas con el usuario HR de ejemplo.

SQL> alter database open;

Database altered.

SQL> alter user hr account unlock;

User altered.

SQL> alter user hr identified by hr;

User altered.

SQL> connect hr/hr
Connected.
SQL> select count(*) from employees;

  COUNT(*)
----------
       107

SQL> show user
USER is "HR"

Vamos a crear una tabla para la prueba de la habilitación del FLASHBACK RECOVERY.

SQL> create table employees_drop as select * from employees;

Table created.

SQL> select count(*) from employees_drop;

  COUNT(*)
----------
       107

Verificamos la existencia de la tabla en la vista de catálogo del usuario.
SQL> select * from cat;

TABLE_NAME           TABLE_TYPE
-------------------- -----------
EMPLOYEES_DROP       TABLE
REGIONS              TABLE
COUNTRIES            TABLE
LOCATIONS            TABLE
LOCATIONS_SEQ        SEQUENCE
DEPARTMENTS          TABLE
DEPARTMENTS_SEQ      SEQUENCE
JOBS                 TABLE
EMPLOYEES            TABLE
EMPLOYEES_SEQ        SEQUENCE
JOB_HISTORY          TABLE
EMP_DETAILS_VIEW     VIEW

12 rows selected.

Borramos la tabla.

SQL> drop table EMPLOYEES_DROP;

Table dropped.

SQL> select * from cat;

TABLE_NAME           TABLE_TYPE
-------------------- -----------
BIN$lqXBbrnuY8DgUwEA TABLE
AApjnQ==$0

REGIONS              TABLE
COUNTRIES            TABLE
LOCATIONS            TABLE
LOCATIONS_SEQ        SEQUENCE
DEPARTMENTS          TABLE
DEPARTMENTS_SEQ      SEQUENCE
JOBS                 TABLE
EMPLOYEES            TABLE
EMPLOYEES_SEQ        SEQUENCE
JOB_HISTORY          TABLE
EMP_DETAILS_VIEW     VIEW

12 rows selected.

Y ahora probamos que podamos recuperar la tabla con el comando FLASHBACK.

SQL> flashback table EMPLOYEES_DROP to before drop;

Flashback complete.

SQL> select * from cat;

TABLE_NAME           TABLE_TYPE
-------------------- -----------
EMPLOYEES_DROP       TABLE
REGIONS              TABLE
COUNTRIES            TABLE
LOCATIONS            TABLE
LOCATIONS_SEQ        SEQUENCE
DEPARTMENTS          TABLE
DEPARTMENTS_SEQ      SEQUENCE
JOBS                 TABLE
EMPLOYEES            TABLE
EMPLOYEES_SEQ        SEQUENCE
JOB_HISTORY          TABLE
EMP_DETAILS_VIEW     VIEW

12 rows selected.

Recuerde que si borramos la tabla agregando la cláusula PURGE, no será posible realizar una recuperación de la tabla borrada.

SQL> drop table EMPLOYEES_DROP purge;

Table dropped.

SQL> select * from cat;

TABLE_NAME           TABLE_TYPE
-------------------- -----------
REGIONS              TABLE
COUNTRIES            TABLE
LOCATIONS            TABLE
LOCATIONS_SEQ        SEQUENCE
DEPARTMENTS          TABLE
DEPARTMENTS_SEQ      SEQUENCE
JOBS                 TABLE
EMPLOYEES            TABLE
EMPLOYEES_SEQ        SEQUENCE
JOB_HISTORY          TABLE
EMP_DETAILS_VIEW     VIEW

11 rows selected.

SQL> flashback table EMPLOYEES_DROP to before drop;
flashback table EMPLOYEES_DROP to before drop
*
ERROR at line 1:
ORA-38305: object not in RECYCLE BIN

Rápida y sencillamente, hemos configurado y probado la características de FLASHBACK a nivel de tabla en una base de datos Oracle versión 19c.

Oracle Always Free, se actualiza en los próximos 8 días.


Recién acaba de recibir un correo de parte del equipo de Oracle Autonomous Database, en donde se me indica que el próximo 8 de junio, mi instancia del servicio Always Free Autonomous Database, va a ser actualizada a Oracle Database 19c.

Una gran noticia, ya que uno de los pocos "peros", que había indicado en mi charla de hace unas semanas atrás, es que la base de datos aprovisionada era versión 18c.

Con la actualización, no sólo viene el tema de la versión, sino de todas las características alrededor de 19c, entre las que sobresale, la gestión y manejo de los índices autonomos.

En los laboratorios realizados hasta el momento, es una de las características mejor cementadas en las últimas versiones de base de datos.

Hay que tener paciencia eso sí, ya que no es rápida la adopción de mejoras a los planes de ejecución.
La característica de autonomía para el manejo de índices, se toma su tiempo para analizar los beneficios que tendra el plan de ejecución de la sentencia, antes de que el indice pase de ser un índice invisible a un índice visible.

En mis pruebas, tomo más de 6 horas el ver dicho comportamiento y la verdad que el resultado, fue excelente.

Durante estas 6 horas, el advisor de creación de índices autonomos, ejecutó más de 59 análisis, buscando la mejor alternativa de rendimiento.

SQL> col execution_name format a40

  1  select execution_name, execution_start,execution_end, status from dba_auto_index_executions
  2* order by execution_end
SQL> /

EXECUTION_NAME                           EXECUTION EXECUTION STATUS
---------------------------------------- --------- --------- -----------
SYS_AI_2019-10-20/11:38:36               20-OCT-19 20-OCT-19 COMPLETED
SYS_AI_2019-10-20/11:53:50               20-OCT-19 20-OCT-19 COMPLETED
SYS_AI_2019-10-20/12:09:06               20-OCT-19 20-OCT-19 COMPLETED
SYS_AI_2019-10-20/12:24:21               20-OCT-19 20-OCT-19 COMPLETED

59 rows selected.

Conforme iba pasando el tiempo, era posible observar las estadísticas desde la vista dba_auto_index_statistics. Logré darme cuenta que en realidad estaba funcionando, cuando por primera vez, logré ver, que existían dos índices candidatos a ser utilizados y que ya había creado un índices invisible.

SQL> select * from dba_auto_index_statistics where execution_name='SYS_AI_2019-10-20/12:39:42';

EXECUTION_NAME                           STAT_NAME                          VALUE
---------------------------------------- ----------------------------- ----------
SYS_AI_2019-10-20/12:39:42               Index candidates                       2
SYS_AI_2019-10-20/12:39:42               Indexes created (visible)              0
SYS_AI_2019-10-20/12:39:42               Indexes created (invisible)            1
SYS_AI_2019-10-20/12:39:42               Indexes dropped                        0
SYS_AI_2019-10-20/12:39:42               Space used in bytes            134217728
SYS_AI_2019-10-20/12:39:42               Space reclaimed in bytes               0
SYS_AI_2019-10-20/12:39:42               SQL statements verified                0
SYS_AI_2019-10-20/12:39:42               SQL statements improved                0
SYS_AI_2019-10-20/12:39:42               SQL statements managed by SPM          0
SYS_AI_2019-10-20/12:39:42               SQL plan baselines created             0
SYS_AI_2019-10-20/12:39:42               Improvement percentage                 0

11 rows selected

Despues de unas horas de activado el monitoreo, logré validar, que ya se había concretado, la creación de 3 índices, para las consultas que había dejado en un ciclo de repetición.
OWNER           INDEX_NAME               INDEX_TYPE     TABLE_OWNER     TABLE_TYPE
--------------- ------------------------ -------------- --------------- -----------
USER_TEST       SYS_AI_38a4rpz9aydwy     NORMAL         USER_TEST       VENENO
USER_TEST       SYS_AI_8j1m1y4m3rg1v     NORMAL         USER_TEST       VENENO
USER_TEST       SYS_AI_grrbd3k2d8ufq     NORMAL         USER_TEST       VENENO

SQL> COL INDEX_OWNER FORMAT A12
SQL> COL COLUMN_NAME FORMAT A20

SQL> select INDEX_OWNER,INDEX_NAME,COLUMN_NAME,COLUMN_POSITION 
from ALL_IND_COLUMNS where index_name='SYS_AI_grrbd3k2d8ufq';

Como lo afirma la documentación, los indices tenían como prefijo SYS_AI, o en pocas palabras, "Sistema, Inteligencia Artificial".

SQL> select INDEX_OWNER,INDEX_NAME,COLUMN_NAME,COLUMN_POSITION 
from ALL_IND_COLUMNS where index_name='SYS_AI_grrbd3k2d8ufq';

INDEX_OWNER  INDEX_NAME                     COLUMN_NAME          COLUMN_POSITION
------------ ------------------------------ -------------------- ---------------
USER_TEST    SYS_AI_grrbd3k2d8ufq           EMPLOYEE_ID                        1

SQL> select INDEX_OWNER,INDEX_NAME,COLUMN_NAME,COLUMN_POSITION 
from ALL_IND_COLUMNS where index_name='SYS_AI_8j1m1y4m3rg1v';

INDEX_OWNER  INDEX_NAME                     COLUMN_NAME          COLUMN_POSITION
------------ ------------------------------ -------------------- ---------------
USER_TEST    SYS_AI_8j1m1y4m3rg1v           MANAGER_ID                         1

SQL> select INDEX_OWNER,INDEX_NAME,COLUMN_NAME,COLUMN_POSITION 
from ALL_IND_COLUMNS where index_name='SYS_AI_38a4rpz9aydwy';

INDEX_OWNER  INDEX_NAME                     COLUMN_NAME          COLUMN_POSITION
------------ ------------------------------ -------------------- ---------------
USER_TEST    SYS_AI_38a4rpz9aydwy           JOB_ID                             1


En la vista de acciones, era posible observar los comandos ejecutados por el programa de ML que gestiona dicha característica autonoma.


SQL> select index_owner, index_name, table_owner, command from dba_auto_index_ind_actions order by start_time;

INDEX_OWNER  INDEX_NAME                     TABLE_OWNER       COMMAND
------------ ------------------------------ ----------------- --------------------
USER_TEST    SYS_AI_grrbd3k2d8ufq           USER_TEST         CREATE INDEX
USER_TEST    SYS_AI_grrbd3k2d8ufq           USER_TEST         REBUILD INDEX
USER_TEST    SYS_AI_grrbd3k2d8ufq           USER_TEST         ALTER INDEX VISIBLE
USER_TEST    SYS_AI_8j1m1y4m3rg1v           USER_TEST         CREATE INDEX
USER_TEST    SYS_AI_38a4rpz9aydwy           USER_TEST         CREATE INDEX
USER_TEST    SYS_AI_38a4rpz9aydwy           USER_TEST         REBUILD INDEX
USER_TEST    SYS_AI_8j1m1y4m3rg1v           USER_TEST         REBUILD INDEX
USER_TEST    SYS_AI_8j1m1y4m3rg1v           USER_TEST         ALTER INDEX VISIBLE


8 rows selected.

Las verificaciones realizadas por la base de datos sobre los índices creados automáticamente se podían visualizar en la vista: DBA_AUTO_INDEX_VERIFICATIONS

SQL> select sql_id, original_buffer_gets, auto_index_buffer_gets,status from dba_auto_index_verifications;

SQL_ID        ORIGINAL_BUFFER_GETS AUTO_INDEX_BUFFER_GETS STATUS
------------- -------------------- ---------------------- ---------
64mhzgsdq5cnt              58292.5                     97 IMPROVED
4mf2rxa1jr5ah                58255                      1 IMPROVED
a68nukn6w407b           58133.1154                      3 IMPROVED
azsswcb98ffvc                58255                     97 IMPROVED
cxdp6hffuf5nh                58255                     89 IMPROVED
a68nukn6w407b           3.08201439                      3 UNCHANGED
d7dj44yburdbz                  107                     96 UNCHANGED
d06rmnjvm5smf                12009                  12009 UNCHANGED
2tryzm0v5xsc7              .000235                        FAILED
a90k7j52rrmr6                    3                        FAILED
c595m0us6g543            58234.995                      1 IMPROVED
drzb4vzkmxg6a                    3                        FAILED
c595m0us6g543           3.00069603                      1 UNCHANGED

De igual manera, pude comprobar las distintas tareas ejecutadas por los distintos consejeros de la base de datos.

SQL> select TASK_NAME,ADVISOR_NAME,EXECUTION_END,STATUS,ACTIVITY_COUNTER from dba_advisor_tasks;


Y finalmente, puede también, generar un reporte de actividad en formato HTML, para pode documentar y entender mejor, todo lo que había pasado.

SET LONG 1000000 PAGESIZE 0SELECT DBMS_AUTO_INDEX.report_activity(type => 'HTML') FROM dual;

Ahora será tiempo a partir del 08 de junio, de volver a repetir nuevamente el laboratorio realizado en mi VM, pero esta vez, en la plataforma Always Free y compartirles mis hallazgos.


sábado, 23 de mayo de 2020

Oracle Database 19c: Creando un tablespace seguro para almacenamiento de datos

La seguridad es siempre un tema de discusión y no es para menos, cada vez, nos vemos más agobiados con las constantes noticias de hackeos de datos confidenciales y no confidenciales.

En un mundo lleno de desafíos por el resguardo de la información, ni el famoso Chema Alonso, a logrado salir libre de culpa, cuando hace poco más de 3 años, un 12 de mayo de 2017, la red interna de Telefónica Española, sufrió un fuerte ataque, al igual que otras grandes companías en España.

En el aquel entonces, se presumío que el ataque había sido enviado desde China y se solicitaba un rescate de poco más de medio millón de Euros en la criptomoneda Bitcoin.

El ataque masivo de ransomware, afectó un número indefinido de servidores de Telefónica y tuvo como consecuencias el paro de labores de la compañía. A pocos horas del inicio del ataque, las figura más mediática en lo que respecta a la seguridad de Telefónica, Chema Alonso, acudido a Twitter para quitar hierro al ataque. "Las noticias son exageradas y los compañeros están trabajando en ello ahora mismo", aseguró.

Sin embargo, la estocada, ya había surtido efecto. Empresas como BBVA, Vodafone y Capgemini, negaban contundemente, que no habían sido víctimas de dicho ataque.

Y es que en el ciberespacio, no hay un lugar seguro del todo y es necesario, tomar medidas para mitigar el impacto de los miles de intentos de ataques, que se dan a cada minuto.

De facto en una base de datos, los datafiles, que son los repositorios de datos para los tablespaces, no son encriptados. Esto supone un alto riesgo de exposición de información, sin necesidad de hacer tan siquiera LOGIN en la base de datos.

A través de comandos de sistema operativo, es posible extraer información plana de los datafiles y tener acceso a datos confidenciales.

Para evitar esto, podemos crear tablespaces encriptados y evitar así, el acceso no autorizado a dicha información, por usuarios conectados a nivel de sistema operativo.

Esta opción es posible, gracias al opcional de Advanced Security, de la base de datos.

Primero que todo, vamos a echar un vistazo a los nombres de los datafiles creados en la instacia PDB de mi contenedor.

SQL> connect / as sysdba
Connected.
SQL> alter session set container=pdb1;

Session altered.

SQL> SELECT tablespace_name, file_name, bytes/1024/1024 size_mb
 FROM dba_data_files 
/


Vamos a crear un nuevo tablespace en la instancia de base de datos, pero esta vez, vamos a agregar el parámetro que me permite indicar que el tablespace va a estar protegido a través de un método de encriptación.

SQL> set linesize 200
SQL> create tablespace tbs_datos_seguros encryption using 'AES256' encrypt;
create tablespace tbs_datos_seguros encryption using 'AES256' encrypt
*
ERROR at line 1:
ORA-28365: wallet is not open

SQL> show con_id

CON_ID
------------------------------
3

A la hora de ejecutar el comando, me da un error en donde me indica que la bóveda de seguridad no se encuentra disponible.

Vamos entonces a realizar unos pequeños ajustes, tanto a nivel del contenedor de la base de datos, como en la PDB

SQL> connect / as sysdba
Connected.

SQL> administer key management set keystore open identified by oracle19 container=all;

keystore altered.

SQL> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY oracle19 WITH BACKUP USING 'cdb1_key_backup' 
/

keystore altered.

SQL> alter session set container=pdb1;

Session altered.

SQL> ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY oracle19 WITH BACKUP USING 'pdb1_key_backup';

keystore altered.

Ahora que hemos creado la bóveda y una llave de administración, podemos continuar con la creación del tablespace encriptado.

SQL> create tablespace tbs_datos_seguros encryption using 'AES256' encrypt;

Tablespace created.

Vamos a brindar privilegios de espacio en dicho tablespace al usuario de esquema HR.

SQL> alter user hr quota unlimited on tbs_datos_seguros;

User altered.

Ahora vamos a crear una tabla en dicho tablespaces e insertamos un registro de prueba, para validar si efectivamente la información, no es accesible desde el sistema operativo.

SQL> create table hr.datos_super_seguros( banco varchar2(200), clave varchar2(100)) tablespace tbs_datos_seguros;

Table created.

SQL> insert into hr.datos_super_seguros values ('Banco Cloud Oracle','TENGOUNPASSWORDMALO');

1 row created.

SQL> commit;

Commit complete.

SQL>

Vamos a obtener el nombre del datafile asignado a dicho tablespaces y validar con el comando STRINGS, que no se encuentra la información disponible desde el sistema operativo.

SQL> col file_name format a95

SQL> SELECT tablespace_name, file_name FROM dba_data_files
/

SQL>
[oracle@instancia-oracledbacr-ol7 datafile]$ strings o1_mf_tbs_dato_hd12ko39_.dbf|more
}|{z
`Ti
TBS_DATOS_SEGUROS
Ye_
F/*p
ie)M
;\9}
_`E}K
/MwV:P
        Nz^
UsX/
^Xd`
uIT0
|7?4i
bvCs
&\?'
~#G#
;AO^
9Ym1
i       Xr
ho}#
k_in
,[:zs
2_t4u6!|
k:)%
b~0ZY
{7{l*
kx"]
Z*3G
e4>;
"_Uh
MN+l
lIoJ-
#!Jz
Fr%C
>KE#P
63iWr
N~6V
L4u>
,=[6
--More--

Listo, ahora podemos dormir un poco más tranquilos, que nuestra información se encuentra bien protegida.

Oracle Container Database 19c: Creando un nuevo servicio a una Pluggable Database

La arquitectura de contenedor de base de datos, viene a revolucionar el mundo de las bases de datos de Oracle.

Desde la versión 12c, es posible poder consolidar hasta 252 bases de datos, compartiendo las mismas estructuras de memoria y procesos de background, optimizando así el uso de recursos físicos de un servidor.

El concepto de instancia de base de datos en una arquitectura NON-CDB ( No contenedor de base de datos ), se vuelve obsoleta a partir del conjunto de características que obtenes con la gestión de los contenedores de base de datos.

Las bases de datos acopladas o Pluggable Database, son las homólogas de las instancias de base de datos en la arquitectura acostumbrada hasta la versión 11g.

Como lo mencioné anteriormente, un contenedor de base de datos, puede consolidar una gran cantidad de instancias de bases de datos y administrarlas como si fueran una sola.

En la versión de Oracle Database 19c, tenemos los siguientes límites asociados a una instancia de base de datos:
  1. Cantidad ilimitada de índices por tabla
  2. 1000 columnas máximo por tabla
  3. Máximo 30 columnas en un índices tipo bitmap
  4. Ilimitada cantidad de políticas de restricción (constraints)
  5. Máximo 255 suconsultas en la cláusula WHERE
  6. Máximo 16 columnas en una partición llave
  7. Máximo 1024K-1 (más de un millón) particiones por tabla o índices
  8. Cantidad ilimitada de registros por tabla
  9. Máximo apróximado de 6 millones de líneas de código en paquetes almacenados
  10. Máximo 2.147 millones de usuarios y roles por base de datos.
  11. Cantidad ilimitada de tablas por base de datos.
  12. En versión Standard Edition máximo 3 PDBs (no requiere licenciamiento adicional)
  13. En versión Enterprise Edition máximo 252 PDBs
  14. En versión Oracle Database Cloud Service SE/EE máximo 3 PDBs
  15. En versión Oracle Database Cloud Service EE-HP (High Performance),EE-ES (Enginneered Systems) y EE-EP (Extreme Performance) y ExaCS (Exadata Cloud Service) limite de 4096 PDBs
En una base de datos Oracle Database 19c, es posible utilizar el paquete DBMS_SERVICE para crear, eliminar, activar y desactivar servicios para una instancia de base de datos.

Los servicios, permiten definir un punto distinto de conexión y agrupar de forma lógica las sesiones que se conectan a la base de datos.

En el ejemplo a continuación, vamos a crear un servicio nuevo para una base de datos PDB ya existente en nuestro contenedor de base de datos.


[oracle@instancia-oracledbacr-ol7 ~]$ sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Sun May 17 00:25:35 2020
Version 19.3.0.0.0

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

SQL> connect / as sysdba
Connected.
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB1                           READ WRITE NO
         5 PDB2                           MOUNTED

Como observan, tenemos creadas dos instancias PDB en este contenedor. Vamos a crear un nuevo servicio para atender conexiones de usuarios, para la instancia PDB1.

Para ello, primero que todo, vamos a cambiar al área de contenedor en donde se encuentra corriendo la instancia PDB1.

SQL> alter session set container=pdb1;

Session altered.


SQL> col name format a20
SQL> col pdb format a10
SQL> show con_id


SERVICE_ID NAME                 PDB            CON_ID
---------- -------------------- ---------- ----------
         7 PDB1                 PDB1                3

A través del paquete DBMS-SERVICE, vamos a crear un servicio que tenga como nombre "prodpdb1".

Para la creación del servicio, es suficiente con pasar dos parámetros al paquete:

  1. El nombre del servicio, cuya longitud no puede exceder los 64 caracteres
  2. El nombre de la red del servicio utilizado en el descriptor de la conexión del SQLNet.


SQL> exec dbms_service.create_service('prodpdb1','prodpdb1');

PL/SQL procedure successfully completed.

Una vez creado, es necesario inicar el servicio.

SQL> exec dbms_service.start_service('prodpdb1');

PL/SQL procedure successfully completed.

Posteriormente, debemos verificar que el servicio se encuentre publicado en el estado del LISTENER.

SQL>  !lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 17-MAY-2020 00:27:15

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=instancia-oracledbacr-ol7.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                07-MAY-2020 21:28:56
Uptime                    9 days 2 hr. 58 min. 19 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/instancia-oracledbacr-ol7/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=instancia-oracledbacr-ol7.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "CDB1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "a5267bb51fc44546e0530200000ab31d" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "a527364c23c85543e0530200000a9a19" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "pdb1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "pdb2" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "prodpdb1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
The command completed successfully


Ahora que confirmamos que el servicio se encuentra siendo atendido por el servicio LISTENER, vamos a proceder a cerrar la instancia PDB y volverla a reiniciar.

SQL> connect / as sysdba
Connected.
SQL> alter pluggable database pdb1 close;

Pluggable database altered.

SQL> alter pluggable database pdb1 open;

Pluggable database altered.

SQL> alter session set container=pdb1;

Session altered.


Seguidamente, conectados en la PDB1 vamos a solicitar al servicio PMON, que haga el registro del nuevo servicio de base de datos con Listener. Durante el registro del servicio, el PMON proporciona al LISTENER la siguiente información:

  • Nombre de la instancia asociada
  • Carga actual y carga máxima en la instancia
  • Nombres de servicios de DB proporcionados por la base de datos.
  • Información sobre servidores dedicados y despachadores (depende del modo del servidor de la base de datos, es decir, el modo conexión al servidor dedicado/compartido)

El proceso PMON se activa cada 60 segundos y proporciona información al LISTENER. Si surge algún problema y el proceso PMON falla, entonces no es posible registrar información al LISTENER periódicamente. Cuando esto sucede,  se puede hacer el registro de servicio de manera manual, usando el comando:

SQL>  alter system register;

System altered.


Ahora podemos validar que el servicio que hemos creado, se encuentre disponible a nivel del contenedor de la base de datos.

Observe, que el ID de servicio es distinto tanto para el servicio original, como para el nuevo creado, sin embargo, el CON_ID que es el indentificar del servicio en el contenedor, es el mismo.

SQL> select service_id,name,pdb,con_id from cdb_services order by con_id;

SERVICE_ID NAME                 PDB            CON_ID
---------- -------------------- ---------- ----------
         7 PDB1                 PDB1                3
         1 prodpdb1             PDB1                3

Ahora procedo a arrancar el servicio.

SQL> exec dbms_service.start_service('prodpdb1');

PL/SQL procedure successfully completed.

SQL> !lsnrctl status;

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 17-MAY-2020 00:31:52

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=instancia-oracledbacr-ol7.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                07-MAY-2020 21:28:56
Uptime                    9 days 3 hr. 2 min. 55 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/instancia-oracledbacr-ol7/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=instancia-oracledbacr-ol7.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "CDB1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "a5267bb51fc44546e0530200000ab31d" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "a527364c23c85543e0530200000a9a19" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "pdb1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "pdb2" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "prodpdb1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
The command completed successfully

Luego es necesario salvar el estado de configuración en la instancia PDB1 y reiniciar la base de datos.

SQL> alter pluggable database save state;

Pluggable database altered.

SQL> alter pluggable database close;

Pluggable database altered.

SQL> alter pluggable database open;

Pluggable database altered.

SQL>  !lsnrctl status;

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 17-MAY-2020 00:32:45

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=instancia-oracledbacr-ol7.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                07-MAY-2020 21:28:56
Uptime                    9 days 3 hr. 3 min. 48 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/instancia-oracledbacr-ol7/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=instancia-oracledbacr-ol7.sub04081356520.vncoracledbacr.oraclevcn.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "CDB1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "a5267bb51fc44546e0530200000ab31d" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "a527364c23c85543e0530200000a9a19" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "pdb1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "pdb2" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
Service "prodpdb1" has 1 instance(s).
  Instance "CDB1", status READY, has 1 handler(s) for this service...
The command completed successfully

SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


Por último, debemos probar que es posible conectarnos a la base de datos, con el nuevo servicio creado.

[oracle@instancia-oracledbacr-ol7 ~]$ sqlplus hr/hr@127.0.0.1:1521/prodpdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Sun May 17 00:35:18 2020
Version 19.3.0.0.0

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

Last Successful login time: Sat May 16 2020 23:39:30 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0

SQL> show user
USER is "HR"
SQL> show con_id

CON_ID
------------------------------
3
SQL>

Comprobación exitosa y caso cerrado, como dicen por ahí.

Todos los Sábados a las 8:00PM

Optimismo para una vida Mejor

Optimismo para una vida Mejor
Noticias buenas que comentar