数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
2Gb or Not 2Gb - File limits in Oracle (Part I)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

2Gb or Not 2Gb - File limits in Oracle

 

翻译:KamusSeraphim

校正:Bloomit

邮件:[email protected]

日期:2004-1

 

经常会听说导入导出的时候,备份恢复的时候,SQL*Loader导入数据的时候,文件超出了2G大小,结果导致错误。

本人文科毕业,什么二进制,十六进制,数据结构,操作系统等等的一概没有学过,所以对此问题一直都只有一个模糊的认识,今天在metalink上面闲逛,忽然发现了这篇文章,兴之所致,决定好好看看,看完以后,感觉对于此问题明白了很多,于是就顺便翻译成了中文,希望对大家也有所帮助。

对于本文中提及的所有其它NotesBugs也做了尽可能的整理(还未翻译,以后如果有时间再慢慢作),只是文中提到的一些Bug由于本人Metalink帐号的限制亦或是Bug的不公开性,并不能看到详细描述,对于这样的Bug就无法再作整理。

 

原文出处:http://metalink.oracle.com

Doc ID: Note:62427.1 原文创建日期:1998-9-2 原文最后更新日期:2003-8-6

 

介绍

 

本文阐述了“2Gb”问题,解释了为什么2Gb会是一个这样充满魔力的数字,并且如果你想在Oracle的应用中使用超过2Gb大小的文件,那么这篇文章也告诉了一些你应该知道的事情。

 

本文以Unix操作系统为基础,因为大部分的2Gb问题都发生在Unix上面,当然文中也提到了一些对于其它非Unix操作系统的相关资料,在本文的最后一节列出了各个操作系统自己的限制。

 

本文主题包括以下几点:

l         为什么2Gb是一个特殊的数字?

l         怎样使用超过2Gb2Gb+)的文件?

l         导出(Export)和2Gb

l         SQL*Loader2Gb

l         Oracle和其它2Gb问题

l         不同操作系统上的大文件”(Large Files)

 

为什么2Gb是一个特殊的数字?

 

很多当前正在使用的CPUAPI都使用了32位(bit)的字长,而正是这个字长对于很多操作产生了影响。

 

众多的场合下文件操作的标准API在对文件大小和文件中当前位置的处理都使用了有符号32位字(32-bit signed word)。一个有符号32位字以最高位来表示正负,所以只剩下31位来存储真正的数值,而16进制中存储在31位中的最大正值就是0x7FFFFFFF,也就是10进制中的+2147483647,这正是一个临近2Gb的值。

 

2Gb或者更大的文件一般被称为“大文件”,当你在32位环境中使用2147483647甚至更大的数字时,你就很可能会碰到一些问题。为了解决这些问题,最新的操作系统已经重新定义了一系列完全利用64位寻址方式来操作文件大小和偏移量的系统函数。最新的Oracle发行版也已经使用了这些新的接口,但是如果在你决定要使用“大文件”以前,你仍然有不少的问题需要考虑。

 

另外一个特殊的数字是4Gb。也就是作为无符号字(unaigned value)的十六进制数字0xFFFFFFFF(十进制是4294967295),这是一个略小于4Gb的值。将该值加一将使低4位字节成为0x00000000,同时产生'1'进位。这个进位在32位运算中将会失去。所以4Gb也是一个可能会产生问题的特殊数字。本文中对这个问题也有所提及。

 

对于使用Oracle这意味着什么?

 

32bit的问题在不少方面都影响到了Oracle,为了使用“大文件”,你需要满足以下条件:

1.        一个支持2Gb+文件的操作系统或者裸设备(Raw devices

2.        一个具有支持存取2Gb+文件的API的操作系统

3.        一个使用了这些APIOracle版本

 

今天大多数的平台都已经支持了大文件,并且对于这些文件有64bitAPIOracle7.3及以后版本一般已经使用了这些API,但是根据不同的平台,不同的操作系统以及不同的Oracle版本仍然有很多不一样的情况。在一些场合下默认就是支持“大文件”的,但是另外一些场合却可能必须要打一些补丁。

 

一直到写这篇文章的时候,Oracle里面还有一些工具是没有更新到使用这些新的API的,比如众所周知的EXPORTSQL*LOADER,不过仍然再次强调一下,由于平台和操作系统的不同,情况还是不一样的。

 

为什么要使用2Gb+的文件?

 

在这一节中我们试着总结一下对于Oracle的数据文件使用大文件和设备("large" files / devices)的优点以及缺点。

 

使用大于2Gb文件的优点:

l         在大多数平台上Oracle7支持最多1022个数据文件。如果文件小于2G,那么也就是限制了数据库的大小只能是小于2044Gb。当然这对于支持了更多数据文件的Oracle8来说已经不再是个问题(Oracle8支持每个表空间中包含最多1022个数据文件)。

l         在现实情况中Oracle7的最大数据库尺寸会比2044Gb小,因为一般数据文件都存放在单独的表空间中,而很多数据文件就可能远远小于2Gb。使用大文件可以让数据库超越2044Gb的这个限制。

l         使用大文件意味着对于较小的数据库只需要管理较少的文件。

l         需要较少的文件处理资源。

 

使用大于2Gb文件的缺点:

l         恢复的单位更大了。一个2Gb文件的备份和还原,根据备份媒体和磁盘速度的差异,会耗费15分钟到1个小时的时间,那么一个8Gb的文件就要花4倍这样的时间。

l         备份和恢复的并行操作新能将会收到影响。

l         会碰到一些平台特有的限制,比如说在超过2Gb以上异步I/O的操作就可能会变成线性操作。

l         处理2Gb以上的文件可能会需要补丁或者一些特殊的配置。相对于小文件来说也会有更大的风险性。比如在一些AIX的发行版上,超过2Gb,异步I/O就会使用线性操作。

 

使用大于2Gb文件的要点:

l         跟操作系统提供商确认,大文件是否被支持,同时要如何去配置。

l         跟操作系统提供商确认,真正的最大文件限制是多少?

l         询问Oracle技术支持,确定对于你现有的平台,操作系统版本,Oracle版本,是否需要什么补丁或者还有什么限制?

l         记住,如果你真的考虑对于操作系统或者Oracle要打一些补丁的话,那么就再检查一遍上面提到的这些问题。

l         确认对于所有要使用大文件读取的用户来说,操作系统的限制已经正确设定。

l         确认所有的备份脚本都能够处理大文件。

l         注意,对于使用超过2Gb的数据文件,对于最大文件大小还有一个限制。这个限制依赖于你的系统平台以及Oracle初始化参数DB_BLOCK_SIZE。在大多数平台上(包括Unix, NT, VMS)文件大小的限制在4194302*DB_BLOCK_SIZE这么大。

 

[NOTE:112011.1]文档描述了改变文件大小中存在的问题,特别是超过了2Gb的时候。

 

一般需要注意的要点:

需要小心设置文件的自动扩展。明智的作法是在不使用“大文件”的场合下,将自动扩展的数据文件最大尺寸限制在2Gb以下。另外注意由于[BUG:568232]将有可能定义一个超过Oracle处理极限的MAXSIZE数值,这在resize之后将会引发一个内部错误(错误显示为ORA-600 [3292]

 

在很多平台上,Oracle数据文件的头部都包含着附加的数据块,所以创建一个2Gb的数据文件实际上需要比2Gb更多的磁盘空间。在UNIX平台上数据文件头部的附加数据块大小通常等于DB_BLOCK_SIZE的大小,但是在裸设备上可能需要占用更多一些的空间。

 

2Gb相关的Oracle错误

2Gb限制到达的时候可能会发生下面这些错误,这些错误的产生没有特定的顺序。

ORA-01119 Error in creating datafile xxxx 

ORA-27044 unable to write header block of file 

SVR4 Error: 22: Invalid argument

ORA-19502 write error on file 'filename', blockno x (blocksize=nn)

ORA-27070 skgfdisp: async read/write failed

ORA-02237 invalid file size 

KCF:write/open error dba=xxxxxx block=xxxx online=xxxx file=xxxxxxxx file limit exceed. 

Unix error 27, EFBIG

 




相关文章

相关软件