commit 844ed5c31938cd0635073aa0a98af8cc4a8889c6 Author: chpark Date: Tue Sep 23 15:48:48 2025 +0900 Initial commit: Multi-database Docker environment setup - Added MariaDB Docker configuration with localhost:8787/mariadb:10.11.linux - Added MSSQL Docker configuration with localhost:8787/server:2022-latest - Added Oracle Docker configuration with localhost:8787/oracle:latest - Unified database credentials: wace/wace0909!! - Added initialization scripts for all databases - Added management scripts for individual and bulk operations - Added comprehensive documentation diff --git a/README-ALL-DB.md b/README-ALL-DB.md new file mode 100644 index 0000000..8d658e0 --- /dev/null +++ b/README-ALL-DB.md @@ -0,0 +1,248 @@ +# 통합 데이터베이스 Docker 환경 가이드 + +이 프로젝트는 PostgreSQL, MariaDB, MSSQL, Oracle 데이터베이스를 Docker로 통합 관리할 수 있도록 구성되었습니다. + +## 프로젝트 구조 + +``` +workspace_db/ +├── PostgreSQL (기존 실행 중) +├── MariaDB/ +│ ├── docker-compose-mariadb.yml +│ ├── mariadb.env +│ ├── mariadb-init/ +│ ├── mariadb-config/ +│ ├── start-mariadb.sh +│ └── stop-mariadb.sh +├── MSSQL/ +│ ├── docker-compose-mssql.yml +│ ├── mssql.env +│ ├── mssql-init/ +│ ├── mssql-backup/ +│ ├── start-mssql.sh +│ └── stop-mssql.sh +├── Oracle/ +│ ├── docker-compose-oracle.yml +│ ├── oracle.env +│ ├── oracle-init/ +│ ├── oracle-backup/ +│ ├── start-oracle.sh +│ └── stop-oracle.sh +├── start-all-db.sh # 모든 DB 시작 +├── stop-all-db.sh # 모든 DB 중지 +└── README-ALL-DB.md # 이 파일 +``` + +## 통합 연결 정보 + +모든 데이터베이스는 동일한 사용자 정보로 설정되어 있습니다: + +- **데이터베이스명**: wace +- **사용자명**: wace +- **비밀번호**: wace0909!! + +### 포트 정보 + +| 데이터베이스 | 포트 | 관리 도구 | 관리 도구 포트 | +|-------------|------|-----------|---------------| +| PostgreSQL | 5432 | (기존 설정) | (기존 설정) | +| MariaDB | 3306 | phpMyAdmin | 8080 | +| MSSQL | 1433 | Adminer | 8081 | +| Oracle | 1521 | Adminer | 8082 | + +## 빠른 시작 + +### 모든 데이터베이스 시작 +```bash +chmod +x start-all-db.sh +./start-all-db.sh +``` + +### 모든 데이터베이스 중지 +```bash +chmod +x stop-all-db.sh +./stop-all-db.sh +``` + +### 개별 데이터베이스 관리 +```bash +# MariaDB +./start-mariadb.sh +./stop-mariadb.sh + +# MSSQL +./start-mssql.sh +./stop-mssql.sh + +# Oracle +./start-oracle.sh +./stop-oracle.sh +``` + +## 데이터베이스별 상세 정보 + +### 1. PostgreSQL (기존) +- **포트**: 5432 +- **상태**: 이미 실행 중 +- **관리**: 기존 방식 사용 + +### 2. MariaDB +- **이미지**: localhost:8787/mariadb:10.11.linux +- **포트**: 3306 +- **관리 도구**: phpMyAdmin (http://localhost:8080) +- **특징**: UTF8MB4 문자셋, 한글 완벽 지원 + +### 3. MSSQL +- **이미지**: localhost:8787/server:2022-latest +- **포트**: 1433 +- **관리 도구**: Adminer (http://localhost:8081) +- **특징**: Express 에디션, Korean_Wansung_CI_AS 콜레이션 + +### 4. Oracle +- **이미지**: localhost:8787/oracle:latest +- **포트**: 1521 (DB), 5500 (EM) +- **관리 도구**: Adminer (http://localhost:8082) +- **SID**: ORCL +- **PDB**: ORCLPDB1 +- **특징**: Enterprise Manager 포함 + +## 연결 문자열 예시 + +### MariaDB +```bash +mysql -h localhost -P 3306 -u wace -p wace +``` + +### MSSQL +```bash +sqlcmd -S localhost,1433 -U wace -P wace0909!! -d wace +``` + +### Oracle +```bash +sqlplus wace/"wace0909!!"@//localhost:1521/ORCLPDB1 +``` + +### JDBC 연결 문자열 +```properties +# MariaDB +jdbc:mariadb://localhost:3306/wace + +# MSSQL +jdbc:sqlserver://localhost:1433;databaseName=wace + +# Oracle +jdbc:oracle:thin:@localhost:1521:ORCL +``` + +## 초기 데이터 + +모든 데이터베이스에는 동일한 샘플 데이터가 생성됩니다: + +### users 테이블 +| id | username | email | password_hash | +|----|----------|-------|---------------| +| 1 | admin | admin@example.com | (해시) | +| 2 | testuser | test@example.com | (해시) | + +### user_profiles 테이블 +| id | user_id | first_name | last_name | phone | +|----|---------|------------|-----------|-------| +| 1 | 1 | 관리자 | 시스템 | 010-1234-5678 | +| 2 | 2 | 테스트 | 사용자 | 010-9876-5432 | + +## 관리 도구 접속 + +### phpMyAdmin (MariaDB) +- URL: http://localhost:8080 +- 서버: mariadb +- 사용자: wace 또는 root +- 비밀번호: wace0909!! + +### Adminer (MSSQL) +- URL: http://localhost:8081 +- 시스템: MS SQL (beta) +- 서버: mssql +- 사용자명: wace 또는 sa +- 비밀번호: wace0909!! +- 데이터베이스: wace + +### Adminer (Oracle) +- URL: http://localhost:8082 +- 시스템: Oracle +- 서버: oracle:1521 +- 사용자명: wace +- 비밀번호: wace0909!! +- 데이터베이스: ORCLPDB1 + +### Oracle Enterprise Manager +- URL: http://localhost:5500/em +- 사용자: sys (as sysdba) +- 비밀번호: wace0909!! + +## 유용한 명령어 + +### 모든 컨테이너 상태 확인 +```bash +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +``` + +### 개별 로그 확인 +```bash +docker logs mariadb-server +docker logs mssql-server +docker logs oracle-server +``` + +### 데이터 백업 +```bash +# MariaDB +docker exec mariadb-server mysqldump -u wace -p wace > mariadb-backup.sql + +# MSSQL +docker exec mssql-server /opt/mssql-tools/bin/sqlcmd -S localhost -U wace -P wace0909!! -Q "BACKUP DATABASE wace TO DISK = '/var/opt/mssql/backup/wace.bak'" + +# Oracle +docker exec oracle-server expdp wace/wace0909!!@ORCLPDB1 directory=backup_dir dumpfile=wace.dmp +``` + +## 문제 해결 + +### 포트 충돌 +각 데이터베이스는 서로 다른 포트를 사용하므로 충돌이 없어야 합니다. 만약 충돌이 발생하면 docker-compose 파일에서 포트를 변경하세요. + +### 메모리 부족 +Oracle은 많은 메모리를 사용합니다. 시스템 리소스가 부족한 경우 개별적으로 실행하는 것을 권장합니다. + +### 초기화 시간 +- MariaDB: 즉시 사용 가능 +- MSSQL: 1-2분 소요 +- Oracle: 5-10분 소요 (첫 실행 시) + +### 권한 문제 (Linux) +```bash +chmod +x *.sh +``` + +## 리눅스 서버 배포 + +리눅스 서버에 배포할 때: + +1. 모든 스크립트에 실행 권한 부여: +```bash +chmod +x *.sh +``` + +2. Docker와 Docker Compose 설치 확인 + +3. 프라이빗 레지스트리 접근 확인: +```bash +docker login localhost:8787 +``` + +4. 전체 시작: +```bash +./start-all-db.sh +``` + +이제 모든 데이터베이스가 통합 환경에서 실행됩니다! diff --git a/README-MariaDB.md b/README-MariaDB.md new file mode 100644 index 0000000..ac87a44 --- /dev/null +++ b/README-MariaDB.md @@ -0,0 +1,145 @@ +# MariaDB Docker 설정 가이드 + +이 프로젝트는 Docker를 사용하여 MariaDB 서버를 쉽게 설정하고 관리할 수 있도록 구성되었습니다. + +## 파일 구조 + +``` +workspace_db/ +├── docker-compose-mariadb.yml # MariaDB Docker Compose 설정 +├── mariadb.env # 환경 변수 설정 +├── start-mariadb.sh # MariaDB 시작 스크립트 +├── stop-mariadb.sh # MariaDB 중지 스크립트 +├── mariadb-init/ # 초기화 스크립트 디렉토리 +│ └── 01-init-database.sql # 데이터베이스 초기화 SQL +├── mariadb-config/ # MariaDB 설정 파일 디렉토리 +│ └── my.cnf # MariaDB 설정 파일 +└── README-MariaDB.md # 이 파일 +``` + +## 빠른 시작 + +### 1. MariaDB 시작 + +```bash +# Linux/Mac +chmod +x start-mariadb.sh +./start-mariadb.sh + +# Windows (PowerShell) +docker-compose -f docker-compose-mariadb.yml --env-file mariadb.env up -d +``` + +### 2. MariaDB 중지 + +```bash +# Linux/Mac +chmod +x stop-mariadb.sh +./stop-mariadb.sh + +# Windows (PowerShell) +docker-compose -f docker-compose-mariadb.yml down +``` + +## 연결 정보 + +- **호스트**: localhost +- **포트**: 3306 +- **데이터베이스**: testdb +- **사용자**: dbuser +- **비밀번호**: userpassword123 +- **Root 비밀번호**: rootpassword123 + +## phpMyAdmin 접속 + +MariaDB 관리를 위한 phpMyAdmin이 함께 설치됩니다. + +- **URL**: http://localhost:8080 +- **사용자**: root 또는 dbuser +- **비밀번호**: 위의 연결 정보 참조 + +## 환경 변수 설정 + +`mariadb.env` 파일을 수정하여 데이터베이스 설정을 변경할 수 있습니다: + +```env +MYSQL_ROOT_PASSWORD=rootpassword123 +MYSQL_DATABASE=testdb +MYSQL_USER=dbuser +MYSQL_PASSWORD=userpassword123 +``` + +## 초기화 스크립트 + +`mariadb-init/` 디렉토리에 있는 SQL 파일들은 컨테이너 첫 실행 시 자동으로 실행됩니다. + +- 데이터베이스 생성 +- 사용자 권한 설정 +- 샘플 테이블 및 데이터 생성 + +## 설정 파일 + +`mariadb-config/my.cnf` 파일에서 MariaDB 서버 설정을 커스터마이징할 수 있습니다: + +- 문자셋: UTF8MB4 +- 성능 최적화 설정 +- 로그 설정 +- 보안 설정 + +## 유용한 명령어 + +### 컨테이너 상태 확인 +```bash +docker ps | grep mariadb +``` + +### MariaDB 로그 확인 +```bash +docker logs mariadb-server +``` + +### MariaDB 컨테이너 접속 +```bash +docker exec -it mariadb-server mysql -u root -p +``` + +### 데이터 백업 +```bash +docker exec mariadb-server mysqldump -u root -p --all-databases > backup.sql +``` + +### 데이터 복원 +```bash +docker exec -i mariadb-server mysql -u root -p < backup.sql +``` + +## 포트 설정 + +현재 설정된 포트: +- MariaDB: 3306 +- phpMyAdmin: 8080 + +다른 서비스와 포트 충돌이 있는 경우 `docker-compose-mariadb.yml` 파일에서 포트를 변경할 수 있습니다. + +## 데이터 지속성 + +MariaDB 데이터는 Docker 볼륨(`mariadb_data`)에 저장되어 컨테이너를 재시작해도 데이터가 보존됩니다. + +## 문제 해결 + +### 포트 충돌 +다른 MySQL/MariaDB 서비스가 3306 포트를 사용 중인 경우: +1. 기존 서비스 중지 +2. docker-compose-mariadb.yml에서 포트 변경 (예: "3307:3306") + +### 권한 문제 +Linux/Mac에서 스크립트 실행 권한 부여: +```bash +chmod +x start-mariadb.sh stop-mariadb.sh +``` + +### 컨테이너가 시작되지 않는 경우 +```bash +docker logs mariadb-server +``` +명령어로 로그를 확인하여 오류 원인을 파악하세요. diff --git a/docker-compose-mariadb.yml b/docker-compose-mariadb.yml new file mode 100644 index 0000000..ee386e5 --- /dev/null +++ b/docker-compose-mariadb.yml @@ -0,0 +1,52 @@ +version: '3.8' + +services: + mariadb: + image: localhost:8787/mariadb:10.11.linux + container_name: mariadb-server + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-wace0909!!} + MYSQL_DATABASE: ${MYSQL_DATABASE:-wace} + MYSQL_USER: ${MYSQL_USER:-wace} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-wace0909!!} + TZ: Asia/Seoul + ports: + - "3306:3306" + volumes: + - mariadb_data:/var/lib/mysql + - ./mariadb-init:/docker-entrypoint-initdb.d + - ./mariadb-config:/etc/mysql/conf.d + networks: + - mariadb_network + command: > + --character-set-server=utf8mb4 + --collation-server=utf8mb4_unicode_ci + --max-connections=200 + --innodb-buffer-pool-size=256M + + # MariaDB 관리용 phpMyAdmin (선택사항) + phpmyadmin: + image: phpmyadmin/phpmyadmin:latest + container_name: mariadb-phpmyadmin + restart: unless-stopped + environment: + PMA_HOST: mariadb + PMA_PORT: 3306 + PMA_USER: root + PMA_PASSWORD: ${MYSQL_ROOT_PASSWORD:-wace0909!!} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-wace0909!!} + ports: + - "8080:80" + depends_on: + - mariadb + networks: + - mariadb_network + +volumes: + mariadb_data: + driver: local + +networks: + mariadb_network: + driver: bridge diff --git a/docker-compose-mssql.yml b/docker-compose-mssql.yml new file mode 100644 index 0000000..5c3ee33 --- /dev/null +++ b/docker-compose-mssql.yml @@ -0,0 +1,44 @@ +version: '3.8' + +services: + mssql: + image: localhost:8787/server:2022-latest + container_name: mssql-server + restart: unless-stopped + environment: + ACCEPT_EULA: Y + SA_PASSWORD: ${SA_PASSWORD:-wace0909!!} + MSSQL_PID: ${MSSQL_PID:-Express} + TZ: Asia/Seoul + ports: + - "1433:1433" + volumes: + - mssql_data:/var/opt/mssql + - ./mssql-init:/docker-entrypoint-initdb.d + - ./mssql-backup:/var/opt/mssql/backup + networks: + - mssql_network + hostname: mssql-server + user: root + + # MSSQL 관리용 Adminer (선택사항) + mssql-adminer: + image: adminer:latest + container_name: mssql-adminer + restart: unless-stopped + environment: + ADMINER_DEFAULT_SERVER: mssql + ports: + - "8081:8080" + depends_on: + - mssql + networks: + - mssql_network + +volumes: + mssql_data: + driver: local + +networks: + mssql_network: + driver: bridge diff --git a/docker-compose-oracle.yml b/docker-compose-oracle.yml new file mode 100644 index 0000000..23e22bc --- /dev/null +++ b/docker-compose-oracle.yml @@ -0,0 +1,48 @@ +version: '3.8' + +services: + oracle: + image: localhost:8787/oracle:latest + container_name: oracle-server + restart: unless-stopped + environment: + ORACLE_SID: ${ORACLE_SID:-ORCL} + ORACLE_PDB: ${ORACLE_PDB:-ORCLPDB1} + ORACLE_PWD: ${ORACLE_PWD:-wace0909!!} + ORACLE_EDITION: ${ORACLE_EDITION:-standard} + ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8} + ENABLE_ARCHIVELOG: ${ENABLE_ARCHIVELOG:-true} + TZ: Asia/Seoul + ports: + - "1521:1521" + - "5500:5500" + volumes: + - oracle_data:/opt/oracle/oradata + - ./oracle-init:/docker-entrypoint-initdb.d + - ./oracle-backup:/opt/oracle/backup + networks: + - oracle_network + hostname: oracle-server + shm_size: 1g + + # Oracle 관리용 Adminer (선택사항) + oracle-adminer: + image: adminer:latest + container_name: oracle-adminer + restart: unless-stopped + environment: + ADMINER_DEFAULT_SERVER: oracle + ports: + - "8082:8080" + depends_on: + - oracle + networks: + - oracle_network + +volumes: + oracle_data: + driver: local + +networks: + oracle_network: + driver: bridge diff --git a/mariadb-config/my.cnf b/mariadb-config/my.cnf new file mode 100644 index 0000000..85f1d7a --- /dev/null +++ b/mariadb-config/my.cnf @@ -0,0 +1,41 @@ +[mysqld] +# 기본 설정 +character-set-server = utf8mb4 +collation-server = utf8mb4_unicode_ci +init-connect = 'SET NAMES utf8mb4' + +# 성능 설정 +max_connections = 200 +innodb_buffer_pool_size = 256M +innodb_log_file_size = 64M +innodb_flush_log_at_trx_commit = 2 +innodb_flush_method = O_DIRECT + +# 쿼리 캐시 설정 +query_cache_type = 1 +query_cache_size = 32M +query_cache_limit = 2M + +# 로그 설정 +general_log = 0 +slow_query_log = 1 +slow_query_log_file = /var/log/mysql/slow.log +long_query_time = 2 + +# 바이너리 로그 설정 +log-bin = mysql-bin +binlog_format = ROW +expire_logs_days = 7 + +# 보안 설정 +skip-name-resolve +sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO + +# 타임존 설정 +default-time-zone = '+09:00' + +[mysql] +default-character-set = utf8mb4 + +[client] +default-character-set = utf8mb4 diff --git a/mariadb-init/01-init-database.sql b/mariadb-init/01-init-database.sql new file mode 100644 index 0000000..173fb6a --- /dev/null +++ b/mariadb-init/01-init-database.sql @@ -0,0 +1,50 @@ +-- MariaDB 초기화 스크립트 +-- 데이터베이스와 사용자 생성 + +-- 기본 데이터베이스 생성 (이미 환경변수로 생성되지만 추가 설정용) +CREATE DATABASE IF NOT EXISTS wace CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- 추가 데이터베이스 생성 예시 +CREATE DATABASE IF NOT EXISTS appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE DATABASE IF NOT EXISTS logdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- 사용자 권한 설정 +GRANT ALL PRIVILEGES ON wace.* TO 'wace'@'%'; +GRANT ALL PRIVILEGES ON appdb.* TO 'wace'@'%'; +GRANT SELECT, INSERT, UPDATE ON logdb.* TO 'wace'@'%'; + +-- 권한 적용 +FLUSH PRIVILEGES; + +-- 샘플 테이블 생성 +USE wace; + +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + email VARCHAR(100) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS user_profiles ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + first_name VARCHAR(50), + last_name VARCHAR(50), + phone VARCHAR(20), + address TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- 샘플 데이터 삽입 +INSERT INTO users (username, email, password_hash) VALUES +('admin', 'admin@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'), +('testuser', 'test@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'); + +INSERT INTO user_profiles (user_id, first_name, last_name, phone) VALUES +(1, '관리자', '시스템', '010-1234-5678'), +(2, '테스트', '사용자', '010-9876-5432'); diff --git a/mariadb.env b/mariadb.env new file mode 100644 index 0000000..1470e43 --- /dev/null +++ b/mariadb.env @@ -0,0 +1,9 @@ +# MariaDB 환경 변수 설정 +MYSQL_ROOT_PASSWORD=wace0909!! +MYSQL_DATABASE=wace +MYSQL_USER=wace +MYSQL_PASSWORD=wace0909!! + +# 선택적 설정 +MYSQL_ALLOW_EMPTY_PASSWORD=no +MYSQL_RANDOM_ROOT_PASSWORD=no diff --git a/mssql-init/01-init-database.sql b/mssql-init/01-init-database.sql new file mode 100644 index 0000000..ea15b42 --- /dev/null +++ b/mssql-init/01-init-database.sql @@ -0,0 +1,78 @@ +-- MSSQL 초기화 스크립트 +-- 데이터베이스와 사용자 생성 + +USE master; +GO + +-- wace 데이터베이스 생성 +IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'wace') +BEGIN + CREATE DATABASE wace + COLLATE Korean_Wansung_CI_AS; +END +GO + +-- wace 사용자 생성 및 권한 부여 +USE wace; +GO + +-- 로그인 생성 +IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'wace') +BEGIN + CREATE LOGIN wace WITH PASSWORD = 'wace0909!!'; +END +GO + +-- 사용자 생성 +IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name = 'wace') +BEGIN + CREATE USER wace FOR LOGIN wace; + ALTER ROLE db_owner ADD MEMBER wace; +END +GO + +-- 샘플 테이블 생성 +IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'users') +BEGIN + CREATE TABLE users ( + id INT IDENTITY(1,1) PRIMARY KEY, + username NVARCHAR(50) NOT NULL UNIQUE, + email NVARCHAR(100) NOT NULL UNIQUE, + password_hash NVARCHAR(255) NOT NULL, + created_at DATETIME2 DEFAULT GETDATE(), + updated_at DATETIME2 DEFAULT GETDATE() + ); +END +GO + +IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'user_profiles') +BEGIN + CREATE TABLE user_profiles ( + id INT IDENTITY(1,1) PRIMARY KEY, + user_id INT NOT NULL, + first_name NVARCHAR(50), + last_name NVARCHAR(50), + phone NVARCHAR(20), + address NVARCHAR(MAX), + created_at DATETIME2 DEFAULT GETDATE(), + updated_at DATETIME2 DEFAULT GETDATE(), + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE + ); +END +GO + +-- 샘플 데이터 삽입 +IF NOT EXISTS (SELECT * FROM users WHERE username = 'admin') +BEGIN + INSERT INTO users (username, email, password_hash) VALUES + ('admin', 'admin@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'), + ('testuser', 'test@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'); + + INSERT INTO user_profiles (user_id, first_name, last_name, phone) VALUES + (1, N'관리자', N'시스템', '010-1234-5678'), + (2, N'테스트', N'사용자', '010-9876-5432'); +END +GO + +PRINT 'MSSQL wace 데이터베이스 초기화 완료'; +GO diff --git a/mssql.env b/mssql.env new file mode 100644 index 0000000..05683ef --- /dev/null +++ b/mssql.env @@ -0,0 +1,9 @@ +# MSSQL 환경 변수 설정 +SA_PASSWORD=wace0909!! +MSSQL_PID=Express +ACCEPT_EULA=Y + +# 데이터베이스 설정 +DATABASE_NAME=wace +DB_USER=wace +DB_PASSWORD=wace0909!! diff --git a/oracle-init/01-init-database.sql b/oracle-init/01-init-database.sql new file mode 100644 index 0000000..df352f6 --- /dev/null +++ b/oracle-init/01-init-database.sql @@ -0,0 +1,120 @@ +-- Oracle 초기화 스크립트 +-- 데이터베이스와 사용자 생성 + +-- wace 사용자 생성 (PDB에서 실행) +ALTER SESSION SET CONTAINER = ORCLPDB1; + +-- 사용자가 이미 존재하는지 확인하고 생성 +DECLARE + user_count NUMBER; +BEGIN + SELECT COUNT(*) INTO user_count FROM dba_users WHERE username = 'WACE'; + + IF user_count = 0 THEN + EXECUTE IMMEDIATE 'CREATE USER wace IDENTIFIED BY "wace0909!!" DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp'; + EXECUTE IMMEDIATE 'GRANT CONNECT, RESOURCE, DBA TO wace'; + EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO wace'; + EXECUTE IMMEDIATE 'GRANT CREATE TABLE TO wace'; + EXECUTE IMMEDIATE 'GRANT CREATE VIEW TO wace'; + EXECUTE IMMEDIATE 'GRANT CREATE PROCEDURE TO wace'; + EXECUTE IMMEDIATE 'GRANT CREATE SEQUENCE TO wace'; + EXECUTE IMMEDIATE 'GRANT CREATE TRIGGER TO wace'; + EXECUTE IMMEDIATE 'ALTER USER wace QUOTA UNLIMITED ON users'; + DBMS_OUTPUT.PUT_LINE('사용자 wace가 생성되었습니다.'); + ELSE + DBMS_OUTPUT.PUT_LINE('사용자 wace가 이미 존재합니다.'); + END IF; +END; +/ + +-- wace 사용자로 연결하여 테이블 생성 +CONNECT wace/"wace0909!!"@//localhost:1521/ORCLPDB1; + +-- 샘플 테이블 생성 +DECLARE + table_count NUMBER; +BEGIN + SELECT COUNT(*) INTO table_count FROM user_tables WHERE table_name = 'USERS'; + + IF table_count = 0 THEN + EXECUTE IMMEDIATE ' + CREATE TABLE users ( + id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + username VARCHAR2(50) NOT NULL UNIQUE, + email VARCHAR2(100) NOT NULL UNIQUE, + password_hash VARCHAR2(255) NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )'; + DBMS_OUTPUT.PUT_LINE('users 테이블이 생성되었습니다.'); + END IF; +END; +/ + +DECLARE + table_count NUMBER; +BEGIN + SELECT COUNT(*) INTO table_count FROM user_tables WHERE table_name = 'USER_PROFILES'; + + IF table_count = 0 THEN + EXECUTE IMMEDIATE ' + CREATE TABLE user_profiles ( + id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + user_id NUMBER NOT NULL, + first_name VARCHAR2(50), + last_name VARCHAR2(50), + phone VARCHAR2(20), + address CLOB, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_user_profiles_user_id FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE + )'; + DBMS_OUTPUT.PUT_LINE('user_profiles 테이블이 생성되었습니다.'); + END IF; +END; +/ + +-- 업데이트 트리거 생성 +CREATE OR REPLACE TRIGGER trg_users_updated_at + BEFORE UPDATE ON users + FOR EACH ROW +BEGIN + :NEW.updated_at := CURRENT_TIMESTAMP; +END; +/ + +CREATE OR REPLACE TRIGGER trg_user_profiles_updated_at + BEFORE UPDATE ON user_profiles + FOR EACH ROW +BEGIN + :NEW.updated_at := CURRENT_TIMESTAMP; +END; +/ + +-- 샘플 데이터 삽입 +DECLARE + data_count NUMBER; +BEGIN + SELECT COUNT(*) INTO data_count FROM users WHERE username = 'admin'; + + IF data_count = 0 THEN + INSERT INTO users (username, email, password_hash) VALUES + ('admin', 'admin@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'); + + INSERT INTO users (username, email, password_hash) VALUES + ('testuser', 'test@example.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi'); + + INSERT INTO user_profiles (user_id, first_name, last_name, phone) VALUES + (1, '관리자', '시스템', '010-1234-5678'); + + INSERT INTO user_profiles (user_id, first_name, last_name, phone) VALUES + (2, '테스트', '사용자', '010-9876-5432'); + + COMMIT; + DBMS_OUTPUT.PUT_LINE('샘플 데이터가 삽입되었습니다.'); + END IF; +END; +/ + +DBMS_OUTPUT.PUT_LINE('Oracle wace 데이터베이스 초기화 완료'); +/ diff --git a/oracle.env b/oracle.env new file mode 100644 index 0000000..0d631bc --- /dev/null +++ b/oracle.env @@ -0,0 +1,12 @@ +# Oracle 환경 변수 설정 +ORACLE_SID=ORCL +ORACLE_PDB=ORCLPDB1 +ORACLE_PWD=wace0909!! +ORACLE_EDITION=standard +ORACLE_CHARACTERSET=AL32UTF8 +ENABLE_ARCHIVELOG=true + +# 데이터베이스 설정 +DATABASE_NAME=wace +DB_USER=wace +DB_PASSWORD=wace0909!! diff --git a/start-all-db.sh b/start-all-db.sh new file mode 100644 index 0000000..2a4ebc8 --- /dev/null +++ b/start-all-db.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +# 모든 데이터베이스 Docker 컨테이너 시작 스크립트 + +echo "=== 모든 데이터베이스 컨테이너를 시작합니다 ===" +echo "" + +# PostgreSQL 확인 (이미 실행 중인지 확인) +echo "1. PostgreSQL 상태 확인..." +if docker ps | grep -q postgres; then + echo "PostgreSQL이 이미 실행 중입니다." +else + echo "PostgreSQL이 실행되지 않았습니다. 필요시 수동으로 시작하세요." +fi +echo "" + +# MariaDB 시작 +echo "2. MariaDB 시작..." +if [ -f "docker-compose-mariadb.yml" ]; then + docker-compose -f docker-compose-mariadb.yml --env-file mariadb.env up -d + echo "MariaDB 시작 완료" +else + echo "MariaDB 설정 파일이 없습니다." +fi +echo "" + +# MSSQL 시작 +echo "3. MSSQL 시작..." +if [ -f "docker-compose-mssql.yml" ]; then + docker-compose -f docker-compose-mssql.yml --env-file mssql.env up -d + echo "MSSQL 시작 완료" +else + echo "MSSQL 설정 파일이 없습니다." +fi +echo "" + +# Oracle 시작 +echo "4. Oracle 시작..." +if [ -f "docker-compose-oracle.yml" ]; then + docker-compose -f docker-compose-oracle.yml --env-file oracle.env up -d + echo "Oracle 시작 완료 (초기화에 시간이 걸릴 수 있습니다)" +else + echo "Oracle 설정 파일이 없습니다." +fi +echo "" + +# 잠시 대기 후 상태 확인 +echo "컨테이너 상태를 확인합니다..." +sleep 10 +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +echo "" +echo "=== 데이터베이스 연결 정보 ===" +echo "" +echo "PostgreSQL:" +echo " - 포트: 5432 (이미 실행 중인 경우)" +echo "" +echo "MariaDB:" +echo " - 포트: 3306" +echo " - 데이터베이스: wace" +echo " - 사용자: wace / 비밀번호: wace0909!!" +echo " - phpMyAdmin: http://localhost:8080" +echo "" +echo "MSSQL:" +echo " - 포트: 1433" +echo " - 데이터베이스: wace" +echo " - 사용자: wace / 비밀번호: wace0909!!" +echo " - Adminer: http://localhost:8081" +echo "" +echo "Oracle:" +echo " - 포트: 1521" +echo " - SID: ORCL / PDB: ORCLPDB1" +echo " - 사용자: wace / 비밀번호: wace0909!!" +echo " - Adminer: http://localhost:8082" +echo " - Enterprise Manager: http://localhost:5500/em" +echo "" +echo "모든 데이터베이스 컨테이너 시작이 완료되었습니다!" diff --git a/start-mariadb.sh b/start-mariadb.sh new file mode 100644 index 0000000..e3acb4e --- /dev/null +++ b/start-mariadb.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# MariaDB Docker 컨테이너 시작 스크립트 + +echo "MariaDB Docker 컨테이너를 시작합니다..." + +# 환경 변수 파일 확인 +if [ ! -f "mariadb.env" ]; then + echo "경고: mariadb.env 파일이 없습니다. 기본값을 사용합니다." +fi + +# Docker Compose로 MariaDB 시작 +docker-compose -f docker-compose-mariadb.yml --env-file mariadb.env up -d + +# 컨테이너 상태 확인 +echo "컨테이너 상태를 확인합니다..." +sleep 5 +docker ps | grep mariadb + +echo "" +echo "MariaDB 연결 정보:" +echo "- 호스트: localhost" +echo "- 포트: 3306" +echo "- 데이터베이스: testdb" +echo "- 사용자: dbuser" +echo "- 비밀번호: userpassword123" +echo "- Root 비밀번호: rootpassword123" +echo "" +echo "phpMyAdmin 접속: http://localhost:8080" +echo "" +echo "MariaDB 컨테이너가 시작되었습니다!" + +# 로그 확인 (선택사항) +echo "MariaDB 로그를 확인하려면 다음 명령어를 사용하세요:" +echo "docker logs mariadb-server" diff --git a/start-mssql.sh b/start-mssql.sh new file mode 100644 index 0000000..991dac1 --- /dev/null +++ b/start-mssql.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# MSSQL Docker 컨테이너 시작 스크립트 + +echo "MSSQL Docker 컨테이너를 시작합니다..." + +# 환경 변수 파일 확인 +if [ ! -f "mssql.env" ]; then + echo "경고: mssql.env 파일이 없습니다. 기본값을 사용합니다." +fi + +# Docker Compose로 MSSQL 시작 +docker-compose -f docker-compose-mssql.yml --env-file mssql.env up -d + +# 컨테이너 상태 확인 +echo "컨테이너 상태를 확인합니다..." +sleep 10 +docker ps | grep mssql + +echo "" +echo "MSSQL 연결 정보:" +echo "- 호스트: localhost" +echo "- 포트: 1433" +echo "- 데이터베이스: wace" +echo "- 사용자: wace" +echo "- 비밀번호: wace0909!!" +echo "- SA 비밀번호: wace0909!!" +echo "" +echo "Adminer 접속: http://localhost:8081" +echo " - 시스템: MS SQL (beta)" +echo " - 서버: mssql" +echo " - 사용자명: sa 또는 wace" +echo " - 비밀번호: wace0909!!" +echo " - 데이터베이스: wace" +echo "" +echo "MSSQL 컨테이너가 시작되었습니다!" + +# 로그 확인 (선택사항) +echo "MSSQL 로그를 확인하려면 다음 명령어를 사용하세요:" +echo "docker logs mssql-server" diff --git a/start-oracle.sh b/start-oracle.sh new file mode 100644 index 0000000..d977c3f --- /dev/null +++ b/start-oracle.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Oracle Docker 컨테이너 시작 스크립트 + +echo "Oracle Docker 컨테이너를 시작합니다..." + +# 환경 변수 파일 확인 +if [ ! -f "oracle.env" ]; then + echo "경고: oracle.env 파일이 없습니다. 기본값을 사용합니다." +fi + +# Docker Compose로 Oracle 시작 +docker-compose -f docker-compose-oracle.yml --env-file oracle.env up -d + +# 컨테이너 상태 확인 +echo "컨테이너 상태를 확인합니다..." +echo "Oracle 초기화에는 시간이 걸릴 수 있습니다. 잠시 기다려주세요..." +sleep 30 +docker ps | grep oracle + +echo "" +echo "Oracle 연결 정보:" +echo "- 호스트: localhost" +echo "- 포트: 1521" +echo "- SID: ORCL" +echo "- PDB: ORCLPDB1" +echo "- 사용자: wace" +echo "- 비밀번호: wace0909!!" +echo "- SYS 비밀번호: wace0909!!" +echo "" +echo "연결 문자열 예시:" +echo "- sqlplus wace/\"wace0909!!\"@//localhost:1521/ORCLPDB1" +echo "- JDBC: jdbc:oracle:thin:@localhost:1521:ORCL" +echo "" +echo "Adminer 접속: http://localhost:8082" +echo " - 시스템: Oracle" +echo " - 서버: oracle:1521" +echo " - 사용자명: wace" +echo " - 비밀번호: wace0909!!" +echo " - 데이터베이스: ORCLPDB1" +echo "" +echo "Oracle Enterprise Manager: http://localhost:5500/em" +echo "" +echo "Oracle 컨테이너가 시작되었습니다!" + +# 로그 확인 (선택사항) +echo "Oracle 로그를 확인하려면 다음 명령어를 사용하세요:" +echo "docker logs oracle-server" diff --git a/stop-all-db.sh b/stop-all-db.sh new file mode 100644 index 0000000..9f2a876 --- /dev/null +++ b/stop-all-db.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +# 모든 데이터베이스 Docker 컨테이너 중지 스크립트 + +echo "=== 모든 데이터베이스 컨테이너를 중지합니다 ===" +echo "" + +# MariaDB 중지 +echo "1. MariaDB 중지..." +if [ -f "docker-compose-mariadb.yml" ]; then + docker-compose -f docker-compose-mariadb.yml down + echo "MariaDB 중지 완료" +else + echo "MariaDB 설정 파일이 없습니다." +fi +echo "" + +# MSSQL 중지 +echo "2. MSSQL 중지..." +if [ -f "docker-compose-mssql.yml" ]; then + docker-compose -f docker-compose-mssql.yml down + echo "MSSQL 중지 완료" +else + echo "MSSQL 설정 파일이 없습니다." +fi +echo "" + +# Oracle 중지 +echo "3. Oracle 중지..." +if [ -f "docker-compose-oracle.yml" ]; then + docker-compose -f docker-compose-oracle.yml down + echo "Oracle 중지 완료" +else + echo "Oracle 설정 파일이 없습니다." +fi +echo "" + +echo "PostgreSQL은 수동으로 관리하세요 (이미 실행 중인 컨테이너)." +echo "" + +# 컨테이너 상태 확인 +echo "현재 실행 중인 컨테이너:" +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +echo "" +echo "모든 데이터베이스 컨테이너 중지가 완료되었습니다!" diff --git a/stop-mariadb.sh b/stop-mariadb.sh new file mode 100644 index 0000000..bb80109 --- /dev/null +++ b/stop-mariadb.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# MariaDB Docker 컨테이너 중지 스크립트 + +echo "MariaDB Docker 컨테이너를 중지합니다..." + +# Docker Compose로 MariaDB 중지 +docker-compose -f docker-compose-mariadb.yml down + +echo "MariaDB 컨테이너가 중지되었습니다!" + +# 컨테이너 상태 확인 +echo "현재 실행 중인 컨테이너:" +docker ps diff --git a/stop-mssql.sh b/stop-mssql.sh new file mode 100644 index 0000000..cca0444 --- /dev/null +++ b/stop-mssql.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# MSSQL Docker 컨테이너 중지 스크립트 + +echo "MSSQL Docker 컨테이너를 중지합니다..." + +# Docker Compose로 MSSQL 중지 +docker-compose -f docker-compose-mssql.yml down + +echo "MSSQL 컨테이너가 중지되었습니다!" + +# 컨테이너 상태 확인 +echo "현재 실행 중인 컨테이너:" +docker ps diff --git a/stop-oracle.sh b/stop-oracle.sh new file mode 100644 index 0000000..2ddf8ea --- /dev/null +++ b/stop-oracle.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Oracle Docker 컨테이너 중지 스크립트 + +echo "Oracle Docker 컨테이너를 중지합니다..." + +# Docker Compose로 Oracle 중지 +docker-compose -f docker-compose-oracle.yml down + +echo "Oracle 컨테이너가 중지되었습니다!" + +# 컨테이너 상태 확인 +echo "현재 실행 중인 컨테이너:" +docker ps