Oracle Database 12.2: Shared Undo y Local Undo

Por Deiby Gómez 
Publicado en Enero 2017

Introducción:

Cuando Oracle 12c fue publicada en el año 2013 fueron muchísimas nuevas características las que fueron introducidas, pero además una nueva e interesante arquitectura: La Arquitectura Multitenant.

Cuando hablamos de arquitectura Multitenant estamos hablando de Container Database (CDB), Pluggable Database (PDB) y PDB$SEED la cual es una Pluggable Database especial y que es creada de facto.

Esta arquitectura se puede describir en la siguiente imagen: 

En esa imagen se puede notar muchas cosas importantes. En primer lugar se ve que la arquitectura Multitenant está conformada por la Instancia de base de datos, un Contenedor llamado “root”, una Pluggable Database llamada “Seed” y luego varias Pluggable Databases. Pero lo más importante de todo esto, son los archivos que tiene el “Root Container”. Se ve claramente que tanto el “Root Container” como todas las Pluggable Databases poseen su propio Tablespace SYSTEM y SYSAUX. Se ve también que los “Control Files” y los “Redo Logs” pertenecen al “Root Container”  y que por lo tanto, estos archivos son “compartidos” (Shared, en ingles) con todas las Pluggable Databases para que puedan hacer uso de ellos. En otras palabras, todas las Pluggable Databases leen/escriben a los “Control Files” y “Redo Logs” pero estos archivos son adueñados por el “Root Container”, de tal manera que si desconectamos una Pluggable Database, esta solamente se llevará sus propios archivos como por ejemplo los “Datafiles” de los Tablespace SYSTEM y SYSAUX, y los “Datafiles” en donde se guarda los datos del negocio. Es importante notar que crear un Tablespace temporal en una Pluggable Database es opcional, si no se tiene, dicha Pluggable Database utilizará el Tablespace temporal que posee el “Root Container”. Pero lo más importante de todo esto y es el tema que trata este artículo es el Tablespace “Undo”. Tal como se ve en la imagen anterior, el Tablespace “Undo” es adueñado por el “Root Container”, pero es  compartido con todas las Pluggable Databases para que pueda ser utilizado. Ninguna Pluggable Database tiene un propio Tablespace Undo.

¿Qué es el Tablespace Undo y para qué sirve?

Los Datos Undo son muy importantes dentro de una Base de Datos Oracle. Estos datos son almacenados en extensiones de Oracle dentro de Segmentos de tipo “Undo” en un Tablespace que se dedica completamente a almacenar datos “Undo”, es por eso que frecuentemente a este Tablespace se le llama “Undo Tablespace”, aunque puede tener cualquier nombre. Los datos Undo son frecuentemente utilizados para deshacer transacciones (Rollback), para recuperar una transacción que se terminó abruptamente (con Kill – 9, ALTER SYSTEM KILL IMMEDIATE, etc), para realizar una recuperación de una Instancia, para realizar recuperación hasta un punto en el tiempo, para realizar lecturas consistentes, para resolver problemas lógicos y para las operaciones “Flashback” que fueron introducidas en la versión 10g. Los datos “Undo” son igual de importantes que los datos “Redo”, ambos se complementan. Mientras Undo deshace (Undo) el otro rehace (Redo).

Un vistazo a la configuración Undo en Oracle Database 12cR1:

Tal como se ha visto hasta el momento, en la versión 12cR1, el Tablespace Undo era compartido por todas las “Pluggable Databases”. Dicho Undo Tablespace pertenecía al “CDB$ROOT”. Una de las desventajas de tener esta configuración es que no es posible realizar “Flashback Database” a nivel de “Pluggable Database”. Cuando se requería regresar en el tiempo, el “Flashback Database” era aplicado al “Container Database” en su totalidad, impactando todas las “Pluggable Databases” que existen dentro de él. Otra desventaja es que para clonar una “Pluggable Database” se tenia que poner dicha “Pluggable Database” en modo “read only” para garantizar la consistencia de la información que estaba siendo clonada. Finalmente al tener un solo “Undo Tablespace”, esto se convertía en un punto de falla. Si algo dañaba ese único “Undo Tablespace” todas las “Pluggable Databases” eran impactadas.

Oracle Database 12cR2 y su nueva característica “Local Undo”

Iniciando con Oracle Database 12.2.0.1.0 existen dos tipos de configuraciones de Undo: El “Shared Undo” y el “Local Undo”. El “Shared Undo” no es más que la misma configuración que se tenía en 12cR1 en una arquitectura Multitenant, pero “Local Undo” es una configuración nueva. Básicamente se trata de que cada una de las Pluggable Databases tenga su propio Tablespace Undo tal como se ve en la siguiente imagen:

 Esto habilita las soluciones de los problemas que se tuvieron en 12cR1. Si un “Container Database” utiliza “Local Undo” entonces ya es posible realizar “Flashback Pluggable Database”, que no es más que un “Flashback Database” pero a nivel de “Pluggable Database”, de ahí su nombre. Así también clonaciones totalmente online (Hot Cloning) de las “Pluggable Databases”, aunque la “Pluggable Database” clonada esté remota, en otro “Container Database”, ya sea on-premise o en la nube pública de Oracle. La configuración “Local Undo” le da aún más independencia a cada una de las Pluggable Databases. Lo bueno de todo esto es que el tipo de configuración Undo no es una decisión de una sola vez, como la decisión de utilizar “non-CDB” o “CDB”. La configuración de Undo puede ser cambiada en cualquier momento, tanto de “Shared Undo” a “Local Undo” o viceversa. Sin embargo, hay que notar que para cambiar la configuración se necesita “Downtime” (reiniciar la base de datos). “Local Undo” es la configuración recomendada por Oracle, incluso en la nube pública de Oracle, todos los “Container Databases” son creados utilizando la configuración “Local Undo” de facto.

NOTA: Los siguientes ejemplos fueron realizados sobre una versión “Oracle Database 12.2.0.1.0 Enterprise Edition Extreme Performance 64bit”, en la nube de Oracle.

Crear una base de datos configurada con Local Undo:

Para crear un “Container Database” es necesario que el parámetro “enable_pluggable_database” tenga el valor de “true” tal como se muestra a continuación:


SQL> show parameters enable_pluggable_database

NAME                          TYPE    VALUE
------------------------- -------- -------------
enable_pluggable_database    booleanTRUE

La sentencia para crear un “Container Database” utilizando “Local Undo” es el siguiente:


SQL> CREATE DATABASE NuvolaCG
USER SYS IDENTIFIED BY NuvolaCG
USER SYSTEM IDENTIFIED BY NuvolaCG
EXTENT MANAGEMENT LOCAL
DEFAULT TEMPORARY TABLESPACE temp
UNDO TABLESPACE undotbs1
ENABLE PLUGGABLE DATABASE
SEED
SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
SYSAUX DATAFILES SIZE 100M
LOCAL UNDO ON; 

Database created.

Conversión de Shared Undo a Local Undo

Si un “Container Database” fue creado inicialmente con configuración “Shared Undo” y se requiere cambiar a “Local Undo” los siguientes pasos deben ser realizados:

Bajar la Instancia de la base de datos:


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

Abrir la base de datos en modo “upgrade”:


SQL> startup upgrade;
ORACLE instance started.

Total System Global Area 5452595200 bytes
Fixed Size               8804328 bytes
Variable Size       1090521112 bytes
Database Buffers   4345298944 bytes
Redo Buffers             7970816 bytes
Database mounted.
Database opened.

Asegurarse que se está conectado al CDB$ROOT:


SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

Cambiar el Modo de Undo a “Local Undo”:


SQL> alter database local undo on;

Database altered.

Reiniciar la base de datos:


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup;
ORACLE instance started.

Total System Global Area 5452595200 bytes
Fixed Size               8804328 bytes
Variable Size       1090521112 bytes
Database Buffers   4345298944 bytes
Redo Buffers             7970816 bytes
Database mounted.
Database opened.

Verificar que la configuración Local Undo esté en uso:


SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED'

PROPERTY_NAME        PROPERTY_VALUE
-------------------- ---------------
LOCAL_UNDO_ENABLED   TRUE

¿Oracle Crea automáticamente Tablespaces Undo en cada PDB? Es importante notar que cuando la base de datos es abierta, únicamente el PDB$SEED tendrá automáticamente creado su propio Tablespace Undo. Todas las demás “Pluggable Databases” aún no tendrán sus propios Tablespace Undo, excepto si dichas “Pluggable Databases”  se abren automáticamente haciendo uso de la función “SAVE STATE”.


SQL> select pdb.name PDB_NAME, tbs.name TABLESPACE_NAME  
from v$tablespace tbs, v$pdbs pdb where tbs.con_id=pdb.con_id order by 1;

PDB_NAME                TABLESPACE_NAME
-------------------- ------------------------------
NUVOLAPDB1              SYSAUX
NUVOLAPDB1              TEMP
NUVOLAPDB1              SYSTEM
NUVOLAPDB2              SYSAUX
NUVOLAPDB2              TEMP
NUVOLAPDB2              SYSTEM
PDB$SEED                UNDO_1
PDB$SEED                TEMP
PDB$SEED                SYSAUX
PDB$SEED                SYSTEM

10 rows selected.

Los Tablespace Undo de cada una de las “Pluggable Databases” son creados en el momento en que cada “Pluggable Database” es abierta por primera vez, luego de cambiar a la configuración “Local Undo”:


SQL> alter pluggable database all open;

Pluggable database altered.

NOTA: Si se obtiene el siguiente error al intentar abrir las “Pluggable Databases”:

ORA-00060: deadlock detected while waiting for resource

Lo que se debe hacer es abrir cada una de las Pluggable Databases en  modo “Upgrade”, cerrar y volver a abrir en modo normal.


SQL> select pdb.name PDB_NAME, tbs.name TABLESPACE_NAME  
from v$tablespace tbs, v$pdbs pdb where tbs.con_id=pdb.con_id order by 1;

PDB_NAME   TABLESPACE_NAME
---------- ------------------------------
NUVOLAPDB1 TEMP
NUVOLAPDB1 UNDO_1
NUVOLAPDB1 SYSAUX
NUVOLAPDB1 SYSTEM
NUVOLAPDB2 UNDO_1
NUVOLAPDB2 SYSTEM
NUVOLAPDB2 SYSAUX
NUVOLAPDB2 TEMP
PDB$SEED   UNDO_1
PDB$SEED   TEMP
PDB$SEED   SYSAUX
PDB$SEED   SYSTEM

12 rows selected.

Como se ve, luego de la primer apertura de cada Pluggable Database, el Tablespace Undo es creado en cada una de ellas. Es importante notar que el valor de facto para dicho Tablespace Undo es “UNDO_1” y tiene propiedades de facto también. Si se requiere utilizar un Tablespace Undo personalizado, entonces, el Tablespace Undo de la PDB$SEED debe ser modificado, tal como se muestra en la siguiente sección.

Personalización del Tablespace Undo en el PDB$SEED

El Tablespace Undo que utiliza el PDB$SEED para crear nuevas Pluggable Databases puede ser personalizado mediante las siguientes instrucciones:

Forzar la apertura del PDB$SEED:


SQL> ALTER PLUGGABLE DATABASE PDB$SEED OPEN READ WRITE FORCE;

Pluggable database altered.

Moverse al contenedor PDB$SEED:


SQL> ALTER SESSION SET CONTAINER=PDB$SEED;

Session altered.

Una vez el PDB$SEED este abierto, se puede tomar la decisión de modificar el Tablespace Undo que fue automáticamente creado en el PDB$SEED, o borrarlo y crear uno nuevo con las propiedades requeridas. En este ejemplo se crea uno nuevo y la propiedad requerida es “RETENTION GUARANTEE:


SQL> CREATE UNDO TABLESPACE seedundotbs RETENTION GUARANTEE;

Tablespace created.;

Regresar nuevamente al contenedor CDB$ROOT:


SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;

Session altered.

Regresar el PDB$SEED al modo original:


SQL> ALTER PLUGGABLE DATABASE PDB$SEED OPEN READ ONLY FORCE;

Pluggable database altered.

Conversión de Local Undo a Shared Undo

Bajar la Instancia de la base de datos:


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

Abrir la base de datos en modo “upgrade”:


SQL> startup upgrade;
ORACLE instance started.

Total System Global Area 5452595200 bytes
Fixed Size               8804328 bytes
Variable Size       1090521112 bytes
Database Buffers   4345298944 bytes
Redo Buffers             7970816 bytes
Database mounted.
Database opened.

Asegurarse que se está conectado al CDB$ROOT:


SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

Cambiar el Modo de Undo a “Shared Undo”:

SQL> alter database local undo off;

Database altered.

Reiniciar la base de datos:


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup;
ORACLE instance started.

Total System Global Area 5452595200 bytes
Fixed Size               8804328 bytes
Variable Size       1090521112 bytes
Database Buffers   4345298944 bytes
Redo Buffers             7970816 bytes
Database mounted.
Database opened.

Verificación de la configuración de “Shared Undo”:


SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE  PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';

PROPERTY_NAME       PROPERTY_VALUE
------------------ ---------------
LOCAL_UNDO_ENABLED FALSE

Conclusión:

Desde Noviembre del año 2016 cuando la documentación de Oracle Database 12cR2 fue liberada muchas nuevas características fueron conocidas, entre ellas la nueva configuración de Undo. A la antigua configuración ahora se le denomina “Shared Undo” mientras que a la configuración introducida en 12cR2 se le llama “Local Undo”. Esta nueva configuración proporciona aún más independencia a cada “Pluggable Database” y apoya otras nuevas características como “Hot Cloning” y “Flashback Pluggable Database”. Esta nueva configuración es recomendada por Oracle, es por ello que los “Container Databases” creados en la nube pública de Oracle, de facto utilizan “Local Undo”. En este artículo se revisó las formas de cambiar entre “Shared Undo” y “Local Undo” y se revisó teoría de los mismos. Definitivamente Oracle se mantiene constantemente innovando para que las compañías que utilizan la base de datos #1 en el mundo se beneficien de esta innovación.

Deiby Gómez es "Oracle ACE Director", "Oracle Certified Master 11g" y "Oracle Certified Master 12c". Ha sido conferencista en Oracle Open World en USA y en Brasil; en Collaborate, Las Vegas y OTN Tour en varios países de Latinoamérica. Ganador de "SELECT Journal Editor's Choice Award 2016". Es miembro de "Oraworld-Team", ha sido "Beta Tester" de la versión 12cR2. Deiby es el Presidente del Grupo de Usuarios Oracle de Guatemala (GOUG) y actualmente es Consultor de Bases de datos Oracle en Nuvola Consulting Group (www.nuvolacg.com). Twitter @hdeiby.

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.