ITPub博客

首页 > 数据库 > Oracle > 利用flashback闪回表和数据

利用flashback闪回表和数据

Oracle 作者:xypincle 时间:2017-04-19 22:22:40 0 删除 编辑

  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博客 ” ,链接:https://blog.itpub.net/28878983/viewspace-2137633/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle dump详解
请登录后发表评论 登录
全部评论

注册时间:2013-05-11

  • 博文量
    208
  • 访问量
    212351