zoukankan      html  css  js  c++  java
  • oracle_利用闪回功能恢复数据

      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 Settingslinyuefeng>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 
    1421 行出现错误:
    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 未选定行
  • 相关阅读:
    自定义 cell
    iOS的自动布局
    通过字符串获取沙盒路径延展类
    Orcale nvl函数
    Orcale sign函数
    Orcale decode函数
    Orcale rpad函数
    mapper.xml速查
    Spring Boot整合SpringMVC应用
    Spring Boot 整合MyBatis框架
  • 原文地址:https://www.cnblogs.com/cphmvp/p/3321238.html
Copyright © 2011-2022 走看看