sqlite3

bath
『美男高校地球防衛部LOVE!LOVE!』『アンジュ・ヴィエルジュ』
それぞれ別のアニメですが、共に1話目から入浴シーンでした。
アニメを見やすくするために、少し見やすくする効果。私はこれをアニメのシンタックスシュガーと勝手に呼んでいますが、いわゆる ドラえもんでいうところのしずかちゃんの入浴シーンや、エスパーまみのヌードデッサンで、昨今のアニメは必ずといっていいほど、入浴シーンが出てきますね。
ただそれを挟むのは、話が落ち着いたところで、大バトルが始まる前とか、そろそろマンネリだから水着でも挟むか、とか狙いがあったように思えるのですが、この2つのアニメは初回から入浴シーンです。(まあ、『美男〜』の方は、前作があるっぽいので、1話目にもってくるのは、なんとかわかる気がしますが)
『美男〜』の方は、女子向け。『アンジュ』は男子向けです。どちらが面白いかというと、断然『美男〜』の方です。美男子がいちゃいちゃしているところは、面白くてしょうがないです。

お風呂といえば、また子供の頃の話になりますが、お風呂でのアカスリは、必ずやるものと思っていました。アカスリをしないと、完全に綺麗になったことにならないという固定観念で育ちました。今では毎日のアカスリは肌に悪いらしいので、もうしていません。手洗いも洗い過ぎるとバリア効果のある菌まで落ちてしまうとのこと。洗いすぎは必要なものを落としてしまうこともあるので、気を付けなければなりません。

今回はsqlite3です。sqlite3では他のRDB同様に、バキュームでデータベースの垢になってしまっている削除データが完全削除できます。まずはsqlite3のソースを取得してビルドするところからです。

~$ wget http://www.sqlite.org/2016/sqlite-autoconf-3130000.tar.gz
~$ ls
sqlite-autoconf-3130000.tar.gz
~$ tar xzf sqlite-autoconf-3130000.tar.gz
~/sqlite-autoconf-3130000$ cd sqlite-autoconf-3130000
~/sqlite-autoconf-3130000$ ./configure
~/sqlite-autoconf-3130000$ make
~/sqlite-autoconf-3130000$ ./sqlite3 --version
3.13.0 2016-05-18 10:57:30 fc49f556e48970561d7ab6a2f24fdd7d9eb81ff2
~/sqlite-autoconf-3130000$ sudo make install

インストールしたコマンドが先ほどのビルド時に確認したコマンドと一致しているか確認。

~$ sqlite3 --version
3.13.0 2016-05-18 10:57:30 fc49f556e48970561d7ab6a2f24fdd7d9eb81ff2
~$ 

一致しているようです。

sqlite3コマンドで、どのようにファイルができるか確認してみましょう。sqlite3コマンドを使う前のカレントディレクトリは、(.から始まる隠しファイルを覗いて)以下のようにファイルが何もないものとします。

~$ ls
~$ 

sqlite3コマンドを使ってみます。引数には作成するデータベース名を指定します。testdbとしました。

~$ sqlite3 testdb
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .exit
~$ ls
~$ 

sqlite3でデータベース名を指定して起動後、すぐに、.exitで終了してみました。特にファイルは生成されていません。

次はテーブルを作成してみます。

~$ sqlite3 testdb
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> create table table1(id,name);
sqlite> .exit
~$ ls
testdb
~$ 

テーブルを作成して、.exitで終了すると、 testdbというファイルが生成されていました。メモリダンプしてみます。

~$ hd testdb | tee no1.dump
00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
00000010  10 00 01 01 00 40 20 20  00 00 00 01 00 00 00 02  |.....@  ........|
00000020  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 04  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01  |................|
00000060  00 2d f9 88 0d 00 00 00  01 0f ca 00 0f ca 00 00  |.-..............|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000fc0  00 00 00 00 00 00 00 00  00 00 34 01 06 17 19 19  |..........4.....|
00000fd0  01 45 74 61 62 6c 65 74  61 62 6c 65 31 74 61 62  |.Etabletable1tab|
00000fe0  6c 65 31 02 43 52 45 41  54 45 20 54 41 42 4c 45  |le1.CREATE TABLE|
00000ff0  20 74 61 62 6c 65 31 28  69 64 2c 6e 61 6d 65 29  | table1(id,name)|
00001000  0d 00 00 00 00 10 00 00  00 00 00 00 00 00 00 00  |................|
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000
~$ 

次にテーブルにレコードを追加してみましょう。.tablesコマンドでテーブルの一覧、PRAGMA TABLE_INFO(テーブル名)で、列情報を確認することができます。

~$ sqlite3 testdb
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .tables
table1
sqlite> pragma table_info(table1);
0|id||0||0
1|name||0||0
sqlite> insert into table1(id,name) values(1, 'Apple');
sqlite> .exit
~$ hd testdb | tee no2.dump
00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
00000010  10 00 01 01 00 40 20 20  00 00 00 02 00 00 00 02  |.....@  ........|
00000020  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 04  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 02  |................|
00000060  00 2d f9 88 0d 00 00 00  01 0f ca 00 0f ca 00 00  |.-..............|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000fc0  00 00 00 00 00 00 00 00  00 00 34 01 06 17 19 19  |..........4.....|
00000fd0  01 45 74 61 62 6c 65 74  61 62 6c 65 31 74 61 62  |.Etabletable1tab|
00000fe0  6c 65 31 02 43 52 45 41  54 45 20 54 41 42 4c 45  |le1.CREATE TABLE|
00000ff0  20 74 61 62 6c 65 31 28  69 64 2c 6e 61 6d 65 29  | table1(id,name)|
00001000  0d 00 00 00 01 0f f6 00  0f f6 00 00 00 00 00 00  |................|
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001ff0  00 00 00 00 00 00 08 01  03 09 17 41 70 70 6c 65  |...........Apple|
00002000
~$ 

差分を見ると、追加されたレコードと、ヘッダの情報に変化が現れているようです。

~$ diff no1.dump no2.dump
2c2
< 00000010  10 00 01 01 00 40 20 20  00 00 00 01 00 00 00 02  |.....@  ........|
---
> 00000010  10 00 01 01 00 40 20 20  00 00 00 02 00 00 00 02  |.....@  ........|
6c6
< 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01  |................|
---
> 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 02  |................|
14c14
< 00001000  0d 00 00 00 00 10 00 00  00 00 00 00 00 00 00 00  |................|
---
> 00001000  0d 00 00 00 01 0f f6 00  0f f6 00 00 00 00 00 00  |................|
16a17
> 00001ff0  00 00 00 00 00 00 08 01  03 09 17 41 70 70 6c 65  |...........Apple|
~$ 

先ほど追加したレコードを削除してみましょう。

~$ sqlite3 testdb
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .tables
table1
sqlite> select * from table1;
1|Apple
sqlite> delete from table1 where id=1;
sqlite> select * from table1;
sqlite> .exit
~$ 

testdbファイルがどのような変化を見せるでしょうか。サイズの差分を確認します。

~$ ls -l no[23].dump
-rw-r--r-- 1 takk takk 1198  7月 24 13:22 no2.dump
-rw-r--r-- 1 takk takk 1198  7月 24 14:11 no3.dump
~$ 

メモリダンプ結果の比較となりますが、サイズに変化はないようです。これは、deleteでレコード削除をしても、完全な削除ではないことを意味します。
RDBは削除したデータの復活ができますので、sqlite3も同様ですね。では、完全に削除してみます。

~$ sqlite3 testdb
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .tables
table1
sqlite> select * from table1;
sqlite> vacuum;
sqlite> .exit
~$ 

メモリダンプすると、Appleの文字列が消えていますので、レコードは完全に削除されてます。さらにダンプログの比較をするとサイズも小さくなっています。

~$ hd testdb | tee no4.dump
00000000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
00000010  10 00 01 01 00 40 20 20  00 00 00 04 00 00 00 02  |.....@  ........|
00000020  00 00 00 00 00 00 00 00  00 00 00 02 00 00 00 04  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 04  |................|
00000060  00 2d f9 88 0d 00 00 00  01 0f ca 00 0f ca 00 00  |.-..............|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000fc0  00 00 00 00 00 00 00 00  00 00 34 01 06 17 19 19  |..........4.....|
00000fd0  01 45 74 61 62 6c 65 74  61 62 6c 65 31 74 61 62  |.Etabletable1tab|
00000fe0  6c 65 31 02 43 52 45 41  54 45 20 54 41 42 4c 45  |le1.CREATE TABLE|
00000ff0  20 74 61 62 6c 65 31 28  69 64 2c 6e 61 6d 65 29  | table1(id,name)|
00001000  0d 00 00 00 00 10 00 00  00 00 00 00 00 00 00 00  |................|
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000
~$ ls -l no[34].dump
-rw-r--r-- 1 takk takk 1198  7月 24 14:11 no3.dump
-rw-r--r-- 1 takk takk 1119  7月 24 14:21 no4.dump
~$ 

レコードは完全に削除されているようです。

しかし、テーブル作成直後の空レコードのダンプ結果を比べると、やはり差があるようです。

~$ diff no[14].dump
2,3c2,3
< 00000010  10 00 01 01 00 40 20 20  00 00 00 01 00 00 00 02  |.....@  ........|
< 00000020  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 04  |................|
---
> 00000010  10 00 01 01 00 40 20 20  00 00 00 04 00 00 00 02  |.....@  ........|
> 00000020  00 00 00 00 00 00 00 00  00 00 00 02 00 00 00 04  |................|
6c6
< 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01  |................|
---
> 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 04  |................|
~$ 

次はテーブルごと削除します。

takk@deb83:~$ sqlite3 testdb
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> .schema
CREATE TABLE table1(id,name);
sqlite> drop table table1;
sqlite> .schema
sqlite> create table table1(id,name);
sqlite> .exit
takk@deb83:~$ 
~$ hd testdb > no5.dump
~$ diff no[15].dump
2,3c2,3
< 00000010  10 00 01 01 00 40 20 20  00 00 00 01 00 00 00 02  |.....@  ........|
< 00000020  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 04  |................|
---
> 00000010  10 00 01 01 00 40 20 20  00 00 00 06 00 00 00 02  |.....@  ........|
> 00000020  00 00 00 00 00 00 00 00  00 00 00 04 00 00 00 04  |................|
6c6
< 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01  |................|
---
> 00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 06  |................|
~$ 

テーブルを完全に削除して、新規に作成したとしても情報は残るようです。sqlite3での垢すりは、VACUUMぐらいにとどめておいた方が良いですね。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA