viernes, 26 de julio de 2013

Plug a non-CDB in to CDB

En el siguiente ejemplo enseñaré como pasar una base de datos Oracle 12.1 que no es un Contenedor e introducirla en un Contenedor, es decir, convertirla en un PDB y luego agregarla a un Contenedor utilizando el nuevo paquete DBMS_PDB.


Para este ejemplo se tienen las siguientes instancias:

[oracle@orcl12c ~]$ ps -ef |grep pmon
grid      2151     1  0 09:03 ?        00:00:03 asm_pmon_+ASM
oracle    2221     1  0 09:03 ?        00:00:03 ora_pmon_orcl
oracle    2448     1  0 09:04 ?        00:00:04 ora_pmon_cdb1
oracle    9360  1980  0 15:27 pts/0    00:00:00 grep pmon

ORCL: Es la base de datos non-CDB
CDB1: Es la base de datos Contenedor
+ASM: Es la instanca de ASM donde las 2 bases de datos guardan sus archivos.

Poner la base de datos non-CDB en modo READ-ONLY:

[oracle@orcl12c ~]$ export ORACLE_SID=orcl
sqlplus / as sysdba
SQL> startup mount;
SQL> alter database open read only;

Generar un archivo que describe la actual base de datos non-CDB como un PDB:

SQL> exec dbms_pdb.describe ('/home/oracle/orcl.xml');
PL/SQL procedure successfully completed.

Verificar que el actual non-CDB pueda conectarse como PDB a un Contenedor:

SET SERVEROUTPUT ON
DECLARE
 compatible CONSTANT VARCHAR2(3) := 
 CASE DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
 pdb_descr_file => '/home/oracle/orcl.xml',
 pdb_name => 'PDB2')
 WHEN TRUE THEN 'YES'
 ELSE 'NO'
END;
BEGIN
 DBMS_OUTPUT.PUT_LINE(compatible);
END;
/
YES

PL/SQL procedure successfully completed.

Nota: Si el resultado es "NO" consultar la vista "PDB_PLUG_IN_VIOLATIONS" para ver los errores.

Conectarse a al contenedor con un usuario común que contenga el privilegio "CREATE PLUGGABLE DATABASE":

SQL> CREATE PLUGGABLE DATABASE pdb2 USING '/home/oracle/orcl.xml';
Pluggable database created.

Creación de un servicio en el tnsnames.ora que apunte al PDB que estamos creando (pdb2):

[oracle@orcl12c ~]$ cd $ORACLE_HOME/network/admin

[oracle@orcl12c admin]$ vi tnsnames.ora

Agregar lo siguiente:

PDB2 =
 (DESCRIPTION =
 (ADDRESS_LIST =
 (ADDRESS = (PROTOCOL = TCP)(HOST = dgomez12c.oraclefromguatemala)(PORT = 1521)))
 (CONNECT_DATA =
 (SERVICE_NAME =pdb2 )
 )
  )

Conectarse a la nueva base de datos PDB utilizando el servicio en el tnsnames.ora:

[oracle@orcl12c admin]$ sqlplus sys@pdb2 as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Fri Jul 26 15:35:13 2013

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

Enter password:

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

SQL> 

Verificar que estemos conectados al correcto PDB:

SQL> show con_name

CON_NAME
------------------------------
PDB2

Ejecutar el script "noncdb_to_pdb": Este script sirve para eliminar toda la Metadata que existe en el PDB y que ya no se necesita, recuerde que antes el PDB era un non-CDB por lo cual necesitaba tener la metadata de los objetos proporcionados por Oracle y que ahora ya no se necesitan pues esa información la contiene el diccionario del CDB:

SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb

Nota: Este procedimiento puede durar mucho tiempo por lo que se recomienda ejecutarlo como con una herramienta como "nohup".

Abrir el PDB:

SQL> alter pluggable database pdb2 open;
Pluggable database altered.

Verificar que el PDB esté creado:

SQL> select con_id, name from v$pdbs;

    CON_ID NAME
---------- ------------------------------
         2 PDB$SEED
         3 PDB1
         4 PDB2


martes, 23 de julio de 2013

OTN (Oracle Technology Network) LatinAmerican Tour 2013, Guatemala

El pasado 17 de Julio se llevó a cabo uno de los eventos más importantes de Oracle en la ciudad de Guatemala, dicho evento contó con varios Oracle ACE Directors entre ellos:

  • Kai Yu (China)
  • José Niño (Colombia)
  • Gustavo Gonzalez (Argentina)
  • Ronald Bradford (Australia)
  • Plinio Arbizu (Perú)

En este evento tuve la oportunidad  de participar como un Speaker más del OTN 2013 y compartir las siguientes dos conferencias:





La agenda de dicho Evento fué la siguiente:



Agradezco mucho a Oracle User Group de Guatemala por darme la oportunidad de participar en tan prestigioso evento y les mando un gran saludo desde Guatemala a Kai You (I remember the promise for you.), Gustavo Gonzalez (Mantuve una larga conversación con Kai y Ronald en el automovil gracias a vos :D), José Niño (Gracias por confirmar los mitos de Colombia) y Ronald Bradford (thanks for the gift about Australia).



RMAN Database 12c: Recuperación de tablas ( Parte IV )

Por Joel Pérez  y Wissem El Khlifi  

Para la recuperación de tablas se utilizara el ya conocido comando “RECOVER” pero esta vez con funcionalidades nuevas propias de “Oracle Database 12c”. Para llevar a cabo la tarea de recuperación es necesario disponer de la siguiente información:
  • Nombre de la(s) tabla(s) y/o partición(es) a ser recuperadas
  • Punto en el tiempo ( Fecha con hora, minutos y segundos ) deseado para la recuperación
  • Especificar si la tabla será o no importada en la BBDD “target”
RMAN utiliza toda esta información para automatizar el proceso de recuperación de las tablas especificadas y/o particiones de tablas especificadas, como parte del proceso de recuperación, RMAN crea una base de datos auxiliar para alojar los objetos a ser restaurados.
Los pasos llevados a cabo por RMAN para la recuperación de tablas y/o particiones de tablas son los siguientes:
  • Determina cual respaldo ( backup sets ) poseen la tabla deseada a restaurar con el objetivo de llevarla al punto deseado en el tiempo. Internamente el proceso de búsqueda se establece bajo la misma filosofía como cuando deseamos restaurar la BBDD o un determinado “tablespace” a un determinado punto en el tiempo.
Para ver el artículo completo visite el siguiente link:



RMAN Database 12c: Recuperación de tablas ( Parte III )

Por Joel Pérez  y Wissem El Khlifi  

Para llevar a cabo la tarea de utilizar la nueva característica es fundamental contar un respaldo full de los “tablespaces”:
  • UNDO
  • SYSTEM
  • SYSAUX
  • SYSEXT ( en caso de que existiese )
Y el “tablespace” correspondiente que posea la tabla o partición deseada a recuperar.
Los requisitos están basados en los elementos necesarios para conformar una nueva BBDD la cual será denominada como BBDD Auxiliar. La BBDD Auxiliar es una BBDD temporal creada para generar un “Data Pump export dump file” que será objeto de contenido de datos para la obtención finalmente del objeto deseado ( Tabla a Recuperar ). La BBDD Auxiliar no representa una BBDD que deba crearse previo al proceso de la ejecución del comando. La misma es creada de forma automática durante el proceso de “RECOVER” y los mecanismos de acción del mismo comando “RECOVER” remueven la misma al final del proceso.
Para ver el artículo completo visite el siguiente link:


RMAN Database 12c: Recuperación de tablas ( Parte II )

RMAN Database 12c: Recuperación de tablas ( Parte2 )

Por Joel Pérez  y Wissem El Khlifi  
Entremos en materia… al momento de plantear una estrategia de respaldo y recuperación son diversos y múltiples los factores a tomar en cuenta para plantear y establecer una excelente estrategia. Y tal como siempre expreso en conferencias, artículos, y otros… “Jamás serás capaz de plantear una excelente estrategia de respaldo sino eres experto recuperando…”, es decir… el planteamiento de una excelente estrategia de recuperación se basa en establecer las condiciones y mecanismos, para poseer en cualquier momento en modo optimo los elementos necesarios para una recuperación rápida y efectiva de la base de datos en forma completa o parcial.
Al momento de plantear una estrategia de recuperación de base de datos se toma en cuenta los factores para una recuperación completa o parcial de la base de datos ( BBDD ), cuando se hace referencia a una recuperación parcial podríamos establecer que la parcialidad podria estar enfocada a: restauración completa de la estructura de la BBDD exceptuando “tablespaces”, TSPITR ( Tablespace Point-in-Time Recovery ) o parcialidad de su contenido ( objetos ) haciendo uso de Oracle “Flashback”.
Para ver el articulo completo visite el siguiente link:


RMAN Database 12c: Recuperación de tablas ( Parte I )


Por Joel Pérez  y Wissem El Khlifi  

Publicado en julio 2013


Reciban estimados tecnólogos Oracle un cordial saludo. A través del presente artículo, tendremos la oportunidad de visualizar y adentrarnos un poco en el tema de recuperación de tablas provenientes de respaldos realizados con el utilitario RMAN (Oracle Recovery Manager).

“Database12c” la nueva versión de manejador de base de datos de Oracle Corporation, nosotros los tecnólogos Oracle nos preguntábamos “que mas…” podría Oracle adicionar como nuevas características?, de que forma Oracle nos iba a sorprender esta vez y como siempre, las nuevas características y nueva arquitectura no solo nos sorprenden sino que una vez mas nos llevan a otra era…, “Cloud Computing”…
Para ver el artículo completo visite el siguiente link:



martes, 9 de julio de 2013

Oracle 12c: DDL Log

El registro de las actividades DDL's ya existia en la base de datos 11g, sin embargo, todas las sentencias eran registradas en el archivo de alerta, en Oracle 12c se tiene la nueva caracteristica de tener todos los registros DDL's en un archivo de log diferente al alert_log, este log mantiene practicamente el mismo formato que el ya conocido archivo de alerta. El uso de este archivo no  viene habilitado por default en la instalación de una base de datos 12c, para habilitarlo se necesita alterar el parametro "ENABLE_DDL_LOGGING" estableciendolo a "TRUE". Para cada sentencia DDL un registro nuevo es creado dentro de dos archivos diferentes:

  • XML DDL Log: Este archivo puede encontrarse en la ruta $ORACLE_BASE/diag/rdbms/<SID>/<SID>/log/ddl/log.xml
  • Text DDL Log: Este archivo puede encontrarse en la ruta $ORACLE_BASE/diag/rdbms/<SID>/<SID>/log/ddl_orcl.log

Nota: Es importante señalar que los registros DDL's no contiene el usuario que realizó el DDL, es decir, el DDL no registra qué usuario realizó qué DDL.

Las sentencias DDL que pueden ser registradas son:

ALTER/CREATE/DROP/TRUNCATE CLUSTER
ALTER/CREATE/DROP FUNCTION
ALTER/CREATE/DROP INDEX
ALTER/CREATE/DROP OUTLINE
ALTER/CREATE/DROP PACKAGE
ALTER/CREATE/DROP PACKAGE BODY
ALTER/CREATE/DROP PROCEDURE
ALTER/CREATE/DROP PROFILE
ALTER/CREATE/DROP SEQUENCE
CREATE/DROP SYNONYM
ALTER/CREATE/DROP/RENAME/TRUNCATE TABLE
ALTER/CREATE/DROP TRIGGER
ALTER/CREATE/DROP TYPE
ALTER/CREATE/DROP TYPE BODY
DROP USER
ALTER/CREATE/DROP VIEW

Habilitando DDL Log:

SQL> alter system set enable_ddl_logging=true scope=both;

System altered.

Realizando una prueba sencilla:

SQL> create table dgomez (a int);

Table created.

SQL> drop table dgomez;

Table dropped.

Consultando resultados:

[oracle@orcl12c log]$ pwd
/u01/app/oracle/diag/rdbms/orcl/orcl/log
[oracle@orcl12c log]$ ls -ltr
drwxr-x--- 2 oracle asmadmin 4096 Jun 29 12:40 debug
drwxr-x--- 2 oracle asmadmin 4096 Jun 29 12:40 test
drwxr-x--- 2 oracle asmadmin 4096 Jul  9 17:10 ddl
-rw-r----- 1 oracle asmadmin  367 Jul  9 17:16 ddl_orcl.log

[oracle@orcl12c log]$ cat ddl_orcl.log
Tue Jul 09 17:16:06 2013
diag_adl:create table dgomez (a int)
diag_adl:drop table dgomez

[oracle@orcl12c ddl]$ pwd
/u01/app/oracle/diag/rdbms/orcl/orcl/log/ddl
[oracle@orcl12c ddl]$ ls -ltr 
-rw-r----- 1 oracle asmadmin 2530 Jul  9 17:16 log.xml
[oracle@orcl12c ddl]$ cat log.xml
<msg time='2013-07-09T17:16:06.271-06:00' org_id='oracle' comp_id='rdbms'
 msg_id='opiexe:4181:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='orcl12c.datum.com.gt' host_addr='192.168.56.2'>
 <txt>create table dgomez (a int)
 </txt>
</msg>
<msg time='2013-07-09T17:16:14.369-06:00' org_id='oracle' comp_id='rdbms'
 msg_id='opiexe:4181:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='orcl12c.datum.com.gt' host_addr='192.168.56.2'>
 <txt>drop table dgomez
 </txt>
</msg>

Aunque la Documentación no indique que las sentencias "ALTER DATABASE" son registradas, sí son realizadas:




lunes, 1 de julio de 2013

Oracle 12c: Create Container

Para este articulo se asume que ya se tiene instalado el software de Oracle Database 12c, si aún no lo ha instalado visite el siguiente link: Instalar Oracle 12c

[oracle@orcl12c ~]$ dbca










[oracle@orcl12c ~]$ ps -ef |grep pmon
grid      2144     1  0 14:46 ?        00:00:00 asm_pmon_+ASM
oracle    5156     1  0 15:51 ?        00:00:00 ora_pmon_cdb1
oracle    5374  2958  0 15:54 pts/1    00:00:00 grep pmon

[oracle@orcl12c trace]$ export ORACLE_SID=cdb1
[oracle@orcl12c trace]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Jul 1 16:16:59 2013

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


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

SQL> desc CDB_PDBS;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 PDB_ID                                    NOT NULL NUMBER
 PDB_NAME                                  NOT NULL VARCHAR2(128)
 DBID                                      NOT NULL NUMBER
 CON_UID                                   NOT NULL NUMBER
 GUID                                               RAW(16)
 STATUS                                             VARCHAR2(13)
 CREATION_SCN                                       NUMBER
 CON_ID                                             NUMBER

SQL> desc DBA_PDBS;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 PDB_ID                                    NOT NULL NUMBER
 PDB_NAME                                  NOT NULL VARCHAR2(128)
 DBID                                      NOT NULL NUMBER
 CON_UID                                   NOT NULL NUMBER
 GUID                                               RAW(16)
 STATUS                                             VARCHAR2(13)
 CREATION_SCN                                       NUMBER

SQL> select PDB_ID, PDB_NAME FROM CDB_PDBS;

PDB_ID PDB_NAME
---------- ------------------------------------------------------
         3 PDB1
         2 PDB$SEED

Cada contenedor está compuesto de 3 partes: 

  1. El Root
  2. El Seed
  3. PDBs
El Root es la base de datos como tal, la base de datos "contenedor".
El Seed siempre va a estar presente por default en un contenedor y sirve como plantilla para crear futuras PDBs.
Las PDBs son todas las bases de datos que estan dentro del contenedor.

Para una mejor compresión vea la siguiente imagen:


Oracle 12c: Columnas Invisibles

En Oracle 12c las tablas ahora cuentan con la opción de crear columnas de manera invisible, estas columnas no son vistas ni se permite usarlas a menos que se nombren explicitamente, a continuación un ejemplo sencillo:

[oracle@orcl12c ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Jul 1 15:02:23 2013

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


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

SQL> create table dgomez (a int, b int invisible, c int);

Table created.

SQL> desc dgomez;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 A                                                  NUMBER(38)
 C                                                  NUMBER(38)

SQL> alter table dgomez modify (b visible);

Table altered.

SQL> desc dgomez;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 A                                                  NUMBER(38)
 C                                                  NUMBER(38)
 B                                                  NUMBER(38)

Vean que cada vez que la columna invisible sufre una modificación (de invisible a visible o viceversa) dicha columna pasa a ser la ultima de la tabla, en este caso la columna B se creó en la posicion número 2, pero cuando se le modificó para que fuera visible pasó a ser la tercer columna (la ultima).

SQL> insert into dgomez values(1,2,3);
insert into dgomez values(1,2,3)
            *
ERROR at line 1:
ORA-00913: too many values

SQL> insert into dgomez (a,b,c) values (1,2,3);

1 row created.

Vean que no se pudo realizar la inserción de un registro con los tres valores porque no se está nombrando las tres columnas de manera explicita, una vez nombrando las tres columnas se podrá realizar el insert.

SQL> select * from dgomez;

         A          C
---------- ----------
         1          3

SQL> select a,b,c from dgomez;

         A          B          C
---------- ---------- ----------
         1          2          3

En este ultimo ejemplo, para las consultas tambien la columna no se podrá observer a menos que se le nombre explícitamente en la clausula SELECT.

Oracle 12c: Move Datafile online from ASM to Filesystem

Como una nueva característica de Oracle 12c ya se pueden mover los datafiles online, a continuación se moverá un datafile desde ASM a filesystem y nuevamente se regresará a ASM, los pasos son muy simples, el formato genérico para mover un datafile es:

ALTER DATABASE MOVE DATAFILE '<ruta origen>' to '<ruta destino>';


[oracle@orcl12c ~]$ srvctl status asm
ASM is running on orcl12c
[oracle@orcl12c ~]$ srvctl status database -d orcl
Database is running.
[oracle@orcl12c ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Jul 1 14:48:27 2013

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


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

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE

SQL> select file_name from dba_data_files;

FILE_NAME
--------------------------------------------------------------------------------
+DATA/ORCL/DATAFILE/system.258.819378025
+DATA/ORCL/DATAFILE/sysaux.257.819377829
+DATA/ORCL/DATAFILE/users.259.819378241
+DATA/ORCL/DATAFILE/undotbs1.260.819378241

SQL>  alter database move datafile '+DATA/ORCL/DATAFILE/users.259.819378241' to '/home/oracle/users.259.819378241';

Database altered.

[oracle@orcl12c ~]$ ls -ltr /home/oracle
-rw-r----- 1 oracle asmadmin 5251072 Jul  1 14:51 users.259.819378241

[oracle@orcl12c ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Mon Jul 1 14:55:07 2013

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


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

SQL>  alter database move datafile '/home/oracle/users.259.819378241' to '+DATA';

Database altered.

Oracle ACE Director Award - Deiby Gómez

Thanks #OracleACE Program for this awesome certificate recognizing the work I have done in the community for the last year. Looking forwa...