循序渐进oracle第8章:Oracle的闪回特性之恢复drop表四种方法

/* 2008/06/09
*环境:Windows XP +Oracle10.2.0.1
*循序渐进oracle——数据库管理、优化与备份恢复
*循序渐进oracle第8章:Oracle的闪回特性之恢复drop表四种方法
*恢复
*/

方法一:在非归档模式或者归档模式下,用flashback table来恢复。
C:\>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 6月 9 08:26:42 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
orcl             OPEN

非归档模式:
SQL> archive log list;
数据库日志模式             非存档模式
自动存档             禁用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     1
当前日志序列           3
SQL>
SQL> show parameter flashback;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target        integer     1440
SQL> select dbid,name,flashback_on,current_scn from v$database;

      DBID NAME      FLASHBACK_ON       CURRENT_SCN
---------- --------- ------------------ -----------
1184709774 ORCL      NO                      578449

SQL> alter user scott account unlock;

用户已更改。


SQL> create table empcopy
  2  as
  3  select * from emp;

表已创建。

SQL> select * from emp;

SQL> drop table emp;

表已删除。


表已经删除,怎么恢复:

用flashback table闪回。(oracle 10g开始可使用该功能)
SQL> flashback table emp to before drop;

闪回完成。

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

 

方法二:(如果启用闪回数据库时间记录,可以用flashback database,启用闪回数据库时间记录的前提是数据库要运行在归档模式下)
SQL> connect sys/mzl as sysdba
已连接。
SQL> select dbid,name,flashback_on,current_scn from v$database;

      DBID NAME      FLASHBACK_ON       CURRENT_SCN
---------- --------- ------------------ -----------
1184709774 ORCL      NO                      584227

启用闪回数据库时间记录
SQL> alter database flashback on;
alter database flashback on
*
第 1 行出现错误:
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38707: 尚未启用介质恢复。

需要在归档模式下才可以启用 FLASHBACK DATABASE 事件记录
SQL> alter database archivelog;

数据库已更改。

SQL> alter database flashback on;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select sysdate from dual;

SYSDATE
-------------------
2008-06-09 10:09:47

SQL> drop table emp;

表已删除。

在数据库mount状态下用flashback database 恢复表:

SQL> connect sys/mzl as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             100664000 bytes
Database Buffers          180355072 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
SQL> flashback database to timestamp
  2  to_timestamp('2008-06-09 10:09:47','yyyy-mm-dd hh24:mi:ss');

闪回完成。

(在上面语句,也可以用scn来进行恢复)
SQL> alter database open read only;

数据库已更改。

如果数据恢复不够理想,可以关闭数据库继续进行恢复。 如果用'alter database open resetlogs'打开,在想关闭数据库用flashback恢复就不行了。一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点。

 

SQL> select count(*) from scott.emp;

  COUNT(*)
----------
        14

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size             100664000 bytes
Database Buffers          180355072 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项


SQL> alter database open resetlogs;

数据库已更改。

SQL> select count(*) from scott.emp;

  COUNT(*)
----------
        14

 


方法三:归档模式下,用rman的备份基于时间的不完全恢复。
首先进行rman的全备份

C:\>rman target/

恢复管理器: Release 10.2.0.1.0 - Production on 星期一 6月 9 10:27:50 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到目标数据库: ORCL (DBID=1184709774)

RMAN> backup database tag='full' plus archivelog;


启动 backup 于 09-6月 -08
当前日志已存档
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=131 devtype=DISK
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =1 记录 ID=3 时间戳=656936149
输入存档日志线程 =1 序列 =2 记录 ID=1 时间戳=656936141
输入存档日志线程 =1 序列 =3 记录 ID=2 时间戳=656936143
通道 ORA_DISK_1: 正在启动段 1 于 09-6月 -08
通道 ORA_DISK_1: 已完成段 1 于 09-6月 -08
段句柄=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\O1
_MF_ANNNN_TAG20080609T102906_44S5CNDP_.BKP 标记=TAG20080609T102906 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:08
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =1 记录 ID=4 时间戳=656936946
通道 ORA_DISK_1: 正在启动段 1 于 09-6月 -08
通道 ORA_DISK_1: 已完成段 1 于 09-6月 -08
段句柄=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\O1
_MF_ANNNN_TAG20080609T102906_44S5CWJM_.BKP 标记=TAG20080609T102906 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 09-6月 -08

启动 backup 于 09-6月 -08
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
输入数据文件 fno=00003 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
输入数据文件 fno=00005 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
输入数据文件 fno=00002 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
输入数据文件 fno=00004 name=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 09-6月 -08
通道 ORA_DISK_1: 已完成段 1 于 09-6月 -08
段句柄=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\O1
_MF_NNNDF_FULL_44S5CYTV_.BKP 标记=FULL 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:25
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
备份集中包括当前控制文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 09-6月 -08
通道 ORA_DISK_1: 已完成段 1 于 09-6月 -08
段句柄=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\O1
_MF_NCSNF_FULL_44S5GN98_.BKP 标记=FULL 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 09-6月 -08

启动 backup 于 09-6月 -08
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =2 记录 ID=5 时间戳=656937045
通道 ORA_DISK_1: 正在启动段 1 于 09-6月 -08
通道 ORA_DISK_1: 已完成段 1 于 09-6月 -08
段句柄=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\O1
_MF_ANNNN_TAG20080609T103045_44S5GPJ3_.BKP 标记=TAG20080609T103045 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 09-6月 -08

删除表:
C:\>sqlplus scott/mzl@orcl

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 6月 9 10:32:15 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> drop table emp;

表已删除。


用备份来进行恢复:
C:\>rman target/

恢复管理器: Release 10.2.0.1.0 - Production on 星期一 6月 9 10:34:22 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到目标数据库: ORCL (DBID=1184709774)

RMAN> shutdown immediate

使用目标数据库控制文件替代恢复目录
数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup mount

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载

系统全局区域总计     289406976 字节

Fixed Size                     1248576 字节
Variable Size                104858304 字节
Database Buffers             176160768 字节
Redo Buffers                   7139328 字节

RMAN> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"';

sql 语句: alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"

RMAN> restore database;

启动 restore 于 09-6月 -08
使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
正将数据文件00005恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORC
L\BACKUPSET\2008_06_09\O1_MF_NNNDF_FULL_44S71ZMK_.BKP
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\
O1_MF_NNNDF_FULL_44S71ZMK_.BKP 标记 = FULL
通道 ORA_DISK_1: 恢复完成, 用时: 00:01:55
完成 restore 于 09-6月 -08

RMAN> recover database until time '2008-06-09 11:00:00';

启动 recover 于 09-6月 -08
使用通道 ORA_DISK_1

正在开始介质的恢复
介质恢复完成, 用时: 00:00:03

完成 recover 于 09-6月 -08

RMAN> alter database open resetlogs;

数据库已打开


C:\>sqlplus scott/mzl@orcl

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 6月 9 11:08:42 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

 

方法四:归档模式下,用rman的备份基于SCN的不完全恢复。
SQL>connect scott/mzl;
SQL> drop table emp;

表已删除。

用用rman的备份基于SCN的不完全恢复:
C:\>rman target/

恢复管理器: Release 10.2.0.1.0 - Production on 星期一 6月 9 12:44:27 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

连接到目标数据库: ORCL (DBID=1184709774)

RMAN> shutdown immediate

使用目标数据库控制文件替代恢复目录
数据库已关闭
数据库已卸载
Oracle 实例已关闭

RMAN> startup mount

已连接到目标数据库 (未启动)
Oracle 实例已启动
数据库已装载

系统全局区域总计     289406976 字节

Fixed Size                     1248576 字节
Variable Size                113246912 字节
Database Buffers             167772160 字节
Redo Buffers                   7139328 字节

启动到mount下,进一部确定drop emp前的scn值。
C:\>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 6月 9 12:46:47 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
orcl             MOUNTED

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> select thread#,first_change#,next_change#,first_time from v$log_history;

   THREAD# FIRST_CHANGE# NEXT_CHANGE# FIRST_TIME
---------- ------------- ------------ -------------------
         1        534907       567823 2008-06-09 08:17:21
         1        567823       573653 2008-06-09 08:19:42
         1        573653       587297 2008-06-09 08:20:00
         1        586670       588420 2008-06-09 10:15:38
         1        588420       588487 2008-06-09 10:29:06
         1        589360       589820 2008-06-09 10:51:11
         1        589820       589874 2008-06-09 10:57:54
         1        589898       590299 2008-06-09 11:07:52
         1        590299       590367 2008-06-09 11:13:31

已选择9行。

或者:
SQL> select name,first_change#,next_change#,first_time from v$archived_log;

RMAN> restore database;

启动 restore 于 09-6月 -08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=154 devtype=DISK

通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
正将数据文件00005恢复到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORC
L\BACKUPSET\2008_06_09\O1_MF_NNNDF_ORCL_44S7ZB6T_.BKP
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2008_06_09\
O1_MF_NNNDF_ORCL_44S7ZB6T_.BKP 标记 = ORCL
通道 ORA_DISK_1: 恢复完成, 用时: 00:01:55
完成 restore 于 09-6月 -08

RMAN> recover database until scn 590367;

启动 recover 于 09-6月 -08
使用通道 ORA_DISK_1

正在开始介质的恢复
介质恢复完成, 用时: 00:00:03

完成 recover 于 09-6月 -08

RMAN> alter database open resetlogs;

数据库已打开


检查数据库的表数据:

SQL> select count(*) from scott.emp;

  COUNT(*)
----------
        14

还有一个不完全恢复是基于取消的不完全恢复,一般应用于联机重做日志或者归档日志损坏了。

 

**********************************************************************

1  Oracle10g中时间和scn映射关系函数
SQL> select dbms_flashback.get_system_change_number scn from dual;

       SCN
----------
    592854

SQL> select timestamp_to_scn(to_timestamp('2008-06-09 13:50:00','yyyy-mm-dd hh24
:mi:ss')) time from dual;

      TIME
----------
    592844

SQL> select scn_to_timestamp(592054) "TIME" from dual;

TIME
---------------------------------------------------------------------------
09-6月 -08 01.26.50.000000000 下午

SQL> select timestamp_to_scn(to_timestamp('2008-06-09 13:50:00','yyyy-mm-dd hh24
:mi:ss')) "SCN" from dual;

       SCN
----------
    592844

SQL> select timestamp_to_scn(scn_to_timestamp(592844)) "SCN" from dual;

       SCN
----------
    592844

 

2 、表空间的剩余状态
SQL> select tablespace_name,sum(bytes)/1024/1024 "Free MB"
  2      from dba_free_space
  3  group by tablespace_name order by 2;

TABLESPACE_NAME                   Free MB
------------------------------ ----------
SYSAUX                                1.5
USERS                              1.5625
UNDOTBS1                           5.0625
SYSTEM                               5.75
EXAMPLE                           22.3125

****************************************************************************

 

 

 

总结:如果删除一个表,最简单的莫过于用oracle10g中的flashback table功能,就一条语句“flashback table emp to before drop”;如果数据是oracle9i数据库,则最好运行在归档模式下,启动闪回数据库时间记录(flashback),在mount状态下用flashback database来恢复;最后没有办法启用备份的不完全恢复来恢复数据。恢复时基于scn的恢复,可以查询v$log_history或者v$archived_log视图。select thread#,first_change#,next_change#,first_time from v$log_history;
select name,first_change#,next_change#,first_time from v$archived_log;
不完全恢复有三种:基于时间、SCN、取消
recover database until time '2008-06-08 22:10:00';
recover database until scn  '227799';
recover database until cancel;
如果使用旧的控制文件还要加using backup controlfile;


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12778571/viewspace-343098/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12778571/viewspace-343098/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值