Oracle闪回详解
?
1、問(wèn)題定義
閃回是dba做的工作。現(xiàn)在也可授權(quán)給某個(gè)用戶(hù)。
閃回的定義:就是將用戶(hù)錯(cuò)誤的操作回恢到以前的狀態(tài)。即使你的事務(wù)提交的commit。
如果你刪除了一個(gè)表。Drop table(DDL) 不用commit直接生效的。
閃回:flashback。
概念:
Oracle默認(rèn)有2G硬盤(pán)空間,這2G的數(shù)據(jù),保存的是用戶(hù)的某些操作記錄。如果用戶(hù)操作的數(shù)據(jù)在這2G之內(nèi)的。則可以條件閃回。
這個(gè)區(qū)域可以設(shè)置為最大10G。
在Oracle中,默認(rèn)還有一個(gè)選項(xiàng),時(shí)間選項(xiàng)。默認(rèn)是900秒。
通過(guò)以下方式可以查詢(xún)這個(gè)時(shí)間選項(xiàng):
可以修改這個(gè)值:
2、閃回
閃回分類(lèi):
1:閃回表中的數(shù)據(jù) –
閃回執(zhí)行錯(cuò)誤的CRUD語(yǔ)句。
且是提交以后的數(shù)據(jù)。
即對(duì)insert,update,delete有效。且已經(jīng)提交了,則可以使用閃回。
2:閃回刪除
錯(cuò)誤的執(zhí)行了drop table語(yǔ)句。則通過(guò)閃回刪除可以找回以前數(shù)據(jù)。
3:閃回版本查詢(xún)
向一個(gè)表中,做的任何一個(gè)commit語(yǔ)句。Oracle數(shù)據(jù)庫(kù),都會(huì)給你記錄一個(gè)版本。
4:閃回事務(wù)查詢(xún)
執(zhí)行了多條sql語(yǔ)句,且是對(duì)多個(gè)表,或是對(duì)一個(gè)表的多次操作。
閃回的語(yǔ)法:
Flashback table {tableName} to
{
(scn|timestamp)
|
Before drop
}
SCN :System Changement Number – 其實(shí)就是一個(gè)時(shí)間。與時(shí)間一一對(duì)應(yīng)的
Timestamp: 時(shí)間點(diǎn) ,sysdate
--如何獲取時(shí)間號(hào):SCN
通過(guò)一個(gè)函數(shù):
2.1、閃回表
必須要打開(kāi)行移動(dòng)功能,為rowid設(shè)置移動(dòng)空間。
根據(jù)SCN時(shí)間號(hào)閃回:
根據(jù)時(shí)間閃回:
2.2、閃回刪除
就是閃回通過(guò)drop刪除到回收站中的表數(shù)據(jù)。
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> --通過(guò)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> --通過(guò)表名閃回,只會(huì)刪除最近刪除的那一個(gè)
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、閃回版本查詢(xún)
在Oracle數(shù)據(jù)庫(kù)中,有一個(gè)對(duì)象versions記錄的是對(duì)某個(gè)表的commit操作。
記錄下的信息
1:versions_starttime – 什么時(shí)間開(kāi)始的。對(duì)insert
2:versions_endtime – 什么時(shí)間數(shù)據(jù)就沒(méi)有了,當(dāng)執(zhí)行delete,update時(shí)。
3:versions_startscn – 與1對(duì)應(yīng)
4:versions_endscn – 與2對(duì)應(yīng)
5:versions_xid – 操作的事務(wù)的id。
2.3.1、在Oracle中事務(wù)的邊界
開(kāi)始:
在Oracle中以insert,update,delete為事務(wù)的開(kāi)始標(biāo)記。
結(jié)束:
在執(zhí)行rollback,commit.
在執(zhí)行DDL(create ,drop ,alter)語(yǔ)句時(shí),也是事務(wù)的結(jié)束。Commit
示例:
SQL> select *from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL> insert into stud values(12,'BJ');
已創(chuàng)建 1 行。
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
12 BJ
SQL> create table stss(iii int);
表已創(chuàng)建。
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 行出現(xiàn)錯(cuò)誤:
ORA-00942: 表或視圖不存在
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL> rollback;
回退已完成。
SQL> select * from stud;
AGE ADDR
---------- ----------------------------------------
90 山東
SQL>
2.3.2、查詢(xún)一個(gè)表的版本信息
對(duì)于versions而言語(yǔ)法:
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、閃回事務(wù)查詢(xún)
原則就是根據(jù)某個(gè)versions_xid- 事務(wù)id
對(duì)應(yīng)這versionss_id會(huì)有一個(gè)撤銷(xiāo)的sql==== undo_sql
即對(duì)于insert的commit來(lái)說(shuō),則撤銷(xiāo)應(yīng)該是delete
在oracle中,有一個(gè)表
Flashback_transaction_query表。保存了所有用戶(hù)可撤銷(xiāo)的sql語(yǔ)句。
以下是這個(gè)表的結(jié)構(gòu):
Table_name
Undo_sql
Xid對(duì)應(yīng)的就是versions_xid
Grant select any transaction to scott;
轉(zhuǎn)載于:https://www.cnblogs.com/xiaweifeng/p/3688911.html
總結(jié)
以上是生活随笔為你收集整理的Oracle闪回详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在Ubuntu为Android硬件抽象层
- 下一篇: [Android学习系列14]聊天通信的