Add configurable retries for locked SQLite backups
docker-build / Build image (push) Successful in 11s
docker-build / Build image (push) Successful in 11s
Add SQLITE_TIMEOUT, BACKUP_RETRIES, and BACKUP_RETRY_DELAY environment variables to handle "database is locked" errors during backup. Retry the sqlite3 .backup command with configurable timeouts and delays, and clean up any WAL/SHM files that may interfere with subsequent attempts. Bump version to 1.2.2.
This commit is contained in:
@@ -14,6 +14,9 @@ services:
|
||||
- DELETE_AFTER
|
||||
- KEEP_LAST
|
||||
- TZ
|
||||
- SQLITE_TIMEOUT
|
||||
- BACKUP_RETRIES
|
||||
- BACKUP_RETRY_DELAY
|
||||
- MINIO_PATH
|
||||
- MINIO_ACCOUNT_ID
|
||||
- MINIO_APPLICATION_KEY
|
||||
@@ -31,6 +34,9 @@ CRONTAB="00 06 * * *"
|
||||
DELETE_AFTER=10
|
||||
KEEP_LAST=10
|
||||
TZ=Asia/Novosibirsk
|
||||
SQLITE_TIMEOUT=60000
|
||||
BACKUP_RETRIES=5
|
||||
BACKUP_RETRY_DELAY=30
|
||||
MINIO_PATH=myminio://sqlite/master/
|
||||
MINIO_ACCOUNT_ID=account
|
||||
MINIO_APPLICATION_KEY=key
|
||||
@@ -58,6 +64,22 @@ HEALTHCHECK_UUID=00000000-0000-0000-0000-000000000000
|
||||
|
||||
`KEEP_LAST` по умолчанию `10`, если переменная не задана.
|
||||
|
||||
## Заблокированная база
|
||||
|
||||
Если базу пишет живой процесс (grafana, или не добитый старый под), `sqlite3 .backup` падает с `Error: database is locked`.
|
||||
|
||||
Бекап это переживает: соединение открывается с `.timeout SQLITE_TIMEOUT` (мс) — sqlite ждёт освобождения блокировки вместо мгновенной ошибки. Если за это время писатель не отпустил базу, попытка повторяется `BACKUP_RETRIES` раз с паузой `BACKUP_RETRY_DELAY` секунд.
|
||||
|
||||
| Переменная | Default | Что делает |
|
||||
|---|---|---|
|
||||
| `SQLITE_TIMEOUT` | `60000` | сколько мс ждать блокировку в рамках одной попытки |
|
||||
| `BACKUP_RETRIES` | `5` | сколько попыток снять дамп |
|
||||
| `BACKUP_RETRY_DELAY` | `30` | пауза между попытками, сек |
|
||||
|
||||
Максимальное время ожидания с дефолтами: `60s * 5 + 30s * 4 = 7 минут`. После этого — `exit 1` и пинг `/fail`.
|
||||
|
||||
Если база залочена *постоянно* — это не про бекап, а про то, что старый под не умер. Ретраи только прикрывают короткие окна.
|
||||
|
||||
## Healthchecks
|
||||
|
||||
Если `HEALTHCHECK_URL` пуст — пинги не отправляются, бекап работает как обычно.
|
||||
|
||||
Reference in New Issue
Block a user