やってみる

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

SQLite3ドットコマンド(.backup .restore)

 DBファイル丸ごとバックアップ&リストア。

成果物

バックアップ&リストア

sqlite3 :memory: \
"create table T(C text);" \
"insert into T values('A');" \
"select * from T;" \
".backup ./some.backup"
sqlite3 :memory: \
".restore ./some.backup" \
"select * from T;"
A

 保存&復元。どうでもいいけどリストアはレストアとも書く。表記ゆれ。

リストアすると元のテーブルやデータは全部消える!

sqlite3 :memory: \
"create table Z(C text);" \
"insert into Z values('Z');" \
".tables" \
"select * from Z;" \
".restore ./some.backup" \
".tables" \
"select * from T;"
Z
Z
T
A

 .restoreする前に作ったテーブルやレコードは全て消えた!

 .restoreコマンドは超危険。.restore.restoreするコマンドが欲しい。

バックアップファイルをSQLite3で開く

 バックアップファイルはSQLite3データベースファイルのコピーと思われる。

sqlite3 some.backup \
".tables" \
".headers on" \
"select * from T;"
T
C
A

 バックアップファイルもsqlite3コマンドで普通に開けた。.restoreコマンドを使わずともOK。

 つまり.backupコマンドは単なるファイルコピーするコマンド。

SQLite3バックアップ方法

 sqlite3ファイル自体のコピーでいいと思う。だが、他にも以下のような方法がある。

出力 入力 ファイル形式 モード
.backup .restore バイナリ 既存を全消去
.dump sqlite3 < dump.sql SQL 既存に追加

 .cloneコマンドもある。これも単なるファイルコピー。.backupとの違いがわからない。

 ほかにもオプションで.sessionがある。だがこのドットコマンドについて詳細な説明がない。C言語ベースの説明をみてもよくわからなかった。後回し。

.backup/.restoreの使いどころは?

 cpシェルコマンドよりはコピー元名を省略できて便利。でも.cloneのほうが文字数が少ないので入力しやすそう。ただし.cloneはファイルが既存だと上書きできない。.backupはできる。

 いつか.cloneについてもやる。

対象環境

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

前回まで