Saltar a contenido

Oracle

4. Oracle XE

4.1 Crear el archivo docker-compose.yml

cat > ~/ia-lab/services/motores-bd/oracle/docker-compose.yml << 'EOF'
services:
  oracle:
    image: gvenzl/oracle-xe:21-slim
    container_name: oracle-server
    restart: unless-stopped

    env_file:
      - .env

    ports:
      - "0.0.0.0:1521:1521"

    volumes:
      - ../../../data/oracle:/opt/oracle/oradata
      - /mnt/d/academia/bd:/backups

    networks:
      - ia-lab-network

    healthcheck:
      test: ["CMD", "healthcheck.sh"]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 120s

networks:
  ia-lab-network:
    external: true
EOF

Habilitar UFW y permitir el puerto 1521 (Oracle) en el host:

sudo ufw allow 1521/tcp
sudo ufw enable
sudo ufw status

El listener de Oracle XE en gvenzl/oracle-xe ya acepta conexiones remotas (equivalente a --bind-address=0.0.0.0 en MySQL y listen_addresses=* en PostgreSQL). No se usa command: aquí: en esta imagen sustituiría el entrypoint y el contenedor no arranca.

Los usuarios SYSTEM y admin no se atan a un host (no existe @'%' como en MySQL). Con el puerto 1521 publicado y UFW abierto, DBeaver puede entrar desde otro equipo usando Service Name tecnogua.

4.2 Crear el archivo .env

cat > ~/ia-lab/services/motores-bd/oracle/.env << 'EOF'
TZ=America/Bogota
ORACLE_PASSWORD=MiNiCo57**
ORACLE_DATABASE=tecnogua
EOF

ORACLE_DATABASE no es un usuario. Es el nombre del PDB (pluggable database) que crea el contenedor.

El usuario administrador que crea la imagen siempre se llama SYSTEM (también existe SYS), igual que MySQL usa root, PostgreSQL usa postgres y SQL Server usa SA.

Variable Qué es Valor
ORACLE_DATABASE PDB / servicio de conexión tecnogua
ORACLE_PASSWORD Contraseña de SYSTEM y SYS MiNiCo57**

Al conectar (sqlplus, DBeaver) el usuario es SYSTEM, no tecnogua.

Editar la clave del .env en clase:

cd ~/ia-lab/services/motores-bd/oracle
sudo nano .env

Cambiar:

ORACLE_PASSWORD=123456
Ctrl + o  ==>  para guardar
Ctrl + x  ==>  para salir

El primer arranque de Oracle puede tardar varios minutos. Si el contenedor no inicia con 123456, deja MiNiCo57**.

4.3 Crear README.md

cat > ~/ia-lab/services/motores-bd/oracle/README.md << 'EOF'
# Oracle XE - Motor de Base de Datos

> **Acceso remoto habilitado.** Puerto expuesto en `0.0.0.0:1521`.
> **Usuario por defecto:** `SYSTEM`
> **PDB / Service Name:** `tecnogua`
> **Password:** `MiNiCo57**`

---

## Conectar desde WSL (local)

```bash
sudo docker exec -it oracle-server sqlplus system/MiNiCo57**@tecnogua

4.4 Levantar Oracle

cd ~/ia-lab/services/motores-bd/oracle
sudo docker compose up -d

Verificar que está corriendo:

sudo docker ps | grep oracle-server
sudo docker logs oracle-server --tail 20

4.5 Conectar localmente a Oracle

docker exec -it oracle-server bash
sqlplus sys/MiNiCo57** as sysdba

Ya dentro del motor:

En Oracle el usuario es la base de datos (esquema). No se crea otra instancia: CREATE USER es el equivalente a CREATE DATABASE de MySQL/PostgreSQL.

Crear una base de datos (usuario/esquema)

create USER usuario_db IDENTIFIED BY "contrasena" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
ALTER USER usuario_db QUOTA UNLIMITED ON USERS;
grant connect,resource to usuario_db; 

En clase (distinto a SYSTEM / PDB tecnogua):

create USER almacendb_admin IDENTIFIED BY "MiNiCo57**" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
ALTER USER almacendb_admin QUOTA UNLIMITED ON USERS;
grant connect,resource to almacendb_admin; 

Listar todas las bases de datos (esquemas)

SELECT username FROM all_users ORDER BY username;

Eliminar una base de datos (esquema)

Hazlo conectado como SYS o SYSTEM, no desde el propio usuario:

DROP USER usuario CASCADE;

En clase:

DROP USER almacendb_admin CASCADE;

Entrar a una base de datos

Conectarse al usuario es entrar a esa base:

CONN usuario/password

En clase:

CONN almacendb_admin/MiNiCo57

Listar las tablas (dentro de esa base/usuario)

SELECT table_name FROM user_tables;

Listar los campos de una tabla

DESC nombre_tabla;

O también:

SELECT column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name = 'NOMBRE_TABLA';

Salir del motor

EXIT;

4.6 Crear un usuario PROPIO con ACCESO REMOTO

Conectate primero como SYS (sqlplus sys/MiNiCo57** as sysdba), luego ejecuta.

Parte explicativa. Reemplaza usuario y password:

create USER almacendb_admin IDENTIFIED BY "MiNiCo57" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
ALTER USER almacendb_admin QUOTA UNLIMITED ON USERS;
grant connect,resource to almacendb_admin; 

Aplicado en clase. Copiar y pegar (Usuario: admin / Contraseña: 123456):

create USER almacendb_admin IDENTIFIED BY "123456" DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS;
ALTER USER almacendb_admin QUOTA UNLIMITED ON USERS;
grant connect,resource to almacendb_admin; 

Luego entra a esa base (el usuario admin) y usa los mismos comandos del paso 4.5:

CONN admin/"123456"

SELECT username FROM all_users ORDER BY username;
SELECT table_name FROM user_tables;
DESC nombre_tabla;
EXIT;

Si Oracle rechaza 123456 por política de claves, ejecuta antes: ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;

4.7 Conectar remotamente desde cualquier equipo

** Hacerlo desde DBEAVER **
Reemplaza los valores correspondientes en Host

En el terminal de wsl-ubuntu

ip a

Luego, buscar la IP a la linea de Eth0

y esa direccion colocarla en Host

  • Host: IP_SERVIDOR
  • Port: 1521
  • Database/Service: tecnogua (Service Name, no SID XE)
  • User: SYSTEM
  • Password: MiNiCo57**
  • Role: Default (no SYSDBA, salvo que entres como SYS)

ORACLE_DATABASE=tecnogua es el PDB. El usuario de conexión sigue siendo SYSTEM, no tecnogua.

4.8 Backup de una base de datos

sudo docker exec oracle-server expdp system/MiNiCo57**@tecnogua directory=DATA_PUMP_DIR dumpfile=backup_tecnogua.dmp logfile=backup_tecnogua.log

4.9 Variables clave del .env

Variable Descripcion
TZ Zona horaria
ORACLE_PASSWORD Password de SYSTEM y SYS (MiNiCo57**)
ORACLE_DATABASE PDB inicial / Service Name (tecnogua)