/* 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/