法医学的にデータを削除/更新する


15

オラクルからデータをフォレンジックで削除する必要があります。削除しただけの場合、そのスペースが再利用されるまで、データは実際にデータファイルに残っていると理解しています。REDO /アーカイブ/ UNDOスペースについては心配していません。それらはすぐに適切に期限切れになります。

データが実際にデータファイルから削除されるようにする方法はありますか?

回答:


15

これは興味深い質問です。Oracleが実際にデータを物理的に削除するのはいつですか?

Oracleのデータの単位はブロックです。行を削除するとどうなるか見てみましょう。

11gR2の単純な表の例を次に示します(「Oracle Data Blockのダンプ方法」を参照)。

CREATE TABLE test_delete_data(id NUMBER,data VARCHAR2(100));
INSERT INTO test_delete_data VALUES (1, rpad('1', 100, '1'));
INSERT INTO test_delete_data VALUES (2, rpad('2', 100, '2'));
INSERT INTO test_delete_data VALUES (3, rpad('3', 100, '3'));
COMMIT;

SELECT dbms_rowid.rowid_to_absolute_fno(rowid, user, 'TEST_DELETE_DATA') fileno,
       dbms_rowid.rowid_block_number(rowid) blockno
  FROM test_delete_data;

-- replace with values from query
alter system dump datafile 4 block 16573;

user_dump_destディレクトリに作成されたファイルの最後に次のようなものが表示されます。

data_block_dump,data header at 0x8b02264
===============
[...]
block_row_dump:
tab 0, row 0, @0x1f2d
tl: 107 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [100]
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
tab 0, row 1, @0x1ec2
tl: 107 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 03
col  1: [100]
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
tab 0, row 2, @0x1e57
tl: 107 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 04
col  1: [100]
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump

2番目の行を削除し、同じブロックをコミットしてダンプすると、次のようになります。

block_row_dump:
tab 0, row 0, @0x1f2d
tl: 107 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 02
col  1: [100]
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31
tab 0, row 1, @0x1ec2
tl: 2 fb: --HDFL-- lb: 0x2 
tab 0, row 2, @0x1e57
tl: 107 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 04
col  1: [100]
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
end_of_block_dump

レコードはまだあります(Dフラグが設定されています)。実際のバイナリデータ(block header dumpセクションの直前)を見ると、データがまだ上書きされていないことがわかります。

8B040C0 33336404 33333333 33333333 33333333  [.d33333333333333]
8B040D0 33333333 33333333 33333333 33333333  [3333333333333333]
        Repeat 4 times
8B04120 33333333 023C3333 03C10202 32323264  [333333<.....d222]
8B04130 32323232 32323232 32323232 32323232  [2222222222222222]
        Repeat 5 times
8B04190 02002C32 6402C102 31313131 31313131  [2,.....d11111111]
8B041A0 31313131 31313131 31313131 31313131  [1111111111111111]
        Repeat 4 times
8B041F0 31313131 31313131 31313131 30A30602  [111111111111...0]

データを実際に上書きする1つの方法は、行を削除する前に無意味な値に更新することです。更新はab * treeインデックスのdelete + insertに変換されるため、これはインデックスでは機能しません。


+1「データを実際に上書きする1つの方法は、行を削除する前に無意味な値に更新することです。」

素晴らしい答えです!トリガーの代わりに「削除前の更新」を実装できることを追加したいと思います。
ora-600

インデックスデータも確実に上書きしたい場合は、テーブルを縮小し、(そのテーブルの)すべてのインデックスを再構築し、PCT_FREE = 99で新しいテーブルを作成し、すべての空き領域を消費するまで拡張し、このテーブルにダミー行。最後に、テーブルをドロップして空き領域を確保できます。これは間違いなく、各削除後に自動的に実行する必要があるタスクではありません。また、この操作を実行する前に自動拡張を無効にすることにも注意してください。
ora-600

0

削除後もデータが保持されるとは思わないが、スペースが補充されるまでそのテーブルが使用し続けることは正しい。表の最上部のスペース使用量は、最高水準点として知られています。Tom Kyteには、それについての非常に優れた(当然のことながら)投稿があります。

テーブルを再構築して、最高水準点を下げます。

alter table my_table_name move

またはそれを切り捨てることにより; ただし、アクティブなテーブルでは、これは明らかにオプションではありません。


ISTBC。ただし、削除後もデータが(「生の」形式で)存在することを期待します。行がテーブルから「リンク解除」され、スペースが空きとしてマークされているだけです。トムカイテはこう言います。「それで、あなたが情報を削除しても、ブロックはまだ「ブロック」であり、かつてアクティブな行を持っていたブロックに過ぎませんが、もはやそうではありません。」私はこれを100%確信していないので、下票はありません。:)

@cagcowboy、彼はまた、「データを含まない多くのブロックがあるかもしれない」とも言います。これは、将来の使用のためにスペースが保持されるが、データが失われることを常に意味します。私は間違っていると証明されることをいとわない:-)。
ベン

3
あなたの言ってる事がわかります。しかし、「もう含まれていないブロックがたくさんあるかもしれないアクティブなデータをます。基本的に、Oracleが削除されたデータを上書きすることは期待していません。ただ参照しないと思います。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.