亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

ORACLE中查找定位表最后DML操作的時間小結

2020-07-26 13:59:31
字體:
來源:轉載
供稿:網友

在Oracle數據庫中,如何查找,定位一張表最后一次的DML操作的時間呢? 方式有三種,不過都有一些局限性,下面簡單的解析、總結一下。

1:使用ORA_ROWSCN偽列獲取表最后的DML時間

   ORA_ROWSCN偽列是Oracle 10g開始引入的,可以查詢表中記錄最后變更的SCN。然后通過SCN_TO_TIMESTAMP函數可以將SCN轉換為時間戳,從而找到最后DML操作時SCN的對應時間。但是,默認情況下,每行記錄的ORA_ROWSCN是基于Block的,除非在建表的時候開啟行級跟蹤。

SELECT MAX(ORA_ROWSCN), SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN)) FROM xxx.xxx;

如下所示,我們可以創建一個表TEST,然后查一查TEST表最后的DML的操作時間。如下所示:

SQL> CREATE TABLE TEST.TEST ( ID NUMBER); Table created. SQL> COL OWNER FOR A12;SQL> COL TABLE_NAME FOR A32;SQL> COL MONITORING FOR A32;SQL> SELECT OWNER, TABLE_NAME, MONITORING  2 FROM DBA_TABLES  3 WHERE OWNER='TEST'  4 AND TABLE_NAME='TEST';OWNER  TABLE_NAME      MONITORING------------ -------------------------------- --------------------------------TEST   TEST        YESSQL> INSERT INTO TEST.TEST VALUES(1);1 row created.SQL> COMMIT;Commit complete.SQL> SELECT sysdate FROM DUAL;SYSDATE-------------------2018-11-19 14:34:12SQL> SELECT MAX(ORA_ROWSCN), SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN)) FROM TEST.TEST;MAX(ORA_ROWSCN) SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN))--------------- --------------------------------------------------------------  52782810 19-NOV-18 02.34.03.000000000 PMSQL>

使用ORA_ROWSCN偽列獲取表最新的DML時間,也有一些不足和缺陷,具體如下所示:

1:使用SCN_TO_TIMESTAMP(MAX(ORA_ROWSCN))獲取表最后的DML操作時,有可能會遇到ORA-08181錯誤。

 $ oerr ora 8181
08181, 00000, "specified number is not a valid system change number"
// *Cause: supplied scn was beyond the bounds of a valid scn.
// *Action: use a valid scn.

SCN和時間戳的這種轉換要依賴于數據庫內部的數據記錄,而這些數據記錄就來自SMON_SCN_TIME基表,具體來說,SMON_SCN_TIME基表用于記錄過去時間段中SCN(system change number)與具體的時間戳(timestamp)之間的映射關系,因為是采樣記錄這種映射關系,所以SMON_SCN_TIME可以較為粗糙地(不精確地)定位某個SCN的時間信息。實際的SMON_SCN_TIME是一張簇表。而且從10g開始SMON也會定期清理SMON_SCN_TIME中的記錄,所以對于比較久遠的SCN則不能轉換。也就出現了數據庫某些表使用SCN_TO_TIMESTAMP函數時,會遇到ORA-08181錯誤,如下所示,我們用比基表SMON_SCN_TIME中MIN(SCN)的還小1的SCN做轉換時,就會遇到ORA-08181這個錯誤。

根據官方文檔來看: SMON進程每5分鐘采集一次插入到SMON_SCN_TIME表中,同時也刪除一些歷史數據(超過5天前數據)

This is expected behavior as the SCN must be no older than 5 days as part of the current flashback database
features.
 
Currently, the flashback query feature keeps track of times up to a
maximum of 5 days. This period reflects server uptime, not wall-clock
time. You must record the SCN yourself at the time of interest, such as
before doing a DELETE.

2: 使用ORA_ROWSCN偽列獲取表中某一行的DML操作時間可能不準確,當然對于獲取表最后的DML時間是準確的。

    默認情況下,每行記錄的ORA_ROWSCN是基于數據塊(block)的,這樣對于某一行最后的DML時間是不準確的,除非在建表的時候執行開啟行級跟蹤(create table … rowdependencies),這樣才會是在行級記錄級別的SCN。而每個數據塊(block)在頭部是記錄了該數據塊(block)最近事務的SCN,所以默認情況下,只需要從塊的頭部直接獲取這個值就可以了,不需要其他任何的開銷。但是這明顯是不精確的,一個數據塊(block)中會有很多行記錄,每次事務不可能影響到整個數據塊(block)中所有的行,所以這是一個非常不精準的估算值,同一個數據塊(block)的所有記錄的ORA_ROWSCN都會是相同的.如下實驗所示, 當然對于獲取表最后的DML時間是準確的。所以對于每一行的ORA_ROWSCN要求精確的話,就必須開啟行級跟蹤。

 SQL> SELECT * FROM TEST.TEST;  ID----------   1SQL> SELECT ID, SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM TEST.TEST;  ID SCN_TO_TIMESTAMP(ORA_ROWSCN)---------- -------------------------------------------------------------------   1 19-NOV-18 02.34.03.000000000 PMSQL> INSERT INTO TEST.TEST VALUES(2);1 row created.SQL> COMMIT;Commit complete.SQL> INSERT INTO TEST.TEST VALUES(3);1 row created.SQL> COMMIT;Commit complete.SQL> SELECT ID, SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM TEST.TEST;  ID SCN_TO_TIMESTAMP(ORA_ROWSCN)---------- ---------------------------------------------------------------   1 19-NOV-18 03.41.01.000000000 PM   2 19-NOV-18 03.41.01.000000000 PM   3 19-NOV-18 03.41.01.000000000 PM

3:假如表的數據被TRUNCATE掉或全部DELETE后,也會導致無法定位最后一次DML操作的時間。如下所示:

2:使用DBA_TAB_MODIFICATIONS來查找、定為最后的DML操作時間

DBA_TAB_MODIFICATIONS describes modifications to all tables in the database that have been modified since the last time statistics were gathered on the tables

This view is populated only for tables with the MONITORING attribute. It is intended for statistics collection over a long period of time. For performance reasons, the Oracle Database does not populate this view immediately when the actual modifications occur. Run the FLUSH_DATABASE_MONITORING_INFO procedure in the DIMS_STATS PL/SQL package to populate this view with the latest information. The ANALYZE_ANY system privilege is required to run this procedure.

使用DBA_TAB_MODIFICATIONS來查看表最后DML的操作時間,如下測試所示

SQL> CREATE TABLE TEST.TEST (ID NUMBER);Table created.SQL> COL OWNER FOR A12;SQL> COL TABLE_NAME FOR A32;SQL> COL MONITORING FOR A32;SQL> SELECT OWNER, TABLE_NAME, MONITORING  2 FROM DBA_TABLES  3 WHERE OWNER='TEST'  4 AND TABLE_NAME='TEST';OWNER  TABLE_NAME      MONITORING------------ -------------------------------- --------------------------------TEST   TEST        YESSQL> INSERT INTO TEST.TEST VALUES(1);1 row created.SQL> COMMIT;Commit complete.SQL> ALTER SESSION SET NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS";Session altered.SQL> SELECT INSERTS,UPDATES,DELETES,TRUNCATED,TIMESTAMP  2 FROM DBA_TAB_MODIFICATIONS  3 WHERE TABLE_NAME='TEST' AND TABLE_OWNER='TEST';no rows selectedSQL> EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;PL/SQL procedure successfully completed.SQL> SELECT INSERTS,UPDATES,DELETES,TRUNCATED,TIMESTAMP  2 FROM DBA_TAB_MODIFICATIONS  3 WHERE TABLE_NAME='TEST' AND TABLE_OWNER='TEST'; INSERTS UPDATES DELETES TRU TIMESTAMP---------- ---------- ---------- --- -------------------   1   0   0 NO 2018-11-20 10:34:24

但是用DBA_TAB_MODIFICATIONS來定位表最后的DML操作時間也有一定的局限性。如下所示,有些局限性會影響定位最后DML操作的時間的準確性。

1:如果表沒有設置MONITORING屬性,那么DBA_TAB_MODIFICATIONS視圖是不會收集相關表的數據的呢。 假如某張表之前沒有設置MONITORING屬性,那么無法查找最后一次DML操作的時間,設置MONITORING屬性后,DBA_TAB_MODIFICATIONS視圖里面收集的是這個設置時間點后面的DML操作時間。

2:需要執行EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO后,視圖才會有數據。

3:DML操作不提交或回滾,也會記錄到視圖中。這樣就會導致數據不準確。

未提交情況:

回滾情況:

3:收集完統計信息(ANALYZE或dbms_stats包收集統計信息)后,視圖中相關表記錄會置空

SQL> SELECT INSERTS,UPDATES,DELETES,TRUNCATED,TIMESTAMP  2 FROM DBA_TAB_MODIFICATIONS  3 WHERE TABLE_NAME='TEST' AND TABLE_OWNER='TEST'; INSERTS UPDATES DELETES TRU TIMESTAMP---------- ---------- ---------- --- -------------------   6   0   4 YES 2018-11-20 13:14:08SQL> exec dbms_stats.gather_table_stats('TEST','TEST');PL/SQL procedure successfully completed.SQL> SELECT INSERTS,UPDATES,DELETES,TRUNCATED,TIMESTAMP  2 FROM DBA_TAB_MODIFICATIONS  3 WHERE TABLE_NAME='TEST' AND TABLE_OWNER='TEST';no rows selectedSQL>

4:CTAS建立的插入信息不會記錄。如下測試所示:

SQL> CREATE TABLE TEST.TEST1 2 AS 3 SELECT * FROM TEST.TEST;Table created.SQL> exec dbms_stats.flush_database_monitoring_info;PL/SQL procedure successfully completed.SQL> SELECT INSERTS,UPDATES,DELETES,TRUNCATED,TIMESTAMP  2 FROM DBA_TAB_MODIFICATIONS  3 WHERE TABLE_NAME='TEST1' AND TABLE_OWNER='TEST';no rows selected

5:DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO收集數據會有幾秒的延時,這個時間只能接近最后DML時間,而不是精準的。

SQL> COL OWNER FOR A12;SQL> COL TABLE_NAME FOR A32;SQL> COL MONITORING FOR A32;SQL> SELECT OWNER, TABLE_NAME, MONITORING  2 FROM DBA_TABLES  3 WHERE OWNER='TEST'  4 AND TABLE_NAME='TEST1';OWNER  TABLE_NAME      MONITORING------------ -------------------------------- --------------------------------TEST   TEST1       YESSQL> SQL> SELECT SYSDATE FROM DUAL;SYSDATE-------------------2018-11-20 10:46:39SQL> INSERT INTO TEST.TEST VALUES(10);1 row created.SQL> SELECT SYSDATE FROM DUAL;SYSDATE-------------------2018-11-20 10:46:57SQL> COMMIT;Commit complete.SQL> SELECT SYSDATE FROM DUAL;SYSDATE-------------------2018-11-20 10:47:07SQL> exec dbms_stats.flush_database_monitoring_info;PL/SQL procedure successfully completed.SQL> SELECT INSERTS,UPDATES,DELETES,TRUNCATED,TIMESTAMP  2 FROM DBA_TAB_MODIFICATIONS  3 WHERE TABLE_NAME='TEST' AND TABLE_OWNER='TEST'; INSERTS UPDATES DELETES TRU TIMESTAMP---------- ---------- ---------- --- -------------------   3   0   0 NO 2018-11-20 10:47:13

3:觸發器捕獲最后DML操作時間

使用觸發器捕獲DML操作的最后時間是最準確的,但是也是性能開銷最大的,不推薦使用。

總結

以上所述是小編給大家介紹的ORACLE中查找定位表最后DML操作的時間小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费中文字幕| 国产欧美一区二区三区在线| 日韩中文字幕在线播放| 亚洲国产精品99久久| 91在线中文字幕| 久久久久久综合网天天| 欧美激情一区二区三区久久久| 日韩不卡在线观看| 亚洲男女性事视频| 久久综合亚洲社区| 国产精品18久久久久久麻辣| 亚洲性猛交xxxxwww| 精品久久中文字幕| 国产精品色婷婷视频| 成人黄色中文字幕| 欧美午夜精品伦理| 91亚洲va在线va天堂va国| 搡老女人一区二区三区视频tv| 91在线观看免费高清完整版在线观看| 欧美在线视频免费播放| 国产91精品久| 亚洲自拍偷拍区| 日韩在线播放视频| 国产精品丝袜久久久久久高清| 欧美成人精品在线视频| 亚洲精品电影在线观看| 日韩av电影手机在线观看| 69av在线视频| 97国产精品视频| 亚洲男人天堂2024| 久久久天堂国产精品女人| 中文字幕国产精品久久| 色视频www在线播放国产成人| 久久九九精品99国产精品| 国产成人午夜视频网址| 色与欲影视天天看综合网| 91精品国产自产在线| 国产亚洲精品久久久久久牛牛| 亚洲国产精品高清久久久| 国产一区二区久久精品| 国产精品视频yy9099| 国产精品中文字幕久久久| 亚洲aaa激情| 黄色一区二区在线| 美女福利精品视频| 国产a∨精品一区二区三区不卡| 日韩美女写真福利在线观看| 国产日韩欧美影视| 国产在线a不卡| 国产一区二区日韩精品欧美精品| www国产亚洲精品久久网站| 日本不卡高字幕在线2019| 国产精品成人一区| 亚洲三级黄色在线观看| 亚洲欧美国产va在线影院| 亚洲成人免费网站| 日韩女优人人人人射在线视频| 欧美在线视频一区二区| 亚洲午夜未满十八勿入免费观看全集| 久久久99久久精品女同性| 国产一区二区三区在线观看视频| 日韩经典中文字幕| 久久国产精品久久久久久久久久| 精品国产一区二区三区久久久| 超碰97人人做人人爱少妇| 欧美精品生活片| 欧美精品日韩www.p站| 大量国产精品视频| 91精品啪在线观看麻豆免费| 国产www精品| 欧美日韩中文字幕在线视频| 97人洗澡人人免费公开视频碰碰碰| 欧美黑人又粗大| 精品国产精品三级精品av网址| 色综合男人天堂| 国产精品最新在线观看| 亚洲精品美女久久| 亚洲成人性视频| 黄色成人av网| 久久精品91久久香蕉加勒比| 92看片淫黄大片看国产片| 日韩高清有码在线| 自拍偷拍免费精品| 91视频88av| yellow中文字幕久久| 国产美女久久精品香蕉69| 欧美电影在线观看| 国产精品高潮在线| 亚洲国产精品久久久久| 精品视频久久久| 成人精品网站在线观看| 欧美成人免费小视频| 日韩美女视频中文字幕| 亚洲欧美成人网| 国产精品91视频| 97视频在线观看视频免费视频| 日韩欧美精品网址| xx视频.9999.com| 成人伊人精品色xxxx视频| 国产欧美在线视频| 成人免费看吃奶视频网站| 日韩大片在线观看视频| 国产精品久久久久99| 色妞久久福利网| 欧美人与性动交| 欧美电影院免费观看| 精品国产欧美成人夜夜嗨| 日韩在线中文字幕| 深夜福利亚洲导航| 在线丨暗呦小u女国产精品| 精品免费在线视频| 欧美激情第一页xxx| 成人黄色av免费在线观看| 亚洲国产毛片完整版| 日韩av网站导航| 精品美女久久久久久免费| 日韩高清免费观看| 久久综合色88| 日韩精品福利在线| 亚洲精品一区中文字幕乱码| 国产精品久久久久久久久久久久久久| 国产精品影院在线观看| 亚洲色图在线观看| 成人中文字幕在线观看| 欧美精品电影免费在线观看| 日韩中文字幕在线视频| 亚洲综合成人婷婷小说| 久久久久久久久久久91| 国产精品国产三级国产专播精品人| 日韩中文字幕免费看| 久久久久久久久久国产精品| 久久久久久久久久婷婷| 日本亚洲欧美成人| 久久久亚洲天堂| 日韩视频亚洲视频| 国产日韩视频在线观看| 97在线精品视频| 在线观看精品国产视频| 久久综合电影一区| 久久国内精品一国内精品| 久久久精品久久久| 91精品视频免费| 欧美精品第一页在线播放| 久久免费成人精品视频| 国产亚洲欧美日韩一区二区| 久久久久久九九九| 亚洲a在线观看| 成人精品aaaa网站| 国产精品香蕉在线观看| 狠狠久久五月精品中文字幕| 韩国v欧美v日本v亚洲| 国产精品主播视频| 亚洲www永久成人夜色| 欧美午夜精品久久久久久人妖| 色偷偷88888欧美精品久久久| 亚洲区bt下载| 国产精品久久久久久久av大片| 亚洲国产精品va在线看黑人动漫| 亚洲综合精品伊人久久| 久久久久久亚洲| 视频在线观看一区二区| 国产97在线视频| 欧美一区二区色| 亚洲成人av资源网|