316 lines
9.9 KiB
Bash
316 lines
9.9 KiB
Bash
#!/bin/bash
|
|
#==============================================================================
|
|
# Script: 00-install-oracle21c-xe.sh
|
|
# Descriere: Instalare completă Oracle 21c XE în Docker pe LXC Proxmox
|
|
# - Instalează Docker (dacă nu există)
|
|
# - Instalează Oracle 21c XE
|
|
# - Șterge XEPDB1 automat
|
|
# - Creează PDB ROA (și opțional PDB ROA2)
|
|
# Data: 30 Septembrie 2025
|
|
# Rulare: bash 00-install-oracle21c-xe.sh
|
|
# Unde: Pe host Proxmox (sau în LXC prin pct exec)
|
|
#==============================================================================
|
|
|
|
set -e
|
|
|
|
echo "=========================================="
|
|
echo "INSTALARE ORACLE 21c XE PE LXC + DOCKER"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Configurare
|
|
ORACLE_PWD="OraclePass123"
|
|
LXC_ID="108"
|
|
PROXMOX_HOST="10.0.20.201"
|
|
CONTAINER_NAME="oracle-xe"
|
|
ORACLE_IMAGE="container-registry.oracle.com/database/express:21.3.0-xe"
|
|
|
|
# Verificare dacă rulează pe Proxmox sau trebuie SSH
|
|
if [ -f "/etc/pve/.version" ]; then
|
|
echo "✓ Rulează direct pe Proxmox host"
|
|
PVE_CMD=""
|
|
else
|
|
echo "Conectare la Proxmox ${PROXMOX_HOST}..."
|
|
PVE_CMD="ssh root@${PROXMOX_HOST}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo "PASUL 1/7: VERIFICARE LXC ${LXC_ID}"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Verificare LXC există
|
|
if ! ${PVE_CMD} pct status ${LXC_ID} &>/dev/null; then
|
|
echo "ERROR: LXC ${LXC_ID} nu există!"
|
|
echo ""
|
|
echo "Creează LXC manual:"
|
|
echo " pct create ${LXC_ID} local:vztmpl/debian-12-standard_12.2-1_amd64.tar.zst \\"
|
|
echo " --hostname oracle-db \\"
|
|
echo " --memory 8192 \\"
|
|
echo " --cores 4 \\"
|
|
echo " --rootfs local-lvm:32 \\"
|
|
echo " --net0 name=eth0,bridge=vmbr0,ip=dhcp \\"
|
|
echo " --features nesting=1,keyctl=1"
|
|
echo " pct start ${LXC_ID}"
|
|
exit 1
|
|
fi
|
|
|
|
# Start LXC dacă e oprit
|
|
if ! ${PVE_CMD} pct status ${LXC_ID} | grep -q "running"; then
|
|
echo "Pornire LXC ${LXC_ID}..."
|
|
${PVE_CMD} pct start ${LXC_ID}
|
|
sleep 5
|
|
fi
|
|
|
|
echo "✓ LXC ${LXC_ID} activ"
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "PASUL 2/7: INSTALARE DOCKER"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Verificare Docker instalat
|
|
if ${PVE_CMD} pct exec ${LXC_ID} -- which docker &>/dev/null; then
|
|
echo "✓ Docker deja instalat"
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker --version
|
|
else
|
|
echo "Instalare Docker..."
|
|
${PVE_CMD} pct exec ${LXC_ID} -- bash -c '
|
|
# Update package list
|
|
apt-get update
|
|
|
|
# Install prerequisites
|
|
apt-get install -y \
|
|
ca-certificates \
|
|
curl \
|
|
gnupg \
|
|
lsb-release
|
|
|
|
# Add Docker GPG key
|
|
mkdir -p /etc/apt/keyrings
|
|
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
|
|
|
# Add Docker repository
|
|
echo \
|
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
|
|
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
|
|
|
# Install Docker
|
|
apt-get update
|
|
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
|
|
|
# Enable and start Docker
|
|
systemctl enable docker
|
|
systemctl start docker
|
|
|
|
echo "Docker version:"
|
|
docker --version
|
|
'
|
|
echo "✓ Docker instalat"
|
|
fi
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "PASUL 3/7: DOWNLOAD ORACLE 21c XE IMAGE"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Verificare dacă image-ul există
|
|
if ${PVE_CMD} pct exec ${LXC_ID} -- docker images | grep -q "express.*21.3.0-xe"; then
|
|
echo "✓ Oracle XE image deja descărcat"
|
|
else
|
|
echo "Download Oracle 21c XE image (~ 2-3 GB)..."
|
|
echo "Durată estimată: 5-15 minute (depinde de conexiune)"
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker pull ${ORACLE_IMAGE}
|
|
echo "✓ Oracle XE image descărcat"
|
|
fi
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "PASUL 4/7: OPRIRE CONTAINER VECHI (dacă există)"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
if ${PVE_CMD} pct exec ${LXC_ID} -- docker ps -a | grep -q ${CONTAINER_NAME}; then
|
|
echo "Oprire și ștergere container vechi ${CONTAINER_NAME}..."
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker stop ${CONTAINER_NAME} 2>/dev/null || true
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker rm ${CONTAINER_NAME} 2>/dev/null || true
|
|
echo "✓ Container vechi șters"
|
|
else
|
|
echo "✓ Nu există container vechi"
|
|
fi
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "PASUL 5/7: START ORACLE 21c XE CONTAINER"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# Creare directoare pentru date
|
|
${PVE_CMD} pct exec ${LXC_ID} -- mkdir -p /opt/oracle/oradata
|
|
|
|
echo "Pornire container Oracle XE..."
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker run -d \
|
|
--name ${CONTAINER_NAME} \
|
|
--restart=unless-stopped \
|
|
-p 1521:1521 \
|
|
-p 5500:5500 \
|
|
-e ORACLE_PWD=${ORACLE_PWD} \
|
|
-e ORACLE_CHARACTERSET=AL32UTF8 \
|
|
-v /opt/oracle/oradata:/opt/oracle/oradata \
|
|
${ORACLE_IMAGE}
|
|
|
|
echo "✓ Container pornit"
|
|
echo ""
|
|
echo "Așteptare inițializare Oracle (~ 5-10 minute)..."
|
|
echo "Monitorizare log: docker logs -f ${CONTAINER_NAME}"
|
|
echo ""
|
|
|
|
# Așteptare până când Oracle este gata
|
|
TIMEOUT=600 # 10 minute
|
|
ELAPSED=0
|
|
INTERVAL=10
|
|
|
|
while [ $ELAPSED -lt $TIMEOUT ]; do
|
|
if ${PVE_CMD} pct exec ${LXC_ID} -- docker logs ${CONTAINER_NAME} 2>&1 | grep -q "DATABASE IS READY TO USE"; then
|
|
echo ""
|
|
echo "✓ Oracle 21c XE READY!"
|
|
break
|
|
fi
|
|
echo -n "."
|
|
sleep $INTERVAL
|
|
ELAPSED=$((ELAPSED + INTERVAL))
|
|
done
|
|
|
|
if [ $ELAPSED -ge $TIMEOUT ]; then
|
|
echo ""
|
|
echo "ERROR: Timeout așteptând Oracle să pornească!"
|
|
echo "Verifică log-urile: docker logs ${CONTAINER_NAME}"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "PASUL 6/7: ȘTERGERE XEPDB1 + CREARE PDB ROA"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
echo "Conectare la CDB și ștergere XEPDB1..."
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker exec ${CONTAINER_NAME} sqlplus -s sys/${ORACLE_PWD}@localhost:1521/XE as sysdba <<'EOF'
|
|
SET SERVEROUTPUT ON
|
|
WHENEVER SQLERROR CONTINUE
|
|
|
|
-- Închide și șterge XEPDB1
|
|
ALTER PLUGGABLE DATABASE xepdb1 CLOSE IMMEDIATE;
|
|
DROP PLUGGABLE DATABASE xepdb1 INCLUDING DATAFILES;
|
|
|
|
-- Verificare că XEPDB1 a fost șters
|
|
SELECT 'PDB după ștergere XEPDB1:' FROM DUAL;
|
|
SELECT name, open_mode FROM v$pdbs;
|
|
|
|
EXIT;
|
|
EOF
|
|
echo "✓ XEPDB1 șters"
|
|
echo ""
|
|
|
|
echo "Creare PDB ROA..."
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker exec ${CONTAINER_NAME} sqlplus -s sys/${ORACLE_PWD}@localhost:1521/XE as sysdba <<EOF
|
|
SET SERVEROUTPUT ON
|
|
WHENEVER SQLERROR EXIT SQL.SQLCODE
|
|
|
|
-- Creare PDB ROA
|
|
CREATE PLUGGABLE DATABASE roa
|
|
ADMIN USER pdb_admin IDENTIFIED BY ${ORACLE_PWD}
|
|
FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/roa/');
|
|
|
|
-- Deschide PDB ROA
|
|
ALTER PLUGGABLE DATABASE roa OPEN;
|
|
ALTER PLUGGABLE DATABASE roa SAVE STATE;
|
|
|
|
-- Verificare
|
|
SELECT name, open_mode FROM v\$pdbs WHERE name='ROA';
|
|
|
|
DBMS_OUTPUT.PUT_LINE('✓ PDB ROA creat și deschis!');
|
|
|
|
EXIT;
|
|
EOF
|
|
echo "✓ PDB ROA creat"
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "PASUL 7/7: PDB ROA2 (OPȚIONAL)"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
read -p "Vrei să creezi și PDB ROA2? (y/N): " -n 1 -r
|
|
echo ""
|
|
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
echo "Creare PDB ROA2..."
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker exec ${CONTAINER_NAME} sqlplus -s sys/${ORACLE_PWD}@localhost:1521/XE as sysdba <<EOF
|
|
SET SERVEROUTPUT ON
|
|
WHENEVER SQLERROR CONTINUE
|
|
|
|
-- Creare PDB ROA2
|
|
CREATE PLUGGABLE DATABASE roa2
|
|
ADMIN USER pdb_admin IDENTIFIED BY ${ORACLE_PWD}
|
|
FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/','/opt/oracle/oradata/XE/roa2/');
|
|
|
|
-- Deschide PDB ROA2
|
|
ALTER PLUGGABLE DATABASE roa2 OPEN;
|
|
ALTER PLUGGABLE DATABASE roa2 SAVE STATE;
|
|
|
|
-- Verificare
|
|
SELECT name, open_mode FROM v\$pdbs WHERE name='ROA2';
|
|
|
|
DBMS_OUTPUT.PUT_LINE('✓ PDB ROA2 creat și deschis!');
|
|
|
|
EXIT;
|
|
EOF
|
|
echo "✓ PDB ROA2 creat"
|
|
else
|
|
echo "✓ PDB ROA2 omis"
|
|
fi
|
|
echo ""
|
|
|
|
echo "=========================================="
|
|
echo "✅ INSTALARE ORACLE 21c XE COMPLETĂ!"
|
|
echo "=========================================="
|
|
echo ""
|
|
echo "Detalii instalare:"
|
|
echo " - LXC: ${LXC_ID}"
|
|
echo " - Container: ${CONTAINER_NAME}"
|
|
echo " - CDB: XE"
|
|
echo " - PDB: ROA (și ROA2 dacă ai creat)"
|
|
echo " - XEPDB1: ȘTERS"
|
|
echo ""
|
|
echo "Conexiuni:"
|
|
echo " - CDB: sys/${ORACLE_PWD}@${PROXMOX_HOST}:1521/XE as sysdba"
|
|
echo " - PDB ROA: sys/${ORACLE_PWD}@${PROXMOX_HOST}:1521/roa as sysdba"
|
|
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
echo " - PDB ROA2: sys/${ORACLE_PWD}@${PROXMOX_HOST}:1521/roa2 as sysdba"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Test conexiune:"
|
|
echo " ${PVE_CMD} pct exec ${LXC_ID} -- docker exec -it ${CONTAINER_NAME} sqlplus sys/${ORACLE_PWD}@localhost:1521/roa as sysdba"
|
|
echo ""
|
|
echo "Verificare PDB-uri:"
|
|
${PVE_CMD} pct exec ${LXC_ID} -- docker exec ${CONTAINER_NAME} sqlplus -s sys/${ORACLE_PWD}@localhost:1521/XE as sysdba <<'EOF'
|
|
SET PAGESIZE 50
|
|
SELECT con_id, name, open_mode, restricted FROM v$pdbs ORDER BY con_id;
|
|
EXIT;
|
|
EOF
|
|
echo ""
|
|
echo "Management container:"
|
|
echo " Start: ${PVE_CMD} pct exec ${LXC_ID} -- docker start ${CONTAINER_NAME}"
|
|
echo " Stop: ${PVE_CMD} pct exec ${LXC_ID} -- docker stop ${CONTAINER_NAME}"
|
|
echo " Logs: ${PVE_CMD} pct exec ${LXC_ID} -- docker logs -f ${CONTAINER_NAME}"
|
|
echo " Shell: ${PVE_CMD} pct exec ${LXC_ID} -- docker exec -it ${CONTAINER_NAME} bash"
|
|
echo ""
|
|
echo "Următorul pas: 01-setup-oracle21c.sh (pentru tablespace + useri)"
|
|
echo ""
|