全部博文(101)
分类: Oracle
2011-04-19 18:46:40
一.只读表空间的恢复
如果一个表空间是只读表空间,在该表空间上就只能进行读操作而不能做DML操作,也就是说这个
表空间上的数据是不会变化的,因为可以将该表空间的备份从日常的例行备份中取消,只要在该表
空间改为只读表空间之后做一次备份就够了。
修改表空间为只读的命令如下:
alter tablespace xxx read only;
二.临时表空间的恢复
与非当前的还原表空间相似,临时表空间也可以不做备份。如果属于某个临时表空间的文件损失或
者丢失,该临时表空间将不能使用。此时,如有SQL语句排序,那么oracle数据库系统就会报错。
丢失临时文件并不影响oracle的启动。oracle可以在丢失临时文件的情况下正常打开,在这种情况
下,oracle系统会自动创建丢失的临时文件,同时oracle会将相关信息写入报警文件。
下面我用例子来演示恢复的过程;
2.1我先打开数据库查看临时表空间存在;然后在关闭数据库,删除临时表空间里面的数据文件;
然后再尝试打开;
SQL> col file for a55
SQL> set line 120
SQL> col tablespace for a15
SQL> select f.file#,t.ts#,f.name "FILE",t.name "Tablespace"
2 from v$tempfile f,v$tablespace t
3 where f.ts#=t.ts#;
FILE# TS# FILE Ta
blespace
---------- ---------- ------------------------------------------------------- --
-------------
1 3 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/TEMP01.DBF TE
MP
2 10 C:/JINLIAN_TEMP01.DBF JI
NLIAN_TEMP
SQL> -查看那个是默认临时表空间;
SQL> col property_name for a20
SQL> col property_value for a13
SQL> col description for a50
SQL> set line 100
SQL> select * from database_properties
2 where property_name like 'DEFAULT%';
PROPERTY_NAME PROPERTY_VALU DESCRIPTION
-------------------- ------------- ---------------------------------------------
-----
DEFAULT_TEMP_TABLESP TEMP Name of default temporary tablespace
ACE
DEFAULT_PERMANENT_TA USERS Name of default permanent tablespace
BLESPACE
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
SQL> --从description中可以看出TEMP是默认临时表空间;
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
下面我手动删除了默认临时表空间的数据文件;
然后我开始打开数据库;
SQL> startup open;
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 205523844 bytes
Database Buffers 398458880 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL> col file for a55
SQL> set line 120
SQL> col tablespace for a15
SQL> select f.file#,t.ts#,f.name "FILE",t.name "Tablespace"
2 from v$tempfile f,v$tablespace t
3 where f.ts#=t.ts#;
FILE# TS# FILE Ta
blespace
---------- ---------- ------------------------------------------------------- --
-------------
1 3 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/TEMP01.DBF TE
MP
2 10 C:/JINLIAN_TEMP01.DBF JI
NLIAN_TEMP
SQL> --发现TEMP临时数据文件是有的,为了确认我们再查询一下;
SQL> col tablespace_name for a15
SQL> select tablespace_name,status,contents from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
--------------- --------- ---------
SYSTEM ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
SYSAUX ONLINE PERMANENT
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
JINLIAN ONLINE PERMANENT
JINLIAN_UNDO ONLINE UNDO
JINLIAN_INDEX ONLINE PERMANENT
JINLIAN1_UNDO ONLINE UNDO
JINLIAN_TEMP ONLINE TEMPORARY
HFTB ONLINE PERMANENT
已选择11行。
SQL> --确实TMEP表空间是存在的;因为数据库在启动时会再次创建默认临时表空间的;
SQL> --我们再看一下,现在的TMEP是否还是默认临时表空间;
SQL> col property_name for a20
SQL> set line 100
SQL> col property_value for a13
SQL> col description for a50
SQL> select * from database_properties
2 where property_name like 'DEFAULT%';
PROPERTY_NAME PROPERTY_VALU DESCRIPTION
-------------------- ------------- ---------------------------------------------
-----
DEFAULT_TEMP_TABLESP TEMP Name of default temporary tablespace
ACE
DEFAULT_PERMANENT_TA USERS Name of default permanent tablespace
BLESPACE
DEFAULT_TBS_TYPE SMALLFILE Default tablespace type
SQL> --确实,TEMP还是默认的临时表空间,它并没有被JINLIAN_TEMP临时表空间取代成为默认临
时表空间;
SQL> --完成;
为了让网友相信,我将数据库报警日志中的代码贴出来以证明这个新的临时数据文件是新建的;
SMON: enabling tx recovery
Sat Apr 02 16:14:41 2011
Re-creating tempfile E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/TEMP01.DBF
Database Characterset is ZHS16GBK
----------------------------------------------------
2.2需要注意的是,我需要关闭数据,然后启动才能生成新的临时数据文件,但对于那些24小时
7天的数据库,我们是不可以关闭数据库的。那该如果恢复临时表空间了?
步骤如下:
假设因为临时表空间TEMP的数据文件temp01.dbf坏了,导致数据库无法排序;
我们可以如下操作:
SQL> alter tablespace temp add tempfile
2 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/TEMP02.DBF'
3 size 50m;
表空间已更改。
SQL> --注意,这里不能用原来的temp01.dbf的名字了,因为它虽然坏了,但操作系统文件
还是存在的,必须不同名;
SQL> --删除坏的临时数据文件;
SQL> alter tablespace temp drop tempfile
2 'E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/TEMP01.DBF';
表空间已更改。
SQL> --确认查看一下现在的TEMP表空间下的数据文件是哪个?
SQL> col file for a55
SQL> set line 120
SQL> col tablespace for a15
SQL> select f.file#,t.ts#,f.name "FILE",t.name "Tablespace"
2 from v$tempfile f,v$tablespace t
3 where f.ts#=t.ts#;
FILE# TS# FILE Ta
blespace
---------- ---------- ------------------------------------------------------- --
-------------
3 3 E:/ORACLE/PRODUCT/10.2.0/ORADATA/JACKY/TEMP02.DBF TE
MP
2 10 C:/JINLIAN_TEMP01.DBF JI
NLIAN_TEMP
SQL> --成功了,现在的已经是新的临时数据文件了。呵呵!