Oracle 10g 可傳輸表空間現(xiàn)在可以跨平臺移植
2024-08-29 13:38:11
供稿:網(wǎng)友
可傳輸表空間現(xiàn)在可以跨平臺移植,從而使得數(shù)據(jù)發(fā)布更快更輕易。此外,外部表下載使得通過轉(zhuǎn)換進行數(shù)據(jù)轉(zhuǎn)移的任務更簡單更快。
您如何將數(shù)據(jù)從一個數(shù)據(jù)庫轉(zhuǎn)移到另一個數(shù)據(jù)庫?在現(xiàn)有的幾種方法中,有一種方法尤為出色:可傳輸表空間。在這種方法中,您使用一組自包含、只讀的表空間,只導出元數(shù)據(jù),在操作系統(tǒng)層將這些表空間的數(shù)據(jù)文件拷貝至目標平臺,并將元數(shù)據(jù)導入數(shù)據(jù)字典 — 這個過程稱為插入。
操作系統(tǒng)文件拷貝一般比其它傳統(tǒng)的數(shù)據(jù)轉(zhuǎn)移方法(如導出/導入或 SQL*Loader)要快得多。然而,在 Oracle9i 數(shù)據(jù)庫和更低版本中,可傳輸表空間僅限于在目標數(shù)據(jù)庫和源數(shù)據(jù)庫都運行在同一操作系統(tǒng)平臺上的少數(shù)情況下才有用 — 例如,您不能在 Solaris 和 HP-UX 平臺之間傳輸表空間。
在 Oracle 數(shù)據(jù)庫 10g 中,這個局限消失了:只要操作系統(tǒng)字節(jié)順序相同,您就可以在平臺之間傳輸表空間。本文將不就字節(jié)順序展開長篇的討論,但這里只要提幾句話就足夠了:一些操作系統(tǒng)(包括 Windows)在低位內(nèi)存地址中用最低有效字節(jié)存儲多字節(jié)二進制數(shù)據(jù);因此這種系統(tǒng)被稱為低地址低字節(jié)序。相反,其它的操作系統(tǒng)(包括 Solaris)將最高有效字節(jié)存儲在低位內(nèi)存地址中,因此這種系統(tǒng)被稱為低地址高字節(jié)序。當一個低地址高字節(jié)序的系統(tǒng)試圖從一個低地址低字節(jié)序的系統(tǒng)中讀取數(shù)據(jù)時,需要一個轉(zhuǎn)換過程 — 否則,字節(jié)順序?qū)е虏荒苷_解釋讀取的數(shù)據(jù)。(有關字節(jié)順序的具體說明,請閱讀嵌入式系統(tǒng)編程的 2002 年 1 月刊中的一篇極好的文章“字節(jié)順序介紹”。)不過,當在相同字節(jié)順序的平臺之間傳輸表空間時,不需要任何轉(zhuǎn)換。
您怎么知道哪一種操作系統(tǒng)采用哪一種字節(jié)順序?不需猜測或搜索互聯(lián)網(wǎng),相反只需簡單地執(zhí)行以下查詢:
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 操作系統(tǒng)的主機 SRC1 中將一個表空間 USERS 傳輸?shù)竭\行 Microsoft Windows 操作系統(tǒng)的計算機 TGT1 上。源平臺和目標平臺都是低地址低字節(jié)序的。表空間 USERS 的數(shù)據(jù)文件是 users_01.dbf。您將按照類似以下的方法來進行操作。
使表空間為只讀:
alter tablespace users read only;
導出表空間。在操作系統(tǒng)提示符下執(zhí)行:
eXP tablespaces=users transport_tablespace=y file=exp_ts_users.dmp
exp_ts_users.dmp 文件只包含元數(shù)據(jù)(不是表空間 USERS 的內(nèi)容)因此它將非常小。
將文件 exp_ts_users.dmp 和 users_01.dbf 拷貝至主機 TGT1。假如您使用 FTP,那么您將需要指定二進制選項。
將表空間插入到數(shù)據(jù)庫中。在操作系統(tǒng)命令提示符下執(zhí)行下面的語句:
imp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp datafiles='users_01.dbf'
在第 4 步之后,目標數(shù)據(jù)庫將有一個名稱為 USERS 的表空間,并將提供該表空間的內(nèi)容。
請記住,系統(tǒng) SRC1 和 TGT1 分別是 Linux 和 Windows。到 Oracle9i 為止,運行在 TGT1 上的數(shù)據(jù)庫不能識別第 4 步中的數(shù)據(jù)文件 users_01.dbf,從而使得整個過程無用。您將必須求助其它一些方法(如常規(guī)的導出和導入、創(chuàng)建純文本文件并通過 SQL*Loader 加載,或直接在不同的數(shù)據(jù)庫間連接加載插入)。
在 10g 中,不再需要這些替代方法,因為目標數(shù)據(jù)庫能夠識別來自另一個平臺的數(shù)據(jù)文件。在我們的示例中,源主機和目標主機運行的操作系統(tǒng)的字節(jié)順序是相同的(低地址低字節(jié)序),因此不需要任何轉(zhuǎn)換。
這個功能在數(shù)據(jù)倉庫中非凡有用,其中更小的面向?qū)ο蟮臄?shù)據(jù)集市經(jīng)常在刷新之后從倉庫中進行填充。利用 10g,這些數(shù)據(jù)集市現(xiàn)在能夠放在更小、更廉價的計算機(如運行 Linux 的 Intel boxes)中,而將數(shù)據(jù)倉庫服務器放在更大的企業(yè)級計算機中。從本質(zhì)上講,利用可傳輸表空間,您現(xiàn)在可以更好地利用各種硬件和操作系統(tǒng)的組合。
跨不同字節(jié)順序的平臺
假如平臺是不同字節(jié)順序的,那么您將如何實現(xiàn)可傳輸性?正如我之前說明的,目標計算機的字節(jié)順序假如與源計算機的字節(jié)順序不同,那么將不能正確地讀取數(shù)據(jù)文件,因而不可能簡單地拷貝數(shù)據(jù)文件。但別灰心,在 Oracle 10g RMAN 實用程序中提供了幫助,它支持將數(shù)據(jù)文件從一種字節(jié)順序向另一種字節(jié)順序轉(zhuǎn)換。
在上面的例子中,假如主機 SRC1 運行在 Linux 上(低地址低字節(jié)序),而目標主機 TGT1 運行在 HP-UX 上(低地址高字節(jié)序),那么您需要在第 3 步和第 4 步之間引入另一個步驟,以進行轉(zhuǎn)換。利用 RMAN,您將在源計算機 SRC1 上把數(shù)據(jù)文件從 Linux 轉(zhuǎn)換成 HP-UX 格式(假定您已經(jīng)使表空間變?yōu)橹蛔x):
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 中創(chuàng)建了一個標準 RMAN 文件格式 <tablespace_name>_<absolute_datafile_no> 的文件。注重我們沒有觸及表空間 USERS 的數(shù)據(jù)文件;而是為 HP-UX 創(chuàng)建了一個新文件。現(xiàn)在可以將這個文件拷貝至目標系統(tǒng),剩下的步驟很簡單。
這個 RMAN 轉(zhuǎn)換命令非常強大。按照上面給定的形式,它可以按順序創(chuàng)建數(shù)據(jù)文件。對于包含多個數(shù)據(jù)文件的表空間,您可以命令同時轉(zhuǎn)換并運行多個數(shù)據(jù)文件。要實現(xiàn)這一目的,您將需要在上述命令中添加一個子句:
parallelism = 4
該子句創(chuàng)建四個 RMAN 通道,每一個通道處理一個數(shù)據(jù)文件。不過,一種更有用的方法是用一個步驟轉(zhuǎn)換大量的表空間,在這種情況下并行轉(zhuǎn)換將真正帶來很大的幫助。下面我們將兩個表空間 USERS 和 MAINTS 轉(zhuǎn)換至 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
在上述例子中,轉(zhuǎn)換后的文件名難于辨認并很難與原始文件關聯(lián)(例如,文件 users01.dbf 變?yōu)?USERS_4)。
相反,您還可以使用其它格式來為數(shù)據(jù)文件命名。這個過程