Database 手册 · Chapter 9

备份 · WAL · 运维检查点

示例项目的 DatabaseOption 块也包含运维所需的选项。脚本不会直接操作它们,但这些是 在量产环境中最能避免重大问题 的设置,单设一章。

DB_Sqlite.xmp 的运维选项

"DatabaseOption": {
  "Connections": [ /* ... */ ],
  "BackupFolder": "XDatabase/Backup",
  "AutoBackupEnabled": false,
  "AutoBackupIntervalHours": 24,
  "BackupKeepLast": 30,
  "JournalMode": "WAL"
}

按选项整理含义与推荐值。


1) JournalMode — 推荐 WAL

SQLite 的日志模式决定事务数据的记录方式。

特性推荐
DELETE(默认)每事务创建/删除日志文件。单用户可接受小工具
WALWrite-Ahead Logging — 写入期间其他进程仍可读量产推荐
MEMORY仅内存日志 — 断电时有损坏风险临时缓存
OFF不写日志 — 危险严禁

示例设为 "WAL"。WAL 的效果:

  • 设备时序持续 INSERT 的同时,DB Studio 或外部分析工具可同时进行 SELECT
  • 事务提交更快 — 短事务多的模式(如示例)响应性更好
  • 异常终止时自动恢复

更改只需修改 connections.json / .xmpJournalMode 的值。结果可通过 XDatabase/ 目录下出现的两个辅助文件 LocalDB.db-walLocalDB.db-shm 来确认。

备份注意 — 将 WAL / SHM 一并复制,或事先用 PRAGMA wal_checkpoint(TRUNCATE) 把 WAL 内的变更刷入主文件后,只复制 .db 即可。


2) BackupFolder + 手动备份

SQLite 文件是单文件,运行中也可复制(尤其是 WAL 检查点之后)。

示例把 "XDatabase/Backup" 设为备份路径。该目录中实际产生备份文件的时机,是在自动备份开启时,或工具中手动执行备份时。

选项推荐含义
BackupFolder"XDatabase/Backup"备份文件目录(项目相对路径)
AutoBackupEnabled量产: true周期性自动备份
AutoBackupIntervalHours24备份间隔(小时)
BackupKeepLast30保留备份数,超出自动删除

自动备份文件名通常为 {db 名}_{YYYYMMDD_HHMMSS}.db — 目录中按字母顺序排序即时间顺序。

用外部脚本备份的模式

在操作系统层面单独安排备份调度时的推荐流程:

1. PRAGMA wal_checkpoint(TRUNCATE);   // 在 SQL 选项卡执行
2. LocalDB.db   →  复制到外部磁盘 / 网络
3. (按需)     验证文件完整性

3) ConnectionTimeout / CommandTimeout / Reconnect

Connections 数组中 4 个时间选项:

选项推荐含义
ConnectionTimeout15 secOpen() 无响应时的放弃时间
CommandTimeout30 sec单条 SQL 执行超时
PingIntervalSec10 sec连接存活周期检查(对网络 DB 有意义)
ReconnectRetries3断开时自动重试次数

对单文件 SQLite 大多影响小,但迁移到 MSSQL 时这些选项原样生效,因此示例预先填入了这些值。


4) 运维代码的 6 个检查点

示例所有 DB 函数共用的 6 段防御性代码。

A. IsOpen 守卫

if( DB["local"].IsOpen == false )
{
   ShowMessage(EB_Ok, "DB is not open. Press [Open] first.");
   return false;
}

B. 选中行守卫

if( SelectIndex < 0 || SelectIndex >= DB["local"].RowCount )
{
   ShowMessage(EB_Ok, "Select a row first.");
   return false;
}

C. LastError 日志

if( DB["local"].RunSqlQueryParam(sql, p) == false )
{
   LogError($"DB_xxx failed : {DB["local"].LastError}");
   ShowMessage(EB_Ok, $"DB xxx failed : {DB["local"].LastError}");
   return false;
}

D. 事务失败时 Rollback

if( DB["local"].RunSqlQueryParam(sql, p) == false )
{
   DB["local"].Rollback();
   // ...
}

E. Open 失败时同步状态标签

if( DB["local"].Open() == false )
{
   DbStatusText = "● CLOSED";
   return false;
}
DbStatusText = "● OPEN";

F. 变更后 Refresh

return DB_Refresh();

INSERT / UPDATE / DELETE 完成后总是 Refresh 重新填充画面,让 DB 状态与画面状态不会脱节


5) 量产前检查清单

项目确认
JournalMode"WAL"
AutoBackupEnabledtrue(运行)
BackupFolder推荐独立磁盘
BackupKeepLast考虑磁盘容量(通常 14 ~ 60)
LastError 日志每个失败分支都有
IsOpen 守卫每个 DB 函数首行
变更函数末尾的 DB_Refresh缺失时画面会过时
外部备份调度推荐 OS 层面的每周全量备份

至此,DB_Sqlite 示例展示的 可量产级的数据库集成 全部内容讲完。在真实量产项目中应用时,直接照搬这 9 章的模式,只把领域表换成你自己的即可。