2Gb - File limits in Oracle(轉)

zhouwf0726發表於2019-05-14
原文出處: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 怎樣使用超過2Gb(2Gb+)的檔案?
l 匯出(Export)和2Gb
l SQL*Loader和2Gb
l Oracle和其它2Gb問題
l 不同作業系統上的“大檔案”(Large Files)

為什麼2Gb是一個特殊的數字?

很多當前正在使用的CPU和API都使用了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. 一個使用了這些API的Oracle版本

今天大多數的平臺都已經支援了大檔案,並且對於這些檔案有64bit的API,Oracle7.3及以後版本一般已經使用了這些API,但是根據不同的平臺,不同的作業系統以及不同的Oracle版本仍然有很多不一樣的情況。在一些場合下預設就是支援“大檔案”的,但是另外一些場合卻可能必須要打一些補丁。

一直到寫這篇文章的時候,Oracle裡面還有一些工具是沒有更新到使用這些新的API的,比如眾所周知的EXPORT和SQL*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
匯出(Export)和2Gb

2Gb匯出檔案的大小
當編寫大部分版本的Export時,在建立匯出檔案上都是使用了預設的檔案操作API。這就意味著在很多平臺上根本就沒有可能匯出2Gb或者大於2Gb的檔案系統檔案(file system file)。
但是仍然有一些可選項可以用於在Export時解決2Gb的限制:

ü 將大於2Gb的檔案匯出到裸裝置上基本上是沒有問題的,當然這首先要求裸裝置的大小必須能夠容納整個匯出檔案。
ü 匯出到一個允許壓縮或者切割的命名管道中(適用Unix平臺)。
參看“在Unix平臺上匯出大於2Gb檔案的快速參考”一文 [NOTE:30528.1]。
ü 匯出到磁帶(適用大多數平臺)
參看“在Unix系統中匯出到磁帶”一文[NOTE:30428.1]。(這篇文章同時頁詳細描述瞭如何匯出到Unix管道和遠端shell中)
ü Oracle8i允許匯出到多個小檔案中,以替代單一的大檔案。

其它的2Gb匯出問題
Oracle允許區(extent)的尺寸最大為2Gb。但是不幸的是,在大多數的Oracle發行版中Export都存在這樣一個問題,當你Export一個大檔案,並且指定了COMPRESS=Y,那麼就有可能在匯出檔案的NEXT儲存子句中包含了一個大於2Gb的值。這樣將會導致Import失敗,即使是在Import時候指定了IGNORE=Y。Oracle已經在在[BUG:708790]中報告了這個問題,並且在[NOTE:62436.1]中提出了警告。

當Export碰到2Gb限制的時候,會報類似下面的錯誤:
. . exporting table BIGEXPORT
EXP-00015: error on row 10660 of table BIGEXPORT,
column MYCOL, datatype 96
EXP-00002: error in writing to export file
EXP-00002: error in writing to export file
EXP-00000: Export terminated unsuccessfully

在[BUG:185855]中提到了第二個問題,這個問題指出一個全庫匯出產生的CREATE TABLESPACE命令將在檔案大小上使用BYTES為單位,如果檔案大小超過2Gb,那麼在匯入的時候就會產生一個ORA-2237錯誤。這個問題可以通過在匯入之前先以M為單位而不是BYTES為單位來建立表空間這樣的方法來解決。[BUG:490837]也指出了相類似的問題。

匯出到磁帶
匯出的時候VOLSIZE引數限制在4Gb以下,在有些平臺上可能只有2Gb。
在Oracle8i中已經修正了這個問題。[BUG:490190]中對此問題有所描述。

SQL*Loader和2Gb
在SQL*Loader試圖開啟一個超過2Gb的檔案時,將會報以下錯誤:
SQL*Loader-500: Unable to open file (bigfile.dat)
SVR4 Error: 79: Value too large for defined data type

在[NOTE:30528.1]中的例子可以稍作修改以使在SQL*Loader中使用大的輸入檔案。
Oracle 8.0.6在SQL*Loader中已經對discard file和log file實現了大檔案支援,但是對於輸入的data file在各個平臺上仍然時不一樣的。[BUG:948460]中記錄了輸入檔案大小限制的詳細資訊。[BUG:749600]則記錄了最大的discard file檔案大小。

Oracle和其它的2Gb問題
這個章節列舉了其它各色2Gb問題。

l Oracle 8.0.5版本以後在大部分的平臺上Oracle都提供了64位的版本。從8.0.5的README檔案中可以看到相應的介紹-[NOTE:62252.1]
l DBV(資料庫驗證程式)可能無法掃描超過2Gb的資料檔案,並會報DBV-100錯誤。在[BUG:710888]中報告了此錯誤。
l 如果要在Oracle中建立大於2Gb的檔案, SQL命令列的"DATAFILE ... SIZE xxxxxx"子句部分必須以M或者K作單位來指定,否則將會報"ORA-02237: invalid file size"錯誤。在[BUG:185855]中報告了此錯誤。
l 在Oracle 7.3.4發行版以前表空間的限額不能超過2Gb。比如:
ALTER USER QUOTA 2500M ON
這樣將會報" ORA-2187: invalid quota specification."錯誤。
在[BUG:425831]中報告了此錯誤。解決方法是如果一個使用者需要超過2Gb的限額,那麼就給他賦予UNLIMITED TABLESPACE許可權。
l 如果spool的輸出檔案達到了2Gb,那麼會出現錯誤。比如:SQLPLUS的命令spool。
l 在Oracle工具中的一些CORE函式不支援大檔案。[BUG:749600]中報告了此錯誤,在Oracle 8.0.6和8.1.6版本中已經修正了。但是要注意在Oracle 8.1.5和別的任何補丁中都沒有修改這個錯誤。另外即使已經有修正,但是仍然還會有大檔案限制因為不是所有的程式碼都使用了這些CORE函式。
注意:[BUG:749600]雖然闡明瞭CORE函式,但是程式碼的某些部分仍然有問題。比如:SQL*Loader中輸入檔案的讀取就沒有使用CORE。
l UTL_FILE包使用了上述的CORE函式,所以在沒有修正的Oracle版本中仍然有2Gb限制。是一個允許在PL/SQL中進行檔案存取的PL/SQL包。

特定平臺中的大檔案
下面是一些特定平臺中關於大檔案支援的參考資料。雖然我們已經努力使這些文章的資料始終保持更新,但是仍然建議在存取大檔案時對每一個操作要小心謹慎地測試。

平臺參考
AIX (RS6000 / SP)[NOTE:60888.1]
HP[NOTE:62407.1]
Digital Unix[NOTE:62426.1]
Sequent PTX[NOTE:62415.1]
Sun Solaris[NOTE:62409.1]
Windows NTFAT檔案系統支援最大4Gb的檔案
NTFS檔案系統理論上支援最大16Tb的檔案
1.在NT的Oracle8上使用大檔案之前請先參考[NOTE:67421.1]
2.Oracle8.1.6的DBVERIFY程式有問題(參考[BUG:1372172])
3.在8.1.6 / 8.1.7中自動擴充套件到4Gb時會出現問題導致資料庫崩潰。(參考[BUG:1668488])

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756652/viewspace-242275/,如需轉載,請註明出處,否則將追究法律責任。

相關文章