5.8 KiB
5.8 KiB
數據遷移指南 - 從 Supabase 到 MySQL
📋 概述
本指南將幫助您將現有的 Supabase 數據遷移到 MySQL 資料庫,並設置相應的統計功能。
🔧 前置準備
1. 獲取 Supabase 連接資訊
- 登入 Supabase Dashboard
- 選擇您的專案
- 前往 Settings → API
- 複製以下資訊:
- Project URL (NEXT_PUBLIC_SUPABASE_URL)
- anon public key (NEXT_PUBLIC_SUPABASE_ANON_KEY)
2. 確認 MySQL 資料庫已設置
確保您已經執行過:
node scripts/create-basic-tables.js
node scripts/create-views-procedures.js
🚀 執行數據遷移
方法一:使用環境變數(推薦)
Windows:
set NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
set NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
node scripts/migrate-with-env.js
Linux/Mac:
export NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
export NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here
node scripts/migrate-with-env.js
方法二:直接在命令中設定
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=your-key node scripts/migrate-with-env.js
📊 遷移內容
遷移腳本會處理以下數據:
-
困擾案例 (wishes)
- 標題、描述、解決方案
- 公開/私密狀態
- 分類和優先級
- 圖片數據
- 創建和更新時間
-
點讚記錄 (wish_likes)
- 用戶會話 ID
- IP 地址和用戶代理
- 創建時間
-
用戶設定 (user_settings)
- 音樂偏好
- 主題設定
- 語言偏好
- 通知設定
-
系統統計 (system_stats)
- 日統計數據
- 困擾案例數量
- 點讚數量
- 活躍用戶數
🔄 統計功能替代方案
由於 MySQL 觸發器需要 SUPER 權限,我們提供了應用程式層面的統計服務:
自動統計更新
- 困擾案例創建/更新/刪除:自動更新統計數據
- 點讚/取消點讚:自動更新點讚統計
- 用戶設定更新:更新活躍用戶統計
手動重新計算統計
如果需要重新計算所有統計數據:
import { StatisticsService } from '@/lib/statistics-service'
// 重新計算所有統計
const stats = await StatisticsService.recalculateAllStats()
console.log('統計數據:', stats)
🧪 測試遷移結果
1. 檢查數據完整性
node scripts/test-mysql-connection.js
2. 驗證統計數據
import { StatisticsService } from '@/lib/statistics-service'
// 獲取當前統計
const stats = await StatisticsService.getStatistics()
console.log('當前統計:', stats)
3. 檢查應用程式功能
- 啟動開發服務器:
npm run dev - 測試困擾案例創建
- 測試點讚功能
- 檢查分析頁面
🔧 故障排除
常見問題
1. 環境變數未設定
❌ 請設定 Supabase 環境變數
解決方案:按照上述方法設定環境變數
2. 連接失敗
❌ 資料庫連接失敗
解決方案:
- 檢查 Supabase URL 和 Key 是否正確
- 確認 MySQL 資料庫連接正常
- 檢查網路連接
3. 數據重複
⚠️ 遷移完成,但有 X 個項目失敗
解決方案:
- 檢查錯誤詳情
- 清理重複數據
- 重新執行遷移
4. 統計數據不準確
解決方案:
// 重新計算統計數據
await StatisticsService.recalculateAllStats()
調試工具
檢查 Supabase 數據
import { createClient } from '@supabase/supabase-js'
const supabase = createClient(url, key)
// 檢查困擾案例數量
const { count } = await supabase
.from('wishes')
.select('*', { count: 'exact', head: true })
console.log('Supabase 困擾案例數量:', count)
檢查 MySQL 數據
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// 檢查困擾案例數量
const count = await prisma.wish.count()
console.log('MySQL 困擾案例數量:', count)
📈 性能優化
1. 批量遷移
對於大量數據,可以修改遷移腳本使用批量插入:
// 批量插入困擾案例
await prisma.wish.createMany({
data: wishes.map(wish => ({
title: wish.title,
currentPain: wish.current_pain,
// ... 其他字段
}))
})
2. 並行處理
// 並行遷移不同類型的數據
await Promise.all([
migrateWishes(),
migrateLikes(),
migrateUserSettings(),
migrateSystemStats()
])
3. 進度追蹤
// 添加進度條
const total = wishes.length
let processed = 0
for (const wish of wishes) {
// 遷移邏輯
processed++
console.log(`進度: ${processed}/${total} (${Math.round(processed/total*100)}%)`)
}
🔒 安全注意事項
-
環境變數安全
- 不要在代碼中硬編碼 Supabase 密鑰
- 使用
.env.local文件(已被 .gitignore 忽略) - 生產環境使用安全的環境變數管理
-
數據備份
- 遷移前備份 Supabase 數據
- 遷移後驗證數據完整性
- 保留原始數據直到確認遷移成功
-
權限控制
- 確保 MySQL 用戶只有必要的權限
- 定期檢查和更新密碼
✅ 完成檢查清單
- Supabase 連接資訊已獲取
- MySQL 資料庫結構已創建
- 環境變數已設定
- 數據遷移已執行
- 遷移結果已驗證
- 統計功能已測試
- 應用程式功能已確認
- 數據備份已完成
📞 支援
如果遇到問題:
- 檢查錯誤日誌
- 確認環境變數設定
- 驗證資料庫連接
- 查看遷移報告
- 重新計算統計數據
注意:遷移過程中請確保有穩定的網路連接,並在非高峰時段執行以避免影響正常使用。