Instalar y Configurar Oracle 12c 12.1.0.2 SE en Docker y Ubuntu 20.04 LTS (Single Instace)
Tags: oracle, database, ubuntu, linux
Published: 2023-11-09 18:52:50

Actualmente, Docker es una herramienta necesaria para nuestros entornos para exponer servicios por medio de contenedores, hoy vamos a aprender como instalar Oracle 12c 12.1.0.2 SE sobre Docker en Ubuntu 20.04 LTS.

## Requerimientos de instalación

1. [Sistema operativo Ubuntu 20.04 LTS](https://releases.ubuntu.com/20.04/)
2. Oracle 12c 12.1.0.2 lo puedes descargar desde [Oracle Software Delivery](https://edelivery.oracle.com/osdc/faces/Home.jspx), para esto necesitas crear una cuenta de Oracle que es completamente gratis, el paquete que debes de buscar es el siguiente.

![Paquete de referencia a descargar](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c4dlaxmazq8qsgb16ugn.png)

## Instalación de Docker
para la instalación de Docker te puedes guiar de la documentación oficial de Docker
* [Documentación de Instalación de Docker en Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

## Creación de imagen para Docker
Para iniciar la creación de Oracle 12c para Docker necesitamos acceder a nuestro servidor Ubuntu y clonar el siguiente [repositorio](https://github.com/alexandevcwa/docker-images), este repositorio contiene scripts para construir una imagen de Docker para correr una base de datos Oracle.

```bash
cd ~
git clone https://github.com/alexandevcwa/docker-images
```

### Creación de imagen Docker
Al tener clonado el repositorio, debemos ir a la ruta siguiente del repositorio clonado.

```bash
cd ~/docker-images/OracleDatabase/SingleInstance/dockerfiles/
```

El directorio `dickerfiles` contiene múltiples configuraciones para las diferentes versiones de base de datos Oracle.

```
ubuntu:~/docker-images/OracleDatabase/SingleInstance/dockerfiles$ ls
11.2.0.2  12.1.0.2  12.2.0.1  18.3.0
18.4.0  19.3.0  21.3.0  23.3.0
buildContainerImage.sh
```

Ahora vamos a acceder al directorio `12.1.0.2` donde vamos a mover los archivos de instalación de Oracle 12c 12.1.0.2 descargados anteriormente, tienen que ser 2 archivos descargados con los siguientes nombre, `V77388-01_1of2.zip` y `V77388-01_2of2.zip` en la versión Standard Edition 2 de Oracle 12c, a estos archivos se les debe de cambiar el nombre por los siguientes.

```bash
mv V77388-01_1of2.zip linuxamd64_12102_database_se2_1of2.zip
mv V77388-01_2of2.zip linuxamd64_12102_database_se2_2of2.zip
```

Ahora debemos de mover los archivos al directorio `12.1.0.2`

```bash
mv linuxamd64_12102_database_se2_1of2.zip V77388-01_2of2.zip linuxamd64_12102_database_se2_2of2.zip ~/docker-images/OracleDatabase/SingleInstance/dockerfiles/12.1.0.2/
```

Ya con los archivos de instalación de la base de datos, el repositorio clonado y Docker Engine instalado en Ubuntu, debemos de construir la imagen corriendo el siguiente script `buildContainerImage.sh` que está ubicado en la ruta `~/docker-images/OracleDatabase/SingleInstance/dockerfiles`

```bash
sudo ./buildContainerImage.sh -d -v 12.1.0.2 -t oracle-12.1.0.2-se -s
```

Al finalizar el proceso de construcción de la imagen, debe de mostrar el siguiente mensaje.

```
#########################
DATABASE IS READY TO USE!
#########################
```

Ahora correremos una instancia de la imagen para construir el contenedor con el siguiente comando, para mayor descripción del comando y adaptarlo a tu entorno, visita el siguiente [link](https://github.com/alexandevcwa/docker-images/tree/main/OracleDatabase/SingleInstance#running-oracle-database-in-a-container)

```bash
docker run -d --name oracle-12.1.0.2-se-db \
 -p 1521:1521 -p 5500:5500 -p 2484:2484 \
--ulimit nofile=1024:65536 --ulimit nproc=2047:16384 \
--ulimit stack=10485760:33554432 --ulimit memlock=3221225472 \
-e ORACLE_SID=orcl -e ORACLE_PDB=orcrlpdb -e ORACLE_PWD=manager1 \
-e INIT_SGA_SIZE=2560M -e INIT_PGA_SIZE=2560M -e ORACLE_EDITION=standard \
-e ORACLE_CHARACTERSET=WE8MSWIN1252 -e ENABLE_ARCHIVELOG=false \
-e ENABLE_TCPS=false \
-v oracle-12.1.0.2-data/opt/oracle/oradata oracle-12.1.0.2-se:latest
```

Si deseas visualizar el proceso de construcción del contenedor, con el siguiente comando lo puedes ver.

```bash
docker longs -f <container_id>
```

### Configuración de archivo de configuración init.ora

Para configurar el archivo de configuración `init.ora` debemos de tener la herramienta `vi` instalada en el contenedor, con el siguiente comando lo podremos hacer.

```bash
docker exec -it -u root <container_id> bash
yum install -y vi
```

Una vez instalada la herramienta, debemos de ir al directorio donde está ubicado el archivo de configuración y crear una copia del archivo con la siguiente nomenclatura `init<nombre_instancia>.ora`

```bash
cd  /opt/oracle/product/12.1.0.2/dbhome_1/dbs
cp init.ora init<nombre_instancia>.ora
```

Una vez creada la copia del archivo de configuración, debemos acceder al archivo para editarlo con la siguiente configuración.
Esta configuración no es estándar, debes adaptarla a tus recursos del sistema y las necesidades del tamaño de tu base de datos

```
db_name='nombre_instancia'
*.db_unique_name='nombre_instancia'
processes = 150
audit_file_dest='/opt/oracle/admin/<NOMBRE_INSTANCIA>/adump'
audit_trail ='db'
SGA_TARGET=3G
PGA_AGGREGATE_TARGET=1G
db_block_size=8192
db_domain=''
db_recovery_file_dest='/opt/oracle/fast_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='/opt/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=<NOMBRE_INSTANCIA>XDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = (/opt/oracle/oradata/ORCL/control01.ctl)
compatible ='12.1.0.2.0'
ENABLE_PLUGGABLE_DATABASE=TRUE
```

Con esta configuración la base de datos debería de arrancar sin problemas.

### Errores comunes
1. Puede ocurrir que al acceder por medio de `sqlplus` e iniciar la  base de datos con startup, muestre un mensaje de tipo `ORA-01102: cannot mount database in EXCLUSIVE mode`, esto significa que existe ya una instancia de base de datos, para solucionar este error debemos de matar esa instancia de base de datos con el siguiente comando.

**Comando para obtener los procesos**
```bash
ps -ef | grep smon
```

**Salida**

```bash
[oracle@aff8acd3a125 dbs]$ ps -ef | grep smon
oracle        50       1  0 18:01 ?        00:00:00 ora_smon_ORCL
oracle      1679    1213  0 18:40 pts/0    00:00:00 grep --color=auto smon
```

**Matar instancia de base de datos existente**

```bash
kill <id_proceso>
```

_Para corregir cualquier problema es recomendable reiniciar el contenedor completamente._

```bash
docker restart <container_id>
```

**Verificar que el contenedor y la instancia de base de datos se inició correctamente**

```bash
docker logs <container_id>
```