やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3ドットコマンド(.recover)

 壊れたDBファイルからできるだけデータを抽出したSQL文を作れる。

.help

.recover                 Recover as much data as possible from corrupt db.

公式ドキュメント

 .dumpは破損の兆候があると中断してしまう。.recoverは中断しない。

 行に属さないレコードを以下lost_and_foundテーブルに格納する。

CREATE TABLE lost_and_found(
    rootpgno INTEGER,             -- root page of tree pgno is a part of
    pgno INTEGER,                 -- page number row was found on
    nfield INTEGER,               -- number of fields in row
    id INTEGER,                   -- value of rowid field, or NULL
    c0, c1, c2, c3...             -- columns for fields of row
);

 テーブル名が既存ならlost_and_found0, lost_and_found1, ...のように割り振られていく。任意の名前にしたいなら以下。

.recover --lost-and-found orphaned_rows

.recover

sqlite3 :memory: ".recover"
BEGIN;
PRAGMA writable_schema = on;
PRAGMA writable_schema = off;
COMMIT;

 DBファイルの壊し方を知らないので詳しく検証できない。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで