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:
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:
Cambiar:
El primer arranque de Oracle puede tardar varios minutos. Si el contenedor no inicia con
123456, dejaMiNiCo57**.
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
Verificar que está corriendo:
4.5 Conectar localmente a Oracle
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)
Eliminar una base de datos (esquema)
Hazlo conectado como SYS o SYSTEM, no desde el propio usuario:
En clase:
Entrar a una base de datos
Conectarse al usuario es entrar a esa base:
En clase:
Listar las tablas (dentro de esa base/usuario)
Listar los campos de una tabla
O también:
Salir del motor
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
123456por 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
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 SIDXE) - User:
SYSTEM - Password:
MiNiCo57** - Role:
Default(no SYSDBA, salvo que entres comoSYS)
ORACLE_DATABASE=tecnoguaes el PDB. El usuario de conexión sigue siendoSYSTEM, notecnogua.
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) |