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(既定)トランザクションごとにジャーナルを生成/削除。シングルユーザなら OK小ツール
WALWrite-Ahead Logging — 書込中も他プロセスから読取可能量産推奨
MEMORYジャーナルをメモリのみ — 電源断時に破損リスク一時キャッシュ
OFFジャーナル無し — 危険厳禁

サンプルは "WAL" 設定。WAL モードの効果:

  • 装置シーケンスが INSERT を続けながら、DB Studio や外部分析ツールが同時に SELECT 可能
  • トランザクションコミットが速くなり、短いトランザクションが多いパターン(サンプルのような)で応答性が向上
  • 異常終了時に自動復旧

変更は connections.json / .xmpJournalMode キーを変えるだけ。結果は XDatabase/ フォルダに LocalDB.db-walLocalDB.db-shm の 2 つの補助ファイルが現れることで確認できます。

バックアップ時の注意 — 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 形式 — フォルダの名前順ソートがそのまま時間順になります。

外部スクリプトでバックアップするパターン

OS レベルで別途バックアップスケジュールを置く場合の推奨フロー:

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 関数の 1 行目
更新関数末尾の DB_Refresh漏れると画面が stale になる
外部バックアップOS レベルでの週次フルバックアップ推奨

ここまでがサンプル DB_Sqlite が示す 量産可能水準のデータベース統合 のすべてです。実際の量産プロジェクトに適用する際は、本 9 章のパターンをそのまま持ち込み、ドメインテーブルだけを差し替えればよい — それだけです。