Slides from OpenWorld. Flashback has been around for long time yet people assume it should entirely within the realm of the DBA. But with modern development techniques such as continuous integration/continuous deployment, flashback actually is a perfect for *developers*
3. 9/19/2019
3
5 5
6
Stuff
youtube bit.ly/youtube-connor
blog bit.ly/blog-connor
twitter bit.ly/twitter-connor
400+ posts mainly on database & development
250 technical videos, new uploads every week
rants and raves on tech and the world :-)
5
6
14. 9/19/2019
14
29
select * from emp
where hiredate > '01/01/2004'
update emp set ename = 'SUE'
where ename = 'JOHN';
Block 3217
"I need block 3217…
… as it was at 9:00"
9:00
9:03
9:05
session 1 session 2
...and time = scn
30
system change number
29
30
15. 9/19/2019
15
31
Session 1
Request
Block 3217,
SCN 4567192
Block 3217,
SCN 4567234
"SUE"
Block 3217,
SCN 4567003,
change SUE => JOHN
undo segment block(s)
No good..too new
take a copy of the block
Locate
apply undo
Block 3217,
SCN 4567234
" SUE"
Block 3217,
SCN 4567234
" SUE"
Block 3217,
SCN 4567003
" JOHN"
Block 3217,
SCN 4567003
"JOHN"
Session 2
update emp
set ename = 'SUE'
where ename = 'JOHN'
commit;
Done !
32
stress: vast simplification
in-memory undo
throwaway undo
slots
expiry
wrap#
31
32
18. 9/19/2019
18
37
SQL> select * from DEPT;
DEPTNO DNAME LOC
---------- -------------- -------------
10 UNKNOWN NEW YORK
20 UNKNOWN DALLAS
30 UNKNOWN CHICAGO
40 UNKNOWN BOSTON
38
SQL> select * from DEPT AS OF SCN 995401;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
37
38
19. 9/19/2019
19
39
less geeky
40
SQL> select * from DEPT
2 AS OF TIMESTAMP systimestamp -
3 interval '20:00' minute to second;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
39
40
22. 9/19/2019
22
48
SQL> select e.empno, e.ename, d.dname
2 from emp e,
3 dept AS OF TIMESTAMP '16-SEP-19' d
3 where d.deptno = e.deptno;
EMPNO ENAME DNAME
---------- ---------- --------------
7782 CLARK "PREVIOUS NAME"
7839 KING "PREVIOUS NAME"
7934 MILLER "PREVIOUS NAME"
7566 JONES RESEARCH
7902 FORD RESEARCH
7876 ADAMS RESEARCH
7369 SMITH RESEARCH
7788 SCOTT RESEARCH
"What is in it for me?"
48
49
23. 9/19/2019
23
50
1) unit testing
before vs after
51
SQL> select case
2 when d1.deptno is null then 'DELETE'
3 when d2.deptno is null then 'INSERT'
4 end action,
5 d1.deptno, d2.deptno, d1.dname, d1.loc
6 from DEPT d1 full outer join
7 DEPT AS OF TIMESTAMP '16-SEP-19 11.51.02 PM' d2
8 on d1.deptno = d2.deptno;
ACTION DEPTNO DEPTNO DNAME LOC
------ ---------- ---------- -------------- ----------
10 10 ACCOUNTING NEW YORK
20 20 RESEARCH DALLAS
30 30 SALES CHICAGO
DELETE 40
INSERT 50 MARKETING PERTH
50
51
24. 9/19/2019
24
52
2) not just your data
53
SQL> drop procedure debug_msg;
Procedure dropped.
SQL> connect / as sysdba
Connected.
SQL> select text
2 from dba_source
3 as of timestamp systimestamp - interval '5' minute
4 where name='DEBUG_MSG' order by line;
TEXT
---------------------------------------------------------------------
procedure debug_msg(m varchar2) is
begin
dbms_output.put_line(m);
dbms_application_info.set_client_info(m);
end;
5 rows selected.
52
53
25. 9/19/2019
25
54
3) functionality diagnosis
55
SQL> select * from DEPT;
DEPTNO DNAME LOC
---------- -------------- -------------
10 UNKNOWN NEW YORK
SQL> select * from DEPT
2 as of TIMESTAMP SYSTIMESTAMP -
3 INTERVAL '20:00' MINUTE TO SECOND;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
1 change ?
10 changes ?
54
55
26. 9/19/2019
26
56
flashback row versions
57
SQL> SELECT deptno, dname
2 FROM dept
3 VERSIONS BETWEEN
4 TIMESTAMP SYSTIMESTAMP –
5 INTERVAL '20:00' MINUTE TO SECOND
6 AND SYSTIMESTAMP
7 WHERE deptno = 10;
DEPTNO DNAME
---------- --------------
10 ACCOUNTING
10 MONEY GRABBERS
10 FINANCE
10 BEAN COUNTERS
10 UNKNOWN
1 row
5 versions
56
57
27. 9/19/2019
27
58
versions_starttime
versions_startscn
versions_endtime
versions_endscn
versions_xid
versions_operation
59
SQL> SELECT deptno, dname,
2 VERSIONS_STARTTIME
3 ,VERSIONS_XID
4 ,VERSIONS_OPERATION
5 FROM dept
6 VERSIONS BETWEEN TIMESTAMP
7 SYSTIMESTAMP - INTERVAL '20:00' MINUTE TO SECOND
8 AND SYSTIMESTAMP
9 WHERE deptno = 10;
DEPTNO DNAME VERSIONS_STARTTIME VERSIONS_XID V
--------- -------------- ---------------------- ---------------- -
10 UNKNOWN 16-SEP-19 11.53.45 PM 0200100060040000 U
10 MONEY GRABBERS 16-SEP-19 11.53.36 PM 0600050065040000 U
10 FINANCE 16-SEP-19 11.53.24 PM 09000D001D050000 U
10 BEAN COUNTERS 16-SEP-19 11.53.12 PM 01001A00EA030000 U
10 ACCOUNTING
58
59
28. 9/19/2019
28
60
get the lot ...
61
SQL> SELECT deptno, dname,
2 VERSIONS_STARTTIME
3 ,VERSIONS_XID
4 ,VERSIONS_OPERATION
5 FROM dept VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;
DEPTNO DNAME VERSIONS_STARTTIME VERSIONS_XID V
---------- ----------- ------------------------ ---------------- -
50 UNKNOWN 16-SEP-19 11.08.15 PM 04000700EA030000 U
30 UNKNOWN 16-SEP-19 11.08.15 PM 04000700EA030000 U
20 NERDS 16-SEP-19 11.07.57 PM 090016001D050000 U
20 R&D 16-SEP-19 11.07.48 PM 05000B0074040000 U
...
60
61
32. 9/19/2019
32
70
SQL> show parameter undo_retention
NAME TYPE VALUE
------------------------------ ----------- --------
undo_retention integer 900
~
71
SQL> desc v$undostat
Name Null? Type
----------------------------- -------- -----------
BEGIN_TIME DATE
END_TIME DATE
...
...
TUNED_UNDORETENTION NUMBER
CON_ID NUMBER
70
71
34. 9/19/2019
34
77
SQL> SELECT deptno, dname,
2 VERSIONS_STARTTIME
3 ,VERSIONS_XID
4 ,VERSIONS_OPERATION
5 FROM dept VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;
DEPTNO DNAME VERSIONS_STARTTIME VERSIONS_XID V
--------- --------- ----------------------- ---------------- -
50 UNKNOWN 16-SEP-19 11.08.15 PM 04000700EA030000 U
30 UNKNOWN 16-SEP-19 11.08.15 PM 04000700EA030000 U
20 NERDS 16-SEP-19 11.07.57 PM 090016001D050000 U
20 R&D 16-SEP-19 11.07.48 PM 05000B0074040000 U
...
78
XID ?
77
78
35. 9/19/2019
35
79
SQL> desc V$TRANSACTION
Name Null? Type
----------------------------- -------- -------
XIDUSN NUMBER
XIDSLOT NUMBER
XIDSQN NUMBER
...
80
SQL> select
2 XIDUSN, XIDSLOT, XIDSQN
3 from v$transaction
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
1 31 674
SQL> select versions_xid from ...
VERSIONS_XID
-------------------
01 001F 00A202 0000
79
80
36. 9/19/2019
36
82
SQL> desc FLASHBACK_TRANSACTION_QUERY
Name Null? Type
----------------------- -------- --------------
XID RAW(8)
START_SCN NUMBER
START_TIMESTAMP DATE
COMMIT_SCN NUMBER
COMMIT_TIMESTAMP DATE
LOGON_USER VARCHAR2(30)
UNDO_CHANGE# NUMBER
OPERATION VARCHAR2(32)
TABLE_NAME VARCHAR2(256)
TABLE_OWNER VARCHAR2(32)
ROW_ID VARCHAR2(19)
UNDO_SQL VARCHAR2(4000)
83
SQL> update dept
2 set DNAME = 'FINANCE'
2 where deptno = 10;
1 row updated.
SQL> select xid, undo_sql
2 from flashback_transaction_query
3 where xid = hextoraw('09000d001d050000');
XID UNDO_SQL
---------------- ------------------------------------
09000D001D050000 update "SCOTT"."DEPT"
set "DNAME" = 'BEAN COUNTERS'
where ROWID = 'AAAQ+hAAEAAAAAOAAA';
82
83
37. 9/19/2019
37
84
be careful
85
SQL> select text from dba_views
2 where view_name
3 = 'FLASHBACK_TRANSACTION_QUERY';
TEXT
------------------------------------------------
select xid, start_scn, start_timestamp,
decode(commit_scn,
0, commit_scn,
281474976710655, NULL, commit_scn)
commit_scn, commit_timestamp,
logon_user, undo_change#, operation,
table_name, table_owner,
row_id, undo_sql
from SYS.X$KTUQQRY
84
85
38. 9/19/2019
38
86
do not query without predicates ...
SQL> select xid, undo_sql
2 from flashback_transaction_query
3 where xid = hextoraw('09000d001d050000');
87
do not forget hextoraw
SQL> select xid, undo_sql
2 from flashback_transaction_query
3 where xid = hextoraw('09000d001d050000');
86
87
44. 9/19/2019
44
101
flashback transaction
102
SQL> delete from DEPT where DEPTNO = 10;
1 row deleted.
SQL> commit;
Commit complete.
SQL> SELECT VERSIONS_XID
2 FROM dept
3 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;
VERSIONS_XID
----------------
080017006C040000
101
102
45. 9/19/2019
45
103
SQL> BEGIN
2 DBMS_FLASHBACK.TRANSACTION_BACKOUT(
3 numtxns=> 1,
4 xids => sys.xid_array('080017006C040000')
5 );
6 END;
7 /
BEGIN
*
ERROR at line 1:
ORA-55510: Mining could not start
ORA-06512: at "SYS.DBMS_FLASHBACK", line 37
ORA-06512: at "SYS.DBMS_FLASHBACK", line 70
ORA-06512: at line 2
104
104
103
104
46. 9/19/2019
46
105
SQL> ALTER DATABASE ADD
2 SUPPLEMENTAL LOG DATA
3 (PRIMARY KEY) COLUMNS;
Database altered.
106
SQL> delete from DEPT where DEPTNO = 10;
1 row deleted.
SQL> commit;
Commit complete.
SQL> SELECT VERSIONS_XID
2 FROM dept
3 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;
VERSIONS_XID
----------------
080017006C040000
105
106
47. 9/19/2019
47
107
SQL> BEGIN
2 DBMS_FLASHBACK.TRANSACTION_BACKOUT(
3 numtxns => 1,
4 xids => sys.xid_array('080017006C040000')
5 );
6 END;
7 /
SQL> select * from DEPT;
DEPTNO DNAME LOC
---------- -------------- ----------
20 RESEARCH DALLAS
30 SALES CHICAGO
50 MARKETING PERTH
40 HR US?
108
KEEP CALM
AND
DON'T PANIC
107
108
56. 9/19/2019
56
125
126
SQL> desc USER_RECYCLEBIN
Name Null? Type
----------------------------- -------- ----------------
OBJECT_NAME NOT NULL VARCHAR2(30)
ORIGINAL_NAME VARCHAR2(32)
OPERATION VARCHAR2(9)
TYPE VARCHAR2(25)
TS_NAME VARCHAR2(30)
CREATETIME VARCHAR2(19)
DROPTIME VARCHAR2(19)
DROPSCN NUMBER
PARTITION_NAME VARCHAR2(32)
CAN_UNDROP VARCHAR2(3)
CAN_PURGE VARCHAR2(3)
RELATED NOT NULL NUMBER
BASE_OBJECT NOT NULL NUMBER
PURGE_OBJECT NOT NULL NUMBER
SPACE NUMBER
125
126
57. 9/19/2019
57
127
SQL> select OBJECT_NAME, ORIGINAL_NAME,
2 CAN_UNDROP, CAN_PURGE
3 from USER_RECYCLEBIN;
OBJECT_NAME ORIGINAL_NAME CAN CAN
-------------------------------- --------------- --- ---
BIN$CmYCdNcITL6hp9l266nskA==$0 PK_EMP NO YES
BIN$b/W75+c/Q/CeFMBIK7cXfw==$0 EMP YES YES
128
SQL> show RECYCLEBIN
127
128
58. 9/19/2019
58
130
SQL> flashback table EMP to before drop;
Flashback complete.
131
SQL> flashback table EMP to before drop
2 rename to OLD_EMP;
Flashback complete.
130
131
67. 9/19/2019
67
154
most DDL is a flashback boundary
155
SQL> flashback table DEPT to scn ...;
ORA-01466: unable to read data - table definition has changed
154
155
68. 9/19/2019
68
156
each release gets better
157
SQL> alter table DEPT add column XXX date;
SQL> flashback table DEPT to scn ...;
SQL> desc DEPT
Name Null? Type
-------------------------- -------- --------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
XXX DATE
156
157
74. 9/19/2019
74
169
SQL> desc V$FLASHBACK_DATABASE_STAT
Name Null? Type
----------------------------- -------- ---------
BEGIN_TIME DATE
END_TIME DATE
FLASHBACK_DATA NUMBER
DB_DATA NUMBER
REDO_DATA NUMBER
ESTIMATED_FLASHBACK_SIZE NUMBER
173
a good compromise
169
173
88. 9/19/2019
88
207207
SQL> select * from EMP AS OF "JUNE";
SQL> select * from EMP AS OF "MARCH";
SQL> select * from EMP AS OF "2pm Wednesday";
SQL> select * from EMP AS OF etc etc etc
208208
every historical version...
207
208
91. 9/19/2019
91
213213
SQL> desc T
Name Null? Type
------------------------ -------- -------------
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
SQL> desc T_AUDIT
Name Null? Type
------------------------ -------- --------------
AUDIT_DATE DATE
AUDIT_ACTION CHAR(1)
OWNER NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
214214
SQL> create or replace
2 trigger AUDIT_TRG
3 after insert or update or delete on T
4 for each row
5 declare
6 v_action varchar2(1) :=
7 case when updating then 'U'
8 when deleting then 'D' else 'I' end;
9 begin
10 if updating or inserting then
11 insert into T_AUDIT
12 values (sysdate
13 ,v_action
14 ,:new.owner
15 ,:new.object_name);
16 else
17 insert into T_AUDIT
18 values (sysdate
19 ,v_action
20 ,:old.owner
21 ,:old.object_name);
22 end if;
23 end;
213
214
93. 9/19/2019
93
219
SQL> select empno, ename, job, sal, comm,
2 nvl(VERSIONS_STARTTIME,LAST_MOD) TS
3 ,nvl(VERSIONS_OPERATION,'I') op
4 from EMP
5 versions between timestamp
6 timestamp '2019-09-16 20:12:00' and systimestamp
7 order by empno, ts;
EMPNO ENAME JOB SAL COMM TS O
---------- ---------- --------- -------- ---------- ------------ -
7369 SMITH CLERK 806 08.10.51 PM I
7369 SMITH SALES 8060 1000 08.12.10 PM U
7499 ALLEN SALESMAN 1606 300000000 08.10.51 PM I
7521 WARD SALESMAN 1256 500000000 08.10.51 PM I
7566 JONES MANAGER 2981 08.10.51 PM I
...
7900 JAMES CLERK 956 08.10.51 PM I
7902 FORD ANALYST 3006 08.10.51 PM I
7934 MILLER CLERK 1306 08.10.51 PM I
7934 MILLER CLERK 1306 08.12.10 PM D
220
so why didn't we ?
219
220