Как откатить завершённую транзакцию (rollback after commit)?
Есть ли какой-нибудь способ откатить завершённую транзакцию?
Сделал удаление из таблицы` и фиксировал его:
delete from table;
commit;
Теперь хочу откатить зафиксированные изменения.
Есть ли какой-нибудь способ сделать это?
Свободный перевод вопроса Rollback a committed transaction от участника @Varun
Ответы (1 шт):
В общем, нельзя откатить изменения, которые были зафиксированны.
Что можно сделать в этой конкретной ситуации, как один из самых быстрых вариантов, сделать флэшбэк запрос к таблице, из которой были удалены строки, и вставить их обратно.
Обратите внимание, успех этой операции зависит от значения (по умолчанию 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