{
  "scenario": "1GB 内存单机服务器 / 个人站点 / 单进程 Node.js 写入",
  "updated": "2026-09",
  "pragma": {
    "journal_mode": {
      "value": "WAL",
      "why": "写不阻塞读，崩溃恢复更快，是单机服务的最优选择",
      "caution": "会产生 -wal 与 -shm 两个附属文件，备份时要一起处理"
    },
    "synchronous": {
      "value": "NORMAL",
      "why": "WAL 模式下 NORMAL 已能保证数据库不损坏，写入速度约为 FULL 的 3 倍",
      "caution": "极端断电场景可能丢失最后几条已提交事务，个人博客可接受"
    },
    "busy_timeout": {
      "value": 5000,
      "why": "遇到锁时最多等待 5 秒再报错，避免并发写入直接失败",
      "caution": "无"
    },
    "cache_size": {
      "value": -20000,
      "why": "负值单位为 KiB，即约 20 MB 页缓存，对小库基本可全量驻留内存",
      "caution": "内存紧张的机器不要超过 -30000"
    },
    "temp_store": {
      "value": "MEMORY",
      "why": "临时表与排序放内存，避免落盘",
      "caution": "复杂排序可能瞬时吃内存"
    },
    "mmap_size": {
      "value": 134217728,
      "why": "128 MB 内存映射，显著减少 read 系统调用",
      "caution": "某些容器环境不支持，失败可忽略"
    },
    "foreign_keys": {
      "value": "ON",
      "why": "开启外键约束，保证关联数据一致性",
      "caution": "无"
    }
  },
  "antiPatterns": [
    "不要在多进程/多容器间共享同一个 SQLite 文件，WAL 模式不支持跨主机共享",
    "不要用 NFS / 网络盘存放 SQLite 文件，文件锁语义不可靠",
    "不要直接 cp 数据库文件做热备份，应使用 backup API 或先停服务"
  ],
  "backupSnippet": "db.backup('/path/to/backup.db')  // better-sqlite3 的在线备份，正确处理 WAL"
}
