author:skate
time:2010-09-06
oracle的备份与恢复
基于我个人的理解把恢复分为来两大类:
1. 基于备份的恢复
这种基于备份饿恢复是指通过备份文件,redo,archivelog等来实现备份。
2. 没有备份的恢复
没有备份的恢复是指不利用备份文件(备份文件,redo,archivelog)的恢复。也就是非常规的恢复,强制打开数据库
但是根据恢复时丢失数据的多少,也可以分为完全恢复和不完全恢复
1. 基于备份的恢复
基于备份的恢复相对很简单,根据损坏的文件和恢复时间,oracle提供很多方式
A。数据文件的恢复(包括datafile,undofile)
B。表空间的恢复,假如损坏多个数据文件,可以通过表空间来恢复比较当便
C。数据库的恢复,基于数据库的恢复,这个恢复动作较大
D。数据块恢复
E。没有备份文件,利用redo,archivelog恢复数据文件
A。数据文件的恢复(包括datafile,undofile)
创建测试表
SQL> create table tabtest1 tablespace tbs_test1 as select * from tab;
表已创建。
SQL> select count(1) from tabtest1;
COUNT(1)
----------
3678
SQL>
关闭数据库
SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL>
SQL>
这个是时候在退出sqlplus窗口,否则你更改数据文件名时会提示文件正在被使用
SQL> quit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
开
修改数据文件名称,模拟数据文件损坏,在这里我修改UNDOTBS01.DBF和TBS_TEST03.DBF,意思是这里有两个数据文件损坏
登录数据库,打开数据库会报错
C:/Documents and Settings/Administrator>sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on 星期一 9月 6 14:29:44 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF'
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_
---------- ------- -------
ERROR CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------
2 ONLINE ONLINE
FILE NOT FOUND 0
6 ONLINE ONLINE
FILE NOT FOUND 0
FILE# ONLINE ONLINE_
---------- ------- -------
ERROR CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------
从alertlog日志也可以了解到错误信息:
.....
ALTER DATABASE OPEN
Mon Sep 06 14:30:17 2010
Errors in file e:/oracle/product/10.2.0/admin/test/bdump/test_dbw0_3544.trc:
ORA-01157: cannot identify/lock data file 2 - see DBWR trace file
ORA-01110: data file 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
.......
通过错误信息可以知道数据文件2,6已经损坏,其中文件2是回滚段数据,再有备份条件下,可以把它当成普通的数据文件来恢复。
SQL> recover datafile 2;
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF'
ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF'
把UNDOTBS01.DBF文件名改回程原来的名字,也就相当于把备份文件copy回来,接下来就在备份文件UNDOTBS01.DBF的基础上,利用log来恢复
SQL> recover datafile 2;
完成介质恢复。
SQL> select name ,open_mode from v$database;
NAME OPEN_MODE
--------- ----------
TEST MOUNTED
在查看你下,现在还有几个需要恢复的文件
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_
---------- ------- -------
ERROR CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------
6 ONLINE ONLINE
FILE NOT FOUND 0
SQL> select name ,status from v$datafile;
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSTEM01.DBF
SYSTEM
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSAUX01.DBF
ONLINE
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/USERS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/EXAMPLE01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/TBS_TEST03.DBF
ONLINE
已选择6行。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/TBS_TEST03.DBF'
SQL> select name ,status from v$datafile;
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSTEM01.DBF
SYSTEM
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSAUX01.DBF
ONLINE
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/USERS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/EXAMPLE01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/TBS_TEST03.DBF
ONLINE
已选择6行。
把TBS_TEST03.DBF的文件名也copy回来,在这里就是把文件名改回来,然后再恢复
SQL> recover datafile 6;
完成介质恢复。
SQL> select name ,status from v$datafile;
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSTEM01.DBF
SYSTEM
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSAUX01.DBF
ONLINE
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/USERS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/EXAMPLE01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/TBS_TEST03.DBF
ONLINE
已选择6行。
看看还有需要恢复的文件吗?
SQL> select * from v$recover_file;
未选定行
即然没有需要再恢复的文件了,那就打开数据库
SQL> alter database open;
数据库已更改。
数据打开了,那就检查下数据库是否正常,数据是有丢失
SQL> select name,open_mode from v$database;
NAME OPEN_MODE
--------- ----------
TEST READ WRITE
SQL> select count(1) from tabtest;
COUNT(1)
----------
3678
SQL>
ok!!!
需要考虑,普通的数据文件都可以通过备份来恢复,但是回滚段数据文件,在里没有未提交的事务可以当作普通数据文件,那如果里面
有未提交的食物该如何处理?
理论分析,在回滚段里有未提交的事务时,回滚段数据出问题;这个时候,数据的更改已经记录到redo中。在数据库再次启动的时候,oracle会通过控制文件和数据文件的cnt和scn比对来确定哪些文件需要恢复,如果确定undo数据文件需要恢复,oracle就执行instance recover ,smon进程读取log文件通过前滚/回滚来完成数据库的自动恢复,但是如果这个时候发现undo数据文件无法锁定读取的时候,可以通过备份来恢复。即,由dba手动完成读取log来恢复数据库。
那接下来就在实验下:
会话1:
SQL> select object_name from tabtest3 where object_name='testx';
未选定行
SQL> update tabtest3 set object_name='testx' where object_name='TABTEST2';
已更新 1 行。
SQL> update tabtest3 set object_name='testx' where object_name='TABTEST3';
已更新 1 行。
SQL> select object_name from tabtest3 where object_name='testx';
OBJECT_NAME
--------------------------------------------------------------------------------
testx
testx
SQL>
会话2:
SQL> select object_name from tabtest3 where object_name='testx';
未选定行
模拟断电故障
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 断
开
更改UNDOTBS01.DBF的名字模拟undo数据文件损坏
C:/Documents and Settings/Administrator>sqlplus "sys/aibo as sysdba"
SQL*Plus: Release 10.2.0.4.0 - Production on 星期一 9月 6 15:15:14 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 574619648 bytes
Fixed Size 1297944 bytes
Variable Size 234881512 bytes
Database Buffers 331350016 bytes
Redo Buffers 7090176 bytes
数据库装载完毕。
ORA-01113: 文件 2 需要介质恢复
ORA-01110: 数据文件 2: 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF'
把UNDOTBS01.DBF' copy回来,这里把名字改回来就可以
SQL> recover datafile 2;
完成介质恢复。
SQL> select name,status from v$datafile;
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSTEM01.DBF
SYSTEM
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSAUX01.DBF
ONLINE
NAME
--------------------------------------------------------------------------------
STATUS
-------
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/USERS01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/EXAMPLE01.DBF
ONLINE
E:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/TBS_TEST03.DBF
ONLINE
已选择6行。
SQL> alter database open;
数据库已更改。
SQL> select object_name from tabtest3 where object_name='testx';
未选定行
数据已经打开,并回复到数据库故障点状态,未提交的也都回滚
总的来说,在有备份条件下,数据文件(包括undo数据文件)的恢复还是很简单的。
数据文件恢复的条件:数据文件必须处于offlie状态或者数据库mount
------end------