Revisado por Francisco Riccio
En este artículo vamos a ver paso a paso cómo instalar Oracle 12c en Windows 10 usando Docker.
Docker es una tecnología de containers muy popular.
¿No has usado containers? Sirven para desplegar aplicaciones en un entorno virtual aislado, pero sin el overhead de tener un Sistema Operativo (SO) nuevo como se tiene en una Virtual Machine (VM).
La principal diferencia es que los containers virtualizan el SO en vez del hardware, como lo hace una VM. De esta forma un container usa menos espacio en disco (ya que no requiere una copia del SO), y es más ágil (ya que usa menos recursos del host para ejecutar).
Pueden ver más detalles del funcionamiento de Docker en esta URL: https://www.docker.com/what-container#/virtual_machines
Oracle se puede usar con Docker pero no está soportado para ambientes de producción todavía, como se explica en la nota de soporte “2216342.1 Oracle Support for Database Running on Docker”.
Hay varias formas de hacerlo automatizando todo el proceso:
Usuarios han creado scripts y documentación. Por ejemplo: Seth Miller - Oracle RAC cluster in Docker: https://github.com/Seth-Miller/12c-rac-docker
Imágenes oficiales de Oracle 12c en la Docker Store: https://store.docker.com/images/oracle-database-enterprise-edition
Imágenes oficiales en Oracle Container Registry: https://container-registry.oracle.com
Repositorio oficial Oracle de imágenes Docker en Github (originalmente single instance, agregado RAC hace unos días): https://github.com/oracle/docker-images/tree/master/OracleDatabase
Usar imágenes de Oracle Container Registry o de Docker Store tiene la ventaja que los binarios de instalación vienen incluidos, lo que no es permitido por licencia en el resto de las distribuciones.
Pero ambas opciones sólo incluyen las versiones 12.1 y 12.2.
Si queremos crear un ambiente de pruebas con versiones anteriores, tenemos que adaptar los scripts usados en cualquiera de las imágenes anteriores, además de necesitar los archivos de instalación apropiados (OTN para las más recientes, Oracle Software Delivery Cloud https://edelivery.oracle.com/ para anteriores).
Hay muchas referencias de cómo usar Oracle con Docker en Linux, aunque está soportado también en Windows. Esto ofrece desafíos adicionales, así que vamos a ver detalles de cómo hacerlo con Windows 10.
Docker tiene dos versiones para Windows:
Para usar la versión completa es necesario habilitar Microsoft Hyper-V, lo que implica deshabilitar la virtualización por hardware de nuestro PC.
Si estamos usando VirtualBox en el mismo host, con este cambio deja de funcionar. Docker Toolbox no tiene esta restricción, aunque se mantiene como una versión antigua (Legacy), y Docker recomienda usar la versión completa.
Otra diferencia de Docker Toolbox es que necesita una VM VirtualBox para ejecutar. Esta VM se crea de forma automática al usar Toolbox, de nombre default, y se usa como host para los containers que creemos. Más adelante veremos detalles sobre las implicaciones de esto.
En este artículo vamos a usar Docker Toolbox (v 18.01.0-ce), ya que tengo en el mismo host otras VMs VirtualBox que me interesa seguir usando. La versión de Windows es 10.0.16299.309 64 bits.
El instalador se descarga de https://download.docker.com/win/stable/DockerToolbox.exe
Al ejecutarlo hace unas preguntas simples y se instala rápidamente.
La instalación crea dos accesos directos:
El primero es una terminal pre-configurada para trabajar con Docker.
Es lo que vamos a usar para ejecutar todos los comandos.
Además de configurar variables de entorno, valida que la VM default exista y esté ejecutando, y la crea/inicia si es necesario.
Antes de empezar, necesitamos hacer un ajuste a la VM default, porque los valores por defecto son chicos para el disco y la memoria, lo que hace fallar la instalación de Oracle más adelante.
Para evitar esto, vamos a modificar el script usado para crear la VM, asignando más disco y memoria.
El archivo a modificar es C:\Program Files\Docker Toolbox\start.sh. Tenemos que cambiar esta línea (60 en mi caso):
“${DOCKER_MACHINE}” create -d virtualbox $PROXY_ENV "${VM}"
Por estas dos:
VB_OPTS="–virtualbox-disk-size 100000 --virtualbox-cpu-count 2 --virtualbox-memory 2048"
"${DOCKER_MACHINE}" create -d virtualbox $VB_OPTS $PROXY_ENV “${VM}”
Con estos cambios, nuestra VM default usará 100Gb de disco y 2Gb de RAM en vez de los valores originales.
Si ejecutamos la terminal Docker QuickStart, vemos cómo se inicia la VM:
Si vamos a VirtualBox Manager, vemos la VM en ejecución:
La creación del container se puede hacer de las formas nombradas al inicio. Vamos a mostrar cómo hacerlo usando el repositorio GIT de Oracle, por dos motivos:
Para simplificar este artículo, usamos la versión 12.1 que no necesita cambios en los scripts.
El primer paso es instalar el repositorio Oracle Docker-images.
Si tenemos instalado Git for Windows https://github.com/git-for-windows, lo podemos hacer con un comando:
D:\GitHub>git clone https://github.com/oracle/docker-images.git
Cloning into 'docker-images'...
remote: Counting objects: 7740, done.
remote: Compressing objects: 100% (36/36), done.
rRemote: Total 7740 (delta 18), reused 45 (delta 16), pack-reused 7688
Receiving objects: 100% (7740/7740), 9.70 MiB | 870.00 KiB/s, done.
Resolving deltas: 100% (4286/4286), done.
Checking connectivity... done.
Checking out files: 100% (968/968), done.
También podemos bajar un archivo ZIP con el contenido de este repositorio desde Github.com si no tenemos instalado el utilitario git.
Ahora necesitamos los archivos de instalación de Oracle, que se deben bajar de OTN: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html En este artículo usamos la versión 12.1 para linux X64. Los archivos bajados se deben dejar en el directorio D:\GitHub\docker-images\OracleDatabase\dockerfiles\12.1.0.2:
D:\GitHub\docker-images\OracleDatabase\dockerfiles\12.1.0.2>dir
Volume in drive D is externo
Volume Serial Number is 88CD-FFE4
Directory of D:\GitHub\docker-images\OracleDatabase\dockerfiles\12.1.0.2
01/31/2018 11:27 PM <DIR> .
01/31/2018 11:27 PM <DIR> ..
01/31/2018 11:27 PM 140 Checksum.ee
01/31/2018 11:27 PM 148 Checksum.se2
01/31/2018 11:27 PM 2,914 Dockerfile.ee
01/31/2018 11:27 PM 2,928 Dockerfile.se2
01/31/2018 11:27 PM 1,071 checkDBStatus.sh
02/02/2018 09:35 PM 1,123 checkSpace.sh
01/31/2018 11:27 PM 2,941 createDB.sh
01/31/2018 11:27 PM 9,290 db_inst.rsp
01/31/2018 11:27 PM 13,134 dbca.rsp.tmpl
02/02/2018 08:56 PM 2,568 installDBBinaries.sh
01/31/2018 11:27 PM 1,195 installPerl.sh
01/31/2018 11:27 PM 6,140 runOracle.sh
01/31/2018 11:27 PM 1,015 runUserScripts.sh
01/31/2018 11:27 PM 758 setPassword.sh
01/31/2018 11:27 PM 873 setupLinuxEnv.sh
01/31/2018 11:27 PM 678 startDB.sh
07/29/2016 09:27 PM 1,014,527,110 linuxamd64_12102_database_2of2.zip
07/29/2016 09:35 PM 1,673,519,571 linuxamd64_12102_database_1of2.zip
18 File(s) 2,688,093,597 bytes
2 Dir(s) 366,453,194,752 bytes free
Para crear el container, debemos usar los scripts de instalación de la versión que nos interesa. En este caso, 12.1.0.2 Enterprise Edition, lo que implica los archivos de configuración y scripts del directorio docker-images\OracleDatabase\dockerfiles\12.1.0.2. El comando a usar es:
D:\GitHub\docker-images\OracleDatabase\dockerfiles\12.1.0.2>docker build -t
oracle/database:12.1.0.2-ee -f Dockerfile.ee .
Si quisiéramos usar otra versión para la que no existen scripts en este repositorio (cualquiera menor de 12c), podemos usar éste como base y adaptarlo. Al lanzar la creación del container se ejecutan muchos pasos de instalación del SO y binarios, incluyendo la descarga desde internet de la imagen Linux a usar para el SO (7-slim), así como actualizaciones para los paquetes de Linux. Este es un extracto de la una ejecución exitosa:
D:\GitHub\docker-images\OracleDatabase\dockerfiles\12.1.0.2>docker build -t
oracle/database:12.1.0.2-ee -f Dockerfile.ee .
Sending build context to Docker daemon 2.688GB
Step 1/17 : FROM oraclelinux:7-slim
7-slim: Pulling from library/oraclelinux
4040fe120662: Pull complete
Digest: sha256:ef28f2f806afd778bb706fbf6ff90fc98e624c4113ea4d2f4aa508d813ef32fd
Status: Downloaded newer image for oraclelinux:7-slim
---> 9870bebfb1d5
Step 2/17 : MAINTAINER Gerald Venzl <gerald.venzl@oracle.com>
---> Using cache
---> 54e38720af2b
Step 3/17 : ENV ORACLE_BASE=/opt/oracle ORACLE_HOME=/opt/oracle/product/12.1.0.2/dbhome_1
INSTALL_FILE_1="linuxamd64_12102_database_1of2.zip"
INSTALL_FILE_2="linuxamd64_12102_database_2of2.zip" INSTALL_RSP="db_inst.rsp"
CONFIG_RSP="dbca.rsp.tmpl" PWD_FILE="setPassword.sh" PERL_INSTALL_FILE="installPerl.sh"
RUN_FILE="runOracle.sh" START_FILE="startDB.sh" CREATE_DB_FILE="createDB.sh"
SETUP_LINUX_FILE="setupLinuxEnv.sh" CHECK_SPACE_FILE="checkSpace.sh"
CHECK_DB_FILE="checkDBStatus.sh" USER_SCRIPTS_FILE="runUserScripts.sh"
INSTALL_DB_BINARIES_FILE="installDBBinaries.sh"
---> Using cache
---> 6b58ac5188e6
Step 4/17 : ENV INSTALL_DIR=$ORACLE_BASE/install
PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch/:/usr/sbin:$PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
---> Using cache
---> da0154b940f6
Step 5/17 : COPY $INSTALL_FILE_1 $INSTALL_FILE_2 $INSTALL_RSP $PERL_INSTALL_FILE $SETUP_
LINUX_FILE $CHECK_SPACE_FILE $INSTALL_DB_BINARIES_FILE $INSTALL_DIR/
---> Using cache
---> 9de8125b6c2c
Step 6/17 : COPY $RUN_FILE $START_FILE $CREATE_DB_FILE $CONFIG_RSP $PWD_FILE $CHECK_DB_FILE
$USER_SCRIPTS_FILE $ORACLE_BASE/
---> Using cache
---> 12e8def30a14
Step 7/17 : RUN chmod ug+x $INSTALL_DIR/*.sh && sync &&
$INSTALL_DIR/$CHECK_SPACE_FILE && $INSTALL_DIR/$SETUP_LINUX_FILE
---> Running in e49cd72f8f2d
##############################################
: space check! The container needs 12 GB, available 80
##############################################
Loaded plugins: ovl
Resolving Dependencies
--> Running transaction check
---> Package openssl.x86_64 1:1.0.2k-8.0.1.el7 will be installed
--> Processing Dependency: make for package: 1:openssl-1.0.2k-8.0.1.el7.x86_64
---> Package oracle-rdbms-server-12cR1-preinstall.x86_64 0:1.0-6.el7 will be installed
--> Processing Dependency: binutils for package:
oracle-rdbms-server-12cR1-preinstall-1.0-6.el7.x86_64
...
Dependency Updated:
glibc.x86_64 0:2.17-196.el7_4.2 glibc-common.x86_64 0:2.17-196.el7_4.2
libblkid.x86_64 0:2.23.2-43.el7_4.2 libgcc.x86_64 0:4.8.5-16.el7_4.1
libmount.x86_64 0:2.23.2-43.el7_4.2 libstdc++.x86_64 0:4.8.5-16.el7_4.1
libuuid.x86_64 0:2.23.2-43.el7_4.2
Complete!
Removing intermediate container 1bb6ea91ca43
---> 0ffc00520368
Step 8/17 : USER oracle
---> Running in 5d49194f52d2
Removing intermediate container 5d49194f52d2
---> e4e91f3513f8
Step 9/17 : RUN $INSTALL_DIR/$INSTALL_DB_BINARIES_FILE EE
---> Running in e6585f75f94c
Archive: linuxamd64_12102_database_1of2.zip
creating: database/
inflating: database/runInstaller
creating: database/rpm/
inflating: database/rpm/cvuqdisk-1.0.9-1.rpm
...
Step 16/17 : HEALTHCHECK --interval=1m --start-period=5m
CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1
---> Running in a3b47171a775
Removing intermediate container a3b47171a775
---> 5020df18556b
Step 17/17 : CMD exec $ORACLE_BASE/$RUN_FILE
---> Running in 80ed4f3678b0
Removing intermediate container 80ed4f3678b0
---> c175ddb41772
Successfully built c175ddb41772
Successfully tagged oracle/database:12.1.0.2-ee
SECURITY WARNING: You are building a Docker image from Windows against a
non-Windows Docker host. All files and directories added to build context will have
'-rwxr-xr-x' permissions. It is recommended to double check and reset permissions
for sensitive files and directories.
</gerald.venzl@oracle.com>
Una vez que termina la creación, podemos ver que el container está creado:
D:\GitHub\docker-images\OracleDatabase\dockerfiles\12.1.0.2>docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
oracle/database 12.1.0.2-ee c175ddb41772 4 minutes ago 10.6GB
oraclelinux 7-slim 9870bebfb1d5 2 months ago 118MB
El container anterior tiene el SO y los binarios de Oracle instalados, pero no tiene una base creada. Al ejecutar el container se usa un script que crea la base de datos si no está creada. Podemos ver en el log anterior el script que se configuró para la creación de la base, es uno de los parámetros usados en el paso "Step 3/17". Es importante tener presente que el contenido de un container es inmutable, y cada vez que lo reiniciamos se descartan los datos que fueron modificados desde su inicio. Para persistir datos entre ejecuciones, debemos usar un parámetro al ejecutar el container que mapea el directorio interno de datos a uno que existe en nuestro host (-v). De esa forma, los reinicios del container tienen disponibles los datos que fueron modificados en ejecuciones anteriores, persistiendo en nuestro disco. Algo a considerar en Windows: este mapeo de directorios tiene una sintaxis distinta a la usada en Linux, y solo se permite usar directorios que estén en el mismo disco donde fue instalado Docker (C: en mi caso). El comando para ejecutar nuestro container, mapeando el volumen de datos (donde se van a crear los archivos de la base) al directorio
c:\users\calero\.docker\persistentdisk\ora121, es:
docker run --name ora121 -p 1521:1521 -p 5500:5500 -e ORACLE_SID=orcl -e ORACLE_PDB=pdb1 -e
ORACLE_PWD=Oracle_123 -e ORACLE_CHARACTERSET=AL32UTF8 -v
//c/users/calero/.docker/persistentdisk/ora121://opt/oracle/oradata oracle/database:12.1.0.2-ee
Notar que indicamos varios parámetros de creación de la base: SID, PDB, clave para los usuarios y character set. El mapeo de volúmenes a directorios locales a veces no funciona como se espera. Esto se manifiesta con errores en la instalación de Oracle por no poder escribir en disco (permisos, falta de espacio o similares). Yo tuve ese problema en mis pruebas, quizás sea algo que no ocurra siempre. Si tienen problemas similares, deben validar:
docker inspect oracle/database:12.1.0.2-ee
Este comando muestra la configuración de nuestro container. La entrada "Volumes" indica ambos paths. Este es un ejemplo que el mapeo no se hizo:
"Volumes": {
"/opt/oracle/oradata": {}
},
Podemos modificar este mapeo en un container ya creado usando Kitematic, el utilitario que instaló Docker Toolbox. Ejecutando Kitematic para ver los containers de nuestra instalación, debemos ir al tab Settings, y luego a Volumes para ver los mapeos de volúmenes a discos locales. Acá tenemos el botón "Change" que nos permite asignar un nuevo directorio para mapear los volúmenes:
Si hacemos cambios en esa pantalla, el container se ejecuta por lo que se dispara la creación de la base. Si nunca había sido exitosa, es probable que ahora sí, y podemos ver el progreso de la instalación revisando los archivos de log del container con el comando "docker logs -f <container>". Para saber el nombre de un container que no está en ejecución debemos usar "docker ps --no-trunc -aq". Volviendo a la ejecución del comando "docker run", asumiendo que no tuvimos problemas con los mapeos de volúmenes, vamos a ver esto en nuestra terminal que muestra que la creación fue exitosa:
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: Oracle_123
LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 03-FEB-2018 22:30:50
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Starting /opt/oracle/product/12.1.0.2/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/8bde9f952dca/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date 03-FEB-2018 22:30:51
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/8bde9f952dca/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Cleaning up failed steps
4% complete
Copying database files
5% complete
6% complete
12% complete
17% complete
22% complete
30% complete
Creating and starting Oracle instance
32% complete
35% complete
36% complete
37% complete
41% complete
44% complete
45% complete
48% complete
Completing Database Creation
50% complete
53% complete
55% complete
63% complete
66% complete
74% complete
Creating Pluggable Databases
79% complete
100% complete
Look at the log file "/opt/oracle/cfgtoollogs/dbca/orcl/orcl0.log" for further details.
SQL*Plus: Release 12.1.0.2.0 Production on Sat Feb 3 22:56:44 2018
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>
System altered.
SQL>
Pluggable database altered.
SQL> 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
The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
Completed: alter pluggable database pdb1 open
Sat Feb 03 22:56:41 2018
CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE
'/opt/oracle/oradata/orcl/pdb1/pdb1_users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT
1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
Completed: CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE
'/opt/oracle/oradata/orcl/pdb1/pdb1_users01.dbf' SIZE 5M REUSE AUTOEXTEND ON NEXT
1280K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
ALTER DATABASE DEFAULT TABLESPACE "USERS"
Completed: ALTER DATABASE DEFAULT TABLESPACE "USERS"
Sat Feb 03 22:56:44 2018
ALTER SYSTEM SET control_files='/opt/oracle/oradata/orcl/control01.ctl' SCOPE=SPFILE;
ALTER PLUGGABLE DATABASE pdb1 SAVE STATE
Completed: ALTER PLUGGABLE DATABASE pdb1 SAVE STATE
Sat Feb 03 23:09:32 2018
Default pga_aggregate_limit value is too high for the
amount of physical memory in the system
pga_aggregate_limit is 2048 MB
limit based on physical memory and SGA usage is 1202 MB
Sat Feb 03 23:24:34 2018
Resize operation completed for file# 9, old size 563200K, new size 583680K
Hay varias formas de conectarnos a nuestra base corriendo en Docker: 1) usando cualquier cliente con acceso a nuestro host, ya que al ejecutar el container hicimos público el puerto 1521 usado por el listener en el container. Por ejemplo usando SQL*plus:
C:\Users\calero>docker-machine ip
192.168.99.100
C:\Users\calero>sqlplus system/Oracle_123@\"192.168.99.100:1521/orcl\"
SQL*Plus: Release 12.1.0.2.0 Production on Sun Feb 4 01:51:50 2018
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Last Successful login time: Sun Feb 04 2018 01:24:46 -03: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> select host_name from v$instance;
HOST_NAME
----------------------------------------------------------------
8bde9f952dca
SQL>
2) usando el binario de sqlplus dentro de Docker, ejecutado desde nuestro host.
C:\Users\calero>docker ps
CONTAINER ID IMAGE COMMAND CREATED
2c1afcad6a50 oracle/database:12.1.0.2-ee "/bin/sh -c 'exec $O…" 11 hours ago
STATUS PORTS NAMES
Up 11 hours (healthy) 0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp ora121
C:\Users\calero>docker exec -ti 2c1afcad6a50 sqlplus pdbadmin/Oracle_123@pdb1
SQL*Plus: Release 12.1.0.2.0 Production on Sun Feb 4 16:23:47 2018
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 count(1) from all_objects;
COUNT(1)
----------
73597
SQL>
Espero les sirva como introducción para comenzar a usar Oracle en Docker.
Usar imágenes Oracle en Docker desde Oracle Container Registry: https://ronekins.wordpress.com/2017/11/07/oracle-linux-container-registry/ Usar Oracle RAC sobre Docker: https://github.com/oracle/docker-images/blob/master/OracleDatabase/RAC/OracleRealApplicationClusters/README.md Deploy Oracle Database as a Docker Container in Oracle Container Cloud Service http://www.oracle.com/technetwork/articles/cloudcomp/deploy-database-in-container-cloud-3876722.html
Nelson Calero consultor en bases de datos Oracle y MySQL con más de 20 años de experiencia en tecnología Oracle, actualmente trabajando para Pythian desde Uruguay. Especializado en soluciones de alta disponibilidad y RAC, es Ingeniero en Computación, Oracle ACE Director, posee varias certificaciones Oracle (OCE/OCP/Cloud) y docente de Oracle University. Orador frecuente en conferencias internaciones, es co-fundador y Presidente del Grupo de Usuarios de Oracle Uruguay (UYOUG).
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.