SQLite の「unable to open database file」が高負荷時刻に散発する問題を WAL 化で根治した話

SQLite の「unable to open database file」が高負荷時刻に散発する問題を WAL 化で根治した話 ある自立型トレーディングシステムの運用中に、SQLite が OperationalError: unable to open database file を散発的に投げる慢性バグを追い詰めて修正した記録です。「ディスクは空いている」「ファイルは存在する」のにエラーが出る、という一見矛盾した現象の正体と、その根治・緩和の二段構えの対策をまとめます。 WAL とは? 本題に入る前に、今回のキーになる WAL(Write-Ahead Logging) を簡単に押さえておきます。 SQLite には書き込み中のクラッシュからデータを守るための「ジャーナル方式」が複数あり、journal_mode PRAGMA で切り替えます。 delete(デフォルト) — ロールバックジャーナル方式。トランザクションを開始するたびに 元DB-journal というファイルを新規作成して変更前の内容を退避し、コミット時に削除する。書き込み中は DB 本体を直接書き換えるため、読み取りと書き込みが互いをブロックする。 WAL — 先行書き込みログ方式。変更を DB 本体ではなく追記専用の 元DB-wal ファイルに追記していき、後で「チェックポイント」で本体に反映する。-wal と -shm(共有メモリインデックス)は一度作られたら使い回されるため、トランザクション毎のファイル新規作成が発生しない。 WAL の主な利点: 特徴 効果 読み書きが互いをブロックしない reader はトランザクション中の writer を待たずに読める(その逆も) ジャーナルファイルを毎回作らない ファイル作成のオーバーヘッドと競合がなくなる 書き込みが概ね高速 fsync 回数を減らせる(特に synchronous=NORMAL 併用時) WAL が向いているケース: 読み取りが多く・書き込みもそれなりにある、同一ホスト上の単一プロセス/複数プロセスからのアクセス。今回のように「書き込みデーモン 1 つ+複数の reader」という構成は典型的な適用例です。 WAL の注意点: ① ネットワーク越しのファイルシステム(NFS など)では共有メモリが使えず非対応、② in-memory DB では効かない、③ -wal / -shm ファイルが DB 本体と併存するため、バックアップは単純な cp ではなく専用 API(後述)を使う必要がある。 ...

2026年6月8日 · 4 分

Claude Codeで大量データを扱うならSQLite/DuckDBを使おう

Claude Code で Markdown や JSON ファイルを直接編集してデータ管理を行うのは、少量のデータなら問題ありません。しかし、レコード数が100件を超えるような規模になると、スキーマ違反や細かいスクリプト制御の問題、パフォーマンスの低下が発生しやすくなります。こうした場面では、SQLite や DuckDB を活用するのが効果的です。 Markdown/JSON 直接編集の限界 Claude Code にMarkdown ファイルや JSON ファイルを直接編集させる方法は、手軽で分かりやすい反面、データ量が増えると以下の問題が顕在化します。 スキーマ違反: JSON の構造が崩れたり、必須フィールドが欠落するケースが発生する 細かいスクリプト制御が必要になる: データの整合性を保つために、バリデーションや変換のスクリプトが増えていく パフォーマンス低下: ファイル全体を読み込んで書き戻す処理が、レコード数に比例して遅くなる SQLite を使うメリット SQLite はファイルベースの軽量データベースで、Claude Code との相性が良好です。 1 2 3 4 5 6 # SQLite データベースを作成してテーブルを定義 sqlite3 data.db "CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT, value REAL);" # Claude Code から SQL でデータを操作 sqlite3 data.db "INSERT INTO items (name, value) VALUES ('example', 42.0);" sqlite3 data.db "SELECT * FROM items WHERE value > 10;" ACID準拠: データの整合性がデータベースエンジンによって保証される SQL によるクエリ: 複雑な検索・集計・更新が簡潔に記述できる 単一ファイル: .db ファイル1つで完結し、バックアップやコピーが容易 DuckDB を使うメリット DuckDB は分析用途に特化したインプロセスデータベースです。CSV、Parquet、JSON などのファイルを直接 SQL でクエリできます。 ...

2026年3月12日 · 2 分