ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Sparse File

Sparse File

原创 Linux操作系统 作者:westzq1984 时间:2009-11-16 15:36:15 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/8242091/viewspace-619756/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-06

  • 博文量
    251
  • 访问量
    1042177