Note_Tech

All technological notes.


Project maintained by simonangel-fong Hosted on GitHub Pages — Theme by mattgraham

Flashback - Flashback Transaction Backout

Back


Flashback Transaction Backout


Lab: Flashback table to reverse a transaction

Setup Environment

sqlplus / as sysdba

ALTER SESSION set container=orclpdb;

-- CLEANUP from previous run
DROP USER bar CASCADE;
DROP TABLESPACE bartbs INCLUDING CONTENTS AND DATAFILES;

-- Create tablespace
CREATE TABLESPACE bartbs
DATAFILE '/u01/app/oracle/oradata/ORCL/orclpdb/bartbs1.dbf' SIZE 10M REUSE
SEGMENT SPACE MANAGEMENT MANUAL;

-- Create user
CREATE USER BAR IDENTIFIED BY pass4BAR
DEFAULT TABLESPACE bartbs
QUOTA UNLIMITED ON bartbs;

GRANT CREATE SESSION TO BAR;

-- create table and populate
-- be sure table is at least 2 blocks long
CREATE TABLE BAR.barcopy
TABLESPACE bartbs
AS SELECT * FROM HR.EMPLOYEES;

INSERT INTO BAR.BARCOPY
SELECT * FROM BAR.BARCOPY;

INSERT INTO BAR.BARCOPY
SELECT * FROM BAR.BARCOPY;

-- Create an table with a FK relationship
CREATE TABLE BAR.BARDEPT
TABLESPACE BARTBS
AS SELECT * from HR.DEPARTMENTS;

ALTER TABLE BAR.BARDEPT
ADD CONSTRAINT PK_BARDEPT PRIMARY KEY (DEPARTMENT_ID);

ALTER TABLE BAR.BARCOPY
ADD CONSTRAINT dept_id_FK FOREIGN KEY (department_id)
REFERENCES BAR.BARDEPT;
#-- Create backup of the bartbs tablespace
rman target /

BACKUP AS COPY TABLESPACE orclpdb:bartbs;
#-- update the table
sqlplus / as sysdba
ALTER SESSION set container=orclpdb;

UPDATE BAR.BARCOPY SET salary = salary+1;
COMMIT;

sqlplus sys@orclpdb as sysdba

select to_char(sysdate, 'yyyy-mm-dd:hh24:mi:ss')
from dual;
-- 2024-05-29:00:38:27

lab_tran_backout


sqlplus / as sysdba

ALTER SESSION set container=orclpdb;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'ADMIRATION'
WHERE DEPARTMENT_ID = 10;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'MACAROONS'
WHERE DEPARTMENT_ID = 20;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'PUSHBROOMS'
WHERE DEPARTMENT_ID = 30;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'HUMAN REPRISAL'
WHERE DEPARTMENT_ID = 40;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'SCHLEPPING'
WHERE DEPARTMENT_ID = 50;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'INFORMATION MANAGLING'
WHERE DEPARTMENT_ID = 60;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'PUBLIC REVULSION'
WHERE DEPARTMENT_ID = 70;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'SAILORS'
WHERE DEPARTMENT_ID = 80;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'EXECUTION'
WHERE DEPARTMENT_ID = 90;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'FRUSTRATION'
WHERE DEPARTMENT_ID = 100;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'BEAN COUNTING'
WHERE DEPARTMENT_ID = 110;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'PIGGY BANK'
WHERE DEPARTMENT_ID = 120;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'DUCKING'
WHERE DEPARTMENT_ID = 130;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'CORRUPTION'
WHERE DEPARTMENT_ID = 140;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'LIVESTOCK'
WHERE DEPARTMENT_ID = 150;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'BODKIN'
WHERE DEPARTMENT_ID = 160;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'MISCHIEF'
WHERE DEPARTMENT_ID = 170;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'CONFUSION'
WHERE DEPARTMENT_ID = 180;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'PAPER PUSHING'
WHERE DEPARTMENT_ID = 190;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'SURGERY'
WHERE DEPARTMENT_ID = 200;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'IT SUPPRESSION'
WHERE DEPARTMENT_ID = 210;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'NO OBVIOUS CLUE'
WHERE DEPARTMENT_ID = 220;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'OBFUSCATION'
WHERE DEPARTMENT_ID = 230;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'EXTORTION'
WHERE DEPARTMENT_ID = 240;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'SCALPING'
WHERE DEPARTMENT_ID = 250;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'PROCUREMENT'
WHERE DEPARTMENT_ID = 260;

UPDATE BAR.BARDEPT SET DEPARTMENT_NAME = 'PUNISHMENT'
WHERE DEPARTMENT_ID = 270;

/
DECLARE
   CURSOR C1 is
	SELECT * FROM BAR.BARCOPY FOR UPDATE;
BEGIN

FOR C1_row IN C1 LOOP
  UPDATE BAR.BARCOPY
  SET DEPARTMENT_ID = (SELECT TRUNC(DBMS_RANDOM.VALUE(10,270),-1) FROM DUAL)
  WHERE CURRENT OF C1;
END LOOP;

END;
/

COMMIT;

Flashback Transaction

Requirement:


-- query before flashback
select e.department_id, department_name, COUNT(*)
from bar.barcopy E, bar.bardept D
where e.department_id = D.department_id
group by e.department_id, department_name;

lab_tran_backout

-- query whether row movement is enabled
SELECT owner, table_name, row_movement
FROM   dba_tables
WHERE  table_name IN ('BARDEPT','BARCOPY')
AND owner = UPPER('bar');
-- BAR	BARCOPY	DISABLED
-- BAR	BARDEPT	DISABLED

ALTER TABLE BAR.BARDEPT
ENABLE ROW MOVEMENT;

ALTER TABLE BAR.BARCOPY
ENABLE ROW MOVEMENT;

-- Confimr row movement is enabled
SELECT owner, table_name, row_movement
FROM   dba_tables
WHERE  table_name IN ('BARDEPT','BARCOPY')
AND owner = UPPER('bar');

lab_tran_backout

FLASHBACK TABLE BAR.BARDEPT TO TIMESTAMP
TO_TIMESTAMP ('2024-05-29:00:38:27', 'YYYY-MM-DD:HH24:MI:SS');

FLASHBACK TABLE BAR.BARCOPY TO TIMESTAMP
TO_TIMESTAMP ('2024-05-29:00:38:27', 'YYYY-MM-DD:HH24:MI:SS');
select e.department_id, department_name, COUNT(*)
from bar.barcopy E, bar.bardept D
where e.department_id = D.department_id
group by e.department_id, department_name

lab_tran_backout


Clean up

rman target /
delete NOPROMPT copy of tablespace orclpdb:bartbs;
exit;
sqlplus / as sysdba

ALTER SESSION set container=orclpdb;

-- CLEANUP from previous run
DROP USER bar CASCADE;
DROP TABLESPACE bartbs INCLUDING CONTENTS AND DATAFILES;

-- purge recyclebin
PURGE DBA_RECYCLEBIN;

-- Reset undo parameter
ALTER SESSION set container=cdb$root;

ALTER TABLESPACE UNDOTBS1 RETENTION NOGUARANTEE;
ALTER SYSTEM set UNDO_RETENTION = 900 SCOPE=BOTH;

-- confirm reset
show parameter UNDO_RETENTION

lab_tran_backout


TOP