全部博文(101)
分类: Oracle
2011-04-19 18:45:50
一.非当前的还原表空间的恢复
定义:oracle数据库系统在进行备份和恢复时要消耗大量的系统资源,特别是所操作的表空间很大
时。这样不但使维护的工作量急剧增加而且也使系统的效率下降。因此减少备份或恢复的数据量本身就是可以提高系统的效率。在oracle系统中,一些非关键的表空间可以不备份,如果这些表空间崩溃了可以重新创建他们。使用这样的策略,就可以减少备份的数据量也可以提高系统效率。
对非当前的还原表空间就可以采取这一策略。
示例:下面我将用实验来演示一下;
硬件环境:DELL笔记本电脑
操作系统:windows xp sp3
Oracle版本:10.2.0.1.0
操作如下:
SQL> select tablespace_name,status,contents from dba_tablespaces
2 where contents='UNDO';
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
UNDOTBS1 ONLINE UNDO
JINLIAN_UNDO ONLINE UNDO
JINLIAN1_UNDO ONLINE UNDO
SQL> --下面是显示当前数据库在用的还原表空间;
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 7200
undo_tablespace string UNDOTBS1
SQL> --从第三行的undo_tablespace参数可以知道undotabs1是当前在用的undo表空间;
SQL> set line 150
SQL> col file_name for a55
SQL> col tablespace_name for a15
SQL> --查询还原表空间和对应的数据文件;
SQL> select file_id,file_name,tablespace_name
2 from dba_data_files
3 where tablespace_name like '%UNDO%';
FILE_ID FILE_NAME TABLESPACE_NA
ME
---------- ------------------------------------------------------- -------------
-- ----------
2 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/UNDOTBS01.DBF UNDOTBS1
6 C:/JINLIAN_UNDO01.DBF JINLIAN_UNDO
8 C:/JINLIAN_UNDO001.DBF JINLIAN1_UNDO
SQL> conn as sysdba;
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
------------------现在我已经关闭了数据库,我要手动删除JIANLIAN_UNDO表空间下的数据文件
,然后再尝试打开数据库;
SQL> --现在开始打开数据库;
SQL> startup open;
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 201329540 bytes
Database Buffers 402653184 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'C:/JINLIAN_UNDO01.DBF'
SQL> --发现因为缺少了一个数据文件打不开了;先不管了,以加载模式打开数据库;
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> --已经是加载(mount)模式;
SQL> alter database datafile 6 offline drop;
数据库已更改。
SQL> alter database open;--完全打开数据库;
数据库已更改。
SQL> select file_id,file_name,tablespace_name from dba_data_files
2 where tablespace_name like '%UNDO%';
FILE_ID FILE_NAME TABLESPACE_NA
ME
---------- ------------------------------------------------------- -------------
--
2 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/UNDOTBS01.DBF UNDOTBS1
6 C:/JINLIAN_UNDO01.DBF JINLIAN_UNDO
8 C:/JINLIAN_UNDO001.DBF JINLIAN1_UNDO
SQL> --可以发现JIANLIAN_UNDO表空间还在,因为oracle工具也有一些缺陷,下面再次删除;
SQL> select tablespace_name,status,contents from dba_tablespaces
2 where contents='UNDO';
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
UNDOTBS1 ONLINE UNDO
JINLIAN_UNDO ONLINE UNDO
JINLIAN1_UNDO ONLINE UNDO
SQL> --下面用命令删除JINLIAN_UNDO表空间;
SQL> drop tablespace jinlian_undo;
表空间已删除。
SQL> --再次查询一下,看是否已经删除;
SQL> select tablespace_name,status,contents from dba_tablespaces
2 where contents='UNDO';
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
UNDOTBS1 ONLINE UNDO
JINLIAN1_UNDO ONLINE UNDO
SQL> --再用另外一个数据字典查询确认一下;
SQL> select file_id,file_name,tablespace_name from dba_data_files
2 where tablespace_name like '%UNDO%';
FILE_ID FILE_NAME TABLESPACE_NA
ME
---------- ------------------------------------------------------- -------------
--
2 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/UNDOTBS01.DBF UNDOTBS1
8 C:/JINLIAN_UNDO001.DBF JINLIAN1_UNDO
SQL> --确实已经删除JINLIAN_UNDO表空间了,奶奶的,终于放心了;
SQL> --下面我们可以用原来创建这个还原表空间的语句来创建这个表空间或者自己用语句
直接来创建这个表空间;
SQL> create undo tablespace jinlian_undo
2 datafile 'c:/jinlian_undo01.dbf'
3 size 10m
4 extent management local;
表空间已创建。
SQL> --为了体现谨慎的精神,再用命令查询一下,是否已经创建完成;
SQL> select file_id,file_name,tablespace_name from dba_data_files
2 where tablespace_name like '%UNDO%';
FILE_ID FILE_NAME TABLESPACE_NA
ME
---------- ------------------------------------------------------- -------------
--
2 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/UNDOTBS01.DBF UNDOTBS1
8 C:/JINLIAN_UNDO001.DBF JINLIAN1_UNDO
6 C:/JINLIAN_UNDO01.DBF JINLIAN_UNDO
SQL> select tablespace_name,status,contents from dba_tablespaces
2 where contents='UNDO';
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
UNDOTBS1 ONLINE UNDO
JINLIAN_UNDO ONLINE UNDO
JINLIAN1_UNDO ONLINE UNDO
SQL> --完成;
这样操作的意义:
有网友可能会问:一共才10M的小的表空间,使用这一方法也省不了多少时间啊!
其实不然,因为在实际的生产或商业数据库中其还原表空间可以使几GB,甚至是几十GB。在
这种情况下,节省的时间就多了。呵呵!