Some checks failed
CD Pipeline / deploy (push) Failing after 59s
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml) - 部署模式: rsync Python 檔案至 188 → docker restart (volume mount) - Dockerfile/requirements 變動時自動重建 Docker image - 部署通知: Telegram (開始/成功/失敗) - 健康檢查: https://mo.wooo.work/health (最多 5 次重試) - 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
225 lines
4.7 KiB
Markdown
225 lines
4.7 KiB
Markdown
# SQLite 資料庫優化指南
|
||
|
||
**創建日期**:2026-01-14
|
||
**執行時機**:晚上 8 點後(低流量時段)
|
||
|
||
---
|
||
|
||
## 📋 優化內容
|
||
|
||
### 1. 添加索引(總計 8 個)
|
||
|
||
**products 表**:
|
||
- `idx_products_category` - 分類查詢優化
|
||
- `idx_products_status` - 狀態篩選優化
|
||
- `idx_products_updated_at` - 更新時間排序優化
|
||
|
||
**price_records 表**:
|
||
- `idx_price_records_product_id` - 商品價格歷史查詢
|
||
- `idx_price_records_product_time` - 複合索引(商品+時間)
|
||
|
||
**promo_products 表**:
|
||
- `idx_promo_crawled_at` - 爬取時間查詢
|
||
- `idx_promo_batch_id` - 批次查詢
|
||
- `idx_promo_status_change` - 狀態變更篩選
|
||
|
||
### 2. VACUUM 清理
|
||
- 回收已刪除資料的空間
|
||
- 優化資料庫內部結構
|
||
- 預計可節省 5-10% 空間
|
||
|
||
### 3. ANALYZE 統計
|
||
- 更新查詢規劃器統計資訊
|
||
- 提升查詢效能
|
||
|
||
---
|
||
|
||
## ⏰ 執行時間建議
|
||
|
||
**最佳執行時間**:晚上 8:00 - 凌晨 2:00
|
||
|
||
**預計耗時**:
|
||
- 添加索引:1-2 分鐘
|
||
- VACUUM 清理:30-60 秒
|
||
- 總計:約 2-3 分鐘
|
||
|
||
**影響範圍**:
|
||
- ⚠️ 添加索引期間:該表寫入會被阻塞(1-10 秒/索引)
|
||
- 🚨 VACUUM 期間:整個資料庫無法讀寫(30-60 秒)
|
||
|
||
---
|
||
|
||
## 🚀 執行方式
|
||
|
||
### 方式一:手動執行(推薦)
|
||
|
||
#### 1. SSH 連線到伺服器
|
||
```bash
|
||
gcloud compute ssh momo-server --zone=asia-east1-a
|
||
```
|
||
|
||
#### 2. 進入專案目錄
|
||
```bash
|
||
cd ~/momo_pro_system
|
||
```
|
||
|
||
#### 3. 執行優化腳本
|
||
```bash
|
||
python3 database_optimization.py
|
||
```
|
||
|
||
#### 4. 觀察執行過程
|
||
腳本會即時顯示進度:
|
||
```
|
||
[2026-01-14 20:00:15] [INFO] SQLite 資料庫優化腳本啟動
|
||
[2026-01-14 20:00:15] [INFO] 當前資料庫大小: 208.45 MB
|
||
[2026-01-14 20:00:15] [INFO] 步驟 1/3: 添加索引
|
||
[2026-01-14 20:00:16] [SUCCESS] ✓ 索引創建成功: idx_products_category (耗時 0.35 秒)
|
||
...
|
||
[2026-01-14 20:02:30] [SUCCESS] ✓ 資料庫優化完成!
|
||
```
|
||
|
||
---
|
||
|
||
### 方式二:使用 screen 背景執行
|
||
|
||
如果擔心 SSH 斷線,可以使用 screen:
|
||
|
||
```bash
|
||
# 1. SSH 連線
|
||
gcloud compute ssh momo-server --zone=asia-east1-a
|
||
|
||
# 2. 創建 screen 會話
|
||
screen -S db_optimization
|
||
|
||
# 3. 執行腳本
|
||
cd ~/momo_pro_system
|
||
python3 database_optimization.py
|
||
|
||
# 4. 離開 screen(按 Ctrl+A 然後按 D)
|
||
# 腳本會繼續在背景執行
|
||
|
||
# 5. 重新連接 screen 查看進度
|
||
screen -r db_optimization
|
||
```
|
||
|
||
---
|
||
|
||
### 方式三:定時任務(自動執行)
|
||
|
||
如果想要自動在每週日凌晨執行:
|
||
|
||
```bash
|
||
# 編輯 crontab
|
||
crontab -e
|
||
|
||
# 添加以下行(每週日凌晨 2:00 執行)
|
||
0 2 * * 0 cd /home/ogt/momo_pro_system && /usr/bin/python3 database_optimization.py >> logs/db_optimization.log 2>&1
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ 執行後驗證
|
||
|
||
### 1. 檢查索引是否創建成功
|
||
```bash
|
||
sqlite3 data/momo_database.db "SELECT name FROM sqlite_master WHERE type='index' AND name LIKE 'idx_%';"
|
||
```
|
||
|
||
應該看到 8 個新索引。
|
||
|
||
### 2. 檢查資料庫大小
|
||
```bash
|
||
ls -lh data/momo_database.db
|
||
```
|
||
|
||
如果執行了 VACUUM,大小應該會略微減少。
|
||
|
||
### 3. 測試網站運行
|
||
訪問 https://momo.wooo.work/,確認商品列表載入正常。
|
||
|
||
---
|
||
|
||
## 📊 預期效果
|
||
|
||
### 查詢效能提升
|
||
- **分類篩選**:快 50-80%
|
||
- **價格歷史查詢**:快 70-90%
|
||
- **促銷商品查詢**:快 60-80%
|
||
|
||
### 空間節省
|
||
- 預計節省:10-20 MB
|
||
- 資料庫結構更緊湊
|
||
|
||
---
|
||
|
||
## ⚠️ 注意事項
|
||
|
||
1. **執行前備份**(可選,但建議)
|
||
```bash
|
||
cp data/momo_database.db data/momo_database_backup_$(date +%Y%m%d).db
|
||
```
|
||
|
||
2. **確認服務運行正常**
|
||
```bash
|
||
systemctl status momo
|
||
```
|
||
|
||
3. **執行期間避免**:
|
||
- ❌ 不要手動觸發爬蟲任務
|
||
- ❌ 不要進行大量資料匯入
|
||
- ❌ 不要重啟服務
|
||
|
||
4. **執行後檢查日誌**
|
||
```bash
|
||
tail -100 logs/gunicorn-error.log
|
||
```
|
||
|
||
---
|
||
|
||
## 🆘 問題排查
|
||
|
||
### 問題 1:資料庫被鎖定
|
||
**錯誤**:`database is locked`
|
||
|
||
**原因**:有其他程序正在使用資料庫
|
||
|
||
**解決**:
|
||
```bash
|
||
# 檢查是否有爬蟲程序在運行
|
||
ps aux | grep python | grep -E 'crawler|scheduler'
|
||
|
||
# 如果有,先停止
|
||
pkill -f 'run_scheduler.py'
|
||
```
|
||
|
||
### 問題 2:VACUUM 執行時間過長
|
||
**現象**:超過 5 分鐘還在執行
|
||
|
||
**解決**:
|
||
- 正常情況,耐心等待
|
||
- 不要中斷程序(Ctrl+C)
|
||
- 如果超過 10 分鐘,可能需要檢查磁碟空間
|
||
|
||
### 問題 3:執行後網站載入變慢
|
||
**可能原因**:SQLite 緩存尚未建立
|
||
|
||
**解決**:
|
||
- 等待 5-10 分鐘,讓系統重新建立緩存
|
||
- 或手動刷新幾次頁面
|
||
|
||
---
|
||
|
||
## 📞 聯絡支援
|
||
|
||
如有問題,請檢查:
|
||
1. 執行腳本的完整輸出
|
||
2. Gunicorn 錯誤日誌:`logs/gunicorn-error.log`
|
||
3. 系統負載:`uptime`
|
||
|
||
---
|
||
|
||
**文件版本**:1.0
|
||
**最後更新**:2026-01-14
|
||
**維護人員**:MOMO Pro System Admin
|