Oracle闪回详解
?
1、問題定義
閃回是dba做的工作。現在也可授權給某個用戶。
閃回的定義:就是將用戶錯誤的操作回恢到以前的狀態。即使你的事務提交的commit。
如果你刪除了一個表。Drop table(DDL) 不用commit直接生效的。
閃回:flashback。
概念:
Oracle默認有2G硬盤空間,這2G的數據,保存的是用戶的某些操作記錄。如果用戶操作的數據在這2G之內的。則可以條件閃回。
這個區域可以設置為最大10G。
在Oracle中,默認還有一個選項,時間選項。默認是900秒。
通過以下方式可以查詢這個時間選項:
可以修改這個值:
2、閃回
閃回分類:
1:閃回表中的數據 –
閃回執行錯誤的CRUD語句。
且是提交以后的數據。
即對insert,update,delete有效。且已經提交了,則可以使用閃回。
2:閃回刪除
錯誤的執行了drop table語句。則通過閃回刪除可以找回以前數據。
3:閃回版本查詢
向一個表中,做的任何一個commit語句。Oracle數據庫,都會給你記錄一個版本。
4:閃回事務查詢
執行了多條sql語句,且是對多個表,或是對一個表的多次操作。
閃回的語法:
Flashback table {tableName} to
{
(scn|timestamp)
|
Before drop
}
SCN :System Changement Number – 其實就是一個時間。與時間一一對應的
Timestamp: 時間點 ,sysdate
--如何獲取時間號:SCN
通過一個函數:
2.1、閃回表
必須要打開行移動功能,為rowid設置移動空間。
根據SCN時間號閃回:
根據時間閃回:
2.2、閃回刪除
就是閃回通過drop刪除到回收站中的表數據。
Flashback table tableName to before drop;
SQL> --刪除stud這表
SQL> drop table stud;
表已刪除。
SQL> select *from tab;
TNAME TABTYPE CLUSTERID
--------------- ---------------- ----------
BIN$O1guMhXtQtK TABLE
BrmH0wA44/Q==$0
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
SYS_TEMP_FBT TABLE
已選擇6行。
SQL> --通過show 可以查看回收站中信息
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
STUD BIN$O1guMhXtQtKBrmH0wA44/Q==$0 TABLE 2013-03-28:19:29:16
SQL> --閃回
SQL> flashback table stud to before drop;
閃回完成。
SQL> show recyclebin;
SQL> select *from tab;
TNAME TABTYPE CLUSTERID
--------------- ---------------- ----------
BONUS TABLE
DEPT TABLE
EMP TABLE
SALGRADE TABLE
STUD TABLE
SYS_TEMP_FBT TABLE
已選擇6行。
SQL> select * from stud;
ID NAME
---------- ----------
1 Jack
2 張三
3 Rose
表如果重名:
SQL> drop table stud;
表已刪除。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -----------------
STUD BIN$jMt4lVtBQXieHhRHitV3KA==$0 TABLE 2013-03-28:19:33:
STUD BIN$4mfx44bSSo+NPkgEhU/Mig==$0 TABLE 2013-03-28:19:31:
SQL> --通過表名閃回,只會刪除最近刪除的那一個
SQL> flashback table stud to before drop;
閃回完成。
SQL> select * from stud;
AGE ADDR
---------- ------------------------------------------------------------
90 山東
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -----------------
STUD BIN$4mfx44bSSo+NPkgEhU/Mig==$0 TABLE 2013-03-28:19:31:
SQL> flashback table stud to before drop rename to stud2;
閃回完成。
SQL> select * from stud2;
ID NAME
---------- ----------
1 Jack
2 張三
3 Rose
還有一種閃加方式:
2.3、閃回版本查詢
在Oracle數據庫中,有一個對象versions記錄的是對某個表的commit操作。
記錄下的信息
1:versions_starttime – 什么時間開始的。對insert
2:versions_endtime – 什么時間數據就沒有了,當執行delete,update時。
3:versions_startscn – 與1對應
4:versions_endscn – 與2對應
5:versions_xid – 操作的事務的id。
2.3.1、在Oracle中事務的邊界
開始:
在Oracle中以insert,update,delete為事務的開始標記。
結束:
在執行rollback,commit.
在執行DDL(create ,drop ,alter)語句時,也是事務的結束。Commit
示例:
SQL> select *from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL> insert into stud values(12,'BJ');
已創建 1 行。
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
12 BJ
SQL> create table stss(iii int);
表已創建。
SQL> rollback;
回退已完成。
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
12 BJ
SQL> commit;
提交完成。
SQL> delete from stud where age=12;
已刪除 1 行。
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL> drop table st;
drop table st
*
第 1 行出現錯誤:
ORA-00942: 表或視圖不存在
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL> rollback;
回退已完成。
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL>
2.3.2、查詢一個表的版本信息
對于versions而言語法:
Select id,name,
Versions_xid
From person
Versions between ( scn | timestamp) minvalue and maxvalue;
SQL> select id,name,versions_xid from person versions between timestamp minvalue
and maxvalue;
ID NAME VERSIONS_XID
---------- ---------- ----------------
22 BCCCCC 0500130099020000
2 BBBBB 0500130099020000
11 ABBBB 0700020080020000
1 AAA 0700020080020000
2.4、閃回事務查詢
原則就是根據某個versions_xid- 事務id
對應這versionss_id會有一個撤銷的sql==== undo_sql
即對于insert的commit來說,則撤銷應該是delete
在oracle中,有一個表
Flashback_transaction_query表。保存了所有用戶可撤銷的sql語句。
以下是這個表的結構:
Table_name
Undo_sql
Xid對應的就是versions_xid
Grant select any transaction to scott;
轉載于:https://www.cnblogs.com/xiaweifeng/p/3688911.html
總結
以上是生活随笔為你收集整理的Oracle闪回详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu为Android硬件抽象层
- 下一篇: 玩转html5(五)---月球绕着地球转