# Đĩa đầy / cơ sở dữ liệu phình không giới hạn

> Cơ sở dữ liệu quan sát phình lớn vượt xa dữ liệu thực và làm đầy đĩa.

## Triệu chứng

Hộp cạn đĩa, và tệp cơ sở dữ liệu quan sát lớn khổng lồ so với
lượng dữ liệu nó đáng ra phải chứa — ví dụ hàng chục GB trên đĩa trong khi chỉ ~1 GB dự đoán
thực sự được giữ lại. Xóa hàng cũ (hoặc rút ngắn thời gian giữ) **không** làm tệp co lại.

Nguyên nhân: các hàng cũ được xóa theo lịch, nhưng trên một cơ sở dữ liệu được tạo không có auto-vacuum gia tăng, các trang đã giải phóng được giữ trong một free-list nội bộ và không bao giờ được trả lại cho hệ điều hành. Tệp duy trì ở mức đỉnh-cao-nước mãi mãi.

## Xác nhận

Kiểm tra kích thước tệp cơ sở dữ liệu bên trong container backend so với kích thước trực tiếp kỳ vọng:

```bash
docker compose -f docker-compose.release.yml exec backend \
  sh -c 'ls -lh /data/aiboard.db'
```

Nếu tệp lớn gấp nhiều lần khối lượng dữ liệu mà cửa sổ giữ lại của bạn đáng ra phải chứa (một tệp nhiều GB cho vài ngày dự đoán), bạn bị phình free-list. Một đợt ghi tốc độ cao duy nhất có thể làm tệp phình vượt xa kích thước trạng thái-ổn-định.

## Sửa

Các bản phát hành hiện tại tự thu hồi không gian sau mỗi đợt quét giữ lại, nên một hộp khỏe mạnh tự sửa. Một cơ sở dữ liệu đã phình **trước khi** hành vi đó có mặt cần một lần thu hồi một-lần.

1. **Dừng backend** để cơ sở dữ liệu không bị ghi trong lúc thu hồi:

   ```bash
   docker compose -f docker-compose.release.yml stop backend
   ```

2. **Chạy lần thu hồi một-lần** trên tệp cơ sở dữ liệu. Việc này chuyển tệp sang auto-vacuum gia tăng và nén nó lại, trả các trang free-list về OS:

   ```bash
   docker compose -f docker-compose.release.yml run --rm --entrypoint sh backend -c \
     'sqlite3 /data/aiboard.db "PRAGMA auto_vacuum=INCREMENTAL; VACUUM;"'
   ```

3. **Xác minh** tệp đã co lại và dữ liệu nguyên vẹn:

   ```bash
   docker compose -f docker-compose.release.yml run --rm --entrypoint sh backend -c \
     'ls -lh /data/aiboard.db; sqlite3 /data/aiboard.db "PRAGMA integrity_check;"'
   # kỳ vọng một tệp nhỏ hơn nhiều và: ok
   ```

4. **Khởi động backend** lại:

   ```bash
   docker compose -f docker-compose.release.yml start backend
   ```

Lần thu hồi một-lần chỉ cần cho một cơ sở dữ liệu đã phình trước khi việc thu hồi
tự động có mặt. Các bản triển khai mới được tạo có khả năng co lại và tự giữ
mình gọn gàng sau mỗi đợt quét giữ lại.

## Phòng ngừa

- **Giữ thời gian lưu có giới hạn.** Cửa sổ giữ lại (`InferenceObservability:RetentionDays`, mặc định 3 ngày) xóa các hàng dự đoán cũ theo lịch; việc thu hồi sau-xóa trả các trang đã giải phóng về đĩa để tệp giữ gọn nhẹ.
- **Giới hạn số hàng làm chốt chặn đợt bùng phát.** `InferenceObservability:MaxRows` (mặc định 5.000.000) cắt về N hàng mới nhất ngay cả trong cửa sổ thời gian, nên một đột biến tốc độ cao bất ngờ không thể làm đầy đĩa trước khi đợt quét theo thời gian chạy. Hạ nó xuống nếu hộp của bạn có đĩa hạn chế.
- **Cẩn thận với thử nghiệm thông lượng/stub.** Các đợt ghi tốc độ cao (ví dụ kiểm tra thông lượng đường ống cảm biến) là cái làm phình tệp ngay từ đầu. Tránh để một thử nghiệm tốc độ cao chạy đối với lưu trữ bền vững trên một hộp sản xuất.

## Liên quan

- [Khả năng quan sát & Cảnh báo](/operate/monitoring/) — cơ sở dữ liệu quan sát lưu trữ những gì.
