penti/docs/QUICKSTART_MIGRATION.md

404 lines
9.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 마이그레이션 빠른 시작 가이드
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