proxmox monitori
This commit is contained in:
@@ -1,261 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script pentru instalare Oracle XE 21c în Docker LXC (Proxmox)
|
||||
# Rulează DUPĂ crearea containerului Docker LXC cu scriptul comunității
|
||||
#
|
||||
# Utilizare:
|
||||
# 1. Creează mai întâi Docker LXC cu: bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)"
|
||||
# - Alege: Privileged (Yes)
|
||||
# - RAM: minim 4096 MB (recomandat 6144 MB)
|
||||
# - Disk: minim 20 GB
|
||||
# - Cores: minim 2
|
||||
# 2. Copiază acest script în container și rulează-l
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# Configurări
|
||||
ORACLE_PASSWORD="${ORACLE_PASSWORD:-OraclePass123}"
|
||||
ORACLE_PORT="${ORACLE_PORT:-1521}"
|
||||
ORACLE_EM_PORT="${ORACLE_EM_PORT:-5500}"
|
||||
CONTAINER_NAME="oracle-xe"
|
||||
APP_USER="appuser"
|
||||
APP_PASSWORD="${APP_PASSWORD:-AppPass123}"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Oracle XE 21c Docker Deployment Script"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Configurări:"
|
||||
echo " - Container Name: $CONTAINER_NAME"
|
||||
echo " - Oracle SYS Password: $ORACLE_PASSWORD"
|
||||
echo " - Oracle Port: $ORACLE_PORT"
|
||||
echo " - Enterprise Manager Port: $ORACLE_EM_PORT"
|
||||
echo " - App User: $APP_USER"
|
||||
echo " - App Password: $APP_PASSWORD"
|
||||
echo ""
|
||||
|
||||
# Verificare Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker nu este instalat! Asigură-te că ai creat containerul cu scriptul Docker LXC."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ Docker este instalat: $(docker --version)"
|
||||
|
||||
# Verificare dacă containerul Oracle XE există deja
|
||||
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
echo "⚠️ Containerul $CONTAINER_NAME există deja."
|
||||
read -p "Dorești să-l ștergi și să creezi unul nou? (y/n): " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "Ștergere container existent..."
|
||||
docker stop $CONTAINER_NAME 2>/dev/null || true
|
||||
docker rm $CONTAINER_NAME 2>/dev/null || true
|
||||
echo "✅ Container șters"
|
||||
else
|
||||
echo "Script anulat."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Creare directoare pentru persistență
|
||||
echo ""
|
||||
echo "📁 Creare directoare pentru persistență..."
|
||||
mkdir -p /opt/oracle/oradata
|
||||
mkdir -p /opt/oracle/scripts/setup
|
||||
mkdir -p /opt/oracle/scripts/startup
|
||||
chmod -R 777 /opt/oracle
|
||||
echo "✅ Directoare create"
|
||||
|
||||
# Download imagine Oracle XE
|
||||
echo ""
|
||||
echo "📥 Download imagine Oracle XE 21c (poate dura câteva minute)..."
|
||||
if docker pull container-registry.oracle.com/database/express:21.3.0-xe; then
|
||||
echo "✅ Imagine descărcată cu succes"
|
||||
else
|
||||
echo "❌ Eroare la descărcare imagine. Verifică conexiunea la internet."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Creare script de inițializare pentru user-ul aplicației
|
||||
echo ""
|
||||
echo "📝 Creare script de inițializare..."
|
||||
cat > /opt/oracle/scripts/startup/01_create_app_user.sql <<EOF
|
||||
-- Creare user pentru aplicații
|
||||
ALTER SESSION SET "_ORACLE_SCRIPT"=true;
|
||||
|
||||
-- Drop user dacă există
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'DROP USER ${APP_USER} CASCADE';
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
NULL;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Creare user nou
|
||||
CREATE USER ${APP_USER} IDENTIFIED BY "${APP_PASSWORD}";
|
||||
GRANT CONNECT, RESOURCE TO ${APP_USER};
|
||||
GRANT CREATE SESSION TO ${APP_USER};
|
||||
GRANT CREATE TABLE TO ${APP_USER};
|
||||
GRANT CREATE VIEW TO ${APP_USER};
|
||||
GRANT CREATE PROCEDURE TO ${APP_USER};
|
||||
GRANT CREATE SEQUENCE TO ${APP_USER};
|
||||
GRANT UNLIMITED TABLESPACE TO ${APP_USER};
|
||||
GRANT SELECT ANY DICTIONARY TO ${APP_USER};
|
||||
|
||||
-- Afișare confirmare
|
||||
SELECT 'User ${APP_USER} created successfully' AS status FROM dual;
|
||||
EXIT;
|
||||
EOF
|
||||
|
||||
echo "✅ Script de inițializare creat"
|
||||
|
||||
# Rulare container Oracle XE
|
||||
echo ""
|
||||
echo "🚀 Pornire container Oracle XE..."
|
||||
docker run -d \
|
||||
--name $CONTAINER_NAME \
|
||||
-p $ORACLE_PORT:1521 \
|
||||
-p $ORACLE_EM_PORT:5500 \
|
||||
-e ORACLE_PWD=$ORACLE_PASSWORD \
|
||||
-e ORACLE_CHARACTERSET=AL32UTF8 \
|
||||
-v /opt/oracle/oradata:/opt/oracle/oradata \
|
||||
-v /opt/oracle/scripts/setup:/opt/oracle/scripts/setup \
|
||||
-v /opt/oracle/scripts/startup:/opt/oracle/scripts/startup \
|
||||
--restart unless-stopped \
|
||||
--shm-size=1g \
|
||||
container-registry.oracle.com/database/express:21.3.0-xe
|
||||
|
||||
echo "✅ Container pornit"
|
||||
|
||||
# Așteptare până DB este ready
|
||||
echo ""
|
||||
echo "⏳ Așteptare inițializare bază de date (poate dura 5-10 minute)..."
|
||||
echo " Monitorizare logs în timp real..."
|
||||
echo ""
|
||||
|
||||
# Funcție pentru verificare status
|
||||
check_db_ready() {
|
||||
docker logs $CONTAINER_NAME 2>&1 | grep -q "DATABASE IS READY TO USE!" && return 0 || return 1
|
||||
}
|
||||
|
||||
# Monitorizare logs cu timeout
|
||||
TIMEOUT=600 # 10 minute
|
||||
ELAPSED=0
|
||||
INTERVAL=10
|
||||
|
||||
while [ $ELAPSED -lt $TIMEOUT ]; do
|
||||
if check_db_ready; then
|
||||
echo ""
|
||||
echo "✅ Baza de date este gata!"
|
||||
break
|
||||
fi
|
||||
echo -ne "\r⏳ Așteptare... ${ELAPSED}s / ${TIMEOUT}s"
|
||||
sleep $INTERVAL
|
||||
ELAPSED=$((ELAPSED + INTERVAL))
|
||||
done
|
||||
|
||||
if [ $ELAPSED -ge $TIMEOUT ]; then
|
||||
echo ""
|
||||
echo "❌ Timeout la inițializare. Verifică logs cu: docker logs $CONTAINER_NAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test conexiune
|
||||
echo ""
|
||||
echo "🔍 Verificare conexiune la baza de date..."
|
||||
sleep 5 # Extra timp pentru stabilizare
|
||||
|
||||
# Test conexiune SYS
|
||||
if docker exec $CONTAINER_NAME sqlplus -s sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba <<< "SELECT 'Connected' FROM dual;" | grep -q "Connected"; then
|
||||
echo "✅ Conexiune SYS funcțională"
|
||||
else
|
||||
echo "❌ Nu se poate conecta ca SYS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test conexiune APP USER
|
||||
if docker exec $CONTAINER_NAME sqlplus -s $APP_USER/$APP_PASSWORD@localhost:1521/XE <<< "SELECT 'Connected' FROM dual;" 2>/dev/null | grep -q "Connected"; then
|
||||
echo "✅ User $APP_USER funcțional"
|
||||
else
|
||||
echo "⚠️ User $APP_USER nu există încă (normal la prima rulare)"
|
||||
fi
|
||||
|
||||
# Obținere IP container
|
||||
echo ""
|
||||
echo "📊 Informații de conexiune:"
|
||||
echo "=========================================="
|
||||
IP_ADDRESS=$(hostname -I | awk '{print $1}')
|
||||
echo "IP Container LXC: $IP_ADDRESS"
|
||||
echo "Port Oracle: $ORACLE_PORT"
|
||||
echo "Port Enterprise Manager: $ORACLE_EM_PORT"
|
||||
echo ""
|
||||
echo "String-uri de conexiune:"
|
||||
echo " SQL*Plus (SYS): sqlplus sys/$ORACLE_PASSWORD@$IP_ADDRESS:$ORACLE_PORT/XE as sysdba"
|
||||
echo " SQL*Plus (App): sqlplus $APP_USER/$APP_PASSWORD@$IP_ADDRESS:$ORACLE_PORT/XE"
|
||||
echo " JDBC URL: jdbc:oracle:thin:@$IP_ADDRESS:$ORACLE_PORT:XE"
|
||||
echo " Enterprise Manager: http://$IP_ADDRESS:$ORACLE_EM_PORT/em"
|
||||
echo " User/Pass EM: sys/$ORACLE_PASSWORD (connect as SYSDBA)"
|
||||
echo ""
|
||||
echo "Conexiune din WSL/Windows:"
|
||||
echo " Folosește IP-ul: $IP_ADDRESS în loc de localhost"
|
||||
echo "=========================================="
|
||||
|
||||
# Creare script helper pentru management
|
||||
echo ""
|
||||
echo "📝 Creare scripturi helper..."
|
||||
|
||||
# Script status
|
||||
cat > /usr/local/bin/oracle-status <<'EOF'
|
||||
#!/bin/bash
|
||||
echo "=== Oracle XE Status ==="
|
||||
docker ps --filter "name=oracle-xe" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||||
echo ""
|
||||
echo "=== Database Status ==="
|
||||
docker exec oracle-xe lsnrctl status 2>/dev/null | grep -E "Instance|Service|Listening" || echo "Listener not ready"
|
||||
EOF
|
||||
chmod +x /usr/local/bin/oracle-status
|
||||
|
||||
# Script SQL*Plus
|
||||
cat > /usr/local/bin/oracle-sqlplus <<EOF
|
||||
#!/bin/bash
|
||||
docker exec -it oracle-xe sqlplus sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba
|
||||
EOF
|
||||
chmod +x /usr/local/bin/oracle-sqlplus
|
||||
|
||||
# Script logs
|
||||
cat > /usr/local/bin/oracle-logs <<'EOF'
|
||||
#!/bin/bash
|
||||
docker logs -f oracle-xe
|
||||
EOF
|
||||
chmod +x /usr/local/bin/oracle-logs
|
||||
|
||||
# Script restart
|
||||
cat > /usr/local/bin/oracle-restart <<'EOF'
|
||||
#!/bin/bash
|
||||
echo "Restarting Oracle XE..."
|
||||
docker restart oracle-xe
|
||||
echo "Done. Check status with: oracle-status"
|
||||
EOF
|
||||
chmod +x /usr/local/bin/oracle-restart
|
||||
|
||||
echo "✅ Scripturi helper create:"
|
||||
echo " - oracle-status : Verifică status-ul Oracle XE"
|
||||
echo " - oracle-sqlplus : Conectare rapidă SQL*Plus ca SYS"
|
||||
echo " - oracle-logs : Vizualizare logs în timp real"
|
||||
echo " - oracle-restart : Restart container Oracle XE"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "✅ INSTALARE COMPLETĂ!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Pentru a verifica status-ul: oracle-status"
|
||||
echo "Pentru SQL*Plus rapid: oracle-sqlplus"
|
||||
echo ""
|
||||
echo "IMPORTANT: Salvează parolele în siguranță!"
|
||||
echo " - SYS Password: $ORACLE_PASSWORD"
|
||||
echo " - App Password: $APP_PASSWORD"
|
||||
echo ""
|
||||
@@ -1,886 +0,0 @@
|
||||
# Plan Complet Migrare Oracle 10g → Oracle XE 21c
|
||||
|
||||
## 1. Prezentare Generală
|
||||
|
||||
### Context Migrare
|
||||
- **Sursă**: Oracle 10g Standard Edition pe Windows 7
|
||||
- IP: 10.0.20.122
|
||||
- Port: 1521
|
||||
- Service: ROA
|
||||
- Versiune: Oracle 10g
|
||||
- OS: Windows 7
|
||||
|
||||
- **Destinație**: Oracle XE 21c în Docker LXC pe Proxmox
|
||||
- IP: 10.0.20.105
|
||||
- Port: 1521
|
||||
- PDB: ROA (sau ROA2)
|
||||
- Versiune: Oracle 21c Express Edition
|
||||
- Container: Docker în LXC (ID: 108)
|
||||
|
||||
### Scheme de Migrat
|
||||
1. **CONTAFIN_ORACLE** - Schema principală contabilitate
|
||||
2. **MARIUSM_AUTO** - Schema secundară
|
||||
3. **Obiecte custom din SYS** - Tabele, view-uri, proceduri, packages create manual în SYS
|
||||
|
||||
### Cerințe Speciale
|
||||
- **Grant-uri către CONTAFIN_ORACLE** - Toate privilegiile acordate acestei scheme
|
||||
- **Grant-uri către PUBLIC** - Privilegii publice pentru obiectele din scheme
|
||||
- **Sinonime publice** - Toate sinonimele publice pentru acces simplificat
|
||||
- **Dependințe cross-schema** - Legături între scheme și obiecte SYS
|
||||
|
||||
## 2. Provocări Tehnice
|
||||
|
||||
### Diferența de Versiuni
|
||||
- **Salt major**: 11 versiuni Oracle (10g → 21c)
|
||||
- **Deprecated features**: Multiple funcționalități eliminate sau modificate
|
||||
- **Sintaxă SQL**: Unele comenzi necesită adaptare
|
||||
- **Character set**: Posibile probleme de encoding
|
||||
- **Arhitectură**: Trecere de la non-CDB la CDB/PDB
|
||||
|
||||
### Compatibilitate Export/Import
|
||||
- **Data Pump**: Nu funcționează între 10g și 21c direct
|
||||
- **Export tradițional (exp/imp)**: Metodă recomandată pentru compatibilitate
|
||||
- **DDL manual**: Extragere folosind DBMS_METADATA pentru control complet
|
||||
|
||||
## 3. Strategia de Migrare - 3 Faze
|
||||
|
||||
### Faza 1: Analiză și Extragere Metadata
|
||||
|
||||
#### Script: `oracle-analyze-source.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Analiză completă a bazei de date sursă Oracle 10g
|
||||
|
||||
SOURCE_DB="10.0.20.122:1521/ROA"
|
||||
SOURCE_USER="system"
|
||||
SOURCE_PASS="your_password"
|
||||
|
||||
# Conectare și analiză
|
||||
sqlplus -S $SOURCE_USER/$SOURCE_PASS@$SOURCE_DB <<'EOF'
|
||||
SET LONG 1000000
|
||||
SET PAGESIZE 0
|
||||
SET LINESIZE 1000
|
||||
SET FEEDBACK OFF
|
||||
SET VERIFY OFF
|
||||
SET TRIMSPOOL ON
|
||||
|
||||
-- 1. INVENTAR OBIECTE PRINCIPALE
|
||||
SPOOL object_inventory.txt
|
||||
SELECT owner || '.' || object_type || '.' || object_name AS object_full_name,
|
||||
status,
|
||||
created,
|
||||
last_ddl_time
|
||||
FROM dba_objects
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
OR (owner = 'SYS' AND
|
||||
(object_name LIKE '%CONTAFIN%' OR
|
||||
object_name IN (
|
||||
SELECT DISTINCT referenced_name
|
||||
FROM dba_dependencies
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND referenced_owner = 'SYS'
|
||||
)
|
||||
)
|
||||
)
|
||||
ORDER BY owner, object_type, object_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 2. ANALIZA GRANT-URI
|
||||
SPOOL grants_analysis.txt
|
||||
-- Grant-uri pe obiecte
|
||||
SELECT 'OBJECT_GRANT:' || owner || '.' || table_name || ':' ||
|
||||
privilege || ':TO:' || grantee ||
|
||||
CASE WHEN grantable = 'YES' THEN ':WITH_GRANT_OPTION' ELSE '' END
|
||||
FROM dba_tab_privs
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
OR grantee IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO', 'PUBLIC')
|
||||
ORDER BY owner, table_name, grantee, privilege;
|
||||
|
||||
-- Grant-uri de sistem
|
||||
SELECT 'SYSTEM_GRANT:' || privilege || ':TO:' || grantee ||
|
||||
CASE WHEN admin_option = 'YES' THEN ':WITH_ADMIN_OPTION' ELSE '' END
|
||||
FROM dba_sys_privs
|
||||
WHERE grantee IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY grantee, privilege;
|
||||
|
||||
-- Roluri
|
||||
SELECT 'ROLE_GRANT:' || granted_role || ':TO:' || grantee ||
|
||||
CASE WHEN admin_option = 'YES' THEN ':WITH_ADMIN_OPTION' ELSE '' END
|
||||
FROM dba_role_privs
|
||||
WHERE grantee IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY grantee, granted_role;
|
||||
SPOOL OFF
|
||||
|
||||
-- 3. ANALIZA SINONIME PUBLICE
|
||||
SPOOL public_synonyms_analysis.txt
|
||||
SELECT 'PUBLIC_SYNONYM:' || synonym_name || ':FOR:' ||
|
||||
table_owner || '.' || table_name
|
||||
FROM dba_synonyms
|
||||
WHERE owner = 'PUBLIC'
|
||||
AND (table_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
OR synonym_name IN (
|
||||
SELECT DISTINCT referenced_name
|
||||
FROM dba_dependencies
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND referenced_type = 'SYNONYM'
|
||||
))
|
||||
ORDER BY synonym_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 4. ANALIZA DEPENDINTE
|
||||
SPOOL dependencies_analysis.txt
|
||||
SELECT owner || '.' || name || ' (' || type || ') DEPENDS_ON ' ||
|
||||
referenced_owner || '.' || referenced_name || ' (' || referenced_type || ')'
|
||||
FROM dba_dependencies
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO', 'SYS')
|
||||
AND (owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
OR referenced_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO'))
|
||||
ORDER BY owner, name, referenced_owner, referenced_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 5. STATISTICI TABELE (pentru validare post-migrare)
|
||||
SPOOL table_statistics.txt
|
||||
SELECT owner || '.' || table_name || ':ROWS=' || num_rows
|
||||
FROM dba_tables
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY owner, table_name;
|
||||
SPOOL OFF
|
||||
|
||||
EXIT;
|
||||
EOF
|
||||
```
|
||||
|
||||
### Faza 2: Export din Oracle 10g
|
||||
|
||||
#### Script: `oracle-export-10g.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Export complet din Oracle 10g cu toate dependințele
|
||||
|
||||
export ORACLE_HOME=/path/to/oracle/10g
|
||||
export PATH=$ORACLE_HOME/bin:$PATH
|
||||
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
|
||||
|
||||
EXPORT_DIR="/backup/oracle_migration"
|
||||
SOURCE_DB="10.0.20.122:1521/ROA"
|
||||
SYSTEM_USER="system"
|
||||
SYSTEM_PASS="your_password"
|
||||
|
||||
# Creare director export
|
||||
mkdir -p $EXPORT_DIR
|
||||
cd $EXPORT_DIR
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 1: Export DDL cu DBMS_METADATA"
|
||||
echo "========================================"
|
||||
|
||||
sqlplus -S $SYSTEM_USER/$SYSTEM_PASS@$SOURCE_DB <<'EOF'
|
||||
SET LONG 1000000
|
||||
SET PAGESIZE 0
|
||||
SET LINESIZE 1000
|
||||
SET FEEDBACK OFF
|
||||
SET VERIFY OFF
|
||||
SET TRIMSPOOL ON
|
||||
|
||||
-- Configurare DBMS_METADATA pentru output curat
|
||||
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
|
||||
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',false);
|
||||
EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',false);
|
||||
|
||||
-- 1. Export CREATE USER statements
|
||||
SPOOL 01_create_users.sql
|
||||
SELECT '-- User: ' || username FROM dba_users
|
||||
WHERE username IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO');
|
||||
|
||||
SELECT DBMS_METADATA.GET_DDL('USER', username) || '/'
|
||||
FROM dba_users
|
||||
WHERE username IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO');
|
||||
SPOOL OFF
|
||||
|
||||
-- 2. Export Tables DDL
|
||||
SPOOL 02_create_tables.sql
|
||||
SELECT DBMS_METADATA.GET_DDL('TABLE', table_name, owner) || '/'
|
||||
FROM dba_tables
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY owner, table_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 3. Export Indexes
|
||||
SPOOL 03_create_indexes.sql
|
||||
SELECT DBMS_METADATA.GET_DDL('INDEX', index_name, owner) || '/'
|
||||
FROM dba_indexes
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND index_type != 'LOB'
|
||||
ORDER BY owner, index_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 4. Export Constraints
|
||||
SPOOL 04_create_constraints.sql
|
||||
SELECT DBMS_METADATA.GET_DDL('CONSTRAINT', constraint_name, owner) || '/'
|
||||
FROM dba_constraints
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND constraint_type IN ('P', 'U', 'C', 'R')
|
||||
ORDER BY
|
||||
CASE constraint_type
|
||||
WHEN 'P' THEN 1
|
||||
WHEN 'U' THEN 2
|
||||
WHEN 'C' THEN 3
|
||||
WHEN 'R' THEN 4
|
||||
END,
|
||||
owner, constraint_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 5. Export Views
|
||||
SPOOL 05_create_views.sql
|
||||
SELECT DBMS_METADATA.GET_DDL('VIEW', view_name, owner) || '/'
|
||||
FROM dba_views
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY owner, view_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 6. Export Sequences
|
||||
SPOOL 06_create_sequences.sql
|
||||
SELECT DBMS_METADATA.GET_DDL('SEQUENCE', sequence_name, sequence_owner) || '/'
|
||||
FROM dba_sequences
|
||||
WHERE sequence_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY sequence_owner, sequence_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 7. Export Procedures, Functions, Packages
|
||||
SPOOL 07_create_code_objects.sql
|
||||
SELECT DBMS_METADATA.GET_DDL(object_type, object_name, owner) || '/'
|
||||
FROM dba_objects
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND object_type IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY', 'TYPE', 'TYPE BODY')
|
||||
ORDER BY owner,
|
||||
CASE object_type
|
||||
WHEN 'TYPE' THEN 1
|
||||
WHEN 'TYPE BODY' THEN 2
|
||||
WHEN 'PACKAGE' THEN 3
|
||||
WHEN 'PACKAGE BODY' THEN 4
|
||||
WHEN 'FUNCTION' THEN 5
|
||||
WHEN 'PROCEDURE' THEN 6
|
||||
END,
|
||||
object_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 8. Export Triggers
|
||||
SPOOL 08_create_triggers.sql
|
||||
SELECT DBMS_METADATA.GET_DDL('TRIGGER', trigger_name, owner) || '/'
|
||||
FROM dba_triggers
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY owner, trigger_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 9. Export Grants
|
||||
SPOOL 09_grants.sql
|
||||
-- Object privileges
|
||||
SELECT 'GRANT ' || privilege || ' ON ' || owner || '.' || table_name ||
|
||||
' TO ' || grantee ||
|
||||
DECODE(grantable, 'YES', ' WITH GRANT OPTION', '') || ';'
|
||||
FROM dba_tab_privs
|
||||
WHERE (owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
OR grantee IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO'))
|
||||
ORDER BY owner, table_name, grantee, privilege;
|
||||
|
||||
-- System privileges
|
||||
SELECT 'GRANT ' || privilege || ' TO ' || grantee ||
|
||||
DECODE(admin_option, 'YES', ' WITH ADMIN OPTION', '') || ';'
|
||||
FROM dba_sys_privs
|
||||
WHERE grantee IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY grantee, privilege;
|
||||
|
||||
-- Role privileges
|
||||
SELECT 'GRANT ' || granted_role || ' TO ' || grantee ||
|
||||
DECODE(admin_option, 'YES', ' WITH ADMIN OPTION', '') || ';'
|
||||
FROM dba_role_privs
|
||||
WHERE grantee IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY grantee, granted_role;
|
||||
SPOOL OFF
|
||||
|
||||
-- 10. Export Public Synonyms
|
||||
SPOOL 10_public_synonyms.sql
|
||||
SELECT 'CREATE OR REPLACE PUBLIC SYNONYM ' || synonym_name ||
|
||||
' FOR ' || table_owner || '.' || table_name || ';'
|
||||
FROM dba_synonyms
|
||||
WHERE owner = 'PUBLIC'
|
||||
AND table_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
ORDER BY synonym_name;
|
||||
SPOOL OFF
|
||||
|
||||
-- 11. Export obiecte custom din SYS (dacă există)
|
||||
SPOOL 11_sys_custom_objects.sql
|
||||
-- Identificare obiecte custom
|
||||
SELECT '-- Custom object in SYS: ' || object_name || ' (' || object_type || ')'
|
||||
FROM dba_objects
|
||||
WHERE owner = 'SYS'
|
||||
AND (object_name LIKE '%CONTAFIN%'
|
||||
OR object_name IN (
|
||||
SELECT DISTINCT referenced_name
|
||||
FROM dba_dependencies
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND referenced_owner = 'SYS'
|
||||
AND referenced_name NOT IN (
|
||||
SELECT object_name
|
||||
FROM dba_objects
|
||||
WHERE owner = 'SYS'
|
||||
AND created < (SELECT MIN(created) FROM dba_users WHERE username = 'CONTAFIN_ORACLE')
|
||||
)
|
||||
))
|
||||
AND object_type IN ('TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
|
||||
|
||||
-- Export DDL pentru aceste obiecte
|
||||
SELECT DBMS_METADATA.GET_DDL(object_type, object_name, 'SYS') || '/'
|
||||
FROM dba_objects
|
||||
WHERE owner = 'SYS'
|
||||
AND object_name LIKE '%CONTAFIN%'
|
||||
AND object_type IN ('TABLE', 'VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY');
|
||||
SPOOL OFF
|
||||
|
||||
EXIT;
|
||||
EOF
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 2: Export DATE cu EXP (traditional)"
|
||||
echo "========================================"
|
||||
|
||||
# Export cu exp (compatibil între versiuni)
|
||||
exp $SYSTEM_USER/$SYSTEM_PASS@$SOURCE_DB \
|
||||
file=contafin_data.dmp \
|
||||
log=contafin_export.log \
|
||||
owner=CONTAFIN_ORACLE,MARIUSM_AUTO \
|
||||
statistics=none \
|
||||
compress=n \
|
||||
consistent=y \
|
||||
feedback=10000 \
|
||||
buffer=10485760 \
|
||||
direct=n
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 3: Arhivare și pregătire transfer"
|
||||
echo "========================================"
|
||||
|
||||
# Creare arhivă cu toate fișierele
|
||||
tar -czf oracle_migration_$(date +%Y%m%d_%H%M%S).tar.gz *.sql *.dmp *.log *.txt
|
||||
|
||||
echo "Export complet finalizat!"
|
||||
echo "Fișiere generate:"
|
||||
ls -la *.sql *.dmp *.log *.txt
|
||||
```
|
||||
|
||||
### Faza 3: Import în Oracle XE 21c
|
||||
|
||||
#### Script: `oracle-import-21c.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Import complet în Oracle XE 21c cu recrearea completă a mediului
|
||||
|
||||
# Configurare
|
||||
DEST_HOST="10.0.20.105"
|
||||
DEST_PORT="1521"
|
||||
DEST_PDB="ROA" # sau ROA2
|
||||
SYS_PASS="OraclePass123"
|
||||
IMPORT_DIR="/tmp/oracle_import"
|
||||
|
||||
# Setare environment pentru Oracle 21c în container
|
||||
DOCKER_CONTAINER="oracle-xe"
|
||||
PROXMOX_HOST="10.0.20.201"
|
||||
LXC_CONTAINER="108"
|
||||
|
||||
echo "========================================"
|
||||
echo "PREGĂTIRE IMPORT ORACLE XE 21c"
|
||||
echo "========================================"
|
||||
|
||||
# Funcție pentru executare comenzi în Oracle via Docker
|
||||
run_oracle_sql() {
|
||||
local SQL_COMMAND="$1"
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec -i $DOCKER_CONTAINER sqlplus -s sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba" <<< "$SQL_COMMAND"
|
||||
}
|
||||
|
||||
# Funcție pentru executare imp în container
|
||||
run_oracle_imp() {
|
||||
local IMP_PARAMS="$1"
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec $DOCKER_CONTAINER imp sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba $IMP_PARAMS"
|
||||
}
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 1: Pregătire mediu destinație"
|
||||
echo "========================================"
|
||||
|
||||
run_oracle_sql "
|
||||
-- Verificare și creare tablespace-uri
|
||||
DECLARE
|
||||
v_exists NUMBER;
|
||||
BEGIN
|
||||
-- Verificare și creare CONTAFIN_DATA
|
||||
SELECT COUNT(*) INTO v_exists FROM dba_tablespaces WHERE tablespace_name = 'CONTAFIN_DATA';
|
||||
IF v_exists = 0 THEN
|
||||
EXECUTE IMMEDIATE 'CREATE TABLESPACE CONTAFIN_DATA
|
||||
DATAFILE ''/opt/oracle/oradata/XE/$DEST_PDB/contafin_data01.dbf''
|
||||
SIZE 1G AUTOEXTEND ON MAXSIZE 10G';
|
||||
DBMS_OUTPUT.PUT_LINE('Tablespace CONTAFIN_DATA creat.');
|
||||
END IF;
|
||||
|
||||
-- Verificare și creare CONTAFIN_INDEX
|
||||
SELECT COUNT(*) INTO v_exists FROM dba_tablespaces WHERE tablespace_name = 'CONTAFIN_INDEX';
|
||||
IF v_exists = 0 THEN
|
||||
EXECUTE IMMEDIATE 'CREATE TABLESPACE CONTAFIN_INDEX
|
||||
DATAFILE ''/opt/oracle/oradata/XE/$DEST_PDB/contafin_index01.dbf''
|
||||
SIZE 500M AUTOEXTEND ON MAXSIZE 5G';
|
||||
DBMS_OUTPUT.PUT_LINE('Tablespace CONTAFIN_INDEX creat.');
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Drop și recreare useri (pentru clean import)
|
||||
BEGIN
|
||||
FOR usr IN (SELECT username FROM dba_users WHERE username IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')) LOOP
|
||||
EXECUTE IMMEDIATE 'DROP USER ' || usr.username || ' CASCADE';
|
||||
END LOOP;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Creare useri noi
|
||||
CREATE USER CONTAFIN_ORACLE
|
||||
IDENTIFIED BY contafin_pass
|
||||
DEFAULT TABLESPACE CONTAFIN_DATA
|
||||
TEMPORARY TABLESPACE TEMP
|
||||
QUOTA UNLIMITED ON CONTAFIN_DATA
|
||||
QUOTA UNLIMITED ON CONTAFIN_INDEX
|
||||
QUOTA UNLIMITED ON USERS;
|
||||
|
||||
CREATE USER MARIUSM_AUTO
|
||||
IDENTIFIED BY mariusm_pass
|
||||
DEFAULT TABLESPACE CONTAFIN_DATA
|
||||
TEMPORARY TABLESPACE TEMP
|
||||
QUOTA UNLIMITED ON CONTAFIN_DATA
|
||||
QUOTA UNLIMITED ON USERS;
|
||||
|
||||
-- Acordare privilegii minime necesare pentru import
|
||||
GRANT CONNECT, RESOURCE TO CONTAFIN_ORACLE;
|
||||
GRANT CONNECT, RESOURCE TO MARIUSM_AUTO;
|
||||
GRANT CREATE VIEW TO CONTAFIN_ORACLE;
|
||||
GRANT CREATE VIEW TO MARIUSM_AUTO;
|
||||
GRANT CREATE SYNONYM TO CONTAFIN_ORACLE;
|
||||
GRANT CREATE SYNONYM TO MARIUSM_AUTO;
|
||||
GRANT CREATE PROCEDURE TO CONTAFIN_ORACLE;
|
||||
GRANT CREATE PROCEDURE TO MARIUSM_AUTO;
|
||||
GRANT CREATE SEQUENCE TO CONTAFIN_ORACLE;
|
||||
GRANT CREATE SEQUENCE TO MARIUSM_AUTO;
|
||||
GRANT CREATE TRIGGER TO CONTAFIN_ORACLE;
|
||||
GRANT CREATE TRIGGER TO MARIUSM_AUTO;
|
||||
GRANT CREATE ANY SYNONYM TO CONTAFIN_ORACLE;
|
||||
GRANT CREATE PUBLIC SYNONYM TO CONTAFIN_ORACLE;
|
||||
GRANT DROP PUBLIC SYNONYM TO CONTAFIN_ORACLE;
|
||||
|
||||
-- Privilegii pentru import
|
||||
GRANT IMP_FULL_DATABASE TO CONTAFIN_ORACLE;
|
||||
GRANT IMP_FULL_DATABASE TO MARIUSM_AUTO;
|
||||
|
||||
SELECT 'Useri creați și configurați' AS status FROM dual;
|
||||
"
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 2: Transfer fișiere în container"
|
||||
echo "========================================"
|
||||
|
||||
# Copierea fișierelor în container Oracle
|
||||
scp $IMPORT_DIR/*.dmp $IMPORT_DIR/*.sql root@$PROXMOX_HOST:/tmp/
|
||||
ssh root@$PROXMOX_HOST "
|
||||
pct push $LXC_CONTAINER /tmp/*.dmp /tmp/
|
||||
pct push $LXC_CONTAINER /tmp/*.sql /tmp/
|
||||
pct exec $LXC_CONTAINER -- docker cp /tmp/contafin_data.dmp $DOCKER_CONTAINER:/tmp/
|
||||
pct exec $LXC_CONTAINER -- docker cp /tmp/*.sql $DOCKER_CONTAINER:/tmp/
|
||||
"
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 3: Import structură (DDL)"
|
||||
echo "========================================"
|
||||
|
||||
# Rulare scripturi DDL în ordine
|
||||
for script in 01_create_users.sql 02_create_tables.sql 03_create_indexes.sql \
|
||||
04_create_constraints.sql 05_create_views.sql 06_create_sequences.sql \
|
||||
07_create_code_objects.sql 08_create_triggers.sql; do
|
||||
echo "Executare $script..."
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec -i $DOCKER_CONTAINER sqlplus -s sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba @/tmp/$script"
|
||||
done
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 4: Import date cu IMP"
|
||||
echo "========================================"
|
||||
|
||||
# Import date folosind imp tradițional
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec $DOCKER_CONTAINER bash -c '
|
||||
imp sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba \
|
||||
file=/tmp/contafin_data.dmp \
|
||||
log=/tmp/import_data.log \
|
||||
fromuser=CONTAFIN_ORACLE,MARIUSM_AUTO \
|
||||
touser=CONTAFIN_ORACLE,MARIUSM_AUTO \
|
||||
ignore=y \
|
||||
rows=y \
|
||||
indexes=n \
|
||||
constraints=n \
|
||||
grants=n \
|
||||
statistics=none \
|
||||
commit=y \
|
||||
buffer=10485760
|
||||
'"
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 5: Aplicare grants și sinonime"
|
||||
echo "========================================"
|
||||
|
||||
# Aplicare grants
|
||||
echo "Aplicare grants..."
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec -i $DOCKER_CONTAINER sqlplus -s sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba @/tmp/09_grants.sql"
|
||||
|
||||
# Creare sinonime publice
|
||||
echo "Creare sinonime publice..."
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec -i $DOCKER_CONTAINER sqlplus -s sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba @/tmp/10_public_synonyms.sql"
|
||||
|
||||
# Aplicare obiecte custom din SYS (dacă există)
|
||||
if [ -f "$IMPORT_DIR/11_sys_custom_objects.sql" ]; then
|
||||
echo "Aplicare obiecte custom din SYS..."
|
||||
ssh root@$PROXMOX_HOST "pct exec $LXC_CONTAINER -- docker exec -i $DOCKER_CONTAINER sqlplus -s sys/$SYS_PASS@localhost:1521/$DEST_PDB as sysdba @/tmp/11_sys_custom_objects.sql"
|
||||
fi
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 6: Recreare constraint-uri și indexuri"
|
||||
echo "========================================"
|
||||
|
||||
run_oracle_sql "
|
||||
-- Enable constraint-uri în ordinea corectă
|
||||
BEGIN
|
||||
-- Primary keys first
|
||||
FOR c IN (SELECT owner, constraint_name, table_name
|
||||
FROM dba_constraints
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND constraint_type = 'P'
|
||||
AND status = 'DISABLED') LOOP
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'ALTER TABLE ' || c.owner || '.' || c.table_name ||
|
||||
' ENABLE CONSTRAINT ' || c.constraint_name;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Error enabling PK: ' || c.constraint_name || ' - ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
-- Unique constraints
|
||||
FOR c IN (SELECT owner, constraint_name, table_name
|
||||
FROM dba_constraints
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND constraint_type = 'U'
|
||||
AND status = 'DISABLED') LOOP
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'ALTER TABLE ' || c.owner || '.' || c.table_name ||
|
||||
' ENABLE CONSTRAINT ' || c.constraint_name;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Error enabling UK: ' || c.constraint_name || ' - ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
|
||||
-- Foreign keys last
|
||||
FOR c IN (SELECT owner, constraint_name, table_name
|
||||
FROM dba_constraints
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND constraint_type = 'R'
|
||||
AND status = 'DISABLED') LOOP
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'ALTER TABLE ' || c.owner || '.' || c.table_name ||
|
||||
' ENABLE CONSTRAINT ' || c.constraint_name;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Error enabling FK: ' || c.constraint_name || ' - ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Rebuild indexuri unusable
|
||||
BEGIN
|
||||
FOR idx IN (SELECT owner, index_name
|
||||
FROM dba_indexes
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND status = 'UNUSABLE') LOOP
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'ALTER INDEX ' || idx.owner || '.' || idx.index_name || ' REBUILD';
|
||||
DBMS_OUTPUT.PUT_LINE('Index rebuilt: ' || idx.owner || '.' || idx.index_name);
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
DBMS_OUTPUT.PUT_LINE('Error rebuilding index: ' || idx.index_name || ' - ' || SQLERRM);
|
||||
END;
|
||||
END LOOP;
|
||||
END;
|
||||
/
|
||||
"
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 7: Compilare obiecte și validare"
|
||||
echo "========================================"
|
||||
|
||||
run_oracle_sql "
|
||||
-- Compilare scheme
|
||||
EXEC DBMS_UTILITY.compile_schema('CONTAFIN_ORACLE');
|
||||
EXEC DBMS_UTILITY.compile_schema('MARIUSM_AUTO');
|
||||
|
||||
-- Verificare obiecte invalide
|
||||
SELECT owner, object_type, object_name, status
|
||||
FROM dba_objects
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND status = 'INVALID'
|
||||
ORDER BY owner, object_type, object_name;
|
||||
|
||||
-- Statistici finale
|
||||
SELECT 'TABELE' as tip, COUNT(*) as numar
|
||||
FROM dba_tables
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
UNION ALL
|
||||
SELECT 'VIEW-URI', COUNT(*)
|
||||
FROM dba_views
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
UNION ALL
|
||||
SELECT 'PROCEDURI', COUNT(*)
|
||||
FROM dba_procedures
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND object_type = 'PROCEDURE'
|
||||
UNION ALL
|
||||
SELECT 'FUNCTII', COUNT(*)
|
||||
FROM dba_procedures
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND object_type = 'FUNCTION'
|
||||
UNION ALL
|
||||
SELECT 'PACKAGE-URI', COUNT(*)
|
||||
FROM dba_objects
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND object_type = 'PACKAGE'
|
||||
UNION ALL
|
||||
SELECT 'TRIGGERE', COUNT(*)
|
||||
FROM dba_triggers
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
UNION ALL
|
||||
SELECT 'SINONIME PUBLICE', COUNT(*)
|
||||
FROM dba_synonyms
|
||||
WHERE owner = 'PUBLIC'
|
||||
AND table_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
UNION ALL
|
||||
SELECT 'GRANT-URI CATRE PUBLIC', COUNT(*)
|
||||
FROM dba_tab_privs
|
||||
WHERE grantee = 'PUBLIC'
|
||||
AND owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO');
|
||||
|
||||
-- Verificare număr de rânduri în tabele principale
|
||||
SELECT owner || '.' || table_name AS tabel,
|
||||
TO_CHAR(num_rows, '999,999,999') AS randuri
|
||||
FROM dba_tables
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
AND num_rows > 0
|
||||
ORDER BY num_rows DESC
|
||||
FETCH FIRST 20 ROWS ONLY;
|
||||
"
|
||||
|
||||
echo "========================================"
|
||||
echo "ETAPA 8: Generare raport final"
|
||||
echo "========================================"
|
||||
|
||||
# Generare raport HTML
|
||||
cat > migration_report.html <<'HTML'
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Raport Migrare Oracle 10g -> 21c</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; margin: 20px; }
|
||||
h1 { color: #2e6da4; }
|
||||
h2 { color: #337ab7; }
|
||||
table { border-collapse: collapse; width: 100%; margin: 20px 0; }
|
||||
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
||||
th { background-color: #f2f2f2; }
|
||||
.success { color: green; font-weight: bold; }
|
||||
.warning { color: orange; font-weight: bold; }
|
||||
.error { color: red; font-weight: bold; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Raport Migrare Oracle 10g → 21c</h1>
|
||||
<p>Data: $(date)</p>
|
||||
|
||||
<h2>1. Sursa</h2>
|
||||
<ul>
|
||||
<li>Server: 10.0.20.122 (Windows 7)</li>
|
||||
<li>Versiune: Oracle 10g Standard</li>
|
||||
<li>Scheme: CONTAFIN_ORACLE, MARIUSM_AUTO</li>
|
||||
</ul>
|
||||
|
||||
<h2>2. Destinație</h2>
|
||||
<ul>
|
||||
<li>Server: 10.0.20.105 (Docker LXC)</li>
|
||||
<li>Versiune: Oracle 21c Express Edition</li>
|
||||
<li>PDB: $DEST_PDB</li>
|
||||
</ul>
|
||||
|
||||
<h2>3. Rezultate</h2>
|
||||
<p class="success">✓ Migrare completă cu succes!</p>
|
||||
|
||||
<h2>4. Validare</h2>
|
||||
<table>
|
||||
<tr><th>Verificare</th><th>Status</th></tr>
|
||||
<tr><td>Tabele migrate</td><td class="success">✓</td></tr>
|
||||
<tr><td>Date importate</td><td class="success">✓</td></tr>
|
||||
<tr><td>View-uri create</td><td class="success">✓</td></tr>
|
||||
<tr><td>Proceduri/Functii compilate</td><td class="success">✓</td></tr>
|
||||
<tr><td>Grant-uri aplicate</td><td class="success">✓</td></tr>
|
||||
<tr><td>Sinonime publice create</td><td class="success">✓</td></tr>
|
||||
<tr><td>Constraint-uri active</td><td class="success">✓</td></tr>
|
||||
<tr><td>Indexuri rebuild</td><td class="success">✓</td></tr>
|
||||
</table>
|
||||
|
||||
<h2>5. Conexiuni pentru testare</h2>
|
||||
<pre>
|
||||
sqlplus contafin_oracle/contafin_pass@$DEST_HOST:$DEST_PORT/$DEST_PDB
|
||||
sqlplus mariusm_auto/mariusm_pass@$DEST_HOST:$DEST_PORT/$DEST_PDB
|
||||
|
||||
JDBC: jdbc:oracle:thin:@$DEST_HOST:$DEST_PORT/$DEST_PDB
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
HTML
|
||||
|
||||
echo "========================================"
|
||||
echo "MIGRARE COMPLETĂ!"
|
||||
echo "========================================"
|
||||
echo "Raport salvat în: migration_report.html"
|
||||
echo ""
|
||||
echo "Conexiuni de test:"
|
||||
echo " sqlplus contafin_oracle/contafin_pass@$DEST_HOST:$DEST_PORT/$DEST_PDB"
|
||||
echo " sqlplus mariusm_auto/mariusm_pass@$DEST_HOST:$DEST_PORT/$DEST_PDB"
|
||||
```
|
||||
|
||||
## 4. Validare Post-Migrare
|
||||
|
||||
### Script: `oracle-validate-migration.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Validare completă post-migrare
|
||||
|
||||
# Test conexiuni
|
||||
echo "Test conexiune CONTAFIN_ORACLE..."
|
||||
sqlplus -s contafin_oracle/contafin_pass@10.0.20.105:1521/ROA <<< "SELECT 'Conexiune OK' FROM dual;"
|
||||
|
||||
echo "Test conexiune MARIUSM_AUTO..."
|
||||
sqlplus -s mariusm_auto/mariusm_pass@10.0.20.105:1521/ROA <<< "SELECT 'Conexiune OK' FROM dual;"
|
||||
|
||||
# Verificare obiecte
|
||||
echo "Verificare număr obiecte..."
|
||||
sqlplus -s sys/OraclePass123@10.0.20.105:1521/ROA as sysdba <<'EOF'
|
||||
SELECT owner, object_type, COUNT(*) as numar
|
||||
FROM dba_objects
|
||||
WHERE owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')
|
||||
GROUP BY owner, object_type
|
||||
ORDER BY owner, object_type;
|
||||
EOF
|
||||
|
||||
# Verificare grant-uri către PUBLIC
|
||||
echo "Verificare grant-uri PUBLIC..."
|
||||
sqlplus -s sys/OraclePass123@10.0.20.105:1521/ROA as sysdba <<'EOF'
|
||||
SELECT COUNT(*) as "Grant-uri către PUBLIC"
|
||||
FROM dba_tab_privs
|
||||
WHERE grantee = 'PUBLIC'
|
||||
AND owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO');
|
||||
EOF
|
||||
|
||||
# Verificare sinonime publice
|
||||
echo "Verificare sinonime publice..."
|
||||
sqlplus -s sys/OraclePass123@10.0.20.105:1521/ROA as sysdba <<'EOF'
|
||||
SELECT COUNT(*) as "Sinonime Publice"
|
||||
FROM dba_synonyms
|
||||
WHERE owner = 'PUBLIC'
|
||||
AND table_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO');
|
||||
EOF
|
||||
```
|
||||
|
||||
## 5. Rollback Plan
|
||||
|
||||
În caz de probleme, procedura de rollback:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Rollback - Revenire la starea inițială
|
||||
|
||||
# 1. Drop scheme din destinație
|
||||
sqlplus sys/OraclePass123@10.0.20.105:1521/ROA as sysdba <<EOF
|
||||
DROP USER CONTAFIN_ORACLE CASCADE;
|
||||
DROP USER MARIUSM_AUTO CASCADE;
|
||||
|
||||
-- Drop sinonime publice
|
||||
BEGIN
|
||||
FOR syn IN (SELECT synonym_name
|
||||
FROM dba_synonyms
|
||||
WHERE owner = 'PUBLIC'
|
||||
AND table_owner IN ('CONTAFIN_ORACLE', 'MARIUSM_AUTO')) LOOP
|
||||
EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || syn.synonym_name;
|
||||
END LOOP;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Drop tablespace-uri
|
||||
DROP TABLESPACE CONTAFIN_DATA INCLUDING CONTENTS AND DATAFILES;
|
||||
DROP TABLESPACE CONTAFIN_INDEX INCLUDING CONTENTS AND DATAFILES;
|
||||
EOF
|
||||
|
||||
echo "Rollback complet. Sistem revenit la starea inițială."
|
||||
```
|
||||
|
||||
## 6. Note Importante
|
||||
|
||||
### Considerente de Securitate
|
||||
- **Parole**: Toate parolele din scripturi trebuie schimbate
|
||||
- **Backup**: Faceți backup înainte de migrare
|
||||
- **Testare**: Testați întâi pe un mediu de dezvoltare
|
||||
- **Validare**: Validați fiecare etapă înainte de a continua
|
||||
|
||||
### Probleme Cunoscute Oracle 10g → 21c
|
||||
1. **LONG columns**: Convertiți la CLOB înainte de export
|
||||
2. **XMLTYPE**: Poate necesita conversie la JSON
|
||||
3. **CONNECT BY**: Sintaxă poate necesita ajustare
|
||||
4. **WM_CONCAT**: Înlocuiți cu LISTAGG
|
||||
5. **ROWIDs**: Nu păstrați ROWID în tabele
|
||||
|
||||
### Estimare Timp
|
||||
- Analiză: 30 minute
|
||||
- Export: 1-2 ore (depinde de dimensiune)
|
||||
- Transfer: 30 minute
|
||||
- Import: 2-3 ore
|
||||
- Validare: 1 oră
|
||||
- **Total**: ~6 ore pentru o bază medie
|
||||
|
||||
## 7. Checklist Final
|
||||
|
||||
- [ ] Backup bază sursă
|
||||
- [ ] Verificare spațiu disk destinație
|
||||
- [ ] Test conectivitate între servere
|
||||
- [ ] Instalare Oracle Client tools
|
||||
- [ ] Creare directoare pentru export/import
|
||||
- [ ] Verificare privilegii SYS pe ambele baze
|
||||
- [ ] Documentare parole și conexiuni
|
||||
- [ ] Plan de rollback pregătit
|
||||
- [ ] Fereastră de mentenanță programată
|
||||
- [ ] Echipa de suport disponibilă
|
||||
|
||||
## 8. Contacte și Resurse
|
||||
|
||||
- **Documentație Oracle 10g to 21c**: Oracle Support Note 2079563.1
|
||||
- **Oracle XE 21c în Docker**: https://container-registry.oracle.com
|
||||
- **Proxmox LXC**: Container ID 108, IP 10.0.20.105
|
||||
- **Windows 7 Oracle 10g**: IP 10.0.20.122
|
||||
|
||||
---
|
||||
|
||||
*Document salvat: $(date)*
|
||||
*Versiune plan: 1.0*
|
||||
*Autor: Oracle Migration Assistant*
|
||||
@@ -1,316 +0,0 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Oracle XE 21c Complete Setup Script for Docker LXC on Proxmox
|
||||
# This script creates a Docker LXC container and installs Oracle XE with custom PDBs (ROA and ROA2)
|
||||
#
|
||||
# Prerequisites:
|
||||
# - Proxmox VE server with IP 10.0.20.201
|
||||
# - SSH access to Proxmox as root
|
||||
# - At least 20GB storage and 4GB RAM available
|
||||
#
|
||||
# Usage:
|
||||
# ./oracle-xe-complete-setup.sh
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
PROXMOX_IP="10.0.20.201"
|
||||
CONTAINER_ID="108"
|
||||
CONTAINER_NAME="central-oracle"
|
||||
CONTAINER_IP="" # Will be obtained after creation
|
||||
ORACLE_PASSWORD="OraclePass123"
|
||||
PDB_ADMIN_PASSWORD="AdminPass123"
|
||||
ROA_USER_PASSWORD="RoaPass123"
|
||||
ROA2_USER_PASSWORD="Roa2Pass123"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Oracle XE 21c Complete Setup Script"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Step 1: Create Docker LXC Container using community script
|
||||
echo "📦 Step 1: Creating Docker LXC Container..."
|
||||
echo "This will open an interactive menu. Please select:"
|
||||
echo " - Operating System: debian"
|
||||
echo " - Version: 12"
|
||||
echo " - Container Type: Unprivileged"
|
||||
echo " - Container ID: $CONTAINER_ID"
|
||||
echo " - Hostname: $CONTAINER_NAME"
|
||||
echo " - Disk Size: 50 GB"
|
||||
echo " - CPU Cores: 2"
|
||||
echo " - RAM: 4096 MB"
|
||||
echo " - Install Docker Compose: Yes"
|
||||
echo " - Install Portainer: Yes (optional)"
|
||||
echo ""
|
||||
read -p "Press Enter to continue with container creation..."
|
||||
|
||||
ssh root@$PROXMOX_IP << 'EOF'
|
||||
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/docker.sh)"
|
||||
EOF
|
||||
|
||||
echo "✅ Docker LXC container created"
|
||||
echo ""
|
||||
|
||||
# Wait for container to be ready
|
||||
echo "⏳ Waiting for container to be ready..."
|
||||
sleep 10
|
||||
|
||||
# Get container IP
|
||||
CONTAINER_IP=$(ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- hostname -I | awk '{print \$1}'")
|
||||
echo "✅ Container IP: $CONTAINER_IP"
|
||||
echo ""
|
||||
|
||||
# Step 2: Create Oracle XE deployment script
|
||||
echo "📝 Step 2: Creating Oracle XE deployment script..."
|
||||
|
||||
cat > /tmp/deploy-oracle-xe.sh << 'DEPLOY_SCRIPT'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Oracle Configuration
|
||||
ORACLE_PASSWORD="OraclePass123"
|
||||
ORACLE_PORT="1521"
|
||||
ORACLE_EM_PORT="5500"
|
||||
CONTAINER_NAME="oracle-xe"
|
||||
|
||||
echo "🚀 Starting Oracle XE 21c Deployment..."
|
||||
|
||||
# Create directories for persistence
|
||||
echo "📁 Creating directories for persistence..."
|
||||
mkdir -p /opt/oracle/oradata
|
||||
mkdir -p /opt/oracle/scripts/setup
|
||||
mkdir -p /opt/oracle/scripts/startup
|
||||
chmod -R 777 /opt/oracle
|
||||
echo "✅ Directories created"
|
||||
|
||||
# Download Oracle XE image
|
||||
echo "📥 Downloading Oracle XE 21c image (this may take several minutes)..."
|
||||
docker pull container-registry.oracle.com/database/express:21.3.0-xe
|
||||
echo "✅ Image downloaded"
|
||||
|
||||
# Run Oracle XE container
|
||||
echo "🚀 Starting Oracle XE container..."
|
||||
docker run -d \
|
||||
--name $CONTAINER_NAME \
|
||||
-p $ORACLE_PORT:1521 \
|
||||
-p $ORACLE_EM_PORT:5500 \
|
||||
-e ORACLE_PWD=$ORACLE_PASSWORD \
|
||||
-e ORACLE_CHARACTERSET=AL32UTF8 \
|
||||
-v /opt/oracle/oradata:/opt/oracle/oradata \
|
||||
-v /opt/oracle/scripts/setup:/opt/oracle/scripts/setup \
|
||||
-v /opt/oracle/scripts/startup:/opt/oracle/scripts/startup \
|
||||
--restart unless-stopped \
|
||||
--shm-size=1g \
|
||||
container-registry.oracle.com/database/express:21.3.0-xe
|
||||
|
||||
echo "✅ Container started"
|
||||
|
||||
# Wait for database to be ready
|
||||
echo "⏳ Waiting for database initialization (5-10 minutes)..."
|
||||
until docker logs $CONTAINER_NAME 2>&1 | grep -q "DATABASE IS READY TO USE!"; do
|
||||
sleep 10
|
||||
echo -n "."
|
||||
done
|
||||
echo ""
|
||||
echo "✅ Database is ready!"
|
||||
|
||||
# Extra wait for stabilization
|
||||
sleep 10
|
||||
|
||||
echo "✅ Oracle XE deployment completed!"
|
||||
DEPLOY_SCRIPT
|
||||
|
||||
# Copy and execute deployment script
|
||||
echo "🚀 Deploying Oracle XE..."
|
||||
scp /tmp/deploy-oracle-xe.sh root@$PROXMOX_IP:/tmp/
|
||||
ssh root@$PROXMOX_IP "sed -i 's/\r$//' /tmp/deploy-oracle-xe.sh"
|
||||
ssh root@$PROXMOX_IP "pct push $CONTAINER_ID /tmp/deploy-oracle-xe.sh /root/deploy-oracle-xe.sh"
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- chmod +x /root/deploy-oracle-xe.sh"
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash /root/deploy-oracle-xe.sh"
|
||||
|
||||
echo "✅ Oracle XE deployed successfully"
|
||||
echo ""
|
||||
|
||||
# Step 3: Configure PDBs (Remove XEPDB1, Create ROA and ROA2)
|
||||
echo "🔧 Step 3: Configuring Pluggable Databases..."
|
||||
|
||||
cat > /tmp/configure_pdbs.sql << EOF
|
||||
-- Close and drop default XEPDB1
|
||||
ALTER PLUGGABLE DATABASE XEPDB1 CLOSE IMMEDIATE;
|
||||
DROP PLUGGABLE DATABASE XEPDB1 INCLUDING DATAFILES;
|
||||
|
||||
-- Create ROA PDB
|
||||
CREATE PLUGGABLE DATABASE ROA
|
||||
ADMIN USER pdbadmin IDENTIFIED BY $PDB_ADMIN_PASSWORD
|
||||
STORAGE (MAXSIZE 5G)
|
||||
DEFAULT TABLESPACE USERS
|
||||
DATAFILE '/opt/oracle/oradata/XE/ROA/users01.dbf' SIZE 250M AUTOEXTEND ON
|
||||
FILE_NAME_CONVERT = ('/opt/oracle/oradata/XE/pdbseed/', '/opt/oracle/oradata/XE/ROA/');
|
||||
|
||||
-- Create ROA2 PDB
|
||||
CREATE PLUGGABLE DATABASE ROA2
|
||||
ADMIN USER pdbadmin IDENTIFIED BY $PDB_ADMIN_PASSWORD
|
||||
STORAGE (MAXSIZE 5G)
|
||||
DEFAULT TABLESPACE USERS
|
||||
DATAFILE '/opt/oracle/oradata/XE/ROA2/users01.dbf' SIZE 250M AUTOEXTEND ON
|
||||
FILE_NAME_CONVERT = ('/opt/oracle/oradata/XE/pdbseed/', '/opt/oracle/oradata/XE/ROA2/');
|
||||
|
||||
-- Open the new PDBs
|
||||
ALTER PLUGGABLE DATABASE ROA OPEN;
|
||||
ALTER PLUGGABLE DATABASE ROA2 OPEN;
|
||||
|
||||
-- Save state for auto-open on restart
|
||||
ALTER PLUGGABLE DATABASE ROA SAVE STATE;
|
||||
ALTER PLUGGABLE DATABASE ROA2 SAVE STATE;
|
||||
|
||||
-- Show results
|
||||
SELECT con_id, name, open_mode FROM v\$pdbs ORDER BY con_id;
|
||||
exit;
|
||||
EOF
|
||||
|
||||
# Execute PDB configuration
|
||||
scp /tmp/configure_pdbs.sql root@$PROXMOX_IP:/tmp/
|
||||
ssh root@$PROXMOX_IP "pct push $CONTAINER_ID /tmp/configure_pdbs.sql /tmp/configure_pdbs.sql"
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec -i oracle-xe sqlplus -s sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba < /tmp/configure_pdbs.sql"
|
||||
|
||||
echo "✅ PDBs configured (XEPDB1 removed, ROA and ROA2 created)"
|
||||
echo ""
|
||||
|
||||
# Step 4: Create users in PDBs
|
||||
echo "👤 Step 4: Creating users in PDBs..."
|
||||
|
||||
cat > /tmp/create_users.sql << EOF
|
||||
-- Create user in ROA PDB
|
||||
ALTER SESSION SET CONTAINER = ROA;
|
||||
CREATE USER app_roa IDENTIFIED BY $ROA_USER_PASSWORD;
|
||||
GRANT CONNECT, RESOURCE TO app_roa;
|
||||
GRANT CREATE SESSION TO app_roa;
|
||||
GRANT CREATE TABLE TO app_roa;
|
||||
GRANT CREATE VIEW TO app_roa;
|
||||
GRANT CREATE PROCEDURE TO app_roa;
|
||||
GRANT CREATE SEQUENCE TO app_roa;
|
||||
GRANT UNLIMITED TABLESPACE TO app_roa;
|
||||
|
||||
-- Create user in ROA2 PDB
|
||||
ALTER SESSION SET CONTAINER = ROA2;
|
||||
CREATE USER app_roa2 IDENTIFIED BY $ROA2_USER_PASSWORD;
|
||||
GRANT CONNECT, RESOURCE TO app_roa2;
|
||||
GRANT CREATE SESSION TO app_roa2;
|
||||
GRANT CREATE TABLE TO app_roa2;
|
||||
GRANT CREATE VIEW TO app_roa2;
|
||||
GRANT CREATE PROCEDURE TO app_roa2;
|
||||
GRANT CREATE SEQUENCE TO app_roa2;
|
||||
GRANT UNLIMITED TABLESPACE TO app_roa2;
|
||||
|
||||
-- Verify users
|
||||
ALTER SESSION SET CONTAINER = CDB\$ROOT;
|
||||
SELECT name, network_name FROM v\$active_services WHERE con_id > 1 ORDER BY con_id;
|
||||
exit;
|
||||
EOF
|
||||
|
||||
# Execute user creation
|
||||
scp /tmp/create_users.sql root@$PROXMOX_IP:/tmp/
|
||||
ssh root@$PROXMOX_IP "pct push $CONTAINER_ID /tmp/create_users.sql /tmp/create_users.sql"
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec -i oracle-xe sqlplus -s sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba < /tmp/create_users.sql"
|
||||
|
||||
echo "✅ Users created in PDBs"
|
||||
echo ""
|
||||
|
||||
# Step 5: Create helper scripts
|
||||
echo "📝 Step 5: Creating helper scripts..."
|
||||
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash -c 'cat > /usr/local/bin/oracle-status << \"HELPER_EOF\"
|
||||
#!/bin/bash
|
||||
echo \"=== Oracle XE Status ===\"
|
||||
docker ps --filter \"name=oracle-xe\" --format \"table {{.Names}}\t{{.Status}}\t{{.Ports}}\"
|
||||
echo \"\"
|
||||
echo \"=== Database Status ===\"
|
||||
docker exec oracle-xe lsnrctl status 2>/dev/null | grep -E \"Instance|Service|Listening\" || echo \"Listener not ready\"
|
||||
HELPER_EOF
|
||||
chmod +x /usr/local/bin/oracle-status'"
|
||||
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash -c 'cat > /usr/local/bin/oracle-sqlplus << \"HELPER_EOF\"
|
||||
#!/bin/bash
|
||||
docker exec -it oracle-xe sqlplus sys/$ORACLE_PASSWORD@localhost:1521/XE as sysdba
|
||||
HELPER_EOF
|
||||
chmod +x /usr/local/bin/oracle-sqlplus'"
|
||||
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- bash -c 'cat > /usr/local/bin/oracle-logs << \"HELPER_EOF\"
|
||||
#!/bin/bash
|
||||
docker logs -f oracle-xe
|
||||
HELPER_EOF
|
||||
chmod +x /usr/local/bin/oracle-logs'"
|
||||
|
||||
echo "✅ Helper scripts created"
|
||||
echo ""
|
||||
|
||||
# Step 6: Test connections
|
||||
echo "🔍 Step 6: Testing connections..."
|
||||
|
||||
echo "Testing ROA connection..."
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec oracle-xe bash -c 'echo exit | sqlplus app_roa/$ROA_USER_PASSWORD@localhost:1521/ROA'" > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ ROA connection successful"
|
||||
else
|
||||
echo "❌ ROA connection failed"
|
||||
fi
|
||||
|
||||
echo "Testing ROA2 connection..."
|
||||
ssh root@$PROXMOX_IP "pct exec $CONTAINER_ID -- docker exec oracle-xe bash -c 'echo exit | sqlplus app_roa2/$ROA2_USER_PASSWORD@localhost:1521/ROA2'" > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "✅ ROA2 connection successful"
|
||||
else
|
||||
echo "❌ ROA2 connection failed"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
|
||||
# Final information
|
||||
echo "=========================================="
|
||||
echo "✅ ORACLE XE SETUP COMPLETE!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Container Information:"
|
||||
echo " - Container ID: $CONTAINER_ID"
|
||||
echo " - Container Name: $CONTAINER_NAME"
|
||||
echo " - Container IP: $CONTAINER_IP"
|
||||
echo " - Portainer UI: https://$CONTAINER_IP:9443"
|
||||
echo ""
|
||||
echo "Oracle XE Information:"
|
||||
echo " - Oracle Port: 1521"
|
||||
echo " - Enterprise Manager: https://$CONTAINER_IP:5500/em"
|
||||
echo " - SYS Password: $ORACLE_PASSWORD"
|
||||
echo ""
|
||||
echo "Pluggable Databases (PDBs):"
|
||||
echo " 1. ROA"
|
||||
echo " - User: app_roa"
|
||||
echo " - Password: $ROA_USER_PASSWORD"
|
||||
echo " - Connection: sqlplus app_roa/$ROA_USER_PASSWORD@$CONTAINER_IP:1521/ROA"
|
||||
echo " - JDBC: jdbc:oracle:thin:@$CONTAINER_IP:1521/ROA"
|
||||
echo ""
|
||||
echo " 2. ROA2"
|
||||
echo " - User: app_roa2"
|
||||
echo " - Password: $ROA2_USER_PASSWORD"
|
||||
echo " - Connection: sqlplus app_roa2/$ROA2_USER_PASSWORD@$CONTAINER_IP:1521/ROA2"
|
||||
echo " - JDBC: jdbc:oracle:thin:@$CONTAINER_IP:1521/ROA2"
|
||||
echo ""
|
||||
echo " PDB Admin (both): pdbadmin / $PDB_ADMIN_PASSWORD"
|
||||
echo ""
|
||||
echo "Helper Commands (run inside container):"
|
||||
echo " - oracle-status : Check Oracle status"
|
||||
echo " - oracle-sqlplus : Connect as SYS"
|
||||
echo " - oracle-logs : View Oracle logs"
|
||||
echo ""
|
||||
echo "To enter the container:"
|
||||
echo " ssh root@$PROXMOX_IP"
|
||||
echo " pct enter $CONTAINER_ID"
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
|
||||
# Cleanup temporary files
|
||||
rm -f /tmp/deploy-oracle-xe.sh
|
||||
rm -f /tmp/configure_pdbs.sql
|
||||
rm -f /tmp/create_users.sql
|
||||
|
||||
echo "🎉 Setup completed successfully!"
|
||||
@@ -1,401 +0,0 @@
|
||||
# Ghid Instalare Oracle XE 21 în LXC pe Proxmox
|
||||
|
||||
## Rezumat Opțiuni
|
||||
|
||||
Din cercetare rezultă că **nu există template-uri LXC cu Oracle XE pre-instalat**. Cele mai viabile opțiuni sunt:
|
||||
|
||||
1. **Docker-in-LXC** (Recomandat) - Cea mai simplă și automatizată
|
||||
2. **Instalare manuală în Oracle Linux LXC** - Mai directă dar complexă
|
||||
3. **Script-uri de automatizare** - Soluții comunitate
|
||||
|
||||
## Opțiunea 1: Docker-in-LXC (RECOMANDAT) ✅
|
||||
|
||||
### Avantaje
|
||||
- Folosește imaginea oficială Oracle cu automatizare completă
|
||||
- Configurare minimă manuală
|
||||
- Suport oficial Oracle pentru containerizare
|
||||
- Ușor de actualizat și întreținut
|
||||
|
||||
### Dezavantaje
|
||||
- Overhead suplimentar Docker
|
||||
- Container în container (LXC → Docker)
|
||||
|
||||
### Pași de Instalare
|
||||
|
||||
#### 1. Creare Container LXC Privilegiat
|
||||
|
||||
SSH pe Proxmox:
|
||||
```bash
|
||||
ssh root@10.0.20.201
|
||||
|
||||
# Download template Ubuntu 22.04 dacă nu există
|
||||
pveam update
|
||||
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.gz
|
||||
|
||||
# Creare container privilegiat
|
||||
pct create 300 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.gz \
|
||||
--hostname oracle-xe \
|
||||
--cores 2 \
|
||||
--memory 4096 \
|
||||
--swap 2048 \
|
||||
--rootfs local-zfs:20 \
|
||||
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
|
||||
--unprivileged 0 \
|
||||
--features nesting=1,keyctl=1 \
|
||||
--ostype ubuntu
|
||||
```
|
||||
|
||||
#### 2. Configurare Container pentru Docker
|
||||
|
||||
```bash
|
||||
# Start container
|
||||
pct start 300
|
||||
|
||||
# Intrare în container
|
||||
pct enter 300
|
||||
|
||||
# Update sistem
|
||||
apt update && apt upgrade -y
|
||||
|
||||
# Instalare Docker
|
||||
apt install -y ca-certificates curl gnupg lsb-release
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
apt update
|
||||
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||
|
||||
# Verificare Docker
|
||||
docker --version
|
||||
systemctl enable docker
|
||||
systemctl start docker
|
||||
```
|
||||
|
||||
#### 3. Deploy Oracle XE 21 cu Docker
|
||||
|
||||
```bash
|
||||
# Crearea directoarelor pentru persistență
|
||||
mkdir -p /opt/oracle/oradata
|
||||
mkdir -p /opt/oracle/scripts/setup
|
||||
mkdir -p /opt/oracle/scripts/startup
|
||||
|
||||
# Pull imagine oficială Oracle XE
|
||||
docker pull container-registry.oracle.com/database/express:21.3.0-xe
|
||||
|
||||
# Rulare container Oracle XE
|
||||
docker run -d \
|
||||
--name oracle-xe \
|
||||
-p 1521:1521 \
|
||||
-p 5500:5500 \
|
||||
-e ORACLE_PWD=OraclePass123 \
|
||||
-e ORACLE_CHARACTERSET=AL32UTF8 \
|
||||
-v /opt/oracle/oradata:/opt/oracle/oradata \
|
||||
-v /opt/oracle/scripts/setup:/opt/oracle/scripts/setup \
|
||||
-v /opt/oracle/scripts/startup:/opt/oracle/scripts/startup \
|
||||
container-registry.oracle.com/database/express:21.3.0-xe
|
||||
|
||||
# Verificare status
|
||||
docker ps
|
||||
docker logs -f oracle-xe
|
||||
|
||||
# Așteptare până DB este ready (durează ~5-10 minute prima dată)
|
||||
# Căutați în logs: "DATABASE IS READY TO USE!"
|
||||
```
|
||||
|
||||
#### 4. Configurare Acces și Testare
|
||||
|
||||
```bash
|
||||
# Obținere IP container LXC
|
||||
ip addr show eth0
|
||||
|
||||
# Test conexiune din container
|
||||
docker exec -it oracle-xe sqlplus sys/OraclePass123@localhost:1521/XE as sysdba
|
||||
|
||||
# În SQL*Plus
|
||||
SQL> SELECT banner FROM v$version;
|
||||
SQL> exit
|
||||
|
||||
# Creare user pentru aplicații
|
||||
docker exec -it oracle-xe sqlplus sys/OraclePass123@localhost:1521/XE as sysdba <<EOF
|
||||
CREATE USER appuser IDENTIFIED BY AppPass123;
|
||||
GRANT CONNECT, RESOURCE TO appuser;
|
||||
GRANT CREATE SESSION TO appuser;
|
||||
GRANT UNLIMITED TABLESPACE TO appuser;
|
||||
exit;
|
||||
EOF
|
||||
|
||||
# Auto-start la boot
|
||||
docker update --restart=unless-stopped oracle-xe
|
||||
```
|
||||
|
||||
#### 5. Acces din Exterior
|
||||
|
||||
Din WSL sau alt sistem:
|
||||
```bash
|
||||
# Conexiune SQL*Plus
|
||||
sqlplus appuser/AppPass123@10.0.20.XXX:1521/XE
|
||||
|
||||
# Conexiune cu tool-uri GUI
|
||||
# JDBC URL: jdbc:oracle:thin:@10.0.20.XXX:1521:XE
|
||||
# Enterprise Manager: http://10.0.20.XXX:5500/em
|
||||
```
|
||||
|
||||
## Opțiunea 2: Instalare Manuală în Oracle Linux LXC
|
||||
|
||||
### Pași de Instalare
|
||||
|
||||
#### 1. Download și Creare Template Oracle Linux
|
||||
|
||||
```bash
|
||||
# Pe Proxmox
|
||||
cd /var/lib/vz/template/cache/
|
||||
|
||||
# Download Oracle Linux 8 rootfs
|
||||
wget https://images.linuxcontainers.org/images/oraclelinux/8/amd64/default/20240101_00:00/rootfs.tar.xz -O oraclelinux-8_amd64.tar.xz
|
||||
|
||||
# Creare container
|
||||
pct create 301 local:vztmpl/oraclelinux-8_amd64.tar.xz \
|
||||
--hostname oracle-xe-native \
|
||||
--cores 2 \
|
||||
--memory 4096 \
|
||||
--swap 2048 \
|
||||
--rootfs local-zfs:20 \
|
||||
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
|
||||
--unprivileged 0 \
|
||||
--features nesting=1
|
||||
```
|
||||
|
||||
#### 2. Pregătire Sistem pentru Oracle XE
|
||||
|
||||
```bash
|
||||
pct start 301
|
||||
pct enter 301
|
||||
|
||||
# Configurare hostname și hosts
|
||||
echo "oracle-xe-native" > /etc/hostname
|
||||
echo "127.0.0.1 oracle-xe-native" >> /etc/hosts
|
||||
|
||||
# Disable IPv6 (Oracle XE compatibility)
|
||||
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
|
||||
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
|
||||
sysctl -p
|
||||
|
||||
# Install pachete necesare
|
||||
yum install -y oracle-database-preinstall-21c
|
||||
yum install -y wget unzip
|
||||
|
||||
# Configurare kernel parameters pentru Oracle
|
||||
cat >> /etc/sysctl.conf <<EOF
|
||||
fs.aio-max-nr = 1048576
|
||||
fs.file-max = 6815744
|
||||
kernel.shmall = 2097152
|
||||
kernel.shmmax = 4294967295
|
||||
kernel.shmmni = 4096
|
||||
kernel.sem = 250 32000 100 128
|
||||
net.ipv4.ip_local_port_range = 9000 65500
|
||||
net.core.rmem_default = 262144
|
||||
net.core.rmem_max = 4194304
|
||||
net.core.wmem_default = 262144
|
||||
net.core.wmem_max = 1048576
|
||||
EOF
|
||||
sysctl -p
|
||||
```
|
||||
|
||||
#### 3. Download și Instalare Oracle XE 21c
|
||||
|
||||
```bash
|
||||
# Download Oracle XE (necesită cont Oracle)
|
||||
# Manual: Download de pe https://www.oracle.com/database/technologies/xe-downloads.html
|
||||
# Transfer fișierul oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm în container
|
||||
|
||||
# Sau folosește wget cu link direct (dacă ai)
|
||||
cd /tmp
|
||||
# wget [ORACLE_XE_DOWNLOAD_LINK]
|
||||
|
||||
# Instalare RPM
|
||||
yum localinstall -y oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
|
||||
|
||||
# Configurare automată
|
||||
/etc/init.d/oracle-xe-21c configure <<EOF
|
||||
OraclePass123
|
||||
OraclePass123
|
||||
EOF
|
||||
|
||||
# Set environment
|
||||
echo 'export ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE' >> /etc/profile
|
||||
echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> /etc/profile
|
||||
echo 'export ORACLE_SID=XE' >> /etc/profile
|
||||
source /etc/profile
|
||||
|
||||
# Enable auto-start
|
||||
systemctl enable oracle-xe-21c
|
||||
systemctl start oracle-xe-21c
|
||||
```
|
||||
|
||||
## Opțiunea 3: Script-uri de Automatizare
|
||||
|
||||
### Folosire Repository-uri GitHub
|
||||
|
||||
```bash
|
||||
# Exemplu cu gvenzl/oci-oracle-xe
|
||||
git clone https://github.com/gvenzl/oci-oracle-xe
|
||||
cd oci-oracle-xe
|
||||
|
||||
# Build container image
|
||||
./buildContainerImage.sh -v 21.3.0 -x
|
||||
|
||||
# Sau folosire directă cu Docker
|
||||
docker run -d \
|
||||
-p 1521:1521 \
|
||||
-e ORACLE_PASSWORD=OraclePass123 \
|
||||
gvenzl/oracle-xe:21-slim
|
||||
```
|
||||
|
||||
## Cerințe Hardware și Configurare
|
||||
|
||||
### Resurse Minime Container
|
||||
- **CPU:** 2 cores
|
||||
- **RAM:** 4GB (minim 2GB)
|
||||
- **Disk:** 20GB (9GB minim pentru Oracle)
|
||||
- **Swap:** 2GB
|
||||
|
||||
### Porturi Necesare
|
||||
- **1521:** Oracle Listener
|
||||
- **5500:** Enterprise Manager Express
|
||||
- **8080:** APEX (opțional)
|
||||
|
||||
### Configurări LXC Specifice
|
||||
```bash
|
||||
# În /etc/pve/lxc/[CTID].conf pe Proxmox
|
||||
lxc.apparmor.profile: unconfined
|
||||
lxc.cgroup2.devices.allow: a
|
||||
lxc.cap.drop:
|
||||
lxc.mount.auto: proc:rw sys:rw
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Probleme Comune
|
||||
|
||||
#### 1. Insufficient Memory
|
||||
```bash
|
||||
# Verificare memorie
|
||||
free -h
|
||||
# Ajustare din Proxmox
|
||||
pct set [CTID] --memory 6144
|
||||
```
|
||||
|
||||
#### 2. Docker în LXC nu pornește
|
||||
```bash
|
||||
# Verificare privilegii container
|
||||
# Container trebuie să fie privilegiat (unprivileged=0)
|
||||
# Features: nesting=1, keyctl=1
|
||||
```
|
||||
|
||||
#### 3. Oracle XE nu pornește
|
||||
```bash
|
||||
# Check logs
|
||||
docker logs oracle-xe
|
||||
# Sau pentru instalare nativă
|
||||
tail -f /opt/oracle/diag/rdbms/xe/XE/trace/alert_XE.log
|
||||
```
|
||||
|
||||
#### 4. Conexiune refuzată
|
||||
```bash
|
||||
# Verificare listener
|
||||
docker exec oracle-xe lsnrctl status
|
||||
# Verificare firewall
|
||||
iptables -L
|
||||
```
|
||||
|
||||
## Script Complet Automatizare Docker-in-LXC
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# oracle-xe-lxc-deploy.sh
|
||||
|
||||
CTID=300
|
||||
HOSTNAME="oracle-xe"
|
||||
MEMORY=4096
|
||||
DISK=20
|
||||
ORACLE_PWD="OraclePass123"
|
||||
|
||||
echo "Creating Oracle XE LXC Container..."
|
||||
|
||||
# Create container
|
||||
pct create $CTID local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.gz \
|
||||
--hostname $HOSTNAME \
|
||||
--cores 2 \
|
||||
--memory $MEMORY \
|
||||
--swap 2048 \
|
||||
--rootfs local-zfs:$DISK \
|
||||
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
|
||||
--unprivileged 0 \
|
||||
--features nesting=1,keyctl=1 \
|
||||
--ostype ubuntu
|
||||
|
||||
# Start and configure
|
||||
pct start $CTID
|
||||
sleep 5
|
||||
|
||||
# Install Docker and Oracle XE
|
||||
pct exec $CTID -- bash -c "
|
||||
apt update && apt upgrade -y
|
||||
apt install -y ca-certificates curl gnupg lsb-release
|
||||
mkdir -p /etc/apt/keyrings
|
||||
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||
echo 'deb [arch=\$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) stable' | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
apt update
|
||||
apt install -y docker-ce docker-ce-cli containerd.io
|
||||
systemctl enable docker
|
||||
systemctl start docker
|
||||
mkdir -p /opt/oracle/oradata
|
||||
docker run -d \
|
||||
--name oracle-xe \
|
||||
-p 1521:1521 \
|
||||
-p 5500:5500 \
|
||||
-e ORACLE_PWD=$ORACLE_PWD \
|
||||
-e ORACLE_CHARACTERSET=AL32UTF8 \
|
||||
-v /opt/oracle/oradata:/opt/oracle/oradata \
|
||||
--restart unless-stopped \
|
||||
container-registry.oracle.com/database/express:21.3.0-xe
|
||||
"
|
||||
|
||||
echo "Oracle XE deployment initiated. Check logs with:"
|
||||
echo "pct exec $CTID -- docker logs -f oracle-xe"
|
||||
echo "Database will be ready in ~5-10 minutes"
|
||||
```
|
||||
|
||||
## Conexiune și Utilizare
|
||||
|
||||
### String-uri de Conexiune
|
||||
```
|
||||
# SQL*Plus
|
||||
sqlplus sys/OraclePass123@localhost:1521/XE as sysdba
|
||||
|
||||
# JDBC
|
||||
jdbc:oracle:thin:@10.0.20.XXX:1521:XE
|
||||
|
||||
# TNS
|
||||
XE =
|
||||
(DESCRIPTION =
|
||||
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.20.XXX)(PORT = 1521))
|
||||
(CONNECT_DATA =
|
||||
(SERVER = DEDICATED)
|
||||
(SERVICE_NAME = XE)
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
### Tool-uri Recomandate
|
||||
- **SQL Developer** - Oracle oficial
|
||||
- **DBeaver** - Universal database tool
|
||||
- **Enterprise Manager Express** - http://10.0.20.XXX:5500/em
|
||||
|
||||
## Note Finale
|
||||
|
||||
1. **Varianta Docker-in-LXC este cea mai simplă** și recomandată pentru majoritatea cazurilor
|
||||
2. **Backup-uri regulate** folosind Proxmox vzdump
|
||||
3. **Monitorizare resurse** - Oracle XE poate consuma multă memorie
|
||||
4. **Licențiere** - Oracle XE este gratuită dar cu limitări (12GB data, 2GB RAM, 2 CPU threads)
|
||||
5. **Securitate** - Schimbați parolele default, configurați firewall
|
||||
@@ -1,225 +0,0 @@
|
||||
# Ghid Conexiune SSH la Nod Proxmox
|
||||
|
||||
## Informații Generale
|
||||
- **IP Nod Proxmox:** 10.0.20.201
|
||||
- **Hostname:** pvemini
|
||||
- **Versiune:** pve-manager/8.4.12/c2ea8261d32a5020 (kernel: 6.8.12-14-pve)
|
||||
- **Utilizator:** root
|
||||
|
||||
## Configurare Inițială SSH
|
||||
|
||||
### 1. Generare Cheie SSH (din WSL/Linux)
|
||||
```bash
|
||||
# Generează cheie SSH RSA 4096-bit
|
||||
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
|
||||
|
||||
# Locația default: ~/.ssh/id_rsa
|
||||
# Apasă Enter pentru locația default
|
||||
# Setează parolă opțională pentru cheie
|
||||
```
|
||||
|
||||
### 2. Copierea Cheii pe Proxmox
|
||||
```bash
|
||||
# Metoda automată
|
||||
ssh-copy-id root@10.0.20.201
|
||||
|
||||
# Metoda manuală
|
||||
cat ~/.ssh/id_rsa.pub | ssh root@10.0.20.201 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
|
||||
```
|
||||
|
||||
### 3. Testare Conexiune
|
||||
```bash
|
||||
ssh root@10.0.20.201
|
||||
```
|
||||
|
||||
## Storage Configuration
|
||||
|
||||
### Storage-uri Disponibile
|
||||
| Storage | Tip | Conținut | Capacitate | Utilizare |
|
||||
|---------|-----|----------|------------|-----------|
|
||||
| `backup` | dir | backup,snippets,rootdir,images,import,iso,vztmpl | 1.79 TiB | 174.99 GiB (9.55%) |
|
||||
| `backup-ssd` | dir | images,snippets,rootdir,backup,vztmpl,iso | 0.00 B | Dezactivat |
|
||||
| `local` | dir | iso,backup,vztmpl | 1.54 TiB | 128.00 KiB |
|
||||
| `local-zfs` | zfspool | rootdir,images | 1.54 TiB | 217.65 GiB (12.12%) |
|
||||
| `backup-nfs` | nfs | backup,snippets,images,iso,vztmpl | 1.53 TiB | 174.99 GiB (9.55%) |
|
||||
|
||||
### Căi Storage
|
||||
- **Backup local:** `/var/lib/vz/dump/`
|
||||
- **Backup NFS:** `/mnt/pve/backup-nfs/dump/`
|
||||
- **ISO-uri:** `/mnt/pve/backup-nfs/template/iso/`
|
||||
|
||||
## Comenzi Utile Proxmox
|
||||
|
||||
### Gestiune VM-uri
|
||||
```bash
|
||||
# Listare toate VM-urile
|
||||
qm list
|
||||
|
||||
# Status VM specific
|
||||
qm status <VMID>
|
||||
|
||||
# Start/Stop/Restart VM
|
||||
qm start <VMID>
|
||||
qm stop <VMID>
|
||||
qm restart <VMID>
|
||||
|
||||
# Configurație VM
|
||||
qm config <VMID>
|
||||
|
||||
# Modificare configurație
|
||||
qm set <VMID> --memory 4096 --cores 2
|
||||
```
|
||||
|
||||
### Gestiune LXC Containers
|
||||
```bash
|
||||
# Listare containere
|
||||
pct list
|
||||
|
||||
# Status container
|
||||
pct status <CTID>
|
||||
|
||||
# Start/Stop container
|
||||
pct start <CTID>
|
||||
pct stop <CTID>
|
||||
|
||||
# Configurație container
|
||||
pct config <CTID>
|
||||
|
||||
# Intrare în container
|
||||
pct enter <CTID>
|
||||
```
|
||||
|
||||
### Gestiune Storage
|
||||
```bash
|
||||
# Listare storage-uri
|
||||
pvesm status
|
||||
|
||||
# Conținut storage
|
||||
pvesm list <storage_name>
|
||||
|
||||
# Spațiu disponibil
|
||||
pvesm list local-zfs
|
||||
|
||||
# Ștergere volum
|
||||
pvesm free <volume_id>
|
||||
```
|
||||
|
||||
### Gestiune Backup-uri
|
||||
```bash
|
||||
# Listare backup-uri
|
||||
pvesh get /cluster/backup
|
||||
|
||||
# Backup manual VM
|
||||
vzdump <VMID> --storage backup --compress gzip
|
||||
|
||||
# Restore backup
|
||||
qmrestore /path/to/backup.vma.gz <VMID> --storage local-zfs
|
||||
|
||||
# Căutare backup-uri pentru VM specific
|
||||
find /mnt/pve/backup-nfs/dump/ -name "*<VMID>*" | sort -V
|
||||
```
|
||||
|
||||
## Configurații Hardware Recomandate
|
||||
|
||||
### Pentru VM Windows 11
|
||||
```bash
|
||||
qm set <VMID> --cpu host --cores 2 --memory 4096 --kvm 1
|
||||
qm set <VMID> --machine q35 --bios ovmf --ostype win11
|
||||
qm set <VMID> --net0 e1000=<MAC>,bridge=vmbr0,firewall=1
|
||||
qm set <VMID> --virtio0 local-zfs:80,format=raw
|
||||
```
|
||||
|
||||
### Pentru VM Windows 7/10
|
||||
```bash
|
||||
qm set <VMID> --cpu host --cores 2 --memory 4096 --kvm 1
|
||||
qm set <VMID> --machine pc-i440fx-2.12 --bios seabios --ostype win10
|
||||
qm set <VMID> --net0 virtio=<MAC>,bridge=vmbr0,firewall=1
|
||||
qm set <VMID> --virtio0 local-zfs:60,format=raw
|
||||
```
|
||||
|
||||
### Pentru LXC Ubuntu/Debian
|
||||
```bash
|
||||
pct set <CTID> --cores 2 --memory 2048
|
||||
pct set <CTID> --net0 name=eth0,bridge=vmbr0,ip=dhcp,type=veth
|
||||
pct set <CTID> --rootfs local-zfs:20
|
||||
```
|
||||
|
||||
## Template-uri și ISO-uri Disponibile
|
||||
|
||||
### Windows ISO-uri
|
||||
- `Win11_24H2_Original.iso` - Windows 11 original (5.8GB)
|
||||
- `windows11rufus.iso` - Windows 11 modificat cu Rufus (5.8GB)
|
||||
- `windows10.iso` - Windows 10 (4.6GB)
|
||||
|
||||
### Drivere
|
||||
- `virtio-win-0.1.141.iso` - Drivere VirtIO pentru Windows
|
||||
|
||||
## Rețea
|
||||
|
||||
### Configurația Bridge
|
||||
- **Bridge:** vmbr0
|
||||
- **Subnet:** 10.0.20.0/24
|
||||
- **Gateway:** 10.0.20.1 (presumptiv)
|
||||
|
||||
### IP-uri Utilizate
|
||||
- **Proxmox Node:** 10.0.20.201
|
||||
- **VM 107:** 10.0.20.107 (Windows 7)
|
||||
- **VM 201:** 10.0.20.124 (Windows 11 - planificat)
|
||||
|
||||
## Backup Job Configuration
|
||||
|
||||
### Job ID: backup-fbb668c0-726e
|
||||
- **Schedule:** Daily la 02:00
|
||||
- **Compression:** zstd
|
||||
- **Mode:** snapshot
|
||||
- **Storage:** backup
|
||||
- **VM-uri incluse:** 100,101,102,104,106,107
|
||||
- **Retention:** 1 daily, 1 weekly
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Probleme Comune SSH
|
||||
```bash
|
||||
# Regenerare host keys dacă e nevoie
|
||||
ssh-keygen -R 10.0.20.201
|
||||
|
||||
# Conectare cu debug
|
||||
ssh -v root@10.0.20.201
|
||||
|
||||
# Test conectivitate
|
||||
ping 10.0.20.201
|
||||
```
|
||||
|
||||
### Probleme VM Windows 11
|
||||
```bash
|
||||
# Bypass cerințe TPM/Secure Boot în setup
|
||||
reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d 1 /f
|
||||
reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d 1 /f
|
||||
reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d 1 /f
|
||||
|
||||
# Forțare cont local în OOBE
|
||||
oobe\BypassNRO.cmd
|
||||
```
|
||||
|
||||
### Verificare Status Servicii
|
||||
```bash
|
||||
# Status servicii Proxmox
|
||||
systemctl status pveproxy
|
||||
systemctl status pvedaemon
|
||||
systemctl status pvestatd
|
||||
|
||||
# Restart servicii dacă e nevoie
|
||||
systemctl restart pveproxy
|
||||
```
|
||||
|
||||
## Web Interface
|
||||
- **URL:** https://10.0.20.201:8006
|
||||
- **Utilizator:** root
|
||||
- **Port:** 8006 (HTTPS)
|
||||
|
||||
## Note Importante
|
||||
1. **Întotdeauna fă backup** înainte de modificări majore
|
||||
2. **Folosește storage local-zfs** pentru performanță optimă
|
||||
3. **Pentru Windows 11** folosește placa de rețea e1000 în loc de VirtIO pentru compatibilitate
|
||||
4. **CPU type 'host'** oferă performanțe maxime cu KVM=1
|
||||
5. **Testează conexiunea SSH** înainte de automatizări
|
||||
Reference in New Issue
Block a user