delete,truncateによるデータファイルの変化
今回はデータファイルの中身の変化について。
暗号化されていない表領域は中身が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の前後でデータファイルにも何かしらの変更が加えられるのは当然として
これらの操作によってレコードの値は消えるわけではないことも分かった。
こういった点からも暗号化されていない表領域のデータファイルは注意した方が良さそう。