[Oracle10G新特性]_16.可傳輸表空間
?
??? 可傳輸表空間在10g中貌似也沒有太大的變化,只是增加了跨平臺之間的傳輸特性。對于一些無法進行傳輸的對象,還是需要加以注意,具體的一些限制可以看一下我以前寫的《使用DBMS_SPACE_ADMIN包傳輸TableSpace》,這篇文章是針對9i的tablespace傳輸的,但是一些基本特性還是一致的。看一下Arup Nanda的處理過程。
?
---------------------------------------------------------------------
?
可傳輸表空間
?
可傳輸表空間現在可以跨平臺移植,從而使得數據發布更快更容易。此外,外部表下載使得通過轉換進行數據轉移的任務更簡單更快。
?
??? 您如何將數據從一個數據庫轉移到另一個數據庫?在現有的幾種方法中,有一種方法尤為出色:可傳輸表空間。在這種方法中,您使用一組自包含、只讀的表空間,只導出元數據,在操作系統層將這些表空間的數據文件拷貝至目標平臺,并將元數據導入數據字典 — 這個過程稱為插入。
?
??? 操作系統文件拷貝一般比其它傳統的數據轉移方法(如導出/導入或 SQL*Loader)要快得多。然而,在 Oracle9i 數據庫和更低版本中,可傳輸表空間僅限于在目標數據庫和源數據庫都運行在同一操作系統平臺上的少數情況下才有用 — 例如,您不能在 Solaris 和 HP-UX 平臺之間傳輸表空間。
?
??? 在 Oracle 數據庫 10g 中,這個局限消失了:只要操作系統字節順序相同,您就可以在平臺之間傳輸表空間。本文將不就字節順序展開長篇的討論,但這里只要提幾句話就足夠了:一些操作系統(包括 Windows)在低位內存地址中用最低有效字節存儲多字節二進制數據;因此這種系統被稱為低地址低字節序。相反,其它的操作系統(包括 Solaris)將最高有效字節存儲在低位內存地址中,因此這種系統被稱為低地址高字節序。當一個低地址高字節序的系統試圖從一個低地址低字節序的系統中讀取數據時,需要一個轉換過程 — 否則,字節順序將導致不能正確解釋讀取的數據。(有關字節順序的詳細說明,請閱讀嵌入式系統編程的 2002 年 1 月刊中的一篇極好的文章“字節順序介紹”。)不過,當在相同字節順序的平臺之間傳輸表空間時,不需要任何轉換。
?
??? 您怎么知道哪一種操作系統采用哪一種字節順序?不需猜測或搜索互聯網,相反只需簡單地執行以下查詢:
?
SQL> select * from v$transportable_platform order by platform_id;
?
PLATFORM_ID PLATFORM_NAME?????????????????????? ENDIAN_FORMAT
----------- ----------------------------------- --------------
1 Solaris[tm] OE (32-bit)???????????? Big
2 Solaris[tm] OE (64-bit)???????????? Big
3 HP-UX (64-bit)????????????????????? Big
4 HP-UX IA (64-bit)?????????????????? Big
5 HP Tru64 UNIX?????????????????????? Little
6 AIX-Based Systems (64-bit)????????? Big
7 Microsoft Windows IA (32-bit)?????? Little
8 Microsoft Windows IA (64-bit)?????? Little
9 IBM zSeries Based Linux???????????? Big
10 Linux IA (32-bit)?????????????????? Little
11 Linux IA (64-bit)?????????????????? Little
12 Microsoft Windows 64-bit for AMD??? Little
13 Linux 64-bit for AMD??????????????? Little
15 HP Open VMS???????????????????????? Little
16 Apple Mac OS??????????????????????? Big
?
??? 假設您想從一臺在 Intel 體系結構上運行 Linux 操作系統的主機 SRC1 中將一個表空間 USERS 傳輸到運行 Microsoft Windows 操作系統的計算機 TGT1 上。源平臺和目標平臺都是低地址低字節序的。表空間 USERS 的數據文件是 users_01.dbf。您將按照類似以下的方法來進行操作。
?
??? 1、
使表空間為只讀:
?
??? alter tablespace users read only;
?
??? 2、
導出表空間。在操作系統提示符下執行:
?
??? exp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp
?
??? exp_ts_users.dmp 文件只包含元數據(不是表空間 USERS 的內容)因此它將非常小。
?
??? 3、
將文件 exp_ts_users.dmp 和 users_01.dbf 拷貝至主機 TGT1。如果您使用 FTP,那么您將需要指定二進制選項。
?
??? 4、
將表空間插入到數據庫中。在操作系統命令提示符下執行下面的語句:
?
??? imp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp datafiles='users_01.dbf'
?
??? 在第 4 步之后,目標數據庫將有一個名稱為 USERS 的表空間,并將提供該表空間的內容。
?
??? 請記住,系統 SRC1 和 TGT1 分別是 Linux 和 Windows。到 Oracle9i 為止,運行在 TGT1 上的數據庫不能識別第 4 步中的數據文件 users_01.dbf,從而使得整個過程無用。您將必須求助其它一些方法(如常規的導出和導入、創建純文本文件并通過 SQL*Loader 加載,或直接在不同的數據庫間連接加載插入)。
?
??? 在 10g 中,不再需要這些替代方法,因為目標數據庫能夠識別來自另一個平臺的數據文件。在我們的示例中,源主機和目標主機運行的操作系統的字節順序是相同的(低地址低字節序),因此不需要任何轉換。
???
??? 這個功能在數據倉庫中特別有用,其中更小的面向對象的數據集市常常在刷新之后從倉庫中進行填充。利用 10g,這些數據集市現在能夠放在更小、更廉價的計算機(如運行 Linux 的 Intel boxes)中,而將數據倉庫服務器放在更大的企業級計算機中。從本質上講,利用可傳輸表空間,您現在可以更好地利用各種硬件和操作系統的組合。
?
?
跨不同字節順序的平臺
?
??? 如果平臺是不同字節順序的,那么您將如何實現可傳輸性?正如我之前說明的,目標計算機的字節順序如果與源計算機的字節順序不同,那么將不能正確地讀取數據文件,因而不可能簡單地拷貝數據文件。但別灰心,在 Oracle 10g RMAN 實用程序中提供了幫助,它支持將數據文件從一種字節順序向另一種字節順序轉換。
?
??? 在上面的例子中,如果主機 SRC1 運行在 Linux 上(低地址低字節序),而目標主機 TGT1 運行在 HP-UX 上(低地址高字節序),那么您需要在第 3 步和第 4 步之間引入另一個步驟,以進行轉換。利用 RMAN,您將在源計算機 SRC1 上把數據文件從 Linux 轉換成 HP-UX 格式(假定您已經使表空間變為只讀):
?
RMAN> convert tablespace users
2> to platform 'HP-UX (64-bit)'
3>? format='/home/oracle/rman_bkups/%N_%f';
?
Starting backup at 14-MAR-04
using channel ORA_DISK_1
channel ORA_DISK_1:starting datafile conversion
input datafile fno=00004 name=/usr/oradata/dw/starz10/users01.dbf
converted datafile=/home/oracle/rman_bkups/USERS_4
channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:07
Finished backup at 14-MAR-04
?
??? 這個步驟在目錄 /home/oracle/rman_bkups 中創建了一個標準 RMAN 文件格式 <tablespace_name>_<absolute_datafile_no> 的文件。注意我們沒有觸及表空間 USERS 的數據文件;而是為 HP-UX 創建了一個新文件。現在可以將這個文件拷貝至目標系統,剩下的步驟很簡單。
?
??? 這個 RMAN 轉換命令非常強大。按照上面給定的形式,它可以按順序創建數據文件。對于包含多個數據文件的表空間,您可以命令同時轉換并運行多個數據文件。要實現這一目的,您將需要在上述命令中添加一個子句:
?
parallelism = 4
?
??? 該子句創建四個 RMAN 通道,每一個通道處理一個數據文件。不過,一種更有用的方法是用一個步驟轉換大量的表空間,在這種情況下并行轉換將真正帶來很大的幫助。下面我們將兩個表空間 USERS 和 MAINTS 轉換至 HP-UX:
?
RMAN> convert tablespace users, maints
2> to platform 'HP-UX (64-bit)'
3> format='/home/oracle/rman_bkups/%N_%f'
4> parallelism = 5;
?
Starting backup at 14-MAR-04
using target database controlfile instead of recovery catalog
allocated channel:ORA_DISK_1
channel ORA_DISK_1:sid=244 devtype=DISK
allocated channel:ORA_DISK_2
channel ORA_DISK_2:sid=243 devtype=DISK
allocated channel:ORA_DISK_3
channel ORA_DISK_3:sid=245 devtype=DISK
allocated channel:ORA_DISK_4
channel ORA_DISK_4:sid=272 devtype=DISK
allocated channel:ORA_DISK_5
channel ORA_DISK_5:sid=253 devtype=DISK
channel ORA_DISK_1:starting datafile conversion
input datafile fno=00004 name=/usr/oradata/dw10/dw10/users01.dbf
channel ORA_DISK_2:starting datafile conversion
input datafile fno=00005 name=/usr/oradata/dw10/dw10/users02.dbf
channel ORA_DISK_3:starting datafile conversion
input datafile fno=00006 name=/usr/oradata/dw10/dw10/maints01.dbf
channel ORA_DISK_4:starting datafile conversion
input datafile fno=00007 name=/usr/oradata/dw10/dw10/maints02.dbf
converted datafile=/home/oracle/rman_bkups/USERS_4
channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:03
converted datafile=/home/oracle/rman_bkups/USERS_5
channel ORA_DISK_2:datafile conversion complete, elapsed time: 00:00:00
converted datafile=/home/oracle/rman_bkups/MAINTS_6
channel ORA_DISK_3:datafile conversion complete, elapsed time: 00:00:01
converted datafile=/home/oracle/rman_bkups/MAINTS_7
channel ORA_DISK_4:datafile conversion complete, elapsed time: 00:00:01
Finished backup at 14-MAR-04
?
??? 在上述例子中,轉換后的文件名難于辨認并很難與原始文件關聯(例如,文件 users01.dbf 變為 USERS_4)。相反,您還可以使用其它格式來為數據文件命名。這個過程類似于在 Data Guard 中為數據文件重命名的過程。您可以使用如下命令:
?
RMAN> convert tablespace users
2> to platform 'HP-UX (64-bit)'
3> db_file_name_convert '/usr/oradata/dw10/dw10','/home/oracle/rman_bkups'
4> ;
?
Starting backup at 14-MAR-04
using channel ORA_DISK_1
channel ORA_DISK_1:starting datafile conversion
input datafile fno=00004 name=/usr/oradata/dw10/dw10/users01.dbf
converted datafile=/home/oracle/rman_bkups/users01.dbf
channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:03
channel ORA_DISK_1:starting datafile conversion
input datafile fno=00005 name=/usr/oradata/dw10/dw10/users02.dbf
converted datafile=/home/oracle/rman_bkups/users02.dbf
channel ORA_DISK_1:datafile conversion complete, elapsed time: 00:00:01
Finished backup at 14-MAR-04
?
??? 這將在轉換后保留文件名。如果您切換到目錄 /home/oracle/rman_bkups,您將看到文件 users01.dbf 和 users02.dbf,它們對應相同名稱的原始文件。
?
??? 在上述情況下,我們在源平臺上轉換文件。不過,您也可以在目標平臺上轉換文件。例如,您可以將文件 users01.dbf 拷貝至運行 HP-UX 的主機 TGT1 上,然后利用以下命令將文件轉換成 HP-UX 格式:
?
RMAN> convert
2> datafile '/usr/oradata/dw10/dw10/users01.dbf'
3> format '/home/oracle/rman_bkups/%N_%f'
4> ;
?
??? 這種方法將以指定的格式在目錄中創建文件。
?
??? 但為什么您會想在目標平臺上轉換數據文件,確切的原因是什么?一個原因是更短的停機時間,這要求表空間僅在拷貝至目標主機期間為 READ ONLY 狀態。您可以為數據文件創建三個鏡像,使表空間為只讀,分開第三個鏡像,然后立即使表空間為讀/寫狀態。然后可以把第三個鏡像加載到目標系統上,并在空閑時進行轉換。這種安排使得表空間必須保持為只讀的時間最少。
?
??? 另一個原因可能是性能。OLTP 數據庫可能承擔一個持續的負載,而使用 RMAN 轉換操作可能使系統負載超出期望的范圍。相反,可以把轉換操作卸載到數據倉庫服務器上,其中通常提供了更多的 CPU,以進行并行操作。
?
?
將外部表用作數據傳輸機制
?
??? Oracle9i 數據庫引入了外部表,外部表使得格式化的純文本文件在數據庫中視為一個表,此表可以通過常規 SQL 進行選擇。假設您必須使用這種外部表方法將名稱為 TRANS 的表的內容從 OLTP 數據庫轉移到數據倉庫數據庫中。下面是實現這一目的的步驟。
?
??? 1、
從 OLTP 數據庫中,使用表 TRANS 的內容創建一個純文本文件。該文件可以在目錄 /home/oracle/dump_dir 中命名為 trans_flat.txt。該文件通常是用這條 SQL 語句創建的:
?
??? spool trans_flat.txt
??? select <column_1> ||','|| <column_2> ||','|| ...
??? from trans;
??? spool off
?
??? 2、
利用 ftp、rcp 或其它一些機制將文件拷貝至數據倉庫服務器中。該文件位于目錄 /home/oracle/dump_dir 中。
?
??? 3、
在數據倉庫數據庫上,創建一個名稱為 dump_dir 的目錄對象,方法如下:
?
??? create directory dump_dir as '/home/oracle/dump_dir';
?
??? 4、
創建一個外部表:
?
??? create table trans_ext
??? (
??? ... <columns of the table> ...
??? )
??? organization external
??? (
??? type oracle_loader
??? default directory admin
??? access parameters
??? ?? (
??? records delimited by newline
??? badfile 'trans_ext.bad'
??? discardfile 'trans_ext.dis'
??? logfile 'trans_ext.log'
??? fields terminated by ","? optionally enclosed by '"'
??? ????? (
??? ... <columns> ...
??? ????? )
??? ?? )
??? location ('trans_flat.txt')
??? )
??? reject limit unlimited;
?
??? 5、
現在利用任意一種常用的方法(如直接加載插入和合并)將外部表加載到常規表中。
?
??? 這里最費時的操作是第 1 步,在這個步驟中創建了純文本文件。您可以使用純 SQL 來創建這個文件,然后假脫機到一個文件 — 一個簡單但卻漫長的過程。您可以使用 Pro*C 或 OCI 程序(替代 SQL*Plus)來將記錄卸載到一個純文本文件中,以使這個過程稍微快一些,但它仍將花費一段時間。另一個“速度障礙”是需要人工指定列 — 又一個費時的過程。
?
??? 這兩個問題在 10g 中都已得到了解決。現在您可以利用外部表創建過程快速地將一個表卸載成可移植的格式。上面的第 1 步變為這條簡單的 SQL 語句:
?
create directory dump_dir as '/home/oracle/dump_dir';
?
create table trans_dump
organization external
(
type oracle_datapump
default directory dump_dir
location ('trans_dump.dmp')
)
as
select * from trans
/
?
??? 這些命令在目錄 /home/oracle/dump_dir 中創建了一個名稱為 trans_dump.dmp 的文件。這個文件不完全是 ASCII 文本;元數據是純文本,但實際的數據是原始格式的。不過,這個文件是可以移植到不同的操作系統 — 類似于導出轉儲文件,但與導出不同的是,數據下載非常快。您將把這個文件拷貝到數據倉庫服務器中,然后用與之前提到的相同的方式創建外部表,但這次用這個文件替換源文件。
?
??? 那么舊的數據傳輸機制和這種數據傳輸機制有什么不同?有一些不同。首先,您可以非常快速地創建一個可移植的文件,而無需編寫任何復雜的 SQL,選擇表的列等等。其次,您可以用這種文件作為外部表的輸入,從而使得將數據作為一個常規的表進行查看并在數據處理之后將數據加載到其它的表中成為可能。您還可以按如下所示方法提高到這種外部表中的數據下載的性能。
?
create table trans_dump
organization external
(
type oracle_datapump
default directory dump_dir
location ('trans_dump.dmp')
)
parallel 2
as
select * from trans
/
??? 這些命令創建了相同的文件,只不過是以并行的方式。您應當這么做,以利用多個主機 CPU(如果提供的話)。除了并行化之外,您還可以按照如下所示方法將表下載到多個外部文件中。
?
create table trans_dump
organization external
(
type oracle_datapump
default directory dump_dir
location ('trans_dump_1.dmp','trans_dump_2.dmp')
)
parallel 4
as
select * from trans
/
?
??? 這些命令創建了兩個文件 trans_dump_1.dmp 和 trans_dump_2.dmp,而不只是一個。這種方法在將文件擴散到多個物理設備或控制器上以減少與 I/O 相關的等待時非常有幫助。
?
?
結論
?
??? 通過使表空間能夠跨平臺傳輸,10g 為數據倉庫數據轉移提供了一個強大的解決方案。該特性與外部表下載相結合,消除了在源數據庫和目標數據庫之間進行數據發布的阻礙(無論它是 OLTP 數據庫、數據倉庫數據庫或數據集市數據庫)并使您能夠為特定類型的應用程序作出適當的平臺選擇。
?
??? 此外,通過使可傳輸表空間變得可行,10g 使得數據刷新更快更頻繁,以便能夠更快地把經過分析的數據提供給最終用戶。該功能還可以用來通過離線介質將數據發布給不同的數據庫,而不管它們的主機系統是什么。利用外部表下載,終于為最終用戶提供了一個作為 ETL 工具的實用程序,以用來轉移大量的數據。
?
?
?
?
?
?
?
?