今回はデータファイルの中身の変化について。
暗号化されていない表領域は中身がstringsコマンドで見られるため
レコードが入っている状態でdeleteやtruncateをするとどのように変化するのかを試してみた。

環境

oracle 12c ( Single Instance ) 今回は普通のシングルDBで検証する。

1. 表領域の作成

oracle$ sqlplus / as sysdba
SQL> connect / as sysdba

SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 1m;

表領域が作成されました。

-- テストユーザーの作成
SQL> create user testuser identified by testuser default tablespace test_tblsp;
ユーザーが作成されました。

SQL> grant dba to testuser;
権限付与が成功しました。

SQL> connect testuser/testuser
接続されました。
SQL> show user;
ユーザーは"TESTUSER"です。
SQL>

この時点でデータファイルの中身を見るとDB名と表領域名が書かれていることが分かる。
( データファイルはバイナリだがstringsコマンドで中身を見ることができる )

[oracle@test1    ]$ cd /tmp
[oracle@test1 tmp]$ strings test_tblsp.dbf
}|{z
TESTDB
TEST_TBLSP

2. 表の作成、レコードの挿入

作成した表領域上に表を作成し、レコードを挿入する。

SQL> create table test1 ( c1 varchar2(10) );

表が作成されました。

SQL> insert into test1 values ( 'yaho' );

1行が作成されました。

SQL> commit;

コミットが完了しました。

-- データファイルに書き出す
SQL> alter system checkpoint;

システムが変更されました。

SQL>

この時点でのデータファイルの中身を確認。 delete前後での差分を確認するためにテキストで保存しておく。

[oracle@test1 tmp]$ strings test_tblsp.dbf > bf.txt

# レコードが入っていることを確認
[oracle@test1 tmp]$ cat bf.txt | grep yaho
yaho
[oracle@test1 tmp]$

3. レコードの削除

さて、レコードを削除する。

SQL> delete from test1;

1行が削除されました。

SQL> commit;

コミットが完了しました。

SQL> alter system checkpoint;

システムが変更されました。

レコード削除完了。ではデータファイルの中身の差分を見る。

[oracle@test1 tmp]$ strings test_tblsp.dbf > af.txt

# レコードの値は依然として存在している
[oracle@test1 tmp]$ cat af.txt | grep yaho
yaho
[oracle@test1 tmp]$

4. データファイルの差分の確認

[oracle@test1 tmp]$ diff bf.txt af.txt
1068c1068
< METADATA ,
---
> METADATA <
[oracle@test1 tmp]$

差分は1行のみであった。 このことから、データファイルも何かしらの変更があったことが分かった。 にしてもあまりにも地味だなこれ。。。そして意味不明すぎる。。。

せっかくなのでtruncate(表の切り捨て)もしてみる。

5. truncateの実施

SQL> truncate table test1;

表が切り捨てられました。

SQL>

truncateの前後での差分を確認してみる。

[oracle@test1 tmp]$ strings test_tblsp.dbf > af2.txt
[oracle@test1 tmp]$ diff af.txt af2.txt
3a4,5
>  P<!
> !R<#
[oracle@test1 tmp]$


# 表領域名の後に上記の2行が追記されている
[oracle@test1 tmp]$ head -n 5 af2.txt
}|{z
TESTDB
TEST_TBLSP
 P<!
!R<#

表領域の下にこれまた意味不明な記号が追加されている。

まとめ

最近暗号化に興味を持ったためにデータファイルの中身が気になり試してみた。
deleteやtruncateの前後でデータファイルにも何かしらの変更が加えられるのは当然として
これらの操作によってレコードの値は消えるわけではないことも分かった。
こういった点からも暗号化されていない表領域のデータファイルは注意した方が良さそう。