NOARCHIVELOG 模式下的备份和恢复;
理论:
noarchivelog 模式具有以下特点:
该模式下只能在shutdown数据库后进行一致性备份,并且不能以abort形式(该模式出现数据库不一致)关闭数据库;
该模式下必须备份数据文件和控制文件;
在检查点完成之后,后台进程LGWR可以覆盖原有重做日志内容;
如果上一条成立,那么当数据文件出现介质失败时,只能恢复到过去的完全备份点;
该模式下相应数据文件出现介质失败的恢复分为以下几种情况:
介质失败时,自从备份以来的在线重做日志还没有被循环使用(即没有被覆盖过);这时可以完全恢复该数据文件;
介质失败时,在线重做日志已经被循环使用过,这时不能对该数据文件进行完全恢复,如果该数据文件不是特别重要,
那么可以删除该数据文件(之后再重建),是数据库的其他数据文件保持当前状态(这些数据文件数据不会丢失);如果是比较重要的数据文件,
那么就要使整个数据库回到备份点的状态;
具体步骤(备份):
1)首先查询数据字典找出数据文件和控制文件;
select * from v$datafile;
select * from v$controlfile;
2)然后以非abort模式关闭数据库;
shutdown immediate|normal|transactional;
3)拷贝刚才列出的数据文件和控制文件到备份目的地;
--直接用操作系统命令或操作进行普通的拷贝即可;
4)备份完成,启动数据库;
startup;
具体步骤(恢复)
按照理论里列出的三种情况进行恢复;
一、介质失败时,自从备份以来的在线重做日志还没有被循环使用(即没有被覆盖过);这时可以完全恢复该数据文件;
1)首先,进行恢复的前提是数据文件介质出现失败;
在数据库open阶段时会出现ORA-01157: 和 ORA-01110: 错误;大概意思就是“无法标识/锁定数据文件”,
其中alert.log里会出现类似于下列的告警记录:
ALTER DATABASE OPEN
Tue Jul 02 21:46:43 2013
Errors in file e:\oracle\product\10.2.0\admin\orcl\bdump\orcl_dbw0_5788.trc:
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
Tue Jul 02 21:46:44 2013
ORA-1157 signalled during: ALTER DATABASE OPEN...
上述错误也表明了数据库处在了mount状态,如果数据库不是这个状态,那么需要执行startup force mount 使之处于mount状态(视图v$instantce 的 STATUS 字段可以判定当前状态);
2)查询需要恢复的数据文件的文件列表:select file#,error from v$recover_file;(只有需要恢复的数据文件才会出现在该视图中)
3)这时就可以进行对需要恢复的数据文件进行反向拷贝了(像备份时一样,直接用操作系统命令或操作进行普通的拷贝即可),如果数据文件原位置磁盘损坏,那么可以拷贝至其他磁盘,
只是需要做一个改变该数据文件路径的操作: alter database rename file '源路径及文件名' to '新路径及文件名';
4)如果多个数据文件出现了介质失败,那么直接执行 recover database ; 如果是单个数据文件,那么执行recover datafile file#;
5)介质恢复完成,打开数据库即可,alter database open;
注: 才介质恢复的时候,会应用在线重做日志,需要几组,就应用几组;这时alert.log中也会有类似于下列的记录:
Tue Jul 02 21:50:05 2013
ALTER DATABASE RECOVER datafile 4
Tue Jul 02 21:50:05 2013
Media Recovery Start
parallel recovery started with 2 processes
Tue Jul 02 21:50:06 2013
Recovery of Online Redo Log: Thread 1 Group 3 Seq 769 Reading mem 0
Mem# 0: E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO03.LOG
Completed: ALTER DATABASE RECOVER datafile 4
二、介质失败时,在线重做日志已经被循环使用过,这时不能对该数据文件进行完全恢复,如果该数据文件不是特别重要,
那么可以删除该数据文件(之后再重建),是数据库的其他数据文件保持当前状态(这些数据文件数据不会丢失);
其中前两步骤与 第一种情况 一样;
3) 对相应的数据文件进行删除 alter database datafile 4 offline drop ;
4) 启动数据库即可 alter database open;
三、如果是比较重要的数据文件,那么就要使整个数据库回到备份点的状态;
其中前三步骤与 第一种情况 一样;
4) 执行数据库全恢复命令 RECOVER DATABASE UNTIL CANCEL ;由于该命令告诉数据库不再使用原有重做日志,所以需要在打开库的时候使用resetlogs 选项;
实战(第一种恢复情况)
--窗口 1
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.3.0 - Production on 星期二 7月 2 21:19:24 2013
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 767
当前日志序列 769
SQL> select file_name ,tablespace_name,bytes/1024/1024 as MB from dba_data_files;
FILE_NAME TABLESPACE_NAME MB
-------------------------------------------------------------------------------- ------------------------------ ----------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS 508.75
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX 380
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF UNDOTBS1 405
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 520
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF EXAMPLE 100
E:\TEST_TS.DBF TEST_TS 10
E:\RMAN.DBF RMAN_TAB 20
已选择7行。
SQL> select name from v$controlfile;
NAME
------------------------------------------------------------------------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL01.CTL
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL02.CTL
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROL03.CTL
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
...... 拷贝上面列出的数据文件和控制文件;
......
......
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 838860800 bytes
Fixed Size 1293384 bytes
Variable Size 734004152 bytes
Database Buffers 96468992 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
数据库已经打开。
---窗口 2
SQL> conn scott/tiger
已连接。
SQL> create table youjinge(id number);
表已创建。
SQL> insert into youjinge values (1);
已创建 1 行。
SQL> insert into youjinge values (2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from youjinge;
ID
----------
1
2
--窗口 1
SQL> select * from scott.youjinge;
ID
----------
1
2
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
删除users01.dbf
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 838860800 bytes
Fixed Size 1293384 bytes
Variable Size 734004152 bytes
Database Buffers 96468992 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 4 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 4: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF'
SQL> select * from v$instance;
INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STARTUP_TIME STATUS
--------------- ---------------- ---------------------------------------------------------------- ----------------- -------------- ------------
LOG_SWITCH_WAIT LOGINS SHU DATABASE_STATUS INSTANCE_ROLE ACTIVE_ST BLO
--------------- ---------- --- ----------------- ------------------ --------- ---
1 orcl 45394BCD93E1473 10.2.0.3.0 02-7月 -13 MOUNTED
ALLOWED NO ACTIVE PRIMARY_INSTANCE NORMAL NO
--说明数据库已经在mount状态;
SQL> select file#,error from v$recover_file;
FILE# ERROR
---------- -----------------------------------------------------------------
4 FILE NOT FOUND
SQL> host copy f:\database\user01.dbf e:\oracle\product\10.2.0\oradata\orcl\user01.dbf;
系统找不到指定的文件。
SQL> host copy f:\database\users01.dbf e:\oracle\product\10.2.0\oradata\orcl\users01.dbf;
已复制 1 个文件。
SQL> recover datafile 4;
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select * from scott.youjinge;
ID
----------
1
2
实战(第二种恢复情况)
--窗口 1
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
删除users01.dbf
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 838860800 bytes
Fixed Size 1293384 bytes
Variable Size 734004152 bytes
Database Buffers 96468992 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'E:\TEST_TS.DBF'
SQL> select file#,error from v$recover_file;
FILE# ERROR
---------- -----------------------------------------------------------------
6 FILE NOT FOUND
SQL> alter database datafile 6 offline drop;
数据库已更改。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
E:\TEST_TS.DBF
E:\RMAN.DBF
已选择7行。
SQL> alter database open;
数据库已更改。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
E:\TEST_TS.DBF
E:\RMAN.DBF
已选择7行。
SQL> select file_name from dba_data_files;
FILE_NAME
--------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
E:\TEST_TS.DBF
E:\RMAN.DBF
已选择7行。
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
RMAN_TAB
TEST_TS
已选择8行。
SQL> select file#,status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 OFFLINE
7 ONLINE
已选择7行。
--说明虽然执行了 类似的删除操作,但是只是修改了一下该数据文件的状态;控制文件和数据字典里都还存储在文件及相应表空间的信息;现在重启一下看看情况:
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 838860800 bytes
Fixed Size 1293384 bytes
Variable Size 734004152 bytes
Database Buffers 96468992 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
数据库已经打开。
SQL> select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
RMAN_TAB
TEST_TS
已选择8行。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\EXAMPLE01.DBF
E:\TEST_TS.DBF
E:\RMAN.DBF
已选择7行。
SQL> select file#,status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 OFFLINE
7 ONLINE
已选择7行。
--说明该数据文件与重启前一样; 具体参考:http://blog.csdn.net/tianlesoftware/article/details/6305600
实战(第三种恢复情况)
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
删除SYSTEM01.DBF
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 838860800 bytes
Fixed Size 1293384 bytes
Variable Size 734004152 bytes
Database Buffers 96468992 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'
反向拷贝所有数据文件和控制文件到原有位置,然后进行数据库恢复:
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> select file# ,status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
已选择7行。
SQL> select * from scott.youjinge;
select * from scott.youjinge
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
说明回到备份点的位置