[CLAUDE] Docs: gotcha #88 disk-day + NTFS-compress .mdf -> RECOVERY_PENDING (fix compact /U + ONLINE, login 200, 0 mat data) + WAL reset dong S185

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
pqhuy1987
2026-08-10 12:56:12 +07:00
parent b45a8fec63
commit 5860b84a95
4 changed files with 26 additions and 22 deletions

View File

@ -1406,6 +1406,21 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
**Fix:** (1) Verifier đọc run **CUỐI của commit-range** (run của push mới nhất HEAD chứa mọi commit trước), CANCELLED giữa range = cơ-chế, KHÔNG phán fail; (2) bằng-chứng ship lấy **artifact-level** (bundle-hash rotate + marker set + seeder log + smoke), không nhãn run per-commit; (3) cần verdict/side-effect per-commit riêng (vd đo seeder từng đợt) giãn push hoặc re-run tay. Nguồn: `runs/2026-07-31-S164-4gd-khkk-fanout/sub-cicd-verify-k7.md` M0/M4.
### 88. Windows "giải phóng dung lượng" NÉN file .mdf/.ldf → SQL Server RECOVERY_PENDING, login prod 500 (Session 185)
**Triệu chứng:** login prod trả **500** sau ~10s, detail `"transient failure … UseSqlServer"`; errorlog SQL: `Login failed for user 'vrapp'. Reason: Failed to open the explicitly specified database 'SolutionErp'`; `sys.databases` `SolutionErp` + `VietReport` = **RECOVERY_PENDING** (các DB khác ONLINE). Web tĩnh/IIS vẫn 200 hết nhìn ngoài tưởng "chỉ hỏng login".
**Cơ chế (chuỗi 2 tầng):** (1) **disk C: đầy** SQL không ghi được 2 DB rơi RECOVERY_PENDING, file bị đóng; (2) người/Storage Sense chạy **Disk Cleanup "compress"** để free dung lượng NTFS **nén được đúng các file .mdf/.ldf đang ĐÓNG** (DB đang ONLINE thoát nạn file bị khoá). SQL Server **từ chối mở file nén** cho DB read-write `ALTER DATABASE SET ONLINE` fail `Msg 5118 "file is compressed"`. Cùng sự cố disk làm Gitea push chết (`502` + `unpacker error`) 2 triệu chứng tưởng không liên quan, 1 gốc.
**Fix (đã chạy thật S185, downtime ~1 phút):**
1. `ALTER DATABASE [X] SET OFFLINE` từng DB (KHÔNG dừng cả instance khi chưa cần DB khác còn sống).
2. Copy .mdf/.ldf ra `C:\DBBackup-<date>` làm bản lùi (NTFS tự giải nén khi đọc bản copy hợp lệ).
3. File vẫn bị giữ handle sau lần ONLINE-fail `Restart-Service MSSQL*` (DB OFFLINE không được mở lại lúc startup handle tự do).
4. `compact /U <4 file>` + `compact /U <folder DATA>` (gỡ cờ nén folder kẻo file mới sinh bị nén tiếp).
5. `ALTER DATABASE [X] SET ONLINE` recovery chạy sạch. Verify: `state_desc=ONLINE` + errorlog `Recovery is complete` + login API 200 + đếm row bảng chính khớp.
**Luật:** thấy `Msg 5118` / RECOVERY_PENDING sau sự cố disk **`compact <file>` kiểm cờ nén TRƯỚC** khi nghĩ tới restore backup; **CẤM bật compression trên cây thư mục SQL DATA** (freeing-space bằng nén = bẫy hẹn giờ cho mọi DB đang offline/detached). Bonus bảo mật lộ ra cùng lượt đọc errorlog: port 1433 phơi Internet, `sa` bị brute-force liên tục từ IP lạ firewall riêng.
## Checklist debug bug mới
1. Build pass không? fail check using + package version compat
@ -1444,3 +1459,4 @@ for h in resp.points: # ← .points không phải iterable trực tiếp
33. Nếu thêm enum value vào entity DÙNG-CHUNG mà UI/guard phân-loại sai (file lẫn section / false-pass guard) → grep MỌI predicate field-proxy (`supplierId===null`...) loại value mới + build-verify TỪNG app riêng (#71)
34. Nếu Gitea Actions run CANCELLED ngay sau khi push 2 commit sát nhau → auto-cancel cùng-branch: đọc run CUỐI của range + verify artifact-level (bundle/marker/seeder-log), KHÔNG đọc CANCELLED thành deploy-fail; side-effect @startup chỉ chạy 1 lần cho cả cụm (#86)
35. Nếu probe endpoint để hỏi **authz** mà nhận **415/411** → đó là mã **PRE-AUTH**, vô nghĩa cho câu hỏi authz: request bị loại ở tầng **action-selection / IIS** TRƯỚC authorization filter. Re-probe đúng dạng body (multipart cho endpoint upload; có body cho SignalR negotiate) rồi mới đọc 401/403 (#87)
36. Nếu login prod 500 "transient failure UseSqlServer" + DB RECOVERY_PENDING sau sự cố disk đầy → check **cờ nén NTFS** trên .mdf/.ldf (`compact <file>`, Msg 5118): SET OFFLINE → backup copy → restart service nhả handle → `compact /U` → SET ONLINE. CẤM nén cây SQL DATA (#88)