Oracle Flashback ÉÁ»Ø¨DÉÁ»Ø²éѯ£¨1£©

2014-11-24 08:58:37 ¡¤ ×÷Õß: ¡¤ ä¯ÀÀ: 1
author:ÈóÃ÷2012-2-3 QQ:226399587 http://blog.csdn.net/runming918
FlashbackÊÇORACLE×Ô9i¾Í¿ªÊ¼ÌṩµÄÒ»ÏîÌØÐÔ£¬ÔÚ9iÖÐÀûÓÃoracle²éѯ¶à°æ±¾Ò»ÖµÄÌØµã£¬ÊµÏִӻعö¶ÎÖжÁÈ¡±íÒ»¶¨Ê±¼äÄÚ²Ù×÷¹ýµÄÊý¾Ý£¬¿ÉÓÃÀ´½øÐÐÊý¾Ý±È¶Ô£¬»òÕßÐÞÕýÒâÍâÌá½»Ôì³ÉµÄ´íÎóÊý¾Ý£¬¸ÃÏîÌØÐÔÒ²±»³ÆÎªFlashback Query¡£ÔÚ10gÖÐFlashbackÓֵõ½ÁËÏ൱´óµÄÔöÇ¿£¬ÀûÓûØÊÕÕ¾ºÍÉÁ»ØÇøµÄÌØÐÔʵÏÖ¿ìËÙ»Ö¸´É¾³ý±í(Flashback Table)»ò×ö Êý¾Ý¿âʱ¼äµã»Ö¸´(Flashback Database)µÄ¹¦ÄÜ¡£
Ò»¡¢Flashback Query
Flashback QueryÊÇÀûÓÃ¶à°æ±¾¶ÁÒ»ÖÂÐÔµÄÌØÐÔ´ÓUNDO±í¿Õ¼ä¶ÁÈ¡²Ù×÷ǰµÄ¼Ç¼Êý¾Ý£¡
ʲôÊÇ¶à°æ±¾¶ÁÒ»ÖÂÐÔ
Oracle²ÉÓÃÁËÒ»Öַdz£ÓÅÐãµÄÉè¼Æ£¬Í¨¹ýundoÊý¾ÝÀ´È·±£Ð´²»¶ÂÈû¶Á£¬¼òµ¥µÄ½²£¬²»Í¬µÄÊÂÎñÔÚдÊý¾Ýʱ£¬»á½«Êý¾ÝµÄǰӳÏñдÈëundo±í¿Õ¼ä£¬ÕâÑùÈç¹ûͬʱÓÐÆäËüÊÂÎñ²éѯ¸Ã±íÊý¾Ý£¬Ôò¿ÉÒÔͨ¹ýundo±í¿Õ¼äÖÐÊý¾ÝµÄǰӳÏñÀ´¹¹ÔìËùÐèµÄÍêÕû¼Ç¼¼¯£¬¶ø²»ÐèÒªµÈ´ýдÈëµÄÊÂÎñÌá½»»ò»Ø¹ö¡£
flashback queryÓжàÖÖ·½Ê½¹¹½¨²éѯ¼Ç¼¼¯(×¢Ò⣬ҪʹÓÃflashbackµÄÌØÐÔ£¬±ØÐëÆôÓÃ×Ô¶¯³·Ïú¹ÜÀí±í¿Õ¼ä) ¼Ç¼¼¯µÄÑ¡Ôñ·¶Î§¿ÉÒÔ»ùÓÚʱ¼ä»ò»ùÓÚscn£¬ÉõÖÁ¿ÉÒÔͬʱ²éѯ³ö¼Ç¼ÔÚundo±í¿Õ¼äÖв»Í¬ÊÂÎñʱµÄǰӳÏó¡£Ó÷¨Óë±ê×¼²éѯ·Ç³£ÀàËÆ£¬ÒªÍ¨¹ýflashback query²éѯundoÖеij·ÏúÊý¾Ý£¬×î¼òµ¥µÄ·½Ê½Ö»ÐèÒªÔÚ±ê×¼²éѯÓï¾äµÄ±íÃûºóÃæ¸úÉÏas of timestamp(»ùÓÚʱ¼ä)»òas of scn(»ùÓÚscn)¼´¿É¡£
1¡¢As of timestampµÄʾÀý£º
ÏÈ´´½¨Ò»¸öºÜ¼òµ¥µÄ±í²¢²åÈëһЩ¼Ç¼ÓÃÓÚ²âÊÔ£º
SQL> create table t_fb_test(v_id,va) as
2 select 1,'a' from dual
3 union
4 select 2,'b' from dual
5 union
6 select 3,'c' from dual
7 union
8 select 4,'d' from dual
9 union
10 select 5,'e' from dual
11 union
12 select 6,'f' from dual;
Table created
SQL> select * from t_fb_test;

V_ID VA
---------- --
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected

ɾ³ý¼¸Ìõ¼Ç¼²¢Ìá½»£º
SQL> delete from t_fb_test where v_id < 4;
SQL> commit;
ÏÖÔÚÏÂÃæÎÒÃÇ¿ªÊ¼»Ö¸´²éѯ£º
SQL> select * from t_fb_test as of timestamp sysdate-5/1440;

V_ID VA
---------- --
1 a
2 b
3 c
4 d
5 e
6 f

6 rows selected
¹þ¹þ£¬Êý¾ÝÓÖ±»ÎÒÃÇÕÒ»ØÀ´ÁË£¨Èç¹û±¨´í£ºORA-01466:ÎÞ·¨¶ÁÈ¡Êý¾Ý ¨C ±í¶¨ÒåÒѾ­¸ü¸Ä¡ªÕâ˵Ã÷Äã¼ä¸ôʱ¼ä¹À¼Æ´íÎóÀ²£¬²Ù×÷¹ý¿ì5·ÖÖÓ֮ǰÄ㻹ûÓн¨Õâ±íÀ­¡££©
ÎÒÃÇͨ¹ýÔö¼Óas of timestampµÄÓï·¨£¬¾Í¿ÉÒÔµ½undo±í¿Õ¼äÖвéÕÒµ½5·ÖÖÓ֮ǰµÄ¼Ç¼ǰ¾µÏñ£¬Ê¹ÓÃËüÎÒÃǾͿÉÒÔºÜÇáÒ׵IJ¢ÇÒѸËٵĽ«¼Ç¼»Ö¸´£º
SQL> insert into t_fb_test
2 select * from t_fb_test as of timestamp sysdate-3/1440 where v_id < 4;

3 rows inserted

SQL> commit;
as of timestampµÄÈ··Ç³£Ò×Ó㬵«ÊÇÔÚijЩÇé¿öÏ£¬ÎÒÃǽ¨ÒéʹÓÃas of scnµÄ·½Ê½Ö´ÐÐflashback query£¬±ÈÈçÐèÒª¶Ô¶à¸öÏ໥ÓÐÖ÷Íâ¼üÔ¼ÊøµÄ±í½øÐлָ´Ê±£¬Èç¹ûʹÓÃas of timestampµÄ·½Ê½£¬¿ÉÄÜ»áÓÉÓÚʱ¼äµã²»Í³Ò»µÄÔµ¹ÊÔì³ÉÊý¾ÝÑ¡Ôñ»ò²åÈëʧ°Ü£¬Í¨¹ýscn·½Ê½ÔòÄܹ»È·±£¼Ç¼µÄÔ¼ÊøÒ»ÖÂÐÔ¡£
2¡¢ÉÁ»Ø²éѯ֮As of scn£º
ÎÒÃÇͨ¹ýdbms_flashback.get_system_change_numberº¯ÊýÀ´»ñÈ¡oracleµ±Ç°µÄscn£¬Ö®ºóÔÙÖ´ÐÐÊý¾ÝµÄÐ޸IJÙ×÷¡£
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
14229608
ɾ³ýÊý¾Ý£º
SQL> delete from t_fb_test where v_id > 4;
2 rows deleted
SQL> commit;
ÉÁ»Ø²éѯ£º
SQL> select * from t_fb_test as of scn 14229608;

V_ID VA
---------- --
1 a
2 b
3 c
4 d
5 e
6 f
6 rows selected

È»ºóÎÒÃÇ¿ÉÒÔÓÃinsertÓï¾ä½èÖúas of scn²éѯ½á¹û½«Êý¾Ý»Ö¸´»ØÀ´¡£
ÊÂʵÉÏ£¬OracleÔÚÄÚ²¿¶¼ÊÇʹÓÃscn£¬¼´Ê¹ÄãÖ¸¶¨µÄÊÇas of timestamp£¬oracleÒ²»á½«Æäת»»³Éscn£¬ÏµÍ³Ê±¼ä±ê¼ÇÓëscnÖ®¼ä´æÔÚÒ»ÕÅ±í£¬¼´SYSϵÄSMON_SCN_TIME
ÿ¸ô5·ÖÖÓ£¬ÏµÍ³²úÉúÒ»´Îϵͳʱ¼ä±ê¼ÇÓëscnµÄÆ¥Åä²¢´æÈësys.smon_scn_time±í£¬¸Ã±íÖмǼÁË×î½ü1440¸öϵͳʱ¼ä±ê¼ÇÓëscnµÄÆ¥Åä¼Ç¼£¬ÓÉÓڸñíֻά»¤ÁË×î½üµÄ1440Ìõ¼Ç¼£¬Òò´ËÈç¹ûʹÓÃas of timestampµÄ·½Ê½ÔòÖ»ÄÜflashback×î½ü5ÌìÄÚµÄÊý¾Ý£¨¼ÙÉèϵͳÊÇÔÚ³ÖÐø²»¶ÏÔËÐв¢ÎÞÖжϻò¹Ø»úÖØÆôÖ®Àà²Ù×÷µÄ»°£©¡£×¢ÒâÀí½âϵͳʱ¼ä±ê¼ÇÓëscnµÄÿ5·ÖÖÓÆ¥ÅäÒ»´ÎÕâ¾ä»°£¬¾Ù¸öÀý×Ó£¬±ÈÈçscn:339988,339989·Ö±ðÆ¥Åä08-05-30 13:52:00ºÍ2008-13:57:00£¬Ôòµ±Äãͨ¹ýas of timestamp²éѯ08-05-30 13:52:00»ò08-05-30 13:56:59Õâ¶Îʱ¼äµãÄÚµÄʱ¼äʱ£¬oracle¶¼»á½«ÆäÆ¥ÅäΪscn:339988µ½undo±í¿Õ¼äÖвéÕÒ£¬Ò²¾Í˵ÔÚÕâ¸öʱ¼äÄÚ£¬²»¹ÜÄãÖ¸¶¨µÄʱ¼äµãÊÇʲô£¬²éѯ·µ»ØµÄ¶¼½«ÊÇ08-05-30 13:52:00Õâ¸öʱ¿ÌµÄÊý¾Ý¡£
µ±È»£¬¾ßÌåµÄÇé¿ö£¬ÎÒÏëÄãÇ××ÔÖ´ÐÐÒ»ÏÂselect scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time£¬»áÀí½âµÄ¸üÉî¿ÌһЩ¡£
¹ØÓÚÎÒSCNÓëtimestamp/dateʱ¼äÖ®¼äµÄת»»£¬ÒÔ¼°SCNʵÏÖ»úÖÆÔ­Àí¿ÉÒÔ¿´ÎÒÁíһƪ²©ÎÄ¡¶Oracle SCN ʵÏÖ»úÖÆ×Ü½á ¡·ÓÐÏêϸ½éÉÜ£ºhttp://www.2cto.com/database/201202/118597. html