domingo, 29 de septiembre de 2019

Mi experiencia en el Oracle Open World 2019

La semana pasada participé del Oracle Open World (OOW) y Code One en San Francisco, USA.
Este año me pareció el mejor de los cinco en los que he participado.
Les cuento el porqué, ojalá les sirva de referencia si están considerando participar en el futuro.

Tuve la suerte de ser seleccionado para presentar tres charlas técnicas, y sumado a varias reuniones de trabajo, actividades para partners y eventos organizados por empresas después de la agenda diaria, hicieron que esta experiencia fuera intensa.

Antes de viajar, revisando todas las charlas disponibles para armar mi agenda, encontré dos cosas a destacar. Una, mucho contenido técnico muy interesante, y dado que hay decenas de sesiones en simultáneo, me iba a perder muchas buenas. Lo otro es que varias personas reconocidas en la comunidad, algunos buenos amigos, no participaban este año. Es conocido que unos cuantos se jubilaron, y otros ya no están activos en la comunidad.

El evento empezó el viernes previo para mí, con el Oracle Cloud Partner Council en las oficinas de Oracle - un evento de todo el día donde product managers (PMs) de distintas tecnologías cuentan las novedades y recursos disponibles para partners, y escuchan nuestras experiencias.
Primera vez que participo en este tipo de eventos, me pareció muy valioso y lo recomiendo para los partners que viajan OOW, háganse un tiempo y vayan antes.

El sábado estuve todo el día en un evento para Oracle ACE Directors, el famoso briefing, donde PMs cuentan los planes a futuro en diversas áreas. Todo bajo contrato de confidencialidad (NDA).
También muy interesante, la mayoría de los anuncios se hicieron los días siguientes durante la conferencia. Muchas novedades y mejoras, todas en la dirección correcta a mi entender.

El domingo fui invitado a Oracle Groundbreakers unconference, la primera edición de un evento de todo el día. Buenas discusiones entre miembros de la comunidad y algunos PMs de Oracle, sin agenda y para hablar de los temas que nos interesan.

Aunque tuve que perderme la mitad, porque a la tarde participé del Oracle RAC Innovation summit, en las oficina Oracle del centro. Es la segunda vez que asisto a este evento y es muy valioso también, todos los PMs de Oracle RAC muestran un resumen de las novedades en las nuevas versiones, y reciben experiencias de un grupo reducido de clientes (usuarios) de RAC.

El evento OOW empezó el lunes, aunque parecía mitad de semana para mí.
A medida que iba yendo a distintas presentaciones me fui cruzando con muchas caras familiares, y también con mucha gente nueva, lo que fue una grata sorpresa, y confirmación de que el evento sigue vigente y que la comunidad se está renovando.
Con los edificios Moscone ya remodelados, la distribución cambió comparado con años anteriores, habiendo más salas dentro de los edificios, corredores más grande, y más espacio en el área de exhibición. La calle frente al Moscone sur estaba abierta por primera vez, lo que hacía que se viera muy distinto a años anteriores.

Una parte muy importante del evento es el contenido técnico (si se preguntan cuales son las otras: networking, comunidad y negocios). Ya están disponible todas las presentaciones (aquí), lo que sirve aunque hayan ido, porque no se puede estar en todas.

Sigue la lista de todas las presentaciones a las que pude ir. Se las recomiendo, fueron todas muy buenas.
En los horarios que ven huecos, tomé el examen de certificación "Oracle Autonomous Database Cloud 2019", aprovechando que es gratuito porque se realizó el testfest. Y también estuve un par de horas ayudando en el Groundbreakers hub, en el stand de Blockchain beer.

Lunes:
  • The Query Optimizer in Oracle Database 19c: What’s New [CON1263], Chris Antognini, Monday, September 16, 09:00 AM
  • Oracle Cloud Infrastructure: Practical Tips from Experience [CON1963], Simon Pane, Sean Scott, 10AM
  • Oracle Database Exadata Cloud Do's and Don'ts [CON5226], Brian Spendolini, Sravan Sunkaranam, Satish R, Monday, September 16, 10 AM
  • Oracle Autonomous Health Framework: Deep Dive Database and Cluster Use Cases [PRO4770], Mark Scardina, Monday, September 16, 11:15 AM
  • Best Practices for Patching Oracle Database Single Instances and Oracle RAC [CON3386], Ricardo Gonzalez, Roy Swonger, Monday, September 16, 12:15 PM
  • Using Machine Learning and Oracle Analytics Cloud for Proactive Analytics [DEV3136], Edelweiss Kammermann, 1:30PM
  • Zero Downtime Database Migration to Oracle Cloud [THT6607], Ricardo Gonzalez, Monday, September 16, 01:45 PM

Martes
  • AutoUpgrade Hundreds of Oracle Databases with a Single Command [CON3387], Mike Dietrich
  • Oracle Database 19c: In-Depth Look into the New Automatic Indexing Feature [CON1432], Richard Foote, 11:15 AM
  • Oracle Active Data Guard: Best Practices and New Features Deep Dive [TRN4846], Pieter Van Puymbroeck, Nitin Karkhanis, Mahesh Girkar, 12:30 PM
  • Automate the Operation of Your Oracle Cloud Infrastructure 2.0 [DEV1798], yo, 1:30 PM
  • Oracle Autonomous Health Framework: For Rapid Resolution of Oracle RAC Issues [TRN4773], Mark Scardina, Bill Burton, 3:15PM
  • Ask TOM: How to Make and Test Your Application “Oracle RAC Ready” [THT4778], Markus Michalewicz, 4:00 PM
  • Ask TOM: Proven Ways to Make Applications Slower and Less Secure [THT4796], Connor Mcdonald, 4:30 PM

Miércoles
  • Twenty Features You Will Miss If You Leave Oracle Database [DEV1279], Franck Pachot, 12:30 PM
  • Data Integration in Oracle Cloud: The Dream Team for End-to-End Analytics [CON3137], Edelweiss Kammermann, 4:45 PM

Jueves
  • Oracle Exadata Cloud Services Guide from Practical Experience, yo, 9:00 AM
  • Oracle GoldenGate: Faster Deployments Using Microservices [HOL5221], Bobby Curtis, Mack Bell, Nick Wagner, 10:30 AM
  • A Deep Dive into Oracle Database Statement Parsing [CON3597], Frits Hoogland, 11:15 AM
  • Oracle Database 19c Automatic Indexing Demystified [CON1275], Franck Pachot, 12:15 PM
  • Best Practices for the Most Impactful Oracle Database 18c and 19c Features [TIP4855], Markus Michalewicz, Mauricio Feria, 2:15 PM
  • Oracle Autonomous Data Warehouse Cloud for Developers and Data Scientists [DEV3135], Edelweiss Kammermann, 2:15 PM

Un saludo

PS: Si quieren ver fotos, en mi cuenta de Twitter van a ver muchas: https://twitter.com/ncalerouy

miércoles, 11 de abril de 2018

Usar Oracle 12c en Docker sobre Windows 10 con Oracle Container Registry

¿Docker? ¿En Windows? ¿Oracle en Docker?

Docker es de las más populares tecnología de containers y funciona en Linux, Windows y Mac OS.
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”.

Pueden ver una introducción más completa al tema este artículo que publiqué en OTN, donde muestro los pasos necesarios para instalar y ejecutar una base Oracle usando el repositorio GIT oracle/docker-images.

En este blog vamos a ver otra forma de hacerlo, usando Oracle Container Registry, también sobre Windows 10.
Al usar imagenes de Oracle Container Registry no necesitamos descargar los binarios de instalación de Oracle desde OTN porque vienen incluidos. Por el momento están disponibles imágenes con las versiones 12.2.0.1 y 12.1.0.2.

Primer paso: registrarse en container-registry.oracle.com

Esto es gratuito, debemos entrar con nuestro usuario de OTN (crearlo también es gratuito) y aceptar las políticas uso.
Son sólo esos dos pasos, pero si les quedan dudas pueden ver una explicación detallada acá (en inglés).

Como pueden ver, al día de hoy tenemos dos ediciones disponibles (standard y enterprise) y el cliente:



Siguiendo cualquier de los tres links vamos a la documentación, que explica como usar cada imagen en las dos versiones disponibles. Es la referencia para cualquier cambio en la configuración que nos interese hacer.

Ya creamos nuestro usuario y aceptamos los términos de uso.
Lo siguiente es abrir una terminal en nuestro PC e iniciar sesión con Docker:
    C:\Users\calero>docker login container-registry.oracle.com
    Username: nelson.calero@gmail.com
    Password:
    Login Succeeded

Mientras no hayamos hecho los dos pasos anteriores, si intentamos bajar una imagen vamos a tener este error:
    C:\Users\calero>docker pull container-registry.oracle.com/database/enterprise
    Using default tag: latest
    Error response from daemon: pull access denied for container-registry.oracle.com/database/enterprise, repository does not exist or may require 'docker login'

Pero si hicimos ambos pasos, podemos descargar la imagen con la que nos interesa trabajar.
En este ejemplo vamos a usar la version 12.2.
La sintaxis para esta URL la vemos en la página de OCR que visitamos antes con la documentación.    
C:\Users\calero>docker pull container-registry.oracle.com/database/enterprise:12.2.0.1
12.2.0.1: Pulling from database/enterprise
9bd4d110366e: Downloading [>                                                  ]  2.668MB/143MB
af8b29651e27: Download complete
4c242ab1add4: Download complete

Vemos el progreso de la descarga en nuestra terminal.
Cuando está completa, después de bajar 3.44Gb:
C:\Users\calero>docker pull container-registry.oracle.com/database/enterprise:12.2.0.1
cbb9821ba51c: Pull complete
9bd4d110366e: Pull complete
af8b29651e27: Pull complete
4c242ab1add4: Pull complete
7bda1e55bd08: Pull complete
Digest: sha256:42809e491491d7f07a2aa76903bb5feabe3a0d23abcb7e680264074f043a604c  5.853MB/2.737GB
Status: Downloaded newer image for container-registry.oracle.com/database/enterprise:12.2.0.1

Podemos consultar en docker los detalles de la imagen recién bajada:
    C:\Users\calero>docker images
    REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE
    container-registry.oracle.com/database/enterprise   12.2.0.1            12a359cd0528        5 months ago        3.44GB

Y también comprobar que no está ejecutando:
    C:\Users\calero>docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

La documentación de la imagen docker (misma URL que visitamos antes) explica que debemos crear una mínima configuración antes de poder ejecutar nuestro container.
En mi caso sólo definí la memoria RAM a usar:
    C:\Users\calero>d:

    D:\>cd github

    D:\GitHub>echo DB_MEMORY=1Gb >ora.conf

    D:\GitHub>type ora.conf
    DB_MEMORY=1Gb

Y levantamos nuestro container, indicando el archivo de configuración a usar:
    D:\GitHub>docker run -d -it --name ora122 -P --env-file ora.conf container-registry.oracle.com/database/enterprise:12.2.0.1
    5896d37c1cae083c9ab82ec52cf9900a3b22a012b5257c1cb065a6093d7d55c5

La terminal nos devuelve el control enseguida porque docker queda ejecutando en un proceso del sistema.
Podemos ver el avance del inicio del containter consultando su log.
De nuevo en nuestra terminal, usamos la opcion -f de "docker logs" para ver los cambios que recibe el log sin que nos retorne el control.

    D:\GitHub>docker logs -f 5896d37c1cae083c9ab82ec52cf9900a3b22a012b5257c1cb065a6093d7d55c5
    Setup Oracle Database
    Oracle Database 12.2.0.1 Setup
    Sun Feb 11 21:09:42 UTC 2018

    Check parameters ......
    log file is : /home/oracle/setup/log/paramChk.log
    paramChk.sh is done at 1 sec

    untar DB bits ......
    log file is : /home/oracle/setup/log/untarDB.log
    untarDB.sh is done at 329 sec

    config DB ......
    log file is : /home/oracle/setup/log/configDB.log
    Sun Feb 11 21:15:10 UTC 2018
    Start Docker DB configuration
    Call configDBora.sh to configure database
    Sun Feb 11 21:15:11 UTC 2018
    Configure DB as oracle user
    Setup Database directories ...

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:15:11 2018

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

    Connected to an idle instance.

    SQL>
    File created.

    SQL> ORACLE instance started.

    Total System Global Area  671088640 bytes
    Fixed Size                  8796384 bytes
    Variable Size             192939808 bytes
    Database Buffers          465567744 bytes
    Redo Buffers                3784704 bytes
    Database mounted.
    Database opened.
    SQL>
    Database altered.

    SQL>
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    spfile                               string      /u01/app/oracle/product/12.2.0
                                                     /dbhome_1/dbs/spfileORCLCDB.or
                                                     a
    SQL>
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    encrypt_new_tablespaces              string      CLOUD_ONLY
    SQL>
    User altered.

    SQL>
    User altered.

    SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    update password

    Enter password for SYS:
    create pdb : ORCLPDB1

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:16:12 2018

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


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL>   2    3    4    5
    Pluggable database created.

    SQL>
    Pluggable database altered.

    SQL>
    Pluggable database altered.

    SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
    Reset Database parameters

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:17:49 2018

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


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL>
    System altered.

    SQL> Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 11-FEB-2018 21:17:49

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

    Starting /u01/app/oracle/product/12.2.0/dbhome_1/bin/tnslsnr: please wait...

    TNSLSNR for Linux: Version 12.2.0.1.0 - Production
    System parameter file is /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
    Log messages written to /u01/app/oracle/diag/tnslsnr/5896d37c1cae/listener/alert/log.xml
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
    Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

    Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
    STATUS of the LISTENER
    ------------------------
    Alias                     LISTENER
    Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
    Start Date                11-FEB-2018 21:17:54
    Uptime                    0 days 0 hr. 0 min. 4 sec
    Trace Level               off
    Security                  ON: Local OS Authentication
    SNMP                      OFF
    Listener Parameter File   /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
    Listener Log File         /u01/app/oracle/diag/tnslsnr/5896d37c1cae/listener/alert/log.xml
    Listening Endpoints Summary...
      (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
      (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
    The listener supports no services
    The command completed successfully

    DONE!
    Remove password info
    Docker DB configuration is complete !
    configDB.sh is done at 493 sec

    Done ! The database is ready for use .
    # ===========================================================================
    # == Add below entries to your tnsnames.ora to access this database server ==
    # ====================== from external host =================================
    ORCLCDB=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
        (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLCDB.localdomain)))
    ORCLPDB1=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
        (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCLPDB1.localdomain)))
    #
    #ip-address : IP address of the host where the container is running.
    #port       : Host Port that is mapped to the port 1521 of the container.
    #
    # The mapped port can be obtained from running "docker port "
    # ===========================================================================
      Current log# 1 seq# 4 mem# 0: /u04/app/oracle/redo/redo001.log
    2018-02-11T21:17:48.196143+00:00
    ORCLPDB1(3):Opening pdb with no Resource Manager plan active
    Pluggable database ORCLPDB1 opened read write
    Completed:     alter pluggable database ORCLPDB1 open
    2018-02-11T21:17:49.269276+00:00
        alter pluggable database all save state
    Completed:     alter pluggable database all save state
    2018-02-11T21:17:49.666526+00:00
    ALTER SYSTEM SET encrypt_new_tablespaces='DDL' SCOPE=BOTH;
    2018-02-11T21:25:41.683157+00:00
    Resize operation completed for file# 3, old size 706560K, new size 727040K
    2018-02-11T21:25:42.432198+00:00
    ORCLPDB1(3):Resize operation completed for file# 18, old size 583680K, new size 604160K
    2018-02-11T21:26:53.618735+00:00
    Thread 1 advanced to log sequence 5 (LGWR switch)
      Current log# 2 seq# 5 mem# 0: /u04/app/oracle/redo/redo002.log
    2018-02-11T21:31:52.534344+00:00
    Thread 1 advanced to log sequence 6 (LGWR switch)
      Current log# 3 seq# 6 mem# 0: /u04/app/oracle/redo/redo003.log

     
Después de unos minutos nuestra base está lista para ser usada, así que podemos cancelar el despliegue de logs o abrir otra terminal para comprobarlo:
    D:\GitHub>docker ps
    CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS                    PORTS                                              NAMES
    5896d37c1cae        container-registry.oracle.com/database/enterprise:12.2.0.1   "/bin/sh -c '/bin/ba…"   24 minutes ago      Up 24 minutes (healthy)   0.0.0.0:32769->1521/tcp, 0.0.0.0:32768->5500/tcp   ora122

Podemos abrir una sesion ssh a nuestro container y revisar cómo quedó:
    D:\GitHub>docker exec -i -t 5896d37c1cae /bin/bash
    [oracle@5896d37c1cae /]$ df -h
    Filesystem      Size  Used Avail Use% Mounted on
    none             94G   29G   61G  32% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs          1002M     0 1002M   0% /sys/fs/cgroup
    /dev/sda1        94G   29G   61G  32% /ORCL
    shm              64M     0   64M   0% /dev/shm
    tmpfs          1002M     0 1002M   0% /proc/scsi
    tmpfs          1002M     0 1002M   0% /sys/firmware
    [oracle@5896d37c1cae /]$ ps -eaf | grep pmon
    oracle     112     1  0 21:15 ?        00:00:00 ora_pmon_ORCLCDB
    oracle     991   973  0 21:36 pts/1    00:00:00 grep --color=auto pmon
    [oracle@5896d37c1cae /]$ env | grep ORA
    ORACLE_SID=ORCLCDB
    ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
    [oracle@5896d37c1cae /]$ sqlplus / as sysdba

    SQL*Plus: Release 12.2.0.1.0 Production on Sun Feb 11 21:37:06 2018

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


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL> show sga

    Total System Global Area  671088640 bytes
    Fixed Size                  8796384 bytes
    Variable Size             230688544 bytes
    Database Buffers          427819008 bytes
    Redo Buffers                3784704 bytes
    SQL> show pdbs

        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 ORCLPDB1                       READ WRITE NO
    SQL> show parameter sga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    allow_group_access_to_sga            boolean     FALSE
    lock_sga                             boolean     FALSE
    pre_page_sga                         boolean     TRUE
    sga_max_size                         big integer 640M
    sga_min_size                         big integer 0
    sga_target                           big integer 640M
    unified_audit_sga_queue_size         integer     1048576
    SQL> show parameter pga

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_limit                  big integer 2G
    pga_aggregate_target                 big integer 384M
    SQL> exit
    Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Los archivos usados por Docker para configurar nuestra base están dentro del container, tal como se vio en los logs más arriba. Podemos revisar cuales son todos estos scripts, por si nos interesa hacerles cambios:
    [oracle@5896d37c1cae /]$ cd /home/oracle/setup
    [oracle@5896d37c1cae setup]$ ls -lrt
    total 60
    -rwxr-xr-- 1 oracle oinstall 1340 Aug 17 20:42 untarDB.sh
    -rwxr-xr-- 1 oracle oinstall 1708 Aug 17 20:42 tnsentry.sh
    -rwxr-xr-- 1 oracle oinstall 1361 Aug 17 20:42 startupDB.sh
    -rwxr-xr-- 1 oracle oinstall 1298 Aug 17 20:42 shutDB.sh
    -rwxr-xr-- 1 oracle oinstall 3019 Aug 17 20:42 setupDB.sh
    -rwxr-xr-- 1 oracle oinstall 1229 Aug 17 20:42 patchDB.sh
    -rwxr-xr-- 1 oracle oinstall   18 Aug 17 20:42 patchDB.dat
    -rwxr-xr-- 1 oracle oinstall 1782 Aug 17 20:42 paramChk.sh
    -rwxr-xr-- 1 oracle oinstall  763 Aug 17 20:42 healthcheck.sh
    -rwxr-xr-- 1 oracle oinstall 2165 Aug 17 20:42 dockerInit.sh
    -rwxr-xr-- 1 oracle oinstall 6587 Aug 17 20:42 configDBora.sh
    -rwxr-xr-- 1 oracle oinstall 1476 Aug 17 20:42 configDB.sh
    drwxr-xr-- 2 oracle oinstall 4096 Feb 11 21:15 log
    -rw-r--r-- 1 oracle oinstall  163 Feb 11 21:17 DB_ENV
    [oracle@5896d37c1cae setup]$ ls -lrt log
    total 20
    -rw-r--r-- 1 oracle oinstall  292 Feb 11 21:09 paramChk.log
    -rw-r--r-- 1 oracle oinstall  127 Feb 11 21:09 untarDB.log
    -rw-r--r-- 1 oracle oinstall 3542 Feb 11 21:17 configDB.log
    -rw-r--r-- 1 oracle oinstall  404 Feb 11 21:17 setupDB.log
    -rw-r--r-- 1 oracle oinstall   52 Feb 11 21:17 dockerInit.log
    [oracle@5896d37c1cae setup]$

También podemos conectarnos a la instancia de base de datos usando un cliente instalado en nuestro host, en vez de usar la instalación de Oracle dentro del container.
Los puertos usados por Oracle vienen mapeados en esta imagen para que se puedan usar fuera del container:
    D:\GitHub>docker port ora122
    5500/tcp -> 0.0.0.0:32768
    1521/tcp -> 0.0.0.0:32769

Revisando los logs de creación del contanier que vimos antes, podemos identificar los datos que se necesitan para armar el string de conexión a la base de datos, y usar sqlplus instalado en el PC para conetarnos:
    D:\GitHub>docker-machine ip
    192.168.99.100

    D:\GitHub>sqlplus system/Oradoc_db1@//192.168.99.100:32769/ORCLPDB1.localdomain

    SQL*Plus: Release 12.1.0.2.0 Production on Sun Feb 11 18:51:14 2018

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


    Connected to:
    Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

    SQL> exit
    Disconnected from Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Espero les sea útil.
Un saludo

lunes, 5 de marzo de 2018

Oracle 12c VMs en Windows 10 con Vagrant y Ubuntu (WLS) - errores (2/2)

Continuando con el post anterior, estos son algunos errores posibles si no seguimos los pasos en el orden descrito en el artículo. Seguramente hay muchos más, esto es solo una muestra de lo que puede salir mal en esta configuración (Windows 10.0.16299.192, VirtualBox 5.2.6r120293, Vagrant 2.0.1), así la guía principal de configuración (post anterior) se mantiene simple.

a) Error al intentar iniciar VMs Virtualbox desde Windows

Esto fue luego de actualizar la versión de VirtualBox en Windows de 5.1.4r110228 a 5.2.6.
Al intentar arrancar cualquier VM que ya existía, reportaba este error:

    34b0.21f8: NtCreateFile(\Device\VBoxDrvStub) failed: Unknown Status -5657 (0xffffe9e7) (rcNt=0xe986e9e7)
    VBoxDrvStub error: Not signed with the build certificate.: \Device\HarddiskVolume3\Program Files\Oracle\VirtualBox\VirtualBox.exe

Revisando problemas conocidos encontré esta nota.
Siguiendo las validaciones, en mi caso los drivers eran:

    C:\Users\calero\Downloads>driverquery | findstr /I virtualbox
    VBoxDrv      VirtualBox Service     Kernel        1/15/2018 11:59:22 AM
    VBoxNetAdp   VirtualBox NDIS 6.0 Mi Kernel        1/15/2018 11:59:22 AM
    VBoxNetLwf   VirtualBox NDIS6 Bridg Kernel        1/15/2018 11:59:22 AM
    VBoxUSBMon   VirtualBox USB Monitor Kernel        1/15/2018 11:59:22 AM

Y este es el detalle de VBoxDrv:

    C:\Users\calero>driverquery /v | findstr /I vboxdrv
    VBoxDrv      VirtualBox Service     VirtualBox Service     Kernel        System     Stop Pendi Degraded   TRUE        FALSE        0                 614,400     0          1/15/2018 11:59:22 AM  C:\WINDOWS\system32\DRIVERS\VBoxDrv.sys          4,096

En mi caso lo pude resolver usando la opción de "Reparar la instalación" de programas en Windows.
Esto se hace en "Control Panel\Programs\Programs and Features", buscar "Oracle VM VirtualBox", botón derecho sobre esa entrada y elegir "repair".


b) Error por usar binarios linux de VirtualBox

Si instalan VirtualBox en Ubuntu, cuando lo quieran usar van a tener este error:

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ VBoxManage -v
    WARNING: The character device /dev/vboxdrv does not exist.
             Please install the virtualbox-dkms package and the appropriate
             headers, most likely linux-headers-Microsoft.

             You will not be able to start VMs until this problem is fixed.
    5.0.40_Ubuntur115130

Notar que instalé VirtualBox en Ubuntu solo para probar si funcionaba.
A los efectos de la configuración explicada en el post anterior, pueden asumir que esto no lo hicieron, no tienen virtualbox instalado en unbuntu. Yo lo desinstalé antes de instalar Vagrant.
Para ser rigurosos en los pasos que ejecuté, fueron (aunque sin los detalles ya que no aportan para el resultado final):

    sudo apt install virtualbox
    sudo apt-get install virtualbox-dkms
    sudo apt-get purge virtualbox
    sudo dpkg -i vagrant_2.0.1_x86_64.deb  (sólo esto incluí en el post anterior)

   
c) Virtualbox no está en el path al usar Vagrant

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ vagrant up
    The provider 'virtualbox' that was requested to back the machine 'default' is reporting that it isn't usable on this system. The reason is shown below:

    The "VBoxManage.exe" command or one of its dependencies could not be found. Please verify VirtualBox is properly installed. You can verify everything is okay by running "VBoxManage.exe --version" and verifying that the VirtualBox version is outputted.

    If you just installed VirtualBox, you have to log out and log back in for the new environmental variables to take effect. Using the VirtualBox provider within the WSL requires VirtualBox executables to be available on the system PATH.

No necesita explicación, tal como dice el error, ajustando el path se arregla.

   
d) Mezclar ejecuciones de Vagrant desde ubuntu y desde Windows sobre el mismo repo.

Si al clonar el repositorio primero intentamos usarlo desde Windows con 'vagrant up' (ya sabemos que va a fallar), y después vamos a Ubuntu para tratar de usarlo, tenemos este error:

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ vagrant up
    The VirtualBox VM was created with a user that doesn't match the
    current user running Vagrant. VirtualBox requires that the same user
    be used to manage the VM that was created. Please re-run Vagrant with
    that user. This is not a Vagrant issue.

    The UID used to create the VM was: 0
    Your UID is: 1000

Los archivos creados en Windows se ven como si fueran de root en ubuntu, pero eso no impide que vagrant funcione:

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ id
    uid=1000(ncalero) gid=1000(ncalero) groups=1000(ncalero),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(netdev),110(lxd)

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ ls -la
    total 512
    drwxrwxrwx 0 root root   512 Jan 21 13:38 .
    drwxrwxrwx 0 root root   512 Apr 25  2016 ..
    drwxrwxrwx 0 root root   512 Jan 21 13:38 ansible
    drwxrwxrwx 0 root root   512 Jan 21 13:38 .git
    -rwxrwxrwx 1 root root  1231 Jan 21 13:38 README.md
    drwxrwxrwx 0 root root   512 Jan 21 13:55 .vagrant
    -rwxrwxrwx 1 root root 14051 Jan 21 17:52 Vagrantfile
   
Para evitar este error, lo más simple es usar un directorio nuevo para nuestras pruebas en Ubuntu:

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ mv .vagrant .vagrant-win

Ahora la ejecución desde Ubuntu con nuestro usuario funciona como se describió en el post anterior:

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    ==> default: Box 'bento/oracle-6.9' could not be found. Attempting to find and install...
        default: Box Provider: virtualbox
    ...


e) Error por no configurar las variables de ambiente

Si tratamos de usar vagrant en ubuntu sin configurar las variables de ambiente necesarias, vamos a tener este error:

    ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ vagrant box list
    Vagrant will not operate outside the Windows Subsystem for Linux unless explicitly
    instructed. Due to the inability to enforce expected Linux file ownership and
    permissions on the Windows system, Vagrant will not make modifications to prevent
    unexpected errors. To learn more about this, and the options that are available,
    please refer to the Vagrant documentation:

      https://www.vagrantup.com/docs/other/wsl.html
     

Se arregla fácil configurando las variables descritas en el post anterior.
   
   
f) Error por falta de claves ssh al hacer 'provision'

Si ejecutamos 'vagrant provision' sin tener claves ssh para nuestro usuario:

ncalero@H6RMYZ1:/mnt/d/GitHub/vagrant-builder$ vagrant provision
    ==> default: Running provisioner: ansible...
    Vagrant has automatically selected the compatibility mode '2.0'
    according to the Ansible version installed (2.4.2.0).

    Alternatively, the compatibility mode can be specified in your Vagrantfile:
    https://www.vagrantup.com/docs/provisioning/ansible_common.html#compatibility_mode

        default: Running ansible-playbook...

    PLAY [all] *********************************************************************

    TASK [install simplejson if needed] ********************************************
    changed: [default]

    PLAY [all] *********************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [default]

    ...
   
    TASK [setup_linux : copy public key to authorized_key file of root] ************
     [WARNING]: Unable to find '~/.ssh/id_rsa.pub' in expected paths.

    fatal: [default]: FAILED! => {"msg": "An unhandled exception occurred while running the lookup plugin 'file'. Error was a , original message: could not locate file in lookup: ~/.ssh/id_rsa.pub"}
            to retry, use: --limit @/mnt/d/GitHub/vagrant-builder/ansible/setup.retry

    PLAY RECAP *********************************************************************
    default                    : ok=27   changed=13   unreachable=0    failed=1

    Ansible failed to complete successfully. Any error output should be
    visible above. Please fix these errors and try again.

Esto se resuelve creando la clave ssh como se describe en el post anterior.