Salta el contingut

PR0301 — Exploració de SGBD amb Docker

Informació de la pràctica

Camp Valor
Codi PR0301
Mòdul M0372 — Gestió de Bases de Dades
RA RA1 — Sistemes d'emmagatzematge
Durada estimada 5 hores
Modalitat Individual
Lliurament Fitxer PDF + fitxers SQL a Moodle
Qualificació 10 punts (rúbrica adjunta)

Objectius

  • Posar en marxa contenidors Docker amb PostgreSQL, MySQL/MariaDB, Oracle XE i SQL Server.
  • Connectar-s'hi amb DBeaver i amb el client de línia de comandes de cada motor.
  • Explorar el catàleg del sistema i les metadades de la BD en cadascun dels motors.
  • Crear la mateixa taula de prova als quatre motors i comparar les diferències sintàctiques.
  • Documentar l'experiència amb captures de pantalla i reflexions comparatives.

Prerequisits

  • Docker Desktop instal·lat i funcionant.
  • DBeaver Community Edition instal·lat.
  • Coneixements bàsics de terminal (cd, ls, docker ps, docker exec).

Personalització obligatoria

Tot el que creeu ha de portar el vostre nom. Substituïu nom-cognom pel vostre nom real en minúscules sense accents (exemple: joan-garcia, maria-lopez). Això permet al professor identificar el treball de cada alumne i evita conflictes entre contenidors.


Apartat 1 — PostgreSQL amb Docker (2 punts)

1.1 Posada en marxa del contenidor

# Descarregueu la imatge
docker pull postgres:18

# Creeu i inicieu el contenidor
docker run -d \
  --name postgres-nom-cognom \
  -e POSTGRES_PASSWORD=gbd2025 \
  -e POSTGRES_USER=gbd_user \
  -e POSTGRES_DB=gbd_nom_cognom \
  -p 5432:5432 \
  postgres:18

# Verifiqueu que el contenidor està en marxa
docker ps

Tasca 1.1: Feu una captura de pantalla del resultat de docker ps que mostri el contenidor en execució.

1.2 Connexió i exploració del catàleg

# Entreu al contenidor
docker exec -it postgres-nom-cognom psql -U gbd_user -d gbd_nom_cognom
-- Un cop dins de psql:
\l          -- Llista de bases de dades
\du         -- Llista d'usuaris/rols
\conninfo   -- Informació de la connexió actual

-- Versió del servidor
SELECT version();

-- Bases de dades del servidor
SELECT datname, datcollate FROM pg_database;

-- Taules del catàleg (primeres 20)
SELECT tablename FROM pg_tables
WHERE schemaname = 'pg_catalog'
ORDER BY tablename LIMIT 20;

-- Connexions actuals
SELECT pid, usename, application_name, state FROM pg_stat_activity;

Tasca 1.2: Feu captures de pantalla dels resultats de les metaordes i consultes al catàleg.

1.3 Creació de taula de prova

CREATE TABLE alumnes (
    id        SERIAL PRIMARY KEY,
    nom       VARCHAR(100) NOT NULL,
    cognoms   VARCHAR(200) NOT NULL,
    email     VARCHAR(150) UNIQUE,
    data_alta DATE DEFAULT CURRENT_DATE
);

INSERT INTO alumnes (nom, cognoms, email) VALUES
    ('Joan', 'Garcia Puig', 'joan.garcia@iessapalomera.cat'),
    ('Maria', 'Lopez Serra', 'maria.lopez@iessapalomera.cat'),
    ('Pere', 'Bosch Vila', 'pere.bosch@iessapalomera.cat');

SELECT * FROM alumnes;

-- Metadades de la taula al catàleg
SELECT column_name, data_type, character_maximum_length, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'alumnes'
ORDER BY ordinal_position;

Tasca 1.3: Feu captures de pantalla dels resultats de cada sentència.


Apartat 2 — MySQL/MariaDB amb Docker (2 punts)

2.1 Posada en marxa del contenidor

# Descarregueu la imatge
docker pull mysql:8.0

# Creeu i inicieu el contenidor
docker run -d \
  --name mysql-nom-cognom \
  -e MYSQL_ROOT_PASSWORD=root2025 \
  -e MYSQL_DATABASE=gbd_nom_cognom \
  -e MYSQL_USER=gbd_user \
  -e MYSQL_PASSWORD=gbd2025 \
  -p 3306:3306 \
  mysql:8.0

# Verifiqueu que està en marxa
docker ps

2.2 Connexió i exploració del catàleg

# Connecteu-vos al contenidor
docker exec -it mysql-nom-cognom mysql -u gbd_user -pgbd2025 gbd_nom_cognom
-- Un cop dins de mysql:
SHOW DATABASES;
USE gbd_nom_cognom;
SELECT VERSION();

-- Usuaris del sistema
SELECT user, host, plugin FROM mysql.user;

-- Variables de sistema
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';

Tasca 2.1-2.2: Documenteu els resultats de cada comanda amb captures de pantalla.

2.3 Creació de taula i metadades

CREATE TABLE alumnes (
    id        INT AUTO_INCREMENT PRIMARY KEY,
    nom       VARCHAR(100) NOT NULL,
    cognoms   VARCHAR(200) NOT NULL,
    email     VARCHAR(150) UNIQUE,
    data_alta DATE DEFAULT (CURRENT_DATE)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO alumnes (nom, cognoms, email) VALUES
    ('Joan', 'Garcia Puig', 'joan.garcia@iessapalomera.cat'),
    ('Maria', 'Lopez Serra', 'maria.lopez@iessapalomera.cat'),
    ('Pere', 'Bosch Vila', 'pere.bosch@iessapalomera.cat');

SELECT * FROM alumnes;

-- Metadades al catàleg
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'gbd_nom_cognom' AND TABLE_NAME = 'alumnes';

SHOW TABLE STATUS LIKE 'alumnes';

Tasca 2.3: Documenteu els resultats.


Apartat 3 — Oracle XE amb Docker (2 punts)

3.1 Posada en marxa del contenidor

# Descarregueu la imatge (Oracle XE 21c, versió lleugera sense compte Oracle)
docker pull gvenzl/oracle-xe:21-slim

# Creeu i inicieu el contenidor
# Nota: el primer inici pot trigar 2-3 minuts mentre inicialitza la BD
docker run -d \
  --name oracle-nom-cognom \
  -e ORACLE_PASSWORD=oracle2025 \
  -p 1521:1521 \
  gvenzl/oracle-xe:21-slim

# Espereu fins que el contenidor estigui llest (health: healthy)
docker ps
docker logs oracle-nom-cognom --tail 20

Quan sabeu que Oracle està llest?

Espereu fins que docker logs mostri el missatge DATABASE IS READY TO USE!. Normalment triga entre 1 i 3 minuts.

Tasca 3.1: Feu una captura de pantalla de docker ps i del log que confirma que Oracle està llest.

3.2 Connexió i exploració del catàleg

# Connecteu-vos amb SQL*Plus com a SYSTEM al PDB (Pluggable Database)
docker exec -it oracle-nom-cognom sqlplus system/oracle2025@//localhost:1521/XEPDB1
-- Un cop dins de SQL*Plus:

-- Versió del servidor
SELECT * FROM v$version WHERE banner LIKE 'Oracle%';

-- Base de dades actual
SELECT name, open_mode, db_unique_name FROM v$database;

-- Contenidors disponibles (CDB/PDB)
SELECT con_id, name, open_mode FROM v$pdbs;

-- Taules de l'usuari actual
SELECT table_name FROM user_tables ORDER BY table_name;

-- Tots els usuaris del sistema
SELECT username, account_status, created FROM dba_users ORDER BY created;

-- Tablespaces disponibles
SELECT tablespace_name, status, contents FROM dba_tablespaces;

Tasca 3.2: Feu captures de pantalla dels resultats de les consultes al catàleg.

3.3 Creació d'usuari i taula de prova

A Oracle, cada usuari té el seu propi esquema. Crearem un usuari dedicat per a la pràctica:

-- Com a SYSTEM, creeu l'usuari (substituïu nom_cognom)
CREATE USER alumne_nom_cognom IDENTIFIED BY gbd2025;
GRANT CONNECT, RESOURCE TO alumne_nom_cognom;
ALTER USER alumne_nom_cognom QUOTA UNLIMITED ON USERS;

-- Connecteu-vos com al nou usuari
CONNECT alumne_nom_cognom/gbd2025@//localhost:1521/XEPDB1

-- Creeu la taula (sintaxi Oracle)
CREATE TABLE alumnes (
    id        NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nom       VARCHAR2(100) NOT NULL,
    cognoms   VARCHAR2(200) NOT NULL,
    email     VARCHAR2(150) UNIQUE,
    data_alta DATE DEFAULT SYSDATE
);

-- Inseriu dades (Oracle requereix COMMIT explícit)
INSERT INTO alumnes (nom, cognoms, email)
    VALUES ('Joan', 'Garcia Puig', 'joan.garcia@iessapalomera.cat');
INSERT INTO alumnes (nom, cognoms, email)
    VALUES ('Maria', 'Lopez Serra', 'maria.lopez@iessapalomera.cat');
INSERT INTO alumnes (nom, cognoms, email)
    VALUES ('Pere', 'Bosch Vila', 'pere.bosch@iessapalomera.cat');
COMMIT;

SELECT * FROM alumnes;

-- Metadades de la taula
SELECT column_name, data_type, data_length, nullable, data_default
FROM user_tab_columns
WHERE table_name = 'ALUMNES'
ORDER BY column_id;

Tasca 3.3: Feu captures de pantalla de la creació de l'usuari, la taula i els resultats.


Apartat 4 — SQL Server amb Docker (2 punts)

4.1 Posada en marxa del contenidor

# Descarregueu la imatge (SQL Server 2025 Developer Edition, gratuïta)
docker pull mcr.microsoft.com/mssql/server:2025-latest

# Creeu i inicieu el contenidor
# Nota: la contrasenya SA ha de tenir majúscules, minúscules, xifres i símbols
docker run -d \
  --name sqlserver-nom-cognom \
  -e ACCEPT_EULA=Y \
  -e MSSQL_SA_PASSWORD='Gbd@2025' \
  -p 1433:1433 \
  mcr.microsoft.com/mssql/server:2025-latest

# Verifiqueu que està en marxa
docker ps

Tasca 4.1: Feu una captura de pantalla de docker ps que mostri el contenidor en execució.

4.2 Connexió i exploració del catàleg

# Connecteu-vos amb sqlcmd des de dins del contenidor
docker exec -it sqlserver-nom-cognom \
  /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P 'Gbd@2025' -No
-- Un cop dins de sqlcmd (les sentències han d'anar seguides de GO):

-- Versió del servidor
SELECT @@VERSION;
GO

-- Llista de bases de dades
SELECT name, state_desc, create_date FROM sys.databases;
GO

-- Crear la base de dades de la pràctica
CREATE DATABASE gbd_nom_cognom;
GO
USE gbd_nom_cognom;
GO

-- Connexions actuals
SELECT session_id, login_name, status, program_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;
GO

Tasca 4.2: Feu captures de pantalla dels resultats de les consultes al catàleg.

4.3 Creació de taula i metadades

USE gbd_nom_cognom;
GO

-- Creeu la taula (sintaxi SQL Server)
CREATE TABLE alumnes (
    id        INT IDENTITY(1,1) PRIMARY KEY,
    nom       NVARCHAR(100) NOT NULL,
    cognoms   NVARCHAR(200) NOT NULL,
    email     NVARCHAR(150) UNIQUE,
    data_alta DATE DEFAULT GETDATE()
);
GO

-- Inseriu dades
INSERT INTO alumnes (nom, cognoms, email) VALUES
    ('Joan', 'Garcia Puig', 'joan.garcia@iessapalomera.cat'),
    ('Maria', 'Lopez Serra', 'maria.lopez@iessapalomera.cat'),
    ('Pere', 'Bosch Vila', 'pere.bosch@iessapalomera.cat');
GO

SELECT * FROM alumnes;
GO

-- Metadades de la taula
SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'alumnes';
GO

-- Objectes de la BD
SELECT name, type_desc, create_date FROM sys.objects WHERE type = 'U';
GO

Tasca 4.3: Feu captures de pantalla de la creació de la taula i els resultats.


Apartat 5 — Connexió amb DBeaver (1 punt)

Configureu les quatre connexions a DBeaver i feu captures de pantalla que demostrin que funcionen.

5.1 PostgreSQL

  • Driver: PostgreSQL
  • Host: localhost · Port: 5432
  • Database: gbd_nom_cognom · Username: gbd_user · Password: gbd2025

5.2 MySQL

  • Driver: MySQL
  • Host: localhost · Port: 3306
  • Database: gbd_nom_cognom · Username: gbd_user · Password: gbd2025

5.3 Oracle

  • Driver: Oracle
  • Connection type: Service name · Host: localhost · Port: 1521
  • Service name: XEPDB1 · Username: alumne_nom_cognom · Password: gbd2025

5.4 SQL Server

  • Driver: SQL Server
  • Host: localhost · Port: 1433
  • Database: gbd_nom_cognom · Username: SA · Password: Gbd@2025

Tasca 5: Feu una captura de pantalla de DBeaver amb les quatre connexions actives i, per a cadascuna, mostreu la taula alumnes amb les dades.


Apartat 6 — Comparació i reflexió (1 punt)

Responeu les preguntes següents al vostre informe (mínim 2-3 línies per pregunta):

  1. Diferències de tipus de dades: Compareu com cada motor declara els camps de la taula alumnes (enter autoincremental, text de longitud variable, data amb valor per defecte). Feu una taula resum.

  2. Catàleg del sistema: Cada motor té la seva manera d'exposar les metadades. Quines semblances i diferències trobeu entre pg_catalog (PostgreSQL), information_schema (MySQL), user_tab_columns (Oracle) i INFORMATION_SCHEMA (SQL Server)?

  3. Posada en marxa: Quin motor us ha costat més de posar en marxa amb Docker i per qué? Quin ha sigut el més senzill?

  4. COMMIT explícit: Oracle requereix COMMIT explícit mentre que PostgreSQL i MySQL en mode autocommit no. Com afecta això a la fiabilitat de les dades? En quins escenaris és important controlar el commit manualment?

  5. Reflexió personal: Després d'explorar els quatre motors, en quin tipus de projecte escolliríeu cadascun? Argumenteu breument.


Entrega

L'entrega ha d'incloure:

  • Informe en PDF amb totes les captures de pantalla i respostes demanades.
  • postgres_practica.sql — totes les sentències SQL executades a PostgreSQL.
  • mysql_practica.sql — totes les sentències SQL executades a MySQL.
  • oracle_practica.sql — totes les sentències SQL executades a Oracle.
  • sqlserver_practica.sql — totes les sentències SQL executades a SQL Server.
  • Tots els fitxers pujats a la tasca de la plataforma Moodle abans de la data límit.

Termini

El lliurament fora de termini sense justificació prèvia implica una penalització de 2 punts per dia de retard, fins a un màxim de 0 punts.