author:skate
time:2010-09-06
oracle的备份与恢复
基于我个人的理解把恢复分为来两大类:
1. 基于备份的恢复
这种基于备份饿恢复是指通过备份文件,redo,archivelog等来实现备份。
2. 没有备份的恢复
没有备份的恢复是指不利用备份文件(备份文件,redo,archivelog)的恢复。也就是非常规的恢复,强制打开数据库
但是根据恢复时丢失数据的多少,也可以分为完全恢复和不完全恢复
1. 基于备份的恢复
基于备份的恢复相对很简单,根据损坏的文件和恢复时间,oracle提供很多方式
A。数据文件的恢复(包括datafile,undofile)
B。表空间的恢复,假如损坏多个数据文件,可以通过表空间来恢复比较当便
C。数据库的恢复,基于数据库的恢复,这个恢复动作较大
D。数据块恢复
E。没有备份文件,利用redo,archivelog恢复数据文件
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
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;
-------end------