透過閃回事務檢視資料dml的情況
如果透過閃回事務來得到對應的undo_sql,可能多個dml語句對應一個事務,所以我們需要得到的是一個完整的事務的資訊,裡面包括對應的Undo_sql,這樣才算得到比較完整的sql語句。
我在本地自己做了一個測試。
建立一個test表,然後插入一些記錄,然後嘗試修改一些資料。
SQL> DROP TABLE TEST;
Table dropped.
SQL> create table test (id number,name varchar2(29));
Table created.
SQL> insert into test values(1,'trx1');
1 row created.
SQL> insert into test values(2,'trx1');
1 row created.
SQL> commit;
Commit complete.
SQL> insert into test values(3,'trx2');
1 row created.
SQL> commit;
Commit complete.
SQL> update test set id=4,name='trx3' where name='trx1';
2 rows updated.
SQL> commit;
Commit complete.
SQL> set linesize 200
SQL> col VENDTIME format a22
SQL> col V_STARTTIME format a22
SQL> select versions_starttime v_starttime,versions_startscn v_startscn,versions_xid xid,versions_endtime vendtime,versions_endscn vendscn,versions_operation oper,id,name from test versions between scn minvalue and maxvalue;
V_STARTTIME V_STARTSCN XID VENDTIME VENDSCN O ID NAME
---------------------- ---------- ---------------- ---------------------- ---------- - ---------- -----------------------------
19-AUG-14 05.30.14 AM 7233099 0A000F0070040000 U 4 trx3
19-AUG-14 05.30.14 AM 7233099 0A000F0070040000 U 4 trx3
19-AUG-14 05.29.44 AM 7233087 08001B00FD060000 I 3 trx2
19-AUG-14 05.29.38 AM 7233084 0700100091040000 19-AUG-14 05.30.14 AM 7233099 I 2 trx1
19-AUG-14 05.29.38 AM 7233084 0700100091040000 19-AUG-14 05.30.14 AM 7233099 I 1 trx1
得到了如上的資訊之後,就開始使用閃回事務來查詢,結果沒有任何返回。
SQL> select operation,undo_sql from flashback_transaction_query where table_name='TEST' and table_owner='N1';
no rows selected
檢視Undo的空間情況,undo還很充足。
Current Instance
~~~~~~~~~~~~~~~~
DB Id DB Name Inst Num Instance
----------- ------------ -------- ------------
3645037571 TEST01 1 TEST01
Tablespace STA M A Init Total MB Free MB Used MB LrgstMB MaxExt %Fr A
------------ --- - - ---- ------------ ---------- ----------- -------- ------------ --- -
POOL_DATA OLN L S 64K 960 765 195 98 2147483645 80
SYSAUX OLN L S 64K 325 96 229 91 2147483645 30
SYSTEM OLN L S 64K 325 51 274 50 2147483645 16 *
TEMPTS1 OLN L U 1M 400 400 0 286 100
TEST_DATA1 OLN L S 64K 3 2 1 2 2147483645 67
UNDOTBS OLN L S 64K 935 903 32 672 2147483645 97
------------ ---------- -----------
sum 2,948 2,217 731
使用閃回事務需要賦予一定的許可權,賦一下許可權。
使用dba連線,賦予許可權
SQL> conn / as sysdba
Connected.
SQL> grant execute on dbms_flashback to n1;
Grant succeeded.
SQL> grant select any transaction to n1;
Grant succeeded.
再次查詢驗證,還是沒有資料。
SQL> select operation,undo_sql from flashback_transaction_query where table_name='TEST' and table_owner='N1';
no rows selected
直接用sys看看,倒底是怎麼回事,能看到Operation 顯示為“unknown"而且對應的table_owner也是空。
conn / as sysdba
SQL> col undo_sql format a30
SQL> select table_owner,operation,undo_sql from flashback_transaction_query where table_name='TEST'
2 /
TABLE_OWNER OPERATION UNDO_SQL
-------------------------------- -------------------------------- ------------------------------
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
原來,需要使用alter database命令,啟用對DML更改引用的列值和主鍵值的日誌記錄。
SQL> alter database add supplemental log data;
Database altered.
SQL> conn n1/n1
Connected.
啟用之後,不會立即生效,我們來清空資料,重新插入一些資料。
SQL> select table_owner,operation,undo_sql from flashback_transaction_query where table_name='TEST'
2 /
TABLE_OWNER OPERATION UNDO_SQL
-------------------------------- -------------------------------- ------------------------------
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
SQL> truncate table test;
Table truncated.
SQL> insert into test values(1,'trx1');
1 row created.
SQL> insert into test values(2,'trx1');
1 row created.
SQL> commit;
Commit complete.
再次查詢就能夠成功顯示了。
SQL> col undo_sql format a80
SQL> select table_owner,operation,undo_sql from flashback_transaction_query where table_name='TEST';
TABLE_OWNER OPERATION UNDO_SQL
-------------------------------- -------------------------------- --------------------------------------------------------------------------------
N1 INSERT delete from "N1"."TEST" where ROWID = 'AAAEmOAAJAAABRjAAB';
N1 INSERT delete from "N1"."TEST" where ROWID = 'AAAEmOAAJAAABRjAAA';
UNKNOWN
UNKNOWN
UNKNOWN
UNKNOWN
解決了這個問題,就可以使用閃回事務表來檢視undo_sql了,我們根據start_timestamp來排列,得到最新的資料變化情況。
先使用閃回查詢來看看。
SQL> select versions_starttime v_starttime,versions_startscn v_startscn,versions_xid xid,versions_endtime vendtime,versions_endscn vendscn,versions_operation oper,id,name from test versions between scn minvalue and maxvalue;
V_STARTTIME V_STARTSCN XID VENDTIME VENDSCN O ID NAME
---------------------- ---------- ---------------- ---------------------- ---------- - ---------- -----------------------------
19-AUG-14 05.36.08 AM 7247547 05001A00C2050000 I 2 trx1
19-AUG-14 05.36.08 AM 7247547 05001A00C2050000 I 1 trx1
然後透過閃回事務來關聯。
SQL> select table_owner,START_TIMESTAMP,operation,undo_sql from flashback_transaction_query where table_name='TEST' and table_owner='N1' and xid=hextoraw('05001A00C2050000');
TABLE_OWNER START_TIM OPERATION UNDO_SQL
-------------------------------- --------- -------------------------------- --------------------------------------------------------------------------------
N1 19-AUG-14 INSERT delete from "N1"."TEST" where ROWID = 'AAAEmOAAJAAABRjAAB';
N1 19-AUG-14 INSERT delete from "N1"."TEST" where ROWID = 'AAAEmOAAJAAABRjAAA';
在做undo之前,檢視錶裡現有的資料作比對。
SQL> select *from test;
ID NAME
---------- -----------------------------
1 trx1
2 trx1
SQL> delete from "N1"."TEST" where ROWID = 'AAAEmOAAJAAABRjAAB';
1 row deleted.
SQL> delete from "N1"."TEST" where ROWID = 'AAAEmOAAJAAABRjAAA';
1 row deleted.
SQL> select *from test;
no rows selected
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347055/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視SQLServer的LCK資源等待情況SQLServer
- Linux 檢視程式情況Linux
- ubuntu檢視硬碟掛載情況Ubuntu硬碟
- 檢視錶和索引碎片情況相關資訊索引
- Android下檢視SO庫被依賴的情況Android
- 檢視temp表空間的消耗明細情況
- Oracle 檢視可以DML操作的條件Oracle
- OceanBase學習之路41|如何檢視資源池的分佈情況?
- 透過v$wait_chains檢視診斷資料庫hang和ContentionAI資料庫
- 2.8.3 資料庫服務的資料字典檢視資料庫
- jstat命令檢視jvm的GC情況 (以Linux為例)JSJVMGCLinux
- linux系統檢視網路連線情況Linux
- 如何快速檢視Linux系統重啟情況Linux
- [20231011]查詢sys.optstat_snapshot$瞭解表的DML情況.txt
- fiddler 抓手機包出現這種情況為什麼檢視不了請求資料
- check_postgres指令碼集檢查資料庫健康情況指令碼資料庫
- Linux透過什麼命令可以檢視報文的詳細資訊?Linux
- 如何檢視MySQL資料庫一段時間內的連線情況?兩種方式來解鎖~MySql資料庫
- NAND快閃記憶體供過於求的情況今年會有所好轉嗎?NaN記憶體
- 檢查備份情況的指令碼指令碼
- Polardb X-engine 如何服務巨量資料情況下的業務 (翻譯)- 1
- 資料庫事務併發問題----各種事務隔離下的情況資料庫
- Laravel 透過遷移指令碼建立MySQL檢視Laravel指令碼MySql
- 展示企業情況的BI資料視覺化大屏怎麼做?視覺化
- Oracle 11G 閃回技術 使用Oracle閃回事務查詢Oracle
- windows10系統檢視“資料使用量”閃退的解決方法Windows
- Oracle 11G 閃回技術 閃回版本查詢和閃回事務查詢Oracle
- Excel資料透視表怎麼做 Excel資料透視表技巧Excel
- Hibernate批處理如何透過“datasource-proxy”檢視詳細資訊?
- 以實際情況切入,檢視MySQL複製問題的解決方案MySql
- Mysql DML 新增資料MySql
- Microsoft Excel 教程「2」,如何在 Excel 中建立資料透檢視?ROSExcel
- 【TUNE_ORACLE】檢視系統CPU和IO情況SQL參考OracleSQL
- 透視表excel透視表怎麼做 excel的資料透視表怎麼弄Excel
- 資料庫的物化檢視資料庫
- 資料庫檢視的作用資料庫
- 資料庫檢視的使用資料庫
- 一種透過延遲事務提升資料庫效能的方法資料庫
- Win10系統下怎麼透過事件檢視器中檢視硬碟檢查結果Win10事件硬碟