# 디스크가 가득 참 / 데이터베이스가 무한정 증가함

> 관측 가능성 데이터베이스가 실제 데이터보다 훨씬 커져 디스크를 가득 채웁니다.

## 증상

박스의 디스크 여유 공간이 부족해지고, 관측 가능성 데이터베이스 파일이 보유해야 할 데이터 양에 비해 엄청나게 커집니다 — 예를 들어 실제로는 약 1GB의 예측값만 보관되는데도 디스크에는 수십 GB가 차지하는 경우입니다. 오래된 행을 삭제하거나 보존 기간을 줄여도 파일 크기는 **줄어들지 않습니다**.

원인은 다음과 같습니다. 오래된 행은 예약된 일정에 따라 삭제되지만, 증분 auto-vacuum 없이 생성된 데이터베이스에서는 해제된 페이지가 내부 free-list에 보관되어 운영 체제로 절대 반환되지 않습니다. 파일은 영원히 최고 수위(high-water mark)에 머무릅니다.

## 확인

백엔드 컨테이너 내부의 데이터베이스 파일 크기를 예상되는 실제 크기와 비교하여 확인하세요:

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

파일이 보존 윈도우가 보유해야 할 데이터 양보다 몇 배나 크다면(며칠치 예측값에 대해 수 GB짜리 파일), free-list 비대화 상태입니다. 단 한 번의 고속 쓰기 버스트만으로도 파일이 정상 상태 크기를 훨씬 초과해 부풀어 오를 수 있습니다.

## 해결

현재 릴리스는 각 보존 스윕(retention sweep) 이후 자동으로 공간을 회수하므로, 정상적인 박스는 스스로 교정됩니다. 이 동작이 적용되기 **이전에** 비대해진 데이터베이스는 일회성 회수가 필요합니다.

1. 회수 작업 중 데이터베이스에 쓰기가 발생하지 않도록 **백엔드를 중지**합니다:

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

2. 데이터베이스 파일에 대해 **일회성 회수를 실행**합니다. 이 작업은 파일을 증분 auto-vacuum으로 변환하고 압축하여 free-list 페이지를 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. 파일이 줄어들었고 데이터가 온전한지 **검증**합니다:

   ```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;"'
   # expect a much smaller file and: ok
   ```

4. **백엔드를 다시 시작**합니다:

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

일회성 회수는 자동 회수가 적용되기 전에 증가한 데이터베이스에만 필요합니다.
새로 배포된 환경은 각 보존 스윕 이후 스스로 축소하고 압축 상태를
유지할 수 있도록 생성됩니다.

## 예방

- **보존 기간을 제한된 상태로 유지하세요.** 보존 윈도우(`InferenceObservability:RetentionDays`, 기본값 3일)는 예약된 일정에 따라 오래된 예측 행을 삭제하며, 삭제 후 회수가 해제된 페이지를 디스크로 반환하여 파일을 가볍게 유지합니다.
- **버스트 방어 수단으로 행 수를 제한하세요.** `InferenceObservability:MaxRows`(기본값 5,000,000)는 시간 윈도우 내에서도 가장 최신 N개의 행으로 정리하므로, 갑작스러운 고속 급증이 시간 기반 스윕이 실행되기 전에 디스크를 가득 채우는 것을 막습니다. 박스의 디스크가 제한적이라면 이 값을 낮추세요.
- **처리량/스텁 테스트에 주의하세요.** 고속 쓰기 버스트(예: 센서 파이프라인 처리량 테스트)가 애초에 파일을 부풀리는 원인입니다. 프로덕션 박스의 영구 저장소를 대상으로 고속 테스트를 계속 실행해 두는 것을 피하세요.

## 관련 항목

- [관측 가능성 및 알림](/ko/operate/monitoring/) — 관측 가능성 데이터베이스가 저장하는 내용.
