本文へスキップ
AZ Tools

SQLite データベース検査ツール

SQLite のファイルを SQL エンジンを介さずバイト列のまま読み取ります。100 バイトのヘッダーからページサイズ、テキストエンコーディング、ロールバックか WAL か、フリーリストのページ数、アプリケーションが書き込む user_version と application_id、最後に書き込んだ SQLite の版を取り出し、1 ページ目の sqlite_schema の b-tree をたどってテーブル・インデックス・ビュー・トリガーと、それぞれを定義した CREATE 文を一覧します。行数は推定ではなく、各テーブルの b-tree を葉まで実際にたどって数えた値です。ただし WAL モードでは新しいコミットが -wal ファイルに残るため本体だけでは少なく出ることがあり、WITHOUT ROWID テーブルはインデックス b-tree に行を持つので誤った数を出す代わりに不明と表示します。列名や型、PK と NOT NULL は CREATE 文を解析した結果なので、変わった DDL ではずれることがあり、原文も必ず表示します。SQLCipher などの暗号化ファイルはヘッダーごと暗号化されマジック文字列がないため、中途半端に読まずに拒否します。行の中身はあえて表示しません。何がどれだけ入っているかを答える道具です。

使い方

  1. .sqlite、.db、.sqlite3 のファイルを枠にドロップするか、クリックして選びます。ファイルはブラウザーの外に出ません。
  2. まずヘッダーを見ます。ページサイズ × ページ数がファイルサイズで、空きページは VACUUM で返る分です。
  3. ジャーナルモードを確認します。WAL なら -wal に残るコミットはこのファイルにないため、行数は下限と考えてください。
  4. テーブル一覧で行数、列と宣言された型、各テーブルに付いたインデックスを確認します。
  5. 解析された列がおかしいときはテーブル下の CREATE 文を開き、元の DDL を基準に判断します。

よくある質問

ここに出る行数がアプリケーションの値と違います。
ほとんどの場合は WAL が原因です。WAL モードの SQLite は変更されたページを別の -wal ファイルに追記し、チェックポイントのときだけ本体に取り込みます。そのため -wal を伴わずにコピーしたデータベースは最後のチェックポイント時点のスナップショットで、最近の挿入が欠けて見えます。コピー前に PRAGMA wal_checkpoint(TRUNCATE) を実行するか、-wal と -shm も一緒に移してください。もう一つの原因は WITHOUT ROWID テーブルで、この場合は誤った数ではなく不明と表示します。
SQLCipher で暗号化したデータベースも開けますか。
開けません。おかしな値を見せる代わりに、そうと伝えます。SQLCipher はヘッダーごと暗号化するため、ファイルは "SQLite format 3" で始まらず、鍵がなければ解析する対象がありません。この判定は暗号化と破損の区別にも役立ちます。暗号化されていない切り詰めファイルはヘッダーが読めるので、読める範囲を読み、ページ数がファイル長と合わないと警告します。
空きページとは何ですか。VACUUM すべきですか。
行を消しても SQLite のファイルは縮みません。空いたページはフリーリストに載り、以後の挿入で再利用されます。つまり空きページはファイルがすでに確保していて再び使う領域です。VACUUM はそれを含めずにファイルを作り直し、領域をファイルシステムに返すので、大量削除の後や配布前には意味があります。ただしファイル全体を書き直し、開いている接続を無効にするため、稼働中のデータベースに気軽に実行する作業ではありません。
user_version と application_id は何ですか。
SQLite 自身は触らず、アプリケーションが自由に使うためにヘッダーに用意された 32 ビットの枠が二つです。多くの場合 user_version はスキーマ移行の番号として使い、コードが期待する版と比べて間の移行を実行します。application_id はファイル形式を識別するマジックナンバーとして使い、file(1) のような道具がどの種類の SQLite ファイルかを見分けられるようにします。誰も設定していなければどちらも 0 です。
スキーマバージョンとスキーマ形式はどう違いますか。
スキーマバージョン(スキーマクッキー)はスキーマが変わるたびに増える計数で、準備済みの文が再コンパイルの要否を判断するのに使います。スキーマ形式は 1 から 4 までのファイルレイアウトの世代で、そのファイルが使える機能を示します。4 なら降順インデックスや真偽値リテラルが許され、近年の SQLite はすべて 4 で書き込みます。
ファイルはどこかにアップロードされますか。
されません。ブラウザーの File API で読み、ページ内の JavaScript が解析します。サーバーに送りませんし、送る先のサーバー側の仕組みもありません。ページを開いたあとネットワークを切ってから検査しても動作することで確かめられます。

関連ツール