从上面的文档可以看出,在v$tempfile和v$datafile中file#均代表绝对文件好,而rfile#代表相对文件号,下面来验证一下:
SQL> l
1* select file#,name from v$tempfile
SQL> /
FILE# NAME
---------- ------------------------------------------------------------
1 /home/app/oraten/oradata/oraten/temp01.dbf
SQL> select file#,name from v$datafile;
FILE# NAME
---------- ------------------------------------------------------------
1 /home/app/oraten/oradata/oraten/system01.dbf
2 /home/app/oraten/oradata/oraten/undotbs01.dbf
3 /home/app/oraten/oradata/oraten/sysaux01.dbf
4 /home/app/oraten/oradata/oraten/users01.dbf
5 /home/app/oraten/oradata/oraten/test01.dbf
在v$datafile和v$tempfile中都存在绝对文件号为1的文件,这显然是不对的。
我们知道在文件无法访问时,oracle会报错并在错误信息中显示有关文件的信息,下面我们来模拟临时文件的故障
[oraten@yue oraten]$ chmod 000 temp01.dbf [oraten@yue oraten]$ ll 总用量 932180 -rw-r----- 1 oraten dba 7061504 11月 7 13:59 control01.ctl -rw-r----- 1 oraten dba 7061504 11月 7 13:59 control02.ctl -rw-r----- 1 oraten dba 7061504 11月 7 13:59 control03.ctl -rw-r----- 1 oraten dba 52429312 11月 7 13:44 redo01.log -rw-r----- 1 oraten dba 52429312 11月 7 13:54 redo02.log -rw-r----- 1 oraten dba 52429312 11月 7 13:44 redo03.log -rw-r----- 1 oraten dba 272637952 11月 7 13:49 sysaux01.dbf -rw-r----- 1 oraten dba 461381632 11月 7 13:49 system01.dbf ---------- 1 oraten dba 20979712 11月 7 13:39 temp01.dbf -rw-r----- 1 oraten dba 10493952 11月 7 13:44 test01.dbf -rw-r----- 1 oraten dba 26222592 11月 7 13:49 undotbs01.dbf -rw-r----- 1 oraten dba 5251072 11月 7 13:44 users01.dbf强制启动 数据库
SQL> startup force ORACLE instance started. Total System Global Area 134217728 bytes Fixed Size 2094544 bytes Variable Size 88082992 bytes Database Buffers 37748736 bytes Redo Buffers 6291456 bytes Database mounted. Database opened. SQL>创建临时表,并插入数据
SQL> insert into t1 select * from user_tables;
insert into t1 select * from user_tables
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 101 - see DBWR trace file
ORA-01110: data file 101: '/home/app/oraten/oradata/oraten/temp01.dbf' 呵呵,临时文件无法访问,在这里显示的文件号为101,为什么那?
我们将参数 db_files修改为200,继续实验
SQL> show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 100
SQL> alter system set db_files=200 scope=spfile;
System altered.
SQL> startup force
ORACLE instance started.
Total System Global Area 134217728 bytes
Fixed Size 2094544 bytes
Variable Size 88082992 bytes
Database Buffers 37748736 bytes
Redo Buffers 6291456 bytes
Database mounted.
Database opened.
SQL> insert into t1 select * from user_tables;
insert into t1 select * from user_tables
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/home/app/oraten/oradata/oraten/temp01.dbf'
原来,v$tempfile中的file#并不是绝对文件号,临时文件的绝对文件号是file#+db_files参数。
打完手工!!