Как откатить завершённую транзакцию (rollback after commit)?

Есть ли какой-нибудь способ откатить завершённую транзакцию?

Сделал удаление из таблицы` и фиксировал его:

delete from table; 
commit;

Теперь хочу откатить зафиксированные изменения.

Есть ли какой-нибудь способ сделать это?


Свободный перевод вопроса Rollback a committed transaction от участника @Varun


Ответы (1 шт):

Автор решения: 0xdb

В общем, нельзя откатить изменения, которые были зафиксированны.

Что можно сделать в этой конкретной ситуации, как один из самых быстрых вариантов, сделать флэшбэк запрос к таблице, из которой были удалены строки, и вставить их обратно.

Обратите внимание, успех этой операции зависит от значения (по умолчанию 900 секунд) параметра UNDO_RETENTION - минимального периода времени (может изменится автоматически), в течение которого информация об откате изменений (undo records) сохраняется в табличном пространстве UNDO. То есть, если в данный момент не выполняются другие транзакции с большим количеством изменений, то шанс откатить изменения достаточно высок.

Вот простой ребочий пример:

show parameters undo_retention 

NAME           TYPE    VALUE 
-------------- ------- ----- 
undo_retention integer 900   

create table t2 (col) as
    select level from dual connect by level<=3
/
delete from tab
/
3 rows deleted.

commit
/
Commit complete.

Записать срез данных на момент времени до фиксации транзакции во временную таблицу, затем вставить удалённые записи:

create table tmptab as
    select *                                   
    from tab as of timestamp timestamp'2020-10-06 12:11:00'
/  
Table TMPTAB created.

insert into tab
    select * from tmptab minus
    select * from tab
/
3 rows inserted.

select * from tab
/
       COL
----------
         1
         2
         3

Свободный перевод ответа от участника @Nick Krasnov

→ Ссылка