[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:
File diff suppressed because one or more lines are too long
@ -50,3 +50,7 @@ completeness-gate S185: vong 4/5 chuc-nang (khong-nhip: V4 nén-ngủ — SHARD-
|
||||
3. **`(f-bis)` chứng giá trị ngay lần đầu**: seed M9 đẩy `ctx-audit` vượt cap — đo-trước-seed như cũ thì sổ ghi số CHẾT.
|
||||
4. **Bẫy `grep -c || echo 0` tái diễn lần 4** (chính lead, ngay trong closeout đang đọc luật cấm nó) — bằng chứng lặp lại: *bài học viết ra không tự chặn được gì; chỉ luật soi-được mới chặn*.
|
||||
5. **`value_protect` 0/10 phủ hợp-đồng-vai** — máy đúng luật của nó khi rủ drain `Role baseline`; luật mới là thứ mù. Chính sách ⇒ owner phán (đã phán: YC-019(2)).
|
||||
|
||||
## ADDENDUM — Sự cố prod SAU closeout (cùng đêm, gotcha #88)
|
||||
|
||||
Push closeout hỏng 3/3 (Gitea 502 + unpacker) → giữ sentinel `closing:` đúng luật Sàn-2 → anh báo disk quá tải rồi "không đăng nhập được". Truy chuỗi: login 500 `transient failure UseSqlServer` → errorlog `Failed to open database 'SolutionErp'` → **RECOVERY_PENDING ×2 DB** → SET ONLINE fail **Msg 5118 file-is-compressed** = Disk-Cleanup nén NTFS đúng các .mdf/.ldf đang đóng. Fix theo phương án anh duyệt (copy-trước): OFFLINE từng DB → backup `C:\DBBackup-20260810` 4/4 → restart service nhả handle → `compact /U` → ONLINE → `Recovery is complete`, login **200 + token**, data nguyên (58 PE · 21 user · 12 KHKK · 97 bảng). Push lại **THÔNG** `72568f05..b45a8fec`, ahead 0 → §6.4 trả nợ (xoá sentinel + reset WAL) trong lượt này. 🔴 Treo cho anh: **1433 phơi Internet — `sa` bị brute-force liên tục** (thấy trong errorlog); đề xuất chặn firewall/disable sa — em không tự đổi security setting.
|
||||
|
||||
@ -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 vì 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; và **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ạ — vá 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)
|
||||
|
||||
Reference in New Issue
Block a user