バックアップ · WAL · 運用チェックポイント
サンプルプロジェクトの DatabaseOption ブロックには運用に必要なオプションが入っています。スクリプトでは扱いませんが、量産現場でもっとも大きな問題を回避してくれる 設定なので、別章で整理します。
DB_Sqlite.xmp の運用オプション
"DatabaseOption": {
"Connections": [ /* ... */ ],
"BackupFolder": "XDatabase/Backup",
"AutoBackupEnabled": false,
"AutoBackupIntervalHours": 24,
"BackupKeepLast": 30,
"JournalMode": "WAL"
}オプションごとに意味と推奨値を整理します。
1) JournalMode — WAL 推奨
SQLite のジャーナルモードは、トランザクションデータの記録方法の違いです。
| 値 | 特性 | 推奨 |
|---|---|---|
DELETE(既定) | トランザクションごとにジャーナルを生成/削除。シングルユーザなら OK | 小ツール |
WAL | Write-Ahead Logging — 書込中も他プロセスから読取可能 | 量産推奨 |
MEMORY | ジャーナルをメモリのみ — 電源断時に破損リスク | 一時キャッシュ |
OFF | ジャーナル無し — 危険 | 厳禁 |
サンプルは "WAL" 設定。WAL モードの効果:
- 装置シーケンスが INSERT を続けながら、DB Studio や外部分析ツールが同時に SELECT 可能
- トランザクションコミットが速くなり、短いトランザクションが多いパターン(サンプルのような)で応答性が向上
- 異常終了時に自動復旧
変更は connections.json / .xmp の JournalMode キーを変えるだけ。結果は XDatabase/ フォルダに LocalDB.db-wal、LocalDB.db-shm の 2 つの補助ファイルが現れることで確認できます。
バックアップ時の注意 — WAL / SHM も合わせてコピーするか、事前に
PRAGMA wal_checkpoint(TRUNCATE)で WAL の変更を本ファイルに流し込んでから本.dbだけをコピーしてください。
2) BackupFolder + 手動バックアップ
SQLite ファイルは単一ファイルなので、運用中もコピー可能 です(特に WAL チェックポイント後)。
サンプルは "XDatabase/Backup" をバックアップパスに設定しています。実際にそのフォルダにバックアップファイルが作られるのは、自動バックアップが有効なときか、ツールから手動でバックアップを実行したときです。
| オプション | 推奨 | 意味 |
|---|---|---|
| BackupFolder | "XDatabase/Backup" | バックアップファイルの保存先(プロジェクト相対) |
| AutoBackupEnabled | 量産: true | 定期自動バックアップ |
| AutoBackupIntervalHours | 24 | バックアップ間隔(時間) |
| BackupKeepLast | 30 | 保持するバックアップ数。超過分は自動削除 |
自動バックアップのファイル名は通常 {db 名}_{YYYYMMDD_HHMMSS}.db 形式 — フォルダの名前順ソートがそのまま時間順になります。
外部スクリプトでバックアップするパターン
OS レベルで別途バックアップスケジュールを置く場合の推奨フロー:
1. PRAGMA wal_checkpoint(TRUNCATE); // SQL タブで実行
2. LocalDB.db → 外部ディスク / ネットワークへコピー
3. (必要に応じ) ファイルの整合性確認3) ConnectionTimeout / CommandTimeout / Reconnect
Connections 配列内の 4 つの時間オプション:
| オプション | 推奨 | 意味 |
|---|---|---|
| ConnectionTimeout | 15 sec | Open() が応答しないときに諦めるまでの時間 |
| CommandTimeout | 30 sec | 単一 SQL 実行のタイムアウト |
| PingIntervalSec | 10 sec | 接続生存の周期チェック(ネットワーク DB で意味あり) |
| ReconnectRetries | 3 | 切断時の自動リトライ回数 |
単一ファイルの 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" |
AutoBackupEnabled | true(運用) |
BackupFolder | 別ディスク推奨 |
BackupKeepLast | ディスク容量を考慮(通常 14 〜 60) |
LastError ログ | すべての失敗分岐に入っているか |
IsOpen ガード | すべての DB 関数の 1 行目 |
更新関数末尾の DB_Refresh | 漏れると画面が stale になる |
| 外部バックアップ | OS レベルでの週次フルバックアップ推奨 |
ここまでがサンプル DB_Sqlite が示す 量産可能水準のデータベース統合 のすべてです。実際の量産プロジェクトに適用する際は、本 9 章のパターンをそのまま持ち込み、ドメインテーブルだけを差し替えればよい — それだけです。