【Thomas学习】Oracle数据库临时文件探究
Oracle 中的临时数据文件是一种特殊类型的数据文件,我们知道oracle使用临时文件来存放大规模排序操作和散列操作的中间结果,如果内存中没有足够的空间,还会用临时文件存储全局临时表数据或结果集数据,普通的表和索引是不会存放在临时文件中的,但是临时表中的数据及其索引要存储在临时文件中,不过在数据字典中无法查询到临时表的所在表空间是否为临时表空间,临时表在创建过程中也不可以指定其表空间,见下:
SYS@db10g>CREATE GLOBAL TEMPORARY TABLE temp_test ON COMMIT PRESERVE ROWS AS SELECT * FROM dba_objects; Table created. SYS@db10g>select table_name,tablespace_name,TEMPORARY from user_tables where table_name='TEMP_TEST'; TABLE_NAME TABLESPACE_NAME T ------------------------------ -------------------- - TEMP_TEST Y
对于临时文件的操作不会生成redo,不过可以生成redo(undo总是受redo的“保护”,undo数据就像是表数据和索引数据一样,对undo的修改会生成一些redo,而这些redo会记入日志-TOM)。其实丢失临时表空间的恢复代价几乎没有,丢失了直接重建,或者数据库在启动的时候如果发现丢失临时文件干脆自动重建临时文件并在alert日志中写入:
Thu Aug 16 23:21:27 2012 Re-creating tempfile /u01/app/oracle/oradata/db10g/temp01.dbf Re-creating tempfile /u01/app/oracle/oradata/db10g/temp_test.dbf
需要注意的是在linux系统中,oracle创建临时文件是使用的稀疏创建方式,即在需要之前不会真正占用磁盘存储空间,可以使用linux的磁盘空闲空间查看工具df命令实验
SYS@db10g>!df -h /u01/app/oracle/oradata/db10g Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 45G 19G 24G 44% /
现在创建一个2g的临时文件
SYS@db10g>create temporary tablespace temp_test tempfile 2 '/u01/app/oracle/oradata/db10g/temp_test.dbf' size 2048m; Tablespace created.
再次查看磁盘空闲空间发现没有变化,但是ls命令确实可以看到显示文件的大小为2G
SYS@db10g>!df -h /u01/app/oracle/oradata/db10g Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 45G 19G 24G 44% / SYS@db10g>!ls -lh /u01/app/oracle/oradata/db10g/temp_test.dbf -rw-r----- 1 oracle oinstall2.1GAug 16 22:53 /u01/app/oracle/oradata/db10g/temp_test.dbf
而实际上这样的创建方式很有可能早成空间使用隐患,一旦这个临时文件被使用,磁盘空间会膨胀,之后的临时文件大小也会一直保持膨胀后的大小,对于需要处理这种问题的情况通常我们可以使用dd在文件中填入数据,这样,操作系统就会为文件分配物理磁盘空间了,或者可以使用cp命令使其变成一个非稀疏的文件,这样可以一定程度上降低隐患,cp方式如下:
SYS@db10g>!ls -lh /u01/app/oracle/oradata/db10g/temp_test.dbf -rw-r----- 1 oracle oinstall 2.1G Aug 16 22:53 /u01/app/oracle/oradata/db10g/temp_test.dbf SYS@db10g>!cp --sparse=never /u01/app/oracle/oradata/db10g/temp_test.dbf /u01/app/oracle/oradata/db10g/temp_test_real.dbf SYS@db10g>!df -h /u01/app/oracle/oradata/db10g Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 45G 21G 22G 49% / SYS@db10g>drop tablespace temp_test including contents and datafiles; Tablespace dropped. SYS@db10g>create temporary tablespace temp_test tempfile '/u01/app/oracle/oradata/db10g/temp_test_real.dbf' reuse; Tablespace created.
本文版权由作者Beanbee和博客园共同所有,转载请注明出处。
来自【Beanbee的博客】:http://www.cnblogs.com/beanbee/