eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« Where Are The Controlfile 'Max' Parameters Stored? | Blog首页 | 瑞典游记-别章-丹麦哥本哈根游记 Part V »

Sparse File And Oracle temporary tablespaces
modb.pro

有朋友在Itpub上提出这样一个问题:unix 冷备,但出来的副本里temp01.dbf 文件变大了?

问题内容如下:


下面是原文件夹里查看到的结果:
# cd /md/md1/oracle/proddata
# ls -l temp01.dbf
-rw-r----- 1 oracle dba 14050926592 8月 16 01:24 temp01.dbf
# du -sk temp01.dbf
267176 temp01.dbf

下面是副本文件夹里查看到的结果:
# cd /u1/oracle/proddata
# ls -l temp01.dbf
-rw-r----- 1 oracle dba 14050926592 8月 16 07:52 temp01.dbf
# du -sk temp01.dbf
13728320 temp01.dbf
#

实际上这是Unix/Linux的一个特性,Oracle的临时表空间,初始创建时,比如你指定14G,这个空间是延后分配的。
只是文件创建时,file header/inode信息记录了这个大小,ls信息来自于此,而du 看的大小是计算实际使用的空间,所以可能不同于ls的结果。

而一旦你copy复制出来,空间必须立即分配,就是你你创建临时表空间/扩展的大小。

当然我们备份时是完全可以不备份临时表空间的。

这个特性在Unix/Linux上称为:Sparse File(稀疏文件)。
对于Windows操作系统,大部分(较新)版本同样支持稀疏文件。可以使用fsutil工具验证Windows是否支持稀疏文件:

C:\>fsutil fsinfo volumeinfo c:\
卷名 : SYSTEM
卷序列号 : 0x1ce0895c
组件长度最大值 : 255
文件系统名 : NTFS
支持区分大小写的文件名
保留文件名的大小写
支持文件名中的 Unicode
保留并加强 ACL
支持基于文件的压缩
支持磁盘配额
支持稀疏文件
支持重分析点
支持对象标识符
支持加密文件系统
支持带有名称的数据流

通过稀疏文件,Oracle可以快速创建临时表空间,但是同时也存在隐患,那就是如果将来文件使用时分配空间,而空间不足时将会出现错误。

如果创建时希望分配确定的空间,可以通过创建->删除表空间->再次创建制定reuse子句,此时Oracle将按指定大小一次分配存储空间。

在Solaris上,可以使用mkfile命令加上-n参数创建sparse文件:

NAME mkfile - create a file

SYNOPSIS
mkfile [ -nv ] size [ k | b | m ] filename ...

DESCRIPTION
mkfile creates one or more files that are suitable for use
as NFS-mounted swap areas, or as local swap areas. When a
root user executes mkfile(), the sticky bit is set and the
file is padded with zeros by default. When non-root users
execute mkfile(), they must manually set the sticky bit
using chmod(1). The default size is in bytes, but it can be
flagged as kilobytes, blocks, or megabytes, with the k, b,
or m suffixes, respectively.

OPTIONS
-n Create an empty filename. The size is noted, but disk
blocks are not allocated until data is written to
them. Files created with this option cannot be swapped
over local UFS mounts.

简单测试如下:
$ df -k /export/home
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c1t0d0s7 8263373 6682413 1498327 82% /export/home
$ pwd
/export/home/gqgai
$ mkfile -n 2000m sparsefile.dbf
$ ls -l sparsefile.dbf
-rw------- 1 gqgai maintain 2097152000 Aug 16 22:31 sparsefile.dbf
$ df -k /export/home
Filesystem kbytes used avail capacity Mounted on
/dev/dsk/c1t0d0s7 8263373 6682437 1498303 82% /export/home

Tom在他的网站上有一篇帖子论及这个问题。


历史上的今天...

By eygle on 2005-08-16 22:25 | Comments (16) | Internal | 392 |

16 Comments

sparse file 进行cp后还应该是sparse file吧。
[root@csdba dbtest]# ll -h temp.dbf
-rw-r----- 1 oracle oinstall 101M Aug 16 22:00 temp.dbf
[root@csdba dbtest]# du -h temp.dbf
9.1M temp.dbf
[root@csdba dbtest]# cp temp.dbf temp.dbf.bak

[root@csdba dbtest]# ll -h temp.dbf*
-rw-r----- 1 oracle oinstall 101M Aug 16 22:00 temp.dbf
-rw-r----- 1 root root 101M Aug 16 23:58 temp.dbf.bak
[root@csdba dbtest]# du -h temp.dbf*
9.1M temp.dbf
9.1M temp.dbf.bak

我怀疑他碰到的情况是不是有人在他备份后重建过ts

你的测试环境是Linux吧?

Unix上不是这样的,你看一下我在Solaris上的结果:
$ mkfile -n 10m a.dbf
$ cp a.dbf a.dbf.bak
$ ls -l
total 20534
-rw------- 1 gqgai maintain 10485760 Aug 17 08:58 a.dbf
-rw------- 1 gqgai maintain 10485760 Aug 17 08:58 a.dbf.bak
-rw-r--r-- 1 gqgai maintain 124 Apr 27 2004 local.cshrc
-rw-r--r-- 1 gqgai maintain 607 Apr 27 2004 local.login
-rw-r--r-- 1 gqgai maintain 582 Apr 27 2004 local.profile
$ du -sk a.*
16 a.dbf
10248 a.dbf.bak

对,我用的是linux做的测试。
刚在aix上试着创建sparse file,结果aix hang了,晕倒。
dd if=/dev/random of=1.dmp bs=1024k seek=17 count=3

就这么一条语句,然后一个cpu就被耗光,kill -9也杀不掉,只能重启。

这个应该是跟 cp 本身有关系了,linux 下可以支持 sparse file 拷贝

对,linux cp可以加--sparse=when的子句,可能unix里限制了--sparse=never

Sparse files may require much more media space and copy time when backed up. Larger tapes must be used and filesystem downtime may grow too long.

Sparse files are eventually expanded when copied (cp, cpio), moved (mv) or restored (tar, cpio, dd). This wastes disk space and disks may be too small for the restores.

Executable loaders of some Unix implementations seem to have problems with sparse executable files.

It is not evident how much disk space an application will eventually occupy, if disk space is reserved in form of sparse files.

Network filesystems may not properly implement the lseek feature, or the target filesystem may not be able to create sparse files.


linux应该对sparse file的cp等命令做了改进了。

aix上提供了pax命令解决了sparse file的备份恢复问题

db150_stb:/home/oracle>$ls -l 1.dmp
-rw-r--r-- 1 oracle DBA 1025024 Aug 17 12:15 1.dmp
db150_stb:/home/oracle>$du -k 1.dmp
16 1.dmp

db150_stb:/home/oracle>$pax -r -w 1.dmp temp/


db150_stb:/home/oracle>$ls -l temp/1.dmp
-rw-r--r-- 1 root system 1025024 Aug 17 12:15 temp/1.dmp
db150_stb:/home/oracle>$du -l temp/1.dmp
8 temp/1.dmp

其他unix应该也会有类似的处理方法。

Linux的cp对sparse file具有天生的免疫力:
By default, sparse SOURCE files are detected by a crude heuristic and
the corresponding DEST file is made sparse as well. That is the behav-
ior selected by --sparse=auto. Specify --sparse=always to create a
sparse DEST file whenever the SOURCE file contains a long enough
sequence of zero bytes. Use --sparse=never to inhibit creation of
sparse files.

呵呵,man cp里面有的,linux对这种小细节做的还是不错的

en,我就是从man里面cp出来的:)

还找到一段文字录在这里供参考:

GNU的tar與cp在處理sparse file時之比較

張毓麟

前言

“sparse file”就字面上的意義而言是“稀疏檔案”,它的性質
上就好比數學上的Sparse Matrix(稀疏矩陣)一樣,裡面有些空洞
的地方。sparse file最常出現在軟體的中介資料檔案,或是軟體執
行過程中的暫存檔案。當程式在儲存檔案的過程中,進行檔案指標
跳躍的動作,就會在檔案中造成不存有資料的空洞。

以下以一小段C程式碼,來示範產生一個sparse file:

write(fd,"1234567890",10);lseek(fd,102400,SEEK_CUR);
write(fd,"1234567890",10);

GNU tar與cp對sparse file的default 處理方法

GNU的cp對於sparse file會自動判斷,並採行適當的方法處理;
但是tar並不會自動判斷這種檔案型態,總是以普通檔案的型態來
處理sparse file。因此,在使用tar處理sparse file時,若不特
別加上參數,便會發生sparse file中空洞被填滿的狀況,進而使
得檔案實際佔用的硬碟空間增大許多。是故,要使tar正確處理sparse
file,必須在命令列上加上“S”這個參數,強迫tar運作的過程中
去分辨檔案的型態。

兩者處理sparse file的效率比較

以下以RedHat Linux 6.2版為作業系統,進行一簡單的讀寫測試,
以便於讀者瞭解cp與tar在處理sparse file時之效果差異。

首先,用程式產生一個大小為500MB的sparse file(sp.dat),
實際的大小為4508KB(大約4.4MB),接下來分別用cp與tar比較兩
者處理sparse file複製的速度。

使用cp sp.dat ./dstdir/sp.dat總時間為16.07秒;

使用(tar cSf - sp.dat)|(cd ./dstdir; tar xSf -)總時間為37.74秒。

由以上的比較明顯可以看出,cp在速度上優於tar,此乃因為使用
tar複製檔案,必須透過管道(pipe)的操作,因而降低其效能。

平日操作上的建議

且不論tar與cp處理時的速度差異,若單就操作上來說,依筆者的
經驗,cp毋寧是比較方便的。但是當您在使用cp的時候,必須注意
到cp處理檔案的其他限制,例如對soft-link file的處理等;而tar
對於大部份的檔案都能正確處理,但為了安全的考量,如果不能完
全確定所處理的檔案是否為sparse file,則應該加上“S”參數,
讓tar能正確的處理sparse file。

倒是对wanghai把aix挂掉那个觉得有意思
dd if=/dev/random of=1.dmp bs=1024k seek=17 count=3

把if=/dev/random换成if=/dev/zero呢?

对于aix dd挂掉已经有解释了,在我的blog上

才注意到wanghai也写Blog啊,订阅一份先。

今天也碰到了一回由于之前临时表空间没有分配确定空间,等到使用的时候再分配,磁盘空间已经不够的情况。

按照大师的方法(如果创建时希望分配确定的空间,可以通过创建->删除表空间->再次创建制定reuse子句,此时Oracle将按指定大小一次分配存储空间。)试了下,也不会分配指定大小的空间:

SQL> create temporary tablespace skytemp tempfile '/data/oracle/DBALNP01/temp/skytemp2.dbf' size 100m;

Tablespace created.

SQL> drop tablespace skytemp;

Tablespace dropped.

SQL> create temporary tablespace skytemp tempfile '/data/oracle/DBALNP01/temp/skytemp2.dbf' size 100m reuse;

Tablespace created.

SQL> !
(/data/oracle/DBALNP01/temp)
oracle DBALNP01 > du -ak
128 ./skytemp2.dbf
128 .

不清楚 reuse 会对数据文件具体做些什么操作。

我上边的表述不够清楚,删除之后,应该cp一下文件,以分配空间,再reuse cp复制的文件。

以下是Linux的范例:
SQL> create temporary tablespace temp2 tempfile '/opt/oracle/oradata/eygle/temp2.db' size 10M;

Tablespace created.

SQL> ! ls -l /opt/oracle/oradata/eygle/temp2.db
-rw-r----- 1 oracle dba 10493952 May 29 09:32 /opt/oracle/oradata/eygle/temp2.db

SQL> ! du -sk /opt/oracle/oradata/eygle/temp2.db
76 /opt/oracle/oradata/eygle/temp2.db

SQL> drop tablespace temp2;

Tablespace dropped.

SQL> ! cp --sparse=never /opt/oracle/oradata/eygle/temp2.db /opt/oracle/oradata/eygle/temp2.dbf

SQL> ! du -sk /opt/oracle/oradata/eygle/temp2.dbf
10264 /opt/oracle/oradata/eygle/temp2.dbf

SQL> create temporary tablespace temp2 tempfile '/opt/oracle/oradata/eygle/temp2.dbf' size 10M reuse;

Tablespace created.

SQL> ! du -sk /opt/oracle/oradata/eygle/temp2.dbf
10264 /opt/oracle/oradata/eygle/temp2.dbf


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com