现在的位置: 首页 > 综合 > 正文

oracle的备份与恢复(一)

2013年10月23日 ⁄ 综合 ⁄ 共 7751字 ⁄ 字号 评论关闭

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

 

 

 

抱歉!评论已关闭.