1 方便起见一般:执行如下即可不用往下看:
2
3
4 ① 启用行移动功能
5
6 alter table tbl_a enable row movement;
7
8 ② 闪回表数据到某个时间点
9
10 flashback table tbl_a to timestamp to_timestamp('2013-07-19 15:10:00','yyyy-mm-dd hh24:mi:ss');
11
12 详解:
13
14
15 利用ORACLE的闪回功能恢复数据
16
17 一、 闪回表数据
18
19
20 从9i开始,Oracle提供了闪回(FLASHBACK)功能。使用FLASHBACK TABLE语句从撤消段中(undo segment)读取该表的过去映像,并利用Oracle9i中引入的回闪查询重建表行。UNDO_RETENTION给出了闪回支持的最小时间。也就是说,FLASHBACK最少可以支持UNDO_RETENTION给出的时间,如果系统比较闲,则可以闪回更长的时间。(当然,如果回滚表空间的空间分配不足,当系统处于忙时,有可能重用还没有达到UNDO_RETENTION时间限制的数据的空间)。使用闪回的一个前提是表不能进行DDL操作。不但不能对DDL操作进行回闪,而且,也无法闪回到DDL操作以前的数据了。
21
22
23 SQL> select * from v$version;
24
25
26 BANNER
27
28 ----------------------------------------------------------------
29
30
31 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
32
33
34 PL/SQL Release 10.2.0.1.0 - Production
35
36
37 CORE 10.2.0.1.0 Production
38
39
40 TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
41
42
43 NLSRTL Version 10.2.0.1.0 – Production
44
45
46 --获得系统变更号
47
48
49 C:\Documents and Settings\linyuefeng>sqlplus /nolog
50
51
52 SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 10月 26 20:41:28 2006
53
54
55 Copyright (c) 1982, 2005, Oracle. All rights reserved.
56
57
58 SQL> conn scott/scott@ora10g;
59
60
61 已连接。
62
63
64 SQL> var scn number
65
66
67 SQL> exec :scn :=dbms_flashback.get_system_change_number
68
69
70 PL/SQL 过程已成功完成。
71
72
73 SQL> print scn
74
75
76 SCN
77
78
79 ----------
80
81
82 914958
83
84
85 SQL> select count(*) from emp;
86
87
88 COUNT(*)
89
90
91 ----------
92
93
94 14
95
96
97 SQL> delete from emp;
98
99
100 已删除14行。
101
102
103 SQL> select count(*) from emp;
104
105
106 COUNT(*)
107
108
109 ----------
110
111
112 0
113
114
115 SQL> commit;
116
117
118 提交完成。
119
120
121 SQL> select count(*) from emp as of scn :scn;
122
123
124 COUNT(*)
125
126
127 ----------
128
129
130 14
131
132
133 SQL> flashback table emp to scn :scn;
134
135
136 flashback table emp to scn :scn
137
138
139 *
140
141
142 第 1 行出现错误:
143
144
145 ORA-08189: 因为未启用行移动功能, 不能闪回表
146
147
148 SQL> alter table emp enable row movement;
149
150
151 表已更改。
152
153
154 这个命令的作用就是允许ORACLE修改分配给行的rowid。在ORACLE中,插入一行时就会为它分配一个rowid,而且这一行永远拥有这个rowid。闪回表处理时会对EMP表完成DELETE 操作,并且重新插入行,这样就会为这些行分配一个新的rowid。要支持闪回功能就必须允许ORACLE执行这个操作。
155
156
157 SQL> flashback table emp to scn :scn;
158
159
160 闪回完成。
161
162
163 SQL> select count(*) from emp;
164
165
166 COUNT(*)
167
168
169 ----------
170
171
172 14
173
174
175 ---也可以通过时间进行闪回
176
177
178 SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') TIME from dual;
179
180
181 TIME
182
183
184 -------------------
185
186
187 2006-10-26 20:55:48
188
189
190 SQL> select count(*) from emp;
191
192
193 COUNT(*)
194
195
196 ----------
197
198
199 14
200
201
202 SQL> delete from emp;
203
204
205 已删除14行。
206
207
208 SQL> commit;
209
210
211 提交完成。
212
213
214 SQL> flashback table emp to timestamp to_date('2006-10-26 20:55:48','yyyy-mm-dd
215
216
217 hh24:mi:ss');
218
219
220 闪回完成。
221
222
223 SQL> select count(*) from emp;
224
225
226 COUNT(*)
227
228
229 ----------
230
231
232 14
233
234
235 二、 闪回删除的表
236
237
238 flashback drop特性从Oracle10g开始才有的,这个新特性,允许你从当前数据库中恢复一个被drop了的对象。在执行drop操作时,现在Oracle不是真正删除它,而是将该对象自动将放入回收站(一个虚拟的容器,用于存放所有被删除的对象)。对于一个对象的删除,ORACLE的操作仅仅就是简单的重令名而已。
239
240
241 在回收站中,被删除的对象将占用创建时的同样的空间,可以利用flashback功能来恢复它, 这个就是flashback drop功能。
242
243
244 SQL> create table emp_test as select * from emp;
245
246
247 Table created
248
249
250 SQL> drop table emp_test;
251
252
253 Table dropped
254
255
256 当一个表被删除并移动到"回收站"中,它的名字要进行一些转换。这样的目的显而易见是为了避免同类对象名称的重复。
257
258
259 SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order by droptime;
260
261
262 OWNER OBJECT_NAME ORIGINAL_NAME DROPTIME
263
264
265 ------------------------------ ------------------------------
266
267
268 SCOTT BIN$rtpdTNe6SIysmO+ZB0t3aQ==$0 EMP_TEST 2006-10-26:22:23:06
269
270
271 SQL> create table emp_test as select * from emp;
272
273
274 Table created
275
276
277 SQL> drop table emp_test;
278
279
280 Table dropped
281
282
283 SQL> select owner,object_name,original_name, DROPTIME from dba_recyclebin order by droptime;
284
285
286 OWNER OBJECT_NAME ORIGINAL_NAME DROPTIME
287
288
289 ------------------------------ ------------------------------
290
291
292 SCOTT BIN$rtpdTNe6SIysmO+ZB0t3aQ==$0 EMP_TEST 2006-10-26:22:23:06
293
294
295 SCOTT BIN$roQhkx6tQneThvaRlsjrhw==$0 EMP_TEST 2006-10-26:22:23:50
296
297
298 --使用flashback table 进行恢复,默认恢复最近删除的表
299
300
301 SQL> flashback table emp_test to before drop;
302
303
304 Done
305
306
307 SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order by droptime;
308
309
310 OWNER OBJECT_NAME ORIGINAL_NAME DROPTIME
311
312
313 ------------------------------ ------------------------------
314
315
316 SCOTT BIN$rtpdTNe6SIysmO+ZB0t3aQ==$0 EMP_TEST 2006-10-26:22:23:06
317
318
319 --也可以指定表名进行恢复
320
321
322 SQL> flashback table "BIN$rtpdTNe6SIysmO+ZB0t3aQ==$0" to before drop;
323
324
325 flashback table "BIN$rtpdTNe6SIysmO+ZB0t3aQ==$0" to before drop
326
327
328 ORA-38312: 原始名称已被现有对象使用
329
330
331 此时被恢复的表名称仍然采用以前的名字,我们之前已经恢复一次EMP_TEST,所以现在恢复就出现了重名,不过可以为其指定新的名字。
332
333
334 SQL> flashback table "BIN$rtpdTNe6SIysmO+ZB0t3aQ==$0" to before drop rename to emp_test2;
335
336
337 Done
338
339
340 SQL> select table_name from user_tables where table_name like '%EMP_TEST%';
341
342
343 TABLE_NAME
344
345
346 ------------------------------
347
348
349 EMP_TEST
350
351
352 EMP_TEST2
353
354
355 --删除回收站里的对象,不能使用DROP命令进行删除,必须使用PURGE命令
356
357
358 SQL> drop table emp_test;
359
360
361 Table dropped
362
363
364 SQL> drop table emp_test2;
365
366
367 Table dropped
368
369
370 SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order by droptime;
371
372
373 OWNER OBJECT_NAME ORIGINAL_NAME DROPTIME
374
375
376 ------------------------------ ------------------------------
377
378
379 SCOTT BIN$M4Q0Pb94SOWSFGarOpI5Og==$0 EMP_TEST 2006-10-26:22:46:07
380
381
382 SCOTT BIN$7P+osQdjSs+5CcSXBc0NAA==$0 EMP_TEST2 2006-10-26:22:46:10
383
384
385 SQL> drop table "BIN$M4Q0Pb94SOWSFGarOpI5Og==$0";
386
387
388 drop table "BIN$M4Q0Pb94SOWSFGarOpI5Og==$0"
389
390
391 ORA-38301: 无法对回收站中的对象执行 DDL/DML
392
393
394
395 SQL> purge table "BIN$M4Q0Pb94SOWSFGarOpI5Og==$0";
396
397
398 Done
399
400 SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order by droptime;
401
402
403 OWNER OBJECT_NAME ORIGINAL_NAME DROPTIME
404
405
406 ------------------------------ ------------------------------
407
408
409 SCOTT BIN$7P+osQdjSs+5CcSXBc0NAA==$0 EMP_TEST2 2006-10-26:22:46:10
410
411
412 --删除整个回收站里的对象
413
414
415 SQL> purge recyclebin;
416
417
418 Done
419
420
421 SQL> select owner,object_name,original_name,DROPTIME from dba_recyclebin order by droptime;
422
423
424 OWNER OBJECT_NAME ORIGINAL_NAME DROPTIME
425
426
427 ------------------------------ ------------------------------
428
429
430 未选定行