Sie sind auf Seite 1von 11

FLASHBACK VERSION QUERY

SQL> desc tab1;


Name

Null?

Type

----------- ----------------- -------NO

NUMBER

TMSTMP

DATE

DSCRPTN

VARCHAR2(15)

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


CURRENT_SCN
-----------

TIMESTAMP
------------------

662902

09-MAY-14 18:30:28

# INSERTING RECORDS
SQL> insert into tab1 (no , tmstmp) values (1,sysdate);
1 row created.
SQL> insert into tab1 (no , tmstmp) values (2,sysdate);
1 row created.
SQL> commit;
Commit complete.

SQL> SELECT
CURRENT_SCN

current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


TIMESTAMP

-----------

------------------

662955

09-MAY-14 18:31:23

# DELETING

RECORDS

SQL> delete from tab1;


2 rows deleted.
SQL> commit;
Commit complete.
SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;
CURRENT_SCN
----------662967

TIMESTAMP
-----------------09-MAY-14 18:31:52

# TIMESTAMP BETWEEN 18:31:23 Vs 18:31:52

COLUMN versions_startscn FORMAT 99999999999999999


COLUMN versions_starttime FORMAT A24
COLUMN versions_endscn FORMAT 99999999999999999
COLUMN versions_endtime FORMAT A24
COLUMN versions_xid FORMAT A16
COLUMN versions_operation FORMAT A1
COLUMN dscrptn FORMAT A11
SET LINESIZE 200

SQL> SELECT
versions_startscn, versions_starttime
,

versions_endscn, versions_endtime

versions_xid, versions_operation

DSCRPTN from tab1


VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('09-MAY-14 18:31:23','DD-MON-YY HH24:MI:SS')
AND TO_TIMESTAMP('09-MAY-14 18:31:52','DD-MON-YY HH24:MI:SS');

VERSIONS_STARTSCN

VERSIONS_STARTTIME

VERSIONS_ENDSCN

VERSIONS_ENDTIME

VERSIONS_XID

------------------ -------------------- ----------------- ----------------- ------------

DSCRPTN

--------

662964

09-MAY-14 06.31.42 PM

060029000F010000

662964

09-MAY-14 06.31.42 PM

060029000F010000

662964

09-MAY-14

06.31.42 PM

662964

09-MAY-14

06.31.42 PM

TIMESTAMP BETWEEN 18:30:28 Vs 18:31:52


SQL> SELECT
versions_startscn, versions_starttime
,

versions_endscn, versions_endtime

versions_xid, versions_operation

DSCRPTN from tab1

VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('09-MAY-14 18:30:28','DD-MON-YY HH24:MI:SS')


AND TO_TIMESTAMP('09-MAY-14 18:31:52','DD-MON-YY HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME
------------------ ------------------

VERSIONS_ENDSCN

VERSIONS_ENDTIME

VERSIONS_XID

----------------- --------- --------- -------------

DSCRPTN

--------

662964

09-MAY-14 06.31.42 PM

060029000F010000

662964

09-MAY-14 06.31.42 PM

060029000F010000

662951

09-MAY-14 06.31.12 PM

662964

09-MAY-14 06.31.42 PM

0700060018010000

662951

09-MAY-14 06.31.12 PM

662964

09-MAY-14 06.31.42 PM

0700060018010000

EXAMPLE II

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


CURRENT_SCN

TIMESTAMP

-----------

------------------

664595

09-MAY-14 19:45:33

# INSERTING RECORDS
SQL> insert into tab1 (no , tmstmp) values (1,sysdate);
1 row created.
SQL> insert into tab1 (no , tmstmp) values (2,sysdate);
1 row created.
SQL> commit;
Commit complete.

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


CURRENT_SCN

TIMESTAMP

-----------

------------------

664608

09-MAY-14 19:46:06

# UPDATING RECORDS
SQL> update tab1 set DSCRPTN='one' where no=1;
1 row updated.
SQL> update tab1 set DSCRPTN='two' where no=2;
1 row updated.
SQL> commit;
Commit complete.
SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') from v$database;
CURRENT_SCN
----------664751

TIMESTAMP
-----------------09-MAY-14 19:48:30

# DELETING RECORDS
SQL> delete from tab1;
2 rows deleted.
SQL> commit;
Commit complete.

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


CURRENT_SCN
----------664835

TIMESTAMP
-----------------09-MAY-14 19:52:18

# TIMESTAMP BETWEEN 19:46:06 Vs

19:52:18

SQL> SELECT
versions_startscn, versions_starttime
,

versions_endscn, versions_endtime

versions_xid, versions_operation

DSCRPTN

from

tab1
VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('09-MAY-14 19:46:06','DD-MON-YY HH24:MI:SS')
AND TO_TIMESTAMP('09-MAY-14 19:52:18','DD-MON-YY HH24:MI:SS');

VERSIONS_STARTSCN VERSIONS_STARTTIME
------------------

VERSIONS_ENDSCN

--------------------- ------------------

VERSIONS_ENDTIME
--------------------

VERSIONS_XID

---------------

DSCRPTN
---------

664761

09-MAY-14 07.48.53 PM

030012000D010000

two

664761

09-MAY-14 07.48.53 PM

030012000D010000

one

664724

09-MAY-14 07.47.45 PM

664761

09-MAY-14 07.48.53 PM

0A00240002010000

two

664724

09-MAY-14 07.47.45 PM

664761

09-MAY-14 07.48.53 PM

0A00240002010000

one

664724

09-MAY-14 07.47.45 PM

664724

09-MAY-14 07.47.45 PM

6 rows selected.

# TIMESTAMP BETWEEN 19:45:33 Vs

19:52:18

SQL> SELECT
,

versions_startscn, versions_starttime

versions_endscn, versions_endtime

versions_xid, versions_operation

DSCRPTN

from

tab1
VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('09-MAY-14 19:45:33','DD-MON-YY HH24:MI:SS')
AND TO_TIMESTAMP('09-MAY-14 19:52:18','DD-MON-YY HH24:MI:SS')
/

VERSIONS_STARTSCN VERSIONS_STARTTIME

VERSIONS_ENDSCN

VERSIONS_ENDTIME

VERSIONS_XID

------------------ ------------------------ ------------------ -------------- ----------------

DSCRPTN

-------

664761

09-MAY-14 07.48.53 PM

030012000D010000

two

664761

09-MAY-14 07.48.53 PM

030012000D010000

one

664724

09-MAY-14 07.47.45 PM

664761

09-MAY-14 07.48.53 PM

0A00240002010000

two

664724

09-MAY-14 07.47.45 PM

664761

09-MAY-14 07.48.53 PM

0A00240002010000

one

664604

09-MAY-14 07.45.55 PM

664724

09-MAY-14 07.47.45 PM

090011003C010000

664604

09-MAY-14 07.45.55 PM

664724

09-MAY-14 07.47.45 PM

090011003C010000

6 rows selected.

EXAMPLE III
BETWEEN CLUASE USING SCN
SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;
CURRENT_SCN TIMESTAMP
----------- -----------------670656 09-MAY-14 23:00:26

SQL> insert into tab1 (no , tmstmp) values (1,sysdate);


1 row created.
SQL> insert into tab1 (no , tmstmp) values (2,sysdate);
1 row created.
SQL> commit;
Commit complete.
SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS')TIMESTAMP from v$database;
CURRENT_SCN

TIMESTAMP

-----------

------------------

670678 09-MAY-14 23:01:24


SQL> update tab1 set DSCRPTN='one' where no=1;
1 row updated.
SQL>

update tab1 set DSCRPTN='two' where no=2;

1 row updated.
SQL> commit;
Commit complete.

***********
SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS')TIMESTAMP from v$database;
CURRENT_SCN

TIMESTAMP

-----------

------------------

670696 09-MAY-14 23:02:09

SQL> insert into tab1 (no , tmstmp) values (3,sysdate);


1 row created.

SQL> insert into tab1 (no , tmstmp) values (4,sysdate);


1 row created.
SQL> commit;
Commit complete.

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS')TIMESTAMP from v$database;


CURRENT_SCN

TIMESTAMP

----------- -----------------670718 09-MAY-14 23:03:02

SQL> delete from tab1 where no=4;


1 row deleted.

SQL> commit;
Commit complete.

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


CURRENT_SCN
-----------

TIMESTAMP
------------------

670730 09-MAY-14 23:03:27

# SCN 670678 AND 670718


SQL> SELECT
versions_startscn, versions_starttime
,

versions_endscn, versions_endtime

versions_xid, versions_operation

DSCRPTN

from tab
VERSIONS BETWEEN SCN 670678 AND 670718;

VERSIONS_STARTSCN VERSIONS_STARTTIME

VERSIONS_ENDSCN VERSIONS_ENDTIME

VERSIONS_XID

V DSCRPTN

------------------ ------------------------ ------------------ ------------------------ ---------------- 670713

09-MAY-14 11.02.46 PM

670713

040011002D010000

09-MAY-14 11.02.46 PM

040011002D010000

670693

09-MAY-14 11.01.59 PM

02001B0029010000

two

670693

09-MAY-14 11.01.59 PM

02001B0029010000

one

6 rows selected.

670726

09-MAY-14 11.03.17 PM

670693

09-MAY-14 11.01.59 PM

670693

09-MAY-14 11.01.59 PM

# SCN 670656 AND 670730


SQL> SELECT
versions_startscn, versions_starttime
,

versions_endscn, versions_endtime

versions_xid, versions_operation

DSCRPTN

from

tab1
VERSIONS BETWEEN SCN 670656 AND 670730;

VERSIONS_STARTSCN VERSIONS_STARTTIME

VERSIONS_ENDSCN

VERSIONS_ENDTIME

VERSIONS_XID

DSCRPTN

------------------ ------------------------ ------------------ ------------------------ --------- -------0500050025010000

040011002D010000

09-MAY-14 11.02.46 PM

040011002D010000

670693

09-MAY-14 11.01.59 PM

02001B0029010000

two

670693

09-MAY-14 11.01.59 PM

02001B0029010000

one

670669

09-MAY-14 11.00.57 PM

670693

09-MAY-14 11.01.59 PM

070017001B010000

670669

09-MAY-14 11.00.57 PM

670693

09-MAY-14 11.01.59 PM

070017001B010000

670726

09-MAY-14 11.03.17 PM

670713

09-MAY-14 11.02.46 PM

670713

670726

09-MAY-14 11.03.17 PM

7 rows selected.

Oracle provides a variety of metadata with each version of our data.


The metadata is exposed via a number of pseudo-columns following below.

Suedo Column

Description

VERSION_XID

Transaction ID of the transaction that created this version.

VERSIONS_OPERATION

Operation Performed . I Insert , U Update , D Delete.

VERSIONS_STARTSCN

SCN of the first version

VERSIONS_STARTTIME

Timestamp of the first version

VERSIONS_ENDSCN

SCN of the last version

VERSIONS_ENDTIME

Timestamp of the last version

POINTS TO NOTE :
One restriction with using specific timestamps or SCNs is that they must be within the boundaries of the
undo_retention

parameter.

Attempting

to

flashback

to

version

older

than

undo_retention will result in ORA-30052: invalid lower limit snapshot expression.

FLASHBACK TRANSACTION QUERY


SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
Database altered.
SQL> show parameter undo;
NAME

TYPE

VALUE

------------------------------------ ----------- ---------undo_management

string

AUTO

undo_retention

integer

2400

undo_tablespace

string

UNDOTBS1

SQL> select * from tab1;


no rows selected

approximately

query

time-

SQL> select current_scn, to_char(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS') "TIMESTAMP"


CURRENT_SCN

from v$database;

TIMESTAMP

----------- ------------------773162 2014-05-18 00:01:59

SQL> insert into tab1 values(1,'sam','sam@orcl.com');


1 row created.

SQL> insert into tab1 values(2,'rose','rose@orcl.com');


1 row created.

SQL> commit;
Commit complete.

SQL> update tab1 set email='sam@gmail.com' where id=1;


1 row updated.

SQL> update tab1 set email='rose@gmail.com' where id=2;


1 row updated.

SQL> commit;
Commit complete.

SQL> delete from tab1 where id=1;


1 row deleted.

SQL> commit;
Commit complete.

SQL> select current_scn,to_char(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS') from v$database;


CURRENT_SCN
----------773273

TIMESTAMP
------------------2014-05-18 00:05:52

SQL> select versions_starttime stime,versions_endtime endtime,versions_xid xid,


2

case

when versions_operation = 'I' then 'INSERT'

when versions_operation = 'U' then 'UPDATE'

when versions_operation = 'D' then 'DELETE'

end as operation,

id from tab1

versions between timestamp minvalue and maxvalue

order by stime;

STIME

ENDTIME

XID

OPERATION

ID

---------------------- ---------------------- ---------------- ---------- ---------18-MAY-14 12.03.26 AM

18-MAY-14 12.04.50 AM

040018003D010000

INSERT

18-MAY-14 12.03.26 AM

18-MAY-14 12.04.50 AM

040018003D010000

INSERT

0500040035010000

UPDATE

0500040035010000

UPDATE

070016002B010000

DELETE

18-MAY-14 12.04.50 AM
18-MAY-14 12.04.50 AM
18-MAY-14 12.05.24 AM

18-MAY-14 12.05.24 AM

###########################################
#

UNDO_SQL for INSERT OPERATION

###########################################

SQL> select operation, logon_user, undo_sql FROM flashback_transaction_query


WHERE xid = HEXTORAW('040018003D010000');

OPERATION

LOGON UNDO_SQL

---------- ----- -----------------------------------------------------------------------------------------INSERT

SAM

delete from "SAM"."TAB1" where ROWID = 'AAAM/6AAEAAAAGEAAB';

INSERT

SAM

delete from "SAM"."TAB1" where ROWID = 'AAAM/6AAEAAAAGEAAA';

BEGIN

SAM

###########################################
#

UNDO_SQL for UPDATE OPERATION

###########################################

SQL> select operation, logon_user, undo_sql FROM flashback_transaction_query


WHERE xid = HEXTORAW('0500040035010000');

OPERATION

LOGON UNDO_SQL

---------- ----- -----------------------------------------------------------------------------------------UPDATE

SAM

update "SAM"."TAB1" set "EMAIL" = 'rose@orcl.com' where ROWID = 'AAAM/6AAEAAAAGEAAB';

UPDATE

SAM

update "SAM"."TAB1" set "EMAIL" = 'sam@orcl.com'

BEGIN

SAM

where ROWID = 'AAAM/6AAEAAAAGEAAA';

###########################################
#

UNDO_SQL for DELETE OPERATION

###########################################

SQL> select operation, logon_user, undo_sql FROM flashback_transaction_query


WHERE xid = HEXTORAW('070016002B010000');

OPERATION

LOGON UNDO_SQL

---------- ----- -----------------------------------------------------------------------------------------DELETE

SAM

BEGIN

SAM

insert into "SAM"."TAB1"("ID","NAME","EMAIL") values ('1','sam','sam@gmail.com');

POINTS TO NOTE :
---------------Look at the Operation column. The original operation was a
SQL shows Insert operation. This is a simple
we do NOT

delete statement but the UNDO

way to get the UNDO SQL.

need to use LOG Miner to get the UNDO SQL Statement.

SQL> select * from tab1;


ID

NAME

---------- --------2

rose

EMAIL
--------------rose@gmail.com

SQL> delete from "SAM"."TAB1" where ROWID = 'AAAM/6AAEAAAAGEAAA';


0 rows deleted.

SQL> delete from "SAM"."TAB1" where ROWID = 'AAAM/6AAEAAAAGEAAB';


1 row deleted.
SQL> select * from tab1;
no rows selected

SQL> rollback;
Rollback complete.

SQL> select * from tab1;


ID

NAME

----------

EMAIL

---------- ---------------

rose

rose@gmail.com

We can query the FLASHBACK_TRANSACTION_QUERY view for all SCNs between 773162 and 773273
SQL> select operation , logon_user , undo_sql from flashback_transaction_query
where table_owner='SAM' and table_name='TAB1'
AND start_scn between 773162 and 773273;

OPERATION

LOGON UNDO_SQL

---------- ----- -----------------------------------------------------------------------------------------INSERT

SAM

delete from "SAM"."TAB1" where ROWID = 'AAAM/6AAEAAAAGEAAB';

INSERT

SAM

delete from "SAM"."TAB1" where ROWID = 'AAAM/6AAEAAAAGEAAA';

UPDATE

SAM

update "SAM"."TAB1" set "EMAIL" = 'rose@orcl.com' where ROWID = 'AAAM/6AAEAAAAGEAAB';

UPDATE

SAM

update "SAM"."TAB1" set "EMAIL" = 'sam@orcl.com' where ROWID = 'AAAM/6AAEAAAAGEAAA';

DELETE

SAM

insert into "SAM"."TAB1"("ID","NAME","EMAIL") values ('1','sam','sam@gmail.com');

FLASHBACK TABLE

DDL operations change the structure of a table , we

cannot subsequently use the TO SCN or TO TIMESTAMP clause

to flash the table back to a time.

###########################################
## Restrictions on Flashing Back Tables

##

###########################################

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP from v$database;


CURRENT_SCN
-----------

TIMESTAMP
------------------

854882 20-MAY-14 11:58:54

SQL> select * from tab1;


ID NAME

EMAIL

---------- --------------- --------------1 sam

sam@gmail.com

2 rose

rose@gmail.com

## DDL operations change the structure of a table ##


####################################################

SQL> alter table tab1 drop column email;


Table altered.

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') TIMESTAMP

from v$database;

CURRENT_SCN TO_CHAR(SYSTIMESTA
----------- -----------------854902 20-MAY-14 11:59:33

SQL> flashback table tab1 to scn 854882;


flashback table tab1 to scn 854882
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed

#########################################
## ADDING CONSTRAINT AN EXISTING TABLE ##
#########################################

SQL> desc tab1;


Name

Null?

Type

----------------------------------------- -------- ---------------------------ID

NUMBER

NAME

VARCHAR2(15)

SQL> SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'DD-MON-YY HH24:MI:SS') from v$database;


CURRENT_SCN TO_CHAR(SYSTIMESTA
----------- -----------------855682 20-MAY-14 12:30:15

SQL> alter table tab1 add constraint pkid primary key(id);


Table altered.

SQL> flashback table tab1 to scn 855682;


flashback table tab1 to scn 855682
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed

CANNOT USE FLASHBACK TABLE ON SYS OBJECTS


SQL> select current_scn,to_char(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS') from v$database;
CURRENT_SCN TIMESTAMP
----------- ------------------857638 2014-05-20 13:48:03

SQL> insert into tab2 values(1);


1 row created.
SQL> insert into tab2 values(2);
1 row created.
SQL> commit;
Commit complete.

SQL> select current_scn, to_char(SYSTIMESTAMP,'YYYY-MM-DD HH24:MI:SS') from v$database;


CURRENT_SCN TIMESTAMP
----------- ------------------857657 2014-05-20 13:48:55
SQL> flashback table tab2 to scn 857638;
flashback table tab2 to scn 857638
*
ERROR at line 1:
ORA-08185: Flashback not supported for user SYS

Das könnte Ihnen auch gefallen