miércoles, 1 de octubre de 2014

Oracle Database 12c 12.1.0.2 Manejo de objetos con DataPump con atributos IN-MEMORY


En la nueva edición de la versión del motor de base de datos 12c, tenemos una nueva característica con el nombre de In-Memory Database.

Hemos hablado un poco de este tema y de que consiste esta nueva tecnología de manejo de información en memoria, para facilitar y mejorar los tiempos de respuesta en ciertos tipos de cálculos.

Oracle ha rediseñado el manejo de datos en memoria, aplicando mejoras considerables, a los modelos planteados por otros fabricantes de la industria.

En el caso de Oracle Database 12c E.E. In-Memory Essential, el manejo de objetos en memoria, permite que una o un conjunto de columnas específicas de una tabla, residan en memoria y el resto en el almacenamiento convencional. La mayor parte de cálculos que se requieren hacer con la información de una base de datos, en la vida real, son sobre una columna específica y no sobre los registros completos de las tablas.

Ahora bien, en la edición 12.1.0.2, la opción In-Memory no viene activada de facto. Nosotros debemos configurar primero el área específica de memoria en el SGA y posteriormente, a través de un "ALTER" sobre el objeto, podemos indicar que la tabla o parte de ella, se maneje en una estructura en memoria y no de forma convencional.

Convencionalmente recordemos, los datos almacenados en una base de datos, residen en una estructura lógica llamada "Tablespace". Cuando un usuario requiere un registro o un grupo de registros, establece a través de un EXPLAIN PLAN, si los datos están memoria o en un disco. Si están en memoria hace un soft parseo, sino, hace un hard parseo y sube los bloques establecidos por el A.U. ( Allocation Unit ), al área de "Buffer cache de Datos". Una vez los datos en memoria, el usuario puede modificar, actualizar, borrar o consultar los registros de esos bloques.

Con este cambio de manejo de datos en una tabla o vista materializada, se han adaptado varios objetos del diccionario de la base de datos, para permitir consultar, si un objeto o alguna de sus columnas, están definidas como estructuras que deben funcionar en memoria. En user_tables, dba_tables y all_tables, hay 5 nuevas columnas que inician con el nombre de INMEMORY_ que contienen información sobre el manejo de atributos sobre los objetos.

Ahora bien, como hemos explicado anteriormente, el manejo de objetos en memoria, no es de facto. Se debe modificar el objeto para activar la característica.

Si deseamos que una tabla completa sea maneja en memoria, la forma de hacer esto es:

SQL> alter table hr.employees inmemory;

Table altered.

Yo puedo tener toda la tabla en memoria o sólo parte de ella.

login as: oracle
oracle@10.0.0.1's password:
Last login: Thu Sep 18 09:40:23 2014 from 10.0.0.200

[oracle@dbvisit01 ~]$ sqlplus hr/hr

SQL*Plus: Release 12.1.0.2.0 Production on Fri Oct 3 09:55:07 2014

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

Last Successful login time: Fri Oct 03 2014 09:29:21 -06:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> create table t1_inmemory
  2  (x number, y number, z char);

Table created.

Ahora configuremos la tabla para que sea almacenada en memoria.
SQL> alter table t1_inmemory inmemory;

Table altered.

Modifiquemos la tabla e indicamos que las columnas "x" -"y" no serán cargadas en memoria, pero la columna "z" si.

SQL> alter table t1_inmemory no inmemory(x,y) inmemory (z);

Table altered.

Con los privilegios de DBA, podemos consultar ahora la vista dinámica V$IM_COLUMN_LEVEL y validar que efectivamente los cambios han sido aplicados al objeto.

SQL> select table_name, segment_column_id, column_name,
  2  inmemory_compression
  3  from v$im_column_level
  4  where owner='HR' and
  5  table_name='T1_INMEMORY'
  6  order by segment_column_id;

TABLE_NAME     SEGMENT_COLUMN_ID COLUM INMEMORY_COMPRESSION
-------------- ----------------- ----- --------------------------
T1_INMEMORY                    1 X     NO INMEMORY
T1_INMEMORY                    2 Y     NO INMEMORY
T1_INMEMORY                    3 Z     DEFAULT

SQL>

Ahora bien, si queremos conocer, cuáles tablas están configuradas para memoria y cuáles no, es necesario realizar la siguiente consulta.

SQL> select table_name, owner, inmemory from user_tables;

TABLE_NAME                     OWNER      INMEMORY INMEMORY
------------------------------ ---------- -------- --------
LOCATIONS                      HR         DISABLED
JOB_HISTORY                    HR         DISABLED
REGIONS                        HR         DISABLED
EMPLOYEES                      HR         ENABLED  NONE
USLOG$_VMDEPARTMENTS_UPDAT     HR         DISABLED
....

22 rows selected.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Una vez concluida nuestra explicación básica, nos podemos hacer la pregunta, foco de este artículo:

Una base de datos Oracle 12.1.0.2 puede o no, tener activada la opción de In-Memory. Si hago un respaldo de una base de datos con tablas en modo in-memory, pero deseo que en la base de datos de destino, no sean INMEMORY, como lo puedo hacer.?

Veamos, primero que todo vamos a crear un directorio para la prueba y vamos a setear este misma dirección como un DIRECTORY de la base de datos.

[oracle@dbvisit01 ~]$ cd
[oracle@dbvisit01 ~]$ mkdir pruebas
[oracle@dbvisit01 ~]$ cd pruebas

[oracle@dbvisit01 pruebas]$ pwd
/home/oracle/pruebas
[oracle@dbvisit01 pruebas]$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Tue Sep 30 05:34:47 2014

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

SQL> connect / as sysdba
Connected.
SQL> create directory expprueba as '/home/oracle/pruebas';

Directory created.

SQL> exit

Ahora vamos a proceder a exportar el esquema "HR" de nuestra base de datos de prueba.

[oracle@dbvisit01 pruebas]$ expdp system/oracle schemas=hr directory=expprueba dumpfile=hr.dmp logfile=hr.log

Export: Release 12.1.0.2.0 - Production on Tue Sep 30 05:38:35 2014

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/******** schemas=hr directory=expprueba dumpfile=hr.dmp logfile=hr.log
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 89.25 MB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/TABLE/POST_TABLE_ACTION
Processing object type SCHEMA_EXPORT/MATERIALIZED_VIEW
Processing object type SCHEMA_EXPORT/TABLE/MATERIALIZED_VIEW_LOG
. . exported "HR"."EMPLEADOS"                            73.72 MB 1070107 rows
. . exported "HR"."ALUMNOS"                              5.539 KB       5 rows
. . exported "HR"."COUNTRIES"                            6.460 KB      25 rows
. . exported "HR"."DEPARTMENTS"                          7.062 KB      24 rows
. . exported "HR"."EJEMPLO"                              5.984 KB       3 rows
. . exported "HR"."EMPLEADOS2"                               0 KB       0 rows
. . exported "HR"."EMPLOYEES"                            17.09 KB     107 rows
. . exported "HR"."JOBS"                                 7.109 KB      19 rows
. . exported "HR"."JOB_HISTORY"                          7.195 KB      10 rows
. . exported "HR"."LOCATIONS"                            8.437 KB      23 rows
. . exported "HR"."MLOG$_DEPARTMENTS"                        0 KB       0 rows
. . exported "HR"."REGIONS"                              5.546 KB       4 rows
. . exported "HR"."T1"                                   6.015 KB       6 rows
. . exported "HR"."T2"                                   5.507 KB       2 rows
. . exported "HR"."USLOG$_VMDEPARTMENTS_UPDAT"               0 KB       0 rows
. . exported "HR"."USLOG$_VM_DEPARTAMENTOS"                  0 KB       0 rows
. . exported "HR"."USLOG$_VM_DEPARTMENTS_UPDA"               0 KB       0 rows
. . exported "HR"."VMDEPARTMENTS"                        7.070 KB      24 rows
. . exported "HR"."VMDEPARTMENTS_UPDATE"                 7.070 KB      24 rows
. . exported "HR"."VM_DEPARTAMENTOS"                     6.523 KB      24 rows
. . exported "HR"."VM_DEPARTMENTS_UPDATE"                7.078 KB      24 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
  /home/oracle/pruebas/hr.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at Tue Sep 30 05:40:27 2014 elapsed 0 00:01:51

Ahora vamos a crear un usuario para hacer el importación de los objetos del esquema HR, pero eliminando en el proceso de carga, la opción o habilitación de INMEMORY.

SQL> create user hr_nomemory identified by nomemory default tablespace users;

User created.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

Creado el usuario, podemos proceder a realizar la importación de los objetos con DataPump, utilizando para ello, un nuevo atributo en el parámetro TRANSFORM, el cuál permite mantener el esquema de carga de los objetos en memoria o en que trabaje con los objetos cargando sus bloques en el Database Buffer ( opción de facto ).

El parámetro TRANSFORM, permite establecer el atributo "inmemory:x", donde "x" puede ser "Y" o "N", para determinar si mantiene el modo de origen de carga en memoria para cada objeto importado, o si por lo contrario, establece el modo de facto de manejo para sus bloques en memoria. 

En nuestro caso, vamos a utilizar el valor "N" y vamos a validar que la tabla que teníamos anteriormente en el esquema de "HR" en memoria, ya no lo esta en el destino.

En la consulta realizada al comienzo de este artículo, en donde validamos si una tabla estaba o no con el atributo de INMEMORY, podemos observar, que la tabla "EMPLOYEES" estaba configurada como IMMEMORY.

[oracle@dbvisit01 pruebas]$ impdp system/oracle directory=expprueba dumpfile=hr.dmp logfile=imp2.log remap_schema=hr:hr_nomemory transform=inmemory:N

Import: Release 12.1.0.2.0 - Production on Tue Sep 30 05:59:26 2014

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_FULL_01":  system/******** directory=expprueba dumpfile=hr.dmp logfile=imp2.log remap_schema=hr:hr_nomemory transform=inmemory:N
Processing object type SCHEMA_EXPORT/USER
ORA-31684: Object type USER:"HR_NOMEMORY" already exists
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HR_NOMEMORY"."EMPLEADOS"                   73.72 MB 1070107 rows
. . imported "HR_NOMEMORY"."ALUMNOS"                     5.539 KB       5 rows
. . imported "HR_NOMEMORY"."COUNTRIES"                   6.460 KB      25 rows
. . imported "HR_NOMEMORY"."DEPARTMENTS"                 7.062 KB      24 rows
. . imported "HR_NOMEMORY"."EJEMPLO"                     5.984 KB       3 rows
. . imported "HR_NOMEMORY"."EMPLEADOS2"                      0 KB       0 rows
. . imported "HR_NOMEMORY"."EMPLOYEES"                   17.09 KB     107 rows
. . imported "HR_NOMEMORY"."JOBS"                        7.109 KB      19 rows
. . imported "HR_NOMEMORY"."JOB_HISTORY"                 7.195 KB      10 rows
. . imported "HR_NOMEMORY"."LOCATIONS"                   8.437 KB      23 rows
. . imported "HR_NOMEMORY"."MLOG$_DEPARTMENTS"               0 KB       0 rows
. . imported "HR_NOMEMORY"."REGIONS"                     5.546 KB       4 rows
. . imported "HR_NOMEMORY"."T1"                          6.015 KB       6 rows
. . imported "HR_NOMEMORY"."T2"                          5.507 KB       2 rows
. . imported "HR_NOMEMORY"."USLOG$_VMDEPARTMENTS_UPDAT"      0 KB       0 rows
. . imported "HR_NOMEMORY"."USLOG$_VM_DEPARTAMENTOS"         0 KB       0 rows
. . imported "HR_NOMEMORY"."USLOG$_VM_DEPARTMENTS_UPDA"      0 KB       0 rows
. . imported "HR_NOMEMORY"."VMDEPARTMENTS"               7.070 KB      24 rows
. . imported "HR_NOMEMORY"."VMDEPARTMENTS_UPDATE"        7.070 KB      24 rows
. . imported "HR_NOMEMORY"."VM_DEPARTAMENTOS"            6.523 KB      24 rows
. . imported "HR_NOMEMORY"."VM_DEPARTMENTS_UPDATE"       7.078 KB      24 rows
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/TABLE/POST_TABLE_ACTION
Processing object type SCHEMA_EXPORT/MATERIALIZED_VIEW
Processing object type SCHEMA_EXPORT/TABLE/MATERIALIZED_VIEW_LOG
Job "SYSTEM"."SYS_IMPORT_FULL_01" completed with 1 error(s) at Tue Sep 30 05:59:52 2014 elapsed 0 00:00:26


Ahora sí, nos conectamos con el usuario que hemos creado y validamos la consulta realizada al principio con el esquema HR.

[oracle@dbvisit01 pruebas]$ sqlplus hr_nomemory/nomemory

SQL*Plus: Release 12.1.0.2.0 Production on Tue Sep 30 06:01:31 2014

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select table_name, inmemory from user_tables;
...
EMPLEADOS2           DISABLED
EMPLEADOS            DISABLED
DEPARTMENTS          DISABLED
REGIONS              DISABLED
LOCATIONS            DISABLED
JOBS                 DISABLED
EMPLOYEES            DISABLED
JOB_HISTORY          DISABLED

22 rows selected.

Con esto terminamos al explicación de como trabaja el nuevo valor para el atributo TRANSFORM en el utilitario DataPump, para Oracle Database 12c 12.1.0.2