如果一个表空间是只读表空间,那么在该表空间上只能进行读操作而不能做DML操作,也就是说在这个表空间上的数据是不会变化的,因此就可以将该表空间的备份从日常的例行备份中取消,而只是在该表空间改为只读表空间之后做一次备份就够了。这不但减少了数据库系统的维护工作量还使系统的负荷减轻。还有操作只读表空间上的数据时不会产生重做操作也不用加锁,这也就提高了系统的效率。
在这里需要指出的是在将一个表空间改为只读表空间之前和之后,最好将数据库的控制文件做备份,因为表空间的状态的变化会写到控制文件中,表空间改为只读表空间之前和之后的控制文件中记录的这个表空间的状态信息是不一样的。
与非当前的还原表空间相似,临时表空间也可以不做备份。如果属于某个临时表空间的文件损坏或丢失,该临时表空间将不能使用。此时,如果有SQL语句使用这一临时表空间(如大规模排序),Oracle数据库系统就会报错。丢失临时文件并不影响Oracle数据库的启动,Oracle数据库可以在丢失临时文件的情况下正常打开。在这种情况下,Oracle数据库系统会自动地创建丢失的临时文件,同时Oracle会将相关的信息写入报警文件(alert log)。
下面还是通过例子来演示这种恢复的方法。首先必须应SYS用户登录Oracle数据库系统,因为在后面的操作中要关闭数据库。SQL> conn system/yang as sysdba
已连接。
SQL> select file#,ts#,name
2 from v$tempfile;
FILE# TS# NAME
---------- ---------- ------------------------------------------
1 3 F:\APP\YANG\ORADATA\ORACL\TEMP01.DBF
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
接下来,利用操作系统工具,在操作系统上删除临时表空间TEMP所对应的临时文件(操作系统文件)F:\APP\YANG\ORADATA\ORACL\TEMP01.DBF 。随后,立即启动Oracle数据库系统。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 535662592 bytes
Fixed Size 1334380 bytes
Variable Size 146801556 bytes
Database Buffers 381681664 bytes
Redo Buffers 5844992 bytes
数据库装载完毕。
数据库已经打开。
SQL> select file#,ts#,name
2 from v$tempfile;
FILE# TS# NAME
---------- ---------- ------------------------------------------
1 3 F:\APP\YANG\ORADATA\ORACL\TEMP01.DBF
显示输出的结果可以看出:临时表空间TEM和与之所对应的临时文件F:\APP\YANG\ORADATA\ORACL\TEMP01.DBF 现在都健在。列出所有表空间以及与之对应的状态信息
SQL> select tablespace_name,status,contents
2 from dba_tablespaces;
TABLESPACE_NAME STATUS CONTENTS
------------------------------ --------- ---------
SYSTEM ONLINE PERMANENT
SYSAUX ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT
EXAMPLE ONLINE PERMANENT
已选择6行。
到此为止,可以确信我们已经成功的恢复了临时表空间TEMP。