`
trophy
  • 浏览: 176576 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

oracle的备份与恢复 (转)

阅读更多

oracle中的不使用rman的备份恢复,看到一篇文章,虽然不全,具有启发性

转自:http://blog.csdn.net/wyzxg/archive/2010/09/06/5866786.aspx

 http://blog.csdn.net/wyzxg/archive/2010/09/06/5867313.aspx

 

===================================================================

 

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

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

B。表空间的恢复,假如损坏多个数据文件,可以通过表空间来恢复比较当便

表空间是数据文件集合的逻辑概念,表空间的恢复根据不同表空间,可以分为:

1)用户表空间恢复
2)临时表空间恢复
3)undo表空间恢复
4)系统表空间恢复


1)用户表空间恢复

SQL> shutdown abort;
ORACLE 例程已经关闭。


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 断

C:\Documents and Settings\Administrator>sqlplus "/as sysdba"

SQL*Plus: Release 10.2.0.4.0 - Production on 星期一 9月 6 16:20:21 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: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TBS_TEST03.DBF'


SQL> select * from v$recover_file;

     FILE# ONLINE  ONLINE_
---------- ------- -------
ERROR                                                                CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------
         6 ONLINE  ONLINE
FILE NOT FOUND                                                             0


         7 ONLINE  ONLINE
FILE NOT FOUND                                                             0


     FILE# ONLINE  ONLINE_
---------- ------- -------
ERROR                                                                CHANGE#
----------------------------------------------------------------- ----------
TIME
--------------


SQL> recover tablespace tbs_test1;
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 7: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TBS_TEST04.DBF'
ORA-01157: 无法标识/锁定数据文件 7 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 7: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TBS_TEST04.DBF'


SQL> recover tablespace tbs_test1;
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 6: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TBS_TEST03.DBF'
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TBS_TEST03.DBF'


SQL> recover tablespace tbs_test1;
完成介质恢复。


SQL> select * from v$recover_file;

未选定行

SQL> alter database open;

数据库已更改。

SQL>

这里用的表空间恢复命令,当然也可以用数据文件恢复命令,只不过那样会麻烦些,要一个一个文件的恢复

-------------------------------------------------------------------------------------------------

2) 临时表空间恢复

临时表空间的恢复要简单些,因为这里没有存储数据,只是用于磁盘排序和临时表,所以当临时表空间有故障可以直接删除

一般临时表空间会有一个或多个临时文件,当是一个过很少的几个临时文件损坏,就可以直接删除临时文件,如果是多个临时
文件损坏,可以重建一个临时表空间


SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
TBS_TEST1
TBS_TEST2
TEMP1

已选择9行。

SQL> select name,status from v$tempfile;

NAME
--------------------------------------------------------------------------------

STATUS
-------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP01.DBF
ONLINE

E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP02.DBF
ONLINE

E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF
ONLINE


SQL>

查看系统的默认临时表空间

SQL> select * from database_properties where property_name='DEFAULT_TEMP_TABLESP
ACE';

PROPERTY_NAME
------------------------------
PROPERTY_VALUE
--------------------------------------------------------------------------------

DESCRIPTION
--------------------------------------------------------------------------------

DEFAULT_TEMP_TABLESPACE
TEMP
Name of default temporary tablespace


SQL>


如果是临时文件坏了,可以通过增加新的临时文件,再删除损坏的临时文件;或者创建新的临时表空间,删除损坏的临时表空间

实验:用UE编辑临时表空间文件,模拟临时文件的损坏


执行一个大排序语句,好产生disk sort

SQL> insert into tabtest3 select * from tabtest3;
insert into tabtest3 select * from tabtest3
            *
第 1 行出现错误:
ORA-01653: 表 SYS.TABTEST3 无法通过 128 (在表空间 TBS_TEST1 中) 扩展

这个错误说明测试表所在的表空间不足, 那就扩展

SQL> alter tablespace tbs_test1 add datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\T
EST\TBS_TEST05.DBF' size 50m;

表空间已更改。


SQL> select * from tabtest3 order by owner;
select * from tabtest3 order by owner
              *
第 1 行出现错误:
ORA-01157: 无法标识/锁定数据文件 203 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 203: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF'


查看现有的临时文件情况:

SQL>  select  t.NAME, tf.name from v$tempfile tf,v$tablespace t
  2   where t.ts#=tf.TS#;


NAME                           NAME
------------------------------ --------------------------------------------------------------------------------
TEMP1                          E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP12.DBF
TEMP1                          E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF
SQL>


既然有两个临时文件,那就把把有问题临时文件删除


SQL> alter database tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF'
drop including datafiles;

表空间已更改。

再就可以执行排序了
SQL> select * from tabtest3 order by owner;


也可以删除临时表空间
SQL> drop tablespace temp including contents and datafiles;
drop tablespace temp including contents and datafiles
*
第 1 行出现错误:
ORA-12906: 不能删除默认的临时表空间

SQL>

创建临时表空间

SQL> create temporary tablespace temp1
  2  tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF' size 10m;

表空间已创建。


更改系统的临时表空间

SQL> alter database default temporary tablespace temp1;

数据库已更改。

查看系统的默认临时表空间


SQL> select * from database_properties where property_name='DEFAULT_TEMP_TABLESP
ACE';

PROPERTY_NAME
------------------------------
PROPERTY_VALUE
--------------------------------------------------------------------------------

DESCRIPTION
--------------------------------------------------------------------------------

DEFAULT_TEMP_TABLESPACE
TEMP1
Name of default temporary tablespace


现在默认的临时表空间是temp1,不是temp了,那现在就可以删除了temp了

SQL> drop tablespace temp including contents and datafiles;

表空间已删除。

SQL> select tablespace_name from dba_tablespaces;

TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
USERS
EXAMPLE
TBS_TEST1
TBS_TEST2
TEMP1

已选择8行。


SQL> select name from v$tempfile;

NAME
--------------------------------------------------------------------------------

E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF

SQL>


总结:

如果是删除临时数据文件,要先添加一个临时文件,在删除有故障的临时数据文件

1. SQL> alter  tablespace temp1  add tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP11.DBF' size 50m  ;
2. SQL> alter database tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP11.DBF' drop including datafiles;

如果是创建新的临时表空间的话
1. 创建一个临时表空间
   create temporary tablespace temp1 tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\TEST\TEMP10.DBF' size 10m;


2. 更改系统的默认临时表空间
   alter database default temporary tablespace temp1;


3. 删除有问题的表空间
   drop tablespace temp including contents and datafiles;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics