利用flashback閃回表和資料

xypincle發表於2017-04-19

  1. 1.將oracle關閉
  2. shutdown immediate;

  3. 2.啟動到mount狀態
  4. startup mount;

  5. 3.檢查oracle是否開啟了archivelog模式,如果沒開,則可能會報錯
  6. 3.1 開啟歸檔
  7. alter database archivelog;
  8. 3.2 開啟閃回特性
  9. alter database flashback on;
  10. 注意:
  11. 如果開啟了歸檔,則可以順利開啟閃回特性,否則會報下列錯誤:
  12. ERROR at line 1:
  13. ORA-38706: Cannot turn on FLASHBACK DATABASE logging.
  14. ORA-38707: Media recovery is not enabled.

  15. 4.啟動oracle到open狀態
  16. alter database open;

  17. 5.檢視flashback的閃回時間
  18. show parameter undo_retention ;
  19. 預設是900秒,也就是15分鐘。

  20. 以下為具體的操作:
  21. flashback:即回閃,是從oracle9i就開始提出的一種操作恢復的功能,在oracle10g中進行了增強和修改,透過回閃,使用者可以完成許多不可能恢復的工作,目前oracle10g的回閃包括以下特性;
  22. 1〉Oracle falshback Database. 特性允許oracle透過Flashback database語句,將資料庫會滾到前一個時間點或者scn上,而不需要作時間點的恢復工作!
  23. 2〉oracle falshback table. 特性允許oracle透過flashback table語句,將表會滾到前一個時間點或者scn上。
  24. 3〉oracle falshback drop. 特性允許oracle把恢復drop掉的table或者索引。
  25. 4〉oracle falshback version query. 特性可以得到特定的表在某一個時間段內的任何修改記錄!
  26. 5〉oracle falshback transaction query 特性可以限制使用者在某一個事務級別上檢查資料庫的修改操作,適用於診斷問題、分析效能、審計事務。
  27. 一:oracle falshback table
  28. oracle flashback table即回閃表
  29. 可以進行的操作:操作1>flashback table tablename to befor drop;
  30. 對於誤drop的table此可以使用本操作,還原drop的table!
  31. 此操作需要使用者有以下的許可權:
  32. A:falshback any table的系統許可權或者是某一個表的flashback許可權。
  33. B:有table的select、insert、delect、alter許可權。
  34. C:有table的row Movement許可權
  35. SQL> set serveroutput on
  36. SQL> set time on
  37. 11:24:37 SQL> set feadback off;
  38. 11:24:59 SQL> select * from tab;
  39. TNAME TABTYPE CLUSTERID
  40. ------------------------------ ------- ----------
  41. B TABLE 
  42. STEST TABLE 
  43. TA TABLE 
  44. GROUPINGTEST TABLE 
  45. COLTABLE TABLE 
  46. ROWTABLE TABLE 
  47. COLTABLE1 TABLE 
  48. ROWTABLE1 TABLE 
  49. A1 TABLE 
  50. A TABLE 
  51. ----------------------
  52. 可以看到本使用者下有table A,現在drop它;
  53. -----------------------
  54. 11:25:01 SQL> drop table a;
  55. 11:26:18 SQL> select * from tab;
  56. TNAME TABTYPE CLUSTERID
  57. ------------------------------ ------- ----------
  58. B TABLE 
  59. STEST TABLE 
  60. TA TABLE 
  61. GROUPINGTEST TABLE 
  62. COLTABLE TABLE 
  63. ROWTABLE TABLE 
  64. COLTABLE1 TABLE 
  65. ROWTABLE1 TABLE 
  66. BIN$dFFlS6jJQLShRwRQ+kLJMg==$0 TABLE 
  67. A1 TABLE 
  68. ----------------------
  69. table已經刪除,可以看到table並不是真正意義上的刪除掉了,而是多了一個"BIN$dFFlS6jJQLShRwRQ+kLJMg==$0"的表,這個表是原來的A表,這是oracle的recyclebin,一個類似垃圾回收站的機制。當使用者刪除表以後把表放到recyclebin中,而不是刪除掉!
  70. ----------------------
  71. 現在使用命令恢復表A
  72. 11:26:29 SQL> flashback table a to before drop;
  73. 11:30:45 SQL> select * from tab;
  74. TNAME TABTYPE CLUSTERID
  75. ------------------------------ ------- ----------
  76. B TABLE 
  77. STEST TABLE 
  78. TA TABLE 
  79. GROUPINGTEST TABLE 
  80. COLTABLE TABLE 
  81. ROWTABLE TABLE 
  82. COLTABLE1 TABLE 
  83. ROWTABLE1 TABLE 
  84. A1 TABLE 
  85. A TABLE 
  86. 可以看到表A已經恢復!
  87. 可以進行的操作:操作2>flashback table tablename to scn/timestamp(a timestamp);
  88. 此操作可以利用scn(在後面介紹)或者timestamp將table恢復到某一個時間點!
  89. -----給table row movement許可權
  90. 11:41:49 SQL> alter table a enable row movement;
  91. ----插入一條記錄
  92. 11:44:16 SQL> insert into a values('www',11);
  93. 11:45:15 SQL> commit;
  94. ----得到該記錄的scn:1576479
  95. 11:45:20 SQL> select a.*,ora_rowscn from a;
  96. NAME AGE ORA_ROWSCN
  97. ---------- ---------- ----------
  98. 500 65 1576479
  99. 600 65 1576479
  100. 111 10 1576479
  101. 222 100 1576479
  102. 333 30 1576479
  103. 444 40 1576479
  104. 555 50 1576479
  105. www 11 1576479
  106. 888 34 1573035
  107. ---刪除一條記錄
  108. 11:45:55 SQL> delete from a where name ='www';
  109. 11:46:19 SQL> commit;
  110. ---利用scn命令恢復刪掉的紀錄!
  111. 11:46:20 SQL> flashback table a to scn 1576479;
  112. 11:46:49 SQL> select * from a;
  113. NAME AGE
  114. ---------- ----------
  115. 500 65
  116. 600 65
  117. 111 10
  118. 222 100
  119. 333 30
  120. 444 40
  121. 555 50
  122. www 11
  123. 888 34
  124. ---利用timestamp命令恢復刪掉的紀錄!
  125. 11:46:54 SQL> flashback table a to timestamp to_timestamp('2007-04-27 11:45:20','yyyy-mm-dd hh24:mi:ss');
  126. 11:56:28 SQL> select * from a;
  127. NAME AGE
  128. ---------- ----------
  129. 500 65
  130. 600 65
  131. 111 10
  132. 222 100
  133. 333 30
  134. 444 40
  135. 555 50
  136. 888 34
  137. 附:--關於scn的介紹:
  138. SCN:system change numbers,oracle10g的每一個表都有ora_rowscn列!但是desc是看不到改列的。
  139. 可以透過select ora_rowscn from table 得到每一條結果集當前的SCN,timestamp_to_scn()將scn轉換到stmestamp;scn_to_timestamp()將timestamp轉換到scn。
  140. 二:flashback drop
  141. 利用flashback drop oracle10g可以對DDL操作進行恢復,oracla提供類似回收站的recyclebin來收集被刪除的物件,其實物件在刪除的時候oracle把物件寫到一個資料字典表中,當使用者不需要該物件的時候,可以利用purge命令來從回收站進行清除。
  142. --察看使用者下所有表
  143. SQL> select * from tab;
  144. TNAME TABTYPE CLUSTERID
  145. ------------------------------ ------- ----------
  146. B TABLE 
  147. STEST TABLE 
  148. TA TABLE 
  149. GROUPINGTEST TABLE 
  150. COLTABLE TABLE 
  151. ROWTABLE TABLE 
  152. COLTABLE1 TABLE 
  153. ROWTABLE1 TABLE 
  154. SYS_TEMP_FBT TABLE 
  155. A1 TABLE 
  156. A TABLE
  157. Executed in 0.078 seconds
  158. --drop 表A1
  159. SQL> drop table a1;
  160. Executed in 0.047 seconds
  161. --再察看此時使用者所擁有的所有表;
  162. SQL> select * from tab;
  163. TNAME TABTYPE CLUSTERID
  164. ------------------------------ ------- ----------
  165. B TABLE 
  166. STEST TABLE 
  167. TA TABLE 
  168. GROUPINGTEST TABLE 
  169. COLTABLE TABLE 
  170. ROWTABLE TABLE 
  171. COLTABLE1 TABLE 
  172. ROWTABLE1 TABLE 
  173. SYS_TEMP_FBT TABLE 
  174. A TABLE 
  175. BIN$fPHKLxsBTBq6+bjBLPEJaw==$0 TABLE
  176. Executed in 0.078 seconds
  177. --如上可以看到A1表drop的同時,當前使用者下又產生了一個以BIN開頭的新表BIN$fPHKLxsBTBq6+bjBLPEJaw==$0,這就是原來的A1表
  178. SQL> set timing off
  179. SQL> set time on
  180. 14:25:40 SQL> select t.object_name,t.original_name from recyclebin t;
  181. OBJECT_NAME ORIGINAL_NAME
  182. ------------------------------ --------------------------------
  183. BIN$fPHKLxsBTBq6+bjBLPEJaw==$0 A1
  184. ---採用flashback table命令恢復剛才刪除的表A1
  185. 14:29:45 SQL> flashback table a1 to before drop;
  186. 14:29:49 SQL> select * from tab;
  187. TNAME TABTYPE CLUSTERID
  188. ------------------------------ ------- ----------
  189. B TABLE 
  190. STEST TABLE 
  191. TA TABLE 
  192. GROUPINGTEST TABLE 
  193. COLTABLE TABLE 
  194. ROWTABLE TABLE 
  195. COLTABLE1 TABLE 
  196. ROWTABLE1 TABLE 
  197. SYS_TEMP_FBT TABLE 
  198. A1 TABLE 
  199. A TABLE 
  200. --當使用者確實不需要該物件時候,可以採用pruge來徹底刪除改物件
  201. 14:29:55 SQL> drop table a1;
  202. 14:31:13 SQL> select * from tab;
  203. TNAME TABTYPE CLUSTERID
  204. ------------------------------ ------- ----------
  205. B TABLE 
  206. STEST TABLE 
  207. TA TABLE 
  208. GROUPINGTEST TABLE 
  209. COLTABLE TABLE 
  210. ROWTABLE TABLE 
  211. COLTABLE1 TABLE 
  212. ROWTABLE1 TABLE 
  213. SYS_TEMP_FBT TABLE 
  214. A TABLE 
  215. BIN$N+i42FTvSSemvMrH6frCQg==$0 TABLE
  216. 14:31:32 SQL> purge table "BIN$N+i42FTvSSemvMrH6frCQg==$0";
  217. 14:31:49 SQL> select * from tab;
  218. TNAME TABTYPE CLUSTERID
  219. ------------------------------ ------- ----------
  220. B TABLE 
  221. STEST TABLE 
  222. TA TABLE 
  223. GROUPINGTEST TABLE 
  224. COLTABLE TABLE 
  225. ROWTABLE TABLE 
  226. COLTABLE1 TABLE 
  227. ROWTABLE1 TABLE 
  228. SYS_TEMP_FBT TABLE 
  229. A TABLE 
  230. --用purge命令收站想清空回收站裡的別的表
  231. 14:31:56 SQL> purge recyclebin;
  232. 14:34:02 SQL> select object_name from recyclebin;
  233. OBJECT_NAME
  234. ------------------------------
  235. 三:oracle falshback version query--閃回版本查詢
  236. oracle10g falshback 能將所有做了提交的行進行記錄,就類似於審計的功能,透過falshback可以查詢什麼時候執行了什麼操作,非常方便,包括閃回版本的查詢和審計等。
  237. 1〉閃回版本的查詢
  238. 14:41:22 SQL> insert into a values('zhao',24);
  239. 14:42:01 SQL> commit;
  240. --查詢當前版本
  241. 14:34:45 SQL> select a.*,ora_rowscn from a;
  242. NAME AGE ORA_ROWSCN
  243. ---------- ---------- ----------
  244. 500 65 1577059
  245. 600 65 1577059
  246. 111 10 1577059
  247. 222 100 1577059
  248. 333 30 1577059
  249. 444 40 1577059
  250. 555 50 1577059
  251. 888 34 1573035
  252. 14:41:22 SQL> insert into a values('zhao',24);
  253. 14:42:01 SQL> commit;
  254. 14:42:03 SQL> select a.*,ora_rowscn from a;
  255. NAME AGE ORA_ROWSCN
  256. ---------- ---------- ----------
  257. 500 65 1577059
  258. 600 65 1577059
  259. 111 10 1577059
  260. 222 100 1577059
  261. 333 30 1577059
  262. 444 40 1577059
  263. 555 50 1577059
  264. 888 34 1573035
  265. zhao 24 1585133
  266. --A:利用scn查詢以前版本的記錄
  267. 14:42:18 SQL> select * from a as of scn 1577059;
  268. NAME AGE
  269. ---------- ----------
  270. 500 65
  271. 600 65
  272. 111 10
  273. 222 100
  274. 333 30
  275. 444 40
  276. 555 50
  277. 888 34
  278. --B:利用timestamp查詢以前版本的記錄
  279. 14:42:51 SQL> select * from a as of timestamp scn_to_timestamp(1577059);
  280. NAME AGE
  281. ---------- ----------
  282. 500 65
  283. 600 65
  284. 111 10
  285. 222 100
  286. 333 30
  287. 444 40
  288. 555 50
  289. www 11
  290. 888 34
  291. 2〉審計的功能:
  292. 14:50:06 SQL> select a.*,versions_operation,versions_xid,versions_starttime from a
  293. 2 versions between timestamp minvalue and maxvalue;
  294. NAME AGE VERSIONS_OPERATION VERSIONS_XID VERSIONS_STARTTIME
  295. ---------- ---------- ------------------ ---------------- --------------------
  296. 600 65 
  297. 111 10 
  298. 222 100 
  299. 333 30 
  300. 444 40 
  301. 555 50 
  302. 888 34 
  303. zhao 24 I 0500110006030000 27-4月 -07 02.42.00 下午
  304. --可以看出 在27-4月 -07 02.42.00 下午 插入(I)了一條記錄
  305. 14:50:53 SQL> a order byversions_starttime;
  306. 14:51:23 SQL> run;
  307. NAME AGE VERSIONS_OPERATION VERSIONS_XID VERSIONS_STARTTIME
  308. ---------- ---------- ------------------ ---------------- ----------------------
  309. 500 65 
  310. 600 65 
  311. 111 10 
  312. 222 100 
  313. 333 30 
  314. 444 40 
  315. 555 50 
  316. 888 34 
  317. zhao 24 I 0500110006030000 27-4月 -07 02.42.00 下午
  318. 四:oracle falshback transaction query回閃事務查詢
  319. oracle10回閃事務功能提供對過去某段時間內所完成的事務的查詢和撤銷!
  320. 14:59:56 SQL> select undo_sql,table_name from flashback_transaction_query x where x.table_owner=upper('zxt') and x.xid ='0500110006030000';
  321. UNDO_SQL TABLE_NAME
  322. -------------------------------------------------------------------------------- --------------
  323. delete from "ZXT"."A" where ROWID = 'AAANOsAAGAAAAMWAAA'; A
  324. --其中UNDO_SQL 就是當時對錶A的DML操作;
  325. 五:oracle falshback Database:閃回資料庫
  326. oracle10g提供資料庫級別的閃回,可以使整個資料庫的資料恢復到某一個時間點或者SCN上!由於牽扯到資料庫的批次操作,這個方面的知識暫時無法研究了!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28878983/viewspace-2137633/,如需轉載,請註明出處,否則將追究法律責任。

相關文章