криміналістичне видалення / оновлення даних


15

У мене є необхідність криміналістично видаляти дані з Oracle. Якщо я просто видалю його, я розумію, що дані все ще будуть фактично знаходитись у файлі даних, поки цей простір не буде використаний повторно. Мене не хвилює простір повторення / архівування / скасування, вони швидко визрівають.

Чи є якісь способи забезпечення даних фактично видалені з файлу даних?

Відповіді:


15

Це цікаве питання: Коли Oracle насправді фізично видаляє дані?

Одиниця даних в Oracle - це блок. Подивимося, що станеться, коли ми видалимо рядок.

Ось приклад з простої таблиці на 11gR2 (див. " Як скинути блок даних Oracle? "):

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

Якщо я видаляю другий рядок, фіксую і скидаю той самий блок, я отримаю щось подібне:

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]

Один із способів змусити дані фактично перезаписатись - оновити їх до безглуздого значення перед видаленням рядка. Це не буде працювати з індексами, оскільки оновлення перекладаються для видалення + вставки в індекс ab * дерева.


+1 "Один із способів змусити дані фактично перезаписатись - це оновити їх до безглуздого значення перед видаленням рядка."

Чудова відповідь! Я хочу додати, що ви можете реалізувати "оновлення перед видаленням" замість тригера .
ora-600

Якщо ви хочете переконатися, що дані індексу також перезаписані, ви можете зменшити таблицю, відновити всі індекси (цієї таблиці), створити нову таблицю з PCT_FREE = 99, яку ви розширите, поки вона не витратить весь вільний простір, а потім заповніть цю таблицю манекенні ряди. Нарешті ви можете скинути стіл, щоб звільнити місце. Це, безумовно, не завдання, яке слід виконувати автоматично після кожного видалення. Також пам’ятайте, що вимкніть автоматичне розширення перед виконанням цієї операції.
ora-600

0

Я не думаю, що дані зберігаються після видалення, але ви правильні, що простір буде використовуватися цією таблицею, поки вона не буде заповнена. Верхнє використання площі в таблиці називається знаком високої води. Том Кіт має справді хороший (не дивно) пост про це.

Ви знижуєте марку високої води, переробляючи стіл:

alter table my_table_name move

або шляхом обрізання; хоча в активній таблиці це, очевидно, не є можливим.


ISTBC, але я б очікував, що дані все ще існуватимуть (у "сирому" вигляді) після видалення. Це буде там, це просто те, що рядок був "від’єднаний" від таблиці та пробіл, позначений як вільний. Том Кайт каже це "Отже, коли ви видаляєте інформацію, блок все ще є" блоком ", це просто блок, який колись мав активні рядки - але більше не робить". Я не впевнений у цьому на 100%, тому жодної протидії. :)

@cagcowboy, він також каже, "у нас може бути багато блоків, які більше не містять даних ". Я завжди вважав це тим, що простір зберігається для подальшого використання, але даних немає. Я готовий бути неправдивим, хоча :-).
Бен

3
Я бачу вашу думку. Однак я б припустив, що він міг написати "у нас може бути багато блоків, які більше не містять активних даних". В основному, я б не очікував, що Oracle замінить видалені дані - я вважаю, що це просто не визначає їх.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.