penti/docs/QUICKSTART_MIGRATION.md

404 lines
9.9 KiB
Markdown
Raw Normal View History

2026-01-31 23:30:51 +09:00
# 마이그레이션 빠른 시작 가이드
make-quant-py의 MySQL 데이터를 PostgreSQL로 마이그레이션하는 실행 가이드입니다.
## 1⃣ 사전 확인
### MySQL 정보 확인
make-quant-py 프로젝트의 MySQL 연결 정보를 확인하세요:
```bash
# make-quant-py 디렉토리로 이동
cd C:\Users\zephy\workspace\quant\make-quant-py
# .env 또는 설정 파일 확인
# MySQL 호스트, 사용자, 비밀번호, 데이터베이스명 메모
```
필요한 정보:
- MySQL 호스트: (예: `localhost` 또는 `127.0.0.1`)
- MySQL 포트: (기본값: `3306`)
- MySQL 사용자: (예: `root`)
- MySQL 비밀번호
- MySQL 데이터베이스: (예: `quant`)
### PostgreSQL 준비
```bash
# pension-quant-platform 디렉토리로 이동
cd C:\Users\zephy\workspace\quant\pension-quant-platform
# Docker 서비스 시작
docker-compose up -d postgres
# 데이터베이스 마이그레이션 (테이블 생성)
docker-compose exec backend alembic upgrade head
```
## 2⃣ Python 환경 준비
### 옵션 A: 로컬에서 실행 (권장)
```bash
# pension-quant-platform 디렉토리에서
cd C:\Users\zephy\workspace\quant\pension-quant-platform
# 가상환경 활성화 (있는 경우)
# Windows:
# .venv\Scripts\activate
# Linux/Mac:
# source .venv/bin/activate
# 필요한 패키지 설치
pip install pymysql pandas tqdm sqlalchemy psycopg2-binary
# 또는 requirements 사용
pip install -r backend/requirements.txt
```
### 옵션 B: Docker 컨테이너에서 실행
```bash
# Docker 백엔드 컨테이너에 접속
docker-compose exec backend bash
# 컨테이너 내부에서 실행 (패키지는 이미 설치됨)
```
## 3⃣ 마이그레이션 실행
### 방법 1: 테스트 마이그레이션 (일부 데이터만)
먼저 소량의 데이터로 테스트해보는 것을 권장합니다:
```bash
# Windows (CMD)
python scripts\migrate_mysql_to_postgres.py ^
--mysql-host localhost ^
--mysql-user root ^
--mysql-password YOUR_PASSWORD ^
--mysql-database quant ^
--price-limit 10000 ^
--fs-limit 10000
# Windows (PowerShell)
python scripts/migrate_mysql_to_postgres.py `
--mysql-host localhost `
--mysql-user root `
--mysql-password YOUR_PASSWORD `
--mysql-database quant `
--price-limit 10000 `
--fs-limit 10000
# Linux/Mac
python scripts/migrate_mysql_to_postgres.py \
--mysql-host localhost \
--mysql-user root \
--mysql-password YOUR_PASSWORD \
--mysql-database quant \
--price-limit 10000 \
--fs-limit 10000
```
**설명**:
- `--price-limit 10000`: 주가 데이터 10,000건만 마이그레이션
- `--fs-limit 10000`: 재무제표 데이터 10,000건만 마이그레이션
- 종목 데이터는 전체 마이그레이션 (보통 2,000-3,000개)
**예상 소요 시간**: 5-10분
### 방법 2: 전체 마이그레이션
테스트가 성공하면 전체 데이터 마이그레이션:
```bash
# Windows (CMD)
python scripts\migrate_mysql_to_postgres.py ^
--mysql-host localhost ^
--mysql-user root ^
--mysql-password YOUR_PASSWORD ^
--mysql-database quant
# Windows (PowerShell)
python scripts/migrate_mysql_to_postgres.py `
--mysql-host localhost `
--mysql-user root `
--mysql-password YOUR_PASSWORD `
--mysql-database quant
# Linux/Mac
python scripts/migrate_mysql_to_postgres.py \
--mysql-host localhost \
--mysql-user root \
--mysql-password YOUR_PASSWORD \
--mysql-database quant
```
**예상 소요 시간**:
- 100만 레코드: 30분-1시간
- 500만 레코드: 2-3시간
- 1,000만+ 레코드: 4-6시간
### 방법 3: Docker 컨테이너에서 실행
호스트의 MySQL에 접근하는 경우:
```bash
# Docker 컨테이너 접속
docker-compose exec backend bash
# 컨테이너 내부에서 실행
python /app/scripts/migrate_mysql_to_postgres.py \
--mysql-host host.docker.internal \
--mysql-user root \
--mysql-password YOUR_PASSWORD \
--mysql-database quant
```
**주의**: `host.docker.internal`은 Docker Desktop (Windows/Mac)에서 호스트를 가리킵니다.
## 4⃣ 진행 상황 확인
마이그레이션이 실행되면 다음과 같은 출력을 볼 수 있습니다:
```
============================================================
MySQL → PostgreSQL 데이터 마이그레이션 시작
시작 시간: 2025-01-29 15:30:00
============================================================
=== 종목 데이터 마이그레이션 시작 ===
MySQL에서 2,547개 종목 데이터 읽기 완료
종목 데이터 저장: 100%|████████████| 2547/2547 [00:18<00:00, 141.50it/s]
종목 데이터 마이그레이션 완료: 2,547개
=== 주가 데이터 마이그레이션 시작 ===
전체 주가 레코드 수: 4,832,156개
배치 1: 10,000개 레코드 처리 중...
주가 데이터 저장: 100%|████████████| 10000/10000 [01:25<00:00, 117.15it/s]
배치 2: 10,000개 레코드 처리 중...
...
```
## 5⃣ 마이그레이션 검증
마이그레이션 완료 후 데이터를 확인하세요:
### 방법 1: API로 확인
```bash
# 데이터베이스 통계 조회
curl http://localhost:8000/api/v1/data/stats
# 응답 예시:
{
"ticker_count": 2547,
"price_count": 4832156,
"financial_count": 2145789,
"sector_count": 0
}
```
### 방법 2: PostgreSQL 직접 확인
```bash
# PostgreSQL 접속
docker-compose exec postgres psql -U postgres -d pension_quant
# 테이블 레코드 수 확인
SELECT 'assets' as table_name, COUNT(*) FROM assets
UNION ALL
SELECT 'price_data', COUNT(*) FROM price_data
UNION ALL
SELECT 'financial_statements', COUNT(*) FROM financial_statements;
# 종료
\q
```
### 방법 3: 샘플 데이터 확인
```sql
-- 종목 샘플 조회
SELECT ticker, name, market, sector
FROM assets
LIMIT 10;
-- 최근 주가 데이터
SELECT ticker, timestamp, close
FROM price_data
ORDER BY timestamp DESC
LIMIT 10;
-- 재무제표 샘플
SELECT ticker, account, base_date, value
FROM financial_statements
LIMIT 10;
```
## 6⃣ 문제 해결
### 연결 오류
**오류**: `Can't connect to MySQL server`
**해결**:
```bash
# MySQL 서버 실행 확인
# Windows (MySQL이 서비스로 실행 중인 경우)
sc query MySQL80 # 또는 MySQL 서비스명
# 또는 MySQL Workbench로 연결 테스트
```
### 비밀번호 오류
**오류**: `Access denied for user`
**해결**:
- MySQL 사용자명과 비밀번호 확인
- make-quant-py 설정 파일에서 확인
### Python 모듈 없음
**오류**: `ModuleNotFoundError: No module named 'pymysql'`
**해결**:
```bash
pip install pymysql pandas tqdm sqlalchemy psycopg2-binary
```
### PostgreSQL 연결 오류
**오류**: `could not connect to server`
**해결**:
```bash
# PostgreSQL 컨테이너 상태 확인
docker-compose ps postgres
# PostgreSQL 재시작
docker-compose restart postgres
```
### 중단 후 재시작
마이그레이션이 중단되었다면:
- **걱정 마세요!** UPSERT 방식이므로 재실행 가능
- 같은 명령어를 다시 실행하면 이어서 진행됩니다
- 기존 데이터는 업데이트, 신규 데이터는 삽입
## 7⃣ 실제 예시
### 예시 1: 로컬 MySQL → Docker PostgreSQL
```bash
# 1. PostgreSQL 준비
docker-compose up -d postgres
docker-compose exec backend alembic upgrade head
# 2. 테스트 마이그레이션 (10,000건)
python scripts/migrate_mysql_to_postgres.py \
--mysql-host localhost \
--mysql-user root \
--mysql-password mypassword \
--mysql-database quant \
--price-limit 10000 \
--fs-limit 10000
# 3. 검증
curl http://localhost:8000/api/v1/data/stats
# 4. 성공하면 전체 마이그레이션
python scripts/migrate_mysql_to_postgres.py \
--mysql-host localhost \
--mysql-user root \
--mysql-password mypassword \
--mysql-database quant
```
### 예시 2: 실제 make-quant-py 데이터
```bash
# make-quant-py의 실제 설정 사용
cd C:\Users\zephy\workspace\quant\pension-quant-platform
python scripts/migrate_mysql_to_postgres.py \
--mysql-host localhost \
--mysql-user root \
--mysql-password YOUR_ACTUAL_PASSWORD \
--mysql-database quant
# 예상 출력:
# ============================================================
# MySQL → PostgreSQL 데이터 마이그레이션 시작
# 시작 시간: 2025-01-29 16:00:00
# ============================================================
#
# === 종목 데이터 마이그레이션 시작 ===
# MySQL에서 2,547개 종목 데이터 읽기 완료
# 종목 데이터 저장: 100%|████████████| 2547/2547
# 종목 데이터 마이그레이션 완료: 2,547개
#
# === 주가 데이터 마이그레이션 시작 ===
# 전체 주가 레코드 수: 4,832,156개
# ...
# 주가 데이터 마이그레이션 완료: 4,832,156개
#
# === 재무제표 데이터 마이그레이션 시작 ===
# 전체 재무제표 레코드 수: 2,145,789개
# ...
# 재무제표 데이터 마이그레이션 완료: 2,145,789개
#
# ============================================================
# 마이그레이션 완료!
# 종료 시간: 2025-01-29 18:15:00
# 소요 시간: 2:15:00
# ============================================================
```
## 8⃣ 다음 단계
마이그레이션 완료 후:
1. **백테스트 실행**:
```bash
curl -X POST http://localhost:8000/api/v1/backtest/run \
-H "Content-Type: application/json" \
-d @samples/backtest_config.json
```
2. **포트폴리오 생성**:
```bash
curl -X POST http://localhost:8000/api/v1/portfolios/ \
-H "Content-Type: application/json" \
-d @samples/portfolio_create.json
```
3. **Frontend 확인**:
- http://localhost:3000
## 📌 체크리스트
마이그레이션 전:
- [ ] MySQL 연결 정보 확인
- [ ] PostgreSQL Docker 실행 중
- [ ] Alembic 마이그레이션 완료
- [ ] Python 패키지 설치
마이그레이션 중:
- [ ] 진행 상황 모니터링
- [ ] 에러 발생 시 로그 확인
마이그레이션 후:
- [ ] 데이터 개수 확인
- [ ] 샘플 데이터 조회
- [ ] 백테스트 테스트
- [ ] MySQL 데이터 백업 (원본 보존)
---
**문서 버전**: v1.0.0
**최종 업데이트**: 2025-01-29