Sparse File是什么,稀疏文件,也就是说,是一个拥有空的空间的文件,磁盘块将并没分配给这些文件
如果这些空的空间填满ASCII的NULL字符,那么文件才会是实际的大小。
看一个例子:
ods_etl[/telephone_cdr/827/200906/CDMA/098]#du -sk telephone_cdr.data.idx
4528 telephone_cdr.data.idx
ods_etl[/telephone_cdr/827/200906/CDMA/098]#ls -l telephone_cdr.data.idx
-rw-r--r-- 1 qywtest staff 93992640 Jul 09 20:10 telephone_cdr.data.idx
ls看到的是文件的属性,该文件属性上分配了91789.6875KB的空间
du看到的是磁盘上分配的文件大小,为4528KB
用fileplace可以看一个文件的实际数据块分布
这是一个Sparse File的输出
ods_etl[/telephone_cdr/827/200906/CDMA/098]#fileplace telephone_cdr.data.idx
File: telephone_cdr.data.idx Size: 93992640 bytes Vol: /dev/lv_827new
Blk Size: 4096 Frag Size: 4096 Nfrags: 1126
Logical Extent
--------------
00799747 1 frags 4096 Bytes, 0.1%
00788026 1 frags 4096 Bytes, 0.1%
00797170 1 frags 4096 Bytes, 0.1%
00806124 1 frags 4096 Bytes, 0.1%
00806927 1 frags 4096 Bytes, 0.1%
00760691 1 frags 4096 Bytes, 0.1%
00803861 1 frags 4096 Bytes, 0.1%
00756390-00756391 2 frags 8192 Bytes, 0.2%
00790716 1 frags 4096 Bytes, 0.1%
00799721-00799722 2 frags 8192 Bytes, 0.2%
00788778 1 frags 4096 Bytes, 0.1%
00769734 1 frags 4096 Bytes, 0.1%
00806839 1 frags 4096 Bytes, 0.1%
00830673 1 frags 4096 Bytes, 0.1%
00806962 1 frags 4096 Bytes, 0.1%
00806789 1 frags 4096 Bytes, 0.1%
00770583 1 frags 4096 Bytes, 0.1%
对比看下一个实文件的
ods_etl[/tmp]#fileplace cel373670_s2.err
File: cel373670_s2.err Size: 43 bytes Vol: /dev/hd3
Blk Size: 4096 Frag Size: 4096 Nfrags: 1
Logical Extent
--------------
00065475 1 frags 4096 Bytes, 100.0%
在来说一说Sparse File的空间分配,这种文件只是分配出一个属性,而并没有分配实际的数据文件块。也就是,其在实际文件系统中并没有占用那么大的空间。在有数据需要写入该文件时,磁盘数据块才会分配给该文件。如果此时文件系统没有足够的空间,那么就算该文件没有达到分配的容量,也无法在写入而报错
今天就遇到了在文件系统上的一个数据库报错
Mon Nov 16 10:19:26 2009
Errors in file /home/oracle/app/oracle/admin/edw_temp/udump/edw_temp_ora_1007834.trc:
ORA-01114: IO error writing block to file 20001 (block # 800137)
ORA-27063: skgfospo: number of bytes read/written is incorrect
IBM AIX RISC System/6000 Error: 28: No space left on device
Additional information: -1
Additional information: 253952
ORA-01114: IO error writing block to file 20001 (block # 800137)
ORA-27063: skgfospo: number of bytes read/written is incorrect
IBM AIX RISC System/6000 Error: 28: No space left on device
Additional information: -1
Additional information: 253952
ORA-01114: IO error writing block to file 20001 (block # 800137)
ORA-27063: skgfospo: number of bytes read/written is incorrect
IBM AIX RISC System/6000 Error: 28: No space left on device
Additional information: -1
Additional information: 253952
ORA-01114: IO error writing block to file 20001 (block # 800137)
ORA-27063: skgfospo: number of bytes read/written is incorrect
IBM AIX RISC System/6000 Error: 28: No space left on device
Additional information: -1
Additional information: 253952
一看file_id,这么大一般都是临时文件。
继续看文件系统,该文件系统已经满了
在看该临时表空间的属性,是自动扩展的,开始我就以为是这个自动扩展的问题,于是就把自动扩展关闭了
但是数据库还是继续在报错,我才仔细看了下,该TEMP文件有8192MB,现在使用了6434MB。
这就是一个典型的Sparse File问题。临时文件虽然给了8192M,但是临时文件建立的时候,并不像数据文件,对文件进行一个格式化。这就是为了什么临时文件建立的很快,而数据文件很慢的原因。因为没有格式化,就没有分配块给该文件,所以临时文件其实就是一个Sparse File。当文件系统分配满了后,在想使用临时文件时,临时文件将没有数据块分配,所以报这个错
解决方法就不说了,如果无法缩小,就重建一个了事
看一看临时文件的属性
qry_app3[/oradata/data02]ls -l TEMP02.dbf
-rw-r----- 1 oracle dba 4980744192 Nov 16 15:15 TEMP02.dbf
qry_app3[/oradata/data02]du -sk TEMP02.dbf
337996 TEMP02.dbf
最后说下,像cp,dd这种拷贝命令,将不会理会Sparse File,其拷贝出来的文件大小和ls看到的一致
要以Sparse File的属性来移动Sparse File,貌似方法只有用tar/cpio来备份文件,在用pax来还原文件才行
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8242091/viewspace-619756/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8242091/viewspace-619756/