DOCS/plans/250911_main_db3_migration_plan.md

117 lines
3.9 KiB
Markdown

# main_db3 → main_db 마이그레이션 계획
## 작성일: 2025-09-11
## 목적: main_db3 데이터를 main_db로 통합
---
## 1. 현황 분석
### main_db3 (삭제 예정)
- 총 13개 테이블, 614개 레코드
- 주요 데이터: users(17), companies(4), conversation_logs(555)
- Slack/Gmail 연동 데이터 보유
### main_db (운영 DB)
- 총 11개 테이블, 대부분 비어있음
- 기존 데이터: company(2), team(2)
---
## 2. 테이블 매핑
| main_db3 | main_db | 비고 |
|----------|---------|------|
| companies | company | 2개 중복 확인 필요 |
| users | user | team_id 필수 추가 |
| workspaces | team | 구조 변환 필요 |
| workspace_members | workspace_member | user_id 매핑 |
| slack_workspaces | slack_workspace | team_id 매핑 |
| user_preferences | user_preference | slack_user_id 제거됨 |
| conversation_logs | conversation_log | robeing_id 컬럼 없음 |
| gmail_tokens | gmail_token | 구조 동일 |
| robeing_stats | robeing | product_id, team_id 추가 |
| slack_user_mapping | - | workspace_member로 통합 |
---
## 3. 마이그레이션 순서
### Phase 1: 조직 구조 (필수 선행)
```sql
-- 1. companies → company (중복 제외)
INSERT INTO company (id, name, url, created_at, updated_at)
SELECT id, name, domain, created_at, updated_at
FROM main_db3.companies
WHERE id NOT IN ('28f17b47-33f8-47ac-b1ae-100e77b37edb', '99d22d6b-d327-4fa4-bd2f-d228c11056e2');
-- 2. workspaces → team 변환
INSERT INTO team (id, company_id, name, created_at, updated_at)
SELECT id, company_id, name, created_at, updated_at FROM main_db3.workspaces;
```
### Phase 2: 사용자 데이터
```sql
-- 3. users → user (기본 team_id 할당)
INSERT INTO "user" (id, team_id, email, name, username, oauth_provider, oauth_id, is_active)
SELECT u.id,
COALESCE(wm.workspace_id, '38bdc27d-cb01-4960-867e-41733d2f3529'), -- 기본 팀
u.email, u.name, u.username, u.oauth_provider, u.oauth_id, u.is_active
FROM main_db3.users u
LEFT JOIN main_db3.workspace_members wm ON u.id = wm.user_id;
-- 4. workspace_members → workspace_member (slack_user_id 추가 예정)
INSERT INTO workspace_member (id, user_id, role, is_active, joined_at)
SELECT id, user_id, role::user_role, is_active, joined_at FROM main_db3.workspace_members;
```
### Phase 3: 통합 데이터
```sql
-- 5. slack_workspaces → slack_workspace
INSERT INTO slack_workspace (id, team_id, slack_team_id, bot_token, is_active)
SELECT id, workspace_id, team_id, bot_token, is_active FROM main_db3.slack_workspaces;
-- 6. user_preferences → user_preference (slack_user_id 제거)
INSERT INTO user_preference (user_id, news_keywords, email_filter, briefing_enabled)
SELECT user_id, news_keywords, email_filter, briefing_enabled FROM main_db3.user_preferences;
-- 7. gmail_tokens → gmail_token
INSERT INTO gmail_token SELECT * FROM main_db3.gmail_tokens;
```
### Phase 4: 대화 기록
```sql
-- 8. conversation_logs → conversation_log (컬럼 매핑 주의)
INSERT INTO conversation_log (user_id, channel_id, message, response, intent, confidence, timestamp)
SELECT user_id, channel_id, message, response, intent, confidence, timestamp
FROM main_db3.conversation_logs WHERE user_id IS NOT NULL;
```
---
## 4. 검증 및 롤백
### 검증
- 레코드 수 대조
- 외래키 무결성 확인
- 주요 사용자 데이터 샘플 검증
### 롤백 계획
- 마이그레이션 전 main_db 백업
- 실패 시 TRUNCATE 후 백업 복원
---
## 5. 주의사항
- **team_id 필수**: user 테이블 INSERT 시 NOT NULL
- **UUID 타입**: 모든 ID는 UUID 타입 유지
- **slack_user_id**: workspace_member로 이동 예정
- **실행 시간**: 새벽 시간대 권장 (서비스 영향 최소화)
---
## 6. 실행 결과 (2025-09-11)
### User 테이블 마이그레이션 완료
- main_db3에서 12명 이관 (총 14명 중 2명 중복 제외)
- UUID 불일치: goeun2dc@gmail.com, info@company-x.partners (기존 main_db UUID 유지)