[Oracle10G新特性]_16.可傳輸表空間
?
??? 可傳輸表空間在10g中貌似也沒有太大的變化,只是增加了跨平臺(tái)之間的傳輸特性。對(duì)于一些無法進(jìn)行傳輸?shù)膶?duì)象,還是需要加以注意,具體的一些限制可以看一下我以前寫的《使用DBMS_SPACE_ADMIN包傳輸TableSpace》,這篇文章是針對(duì)9i的tablespace傳輸?shù)模且恍┗咎匦赃€是一致的。看一下Arup Nanda的處理過程。
?
---------------------------------------------------------------------
?
可傳輸表空間
?
可傳輸表空間現(xiàn)在可以跨平臺(tái)移植,從而使得數(shù)據(jù)發(fā)布更快更容易。此外,外部表下載使得通過轉(zhuǎn)換進(jìn)行數(shù)據(jù)轉(zhuǎn)移的任務(wù)更簡(jiǎn)單更快。
?
??? 您如何將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫(kù)轉(zhuǎn)移到另一個(gè)數(shù)據(jù)庫(kù)?在現(xiàn)有的幾種方法中,有一種方法尤為出色:可傳輸表空間。在這種方法中,您使用一組自包含、只讀的表空間,只導(dǎo)出元數(shù)據(jù),在操作系統(tǒng)層將這些表空間的數(shù)據(jù)文件拷貝至目標(biāo)平臺(tái),并將元數(shù)據(jù)導(dǎo)入數(shù)據(jù)字典 — 這個(gè)過程稱為插入。
?
??? 操作系統(tǒng)文件拷貝一般比其它傳統(tǒng)的數(shù)據(jù)轉(zhuǎn)移方法(如導(dǎo)出/導(dǎo)入或 SQL*Loader)要快得多。然而,在 Oracle9i 數(shù)據(jù)庫(kù)和更低版本中,可傳輸表空間僅限于在目標(biāo)數(shù)據(jù)庫(kù)和源數(shù)據(jù)庫(kù)都運(yùn)行在同一操作系統(tǒng)平臺(tái)上的少數(shù)情況下才有用 — 例如,您不能在 Solaris 和 HP-UX 平臺(tái)之間傳輸表空間。
?
??? 在 Oracle 數(shù)據(jù)庫(kù) 10g 中,這個(gè)局限消失了:只要操作系統(tǒng)字節(jié)順序相同,您就可以在平臺(tái)之間傳輸表空間。本文將不就字節(jié)順序展開長(zhǎng)篇的討論,但這里只要提幾句話就足夠了:一些操作系統(tǒng)(包括 Windows)在低位內(nèi)存地址中用最低有效字節(jié)存儲(chǔ)多字節(jié)二進(jìn)制數(shù)據(jù);因此這種系統(tǒng)被稱為低地址低字節(jié)序。相反,其它的操作系統(tǒng)(包括 Solaris)將最高有效字節(jié)存儲(chǔ)在低位內(nèi)存地址中,因此這種系統(tǒng)被稱為低地址高字節(jié)序。當(dāng)一個(gè)低地址高字節(jié)序的系統(tǒng)試圖從一個(gè)低地址低字節(jié)序的系統(tǒng)中讀取數(shù)據(jù)時(shí),需要一個(gè)轉(zhuǎn)換過程 — 否則,字節(jié)順序?qū)?dǎo)致不能正確解釋讀取的數(shù)據(jù)。(有關(guān)字節(jié)順序的詳細(xì)說明,請(qǐng)閱讀嵌入式系統(tǒng)編程的 2002 年 1 月刊中的一篇極好的文章“字節(jié)順序介紹”。)不過,當(dāng)在相同字節(jié)順序的平臺(tái)之間傳輸表空間時(shí),不需要任何轉(zhuǎn)換。
?
??? 您怎么知道哪一種操作系統(tǒng)采用哪一種字節(jié)順序?不需猜測(cè)或搜索互聯(lián)網(wǎng),相反只需簡(jiǎn)單地執(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
?
??? 假設(shè)您想從一臺(tái)在 Intel 體系結(jié)構(gòu)上運(yùn)行 Linux 操作系統(tǒng)的主機(jī) SRC1 中將一個(gè)表空間 USERS 傳輸?shù)竭\(yùn)行 Microsoft Windows 操作系統(tǒng)的計(jì)算機(jī) TGT1 上。源平臺(tái)和目標(biāo)平臺(tái)都是低地址低字節(jié)序的。表空間 USERS 的數(shù)據(jù)文件是 users_01.dbf。您將按照類似以下的方法來進(jìn)行操作。
?
??? 1、
使表空間為只讀:
?
??? alter tablespace users read only;
?
??? 2、
導(dǎo)出表空間。在操作系統(tǒng)提示符下執(zhí)行:
?
??? exp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp
?
??? exp_ts_users.dmp 文件只包含元數(shù)據(jù)(不是表空間 USERS 的內(nèi)容)因此它將非常小。
?
??? 3、
將文件 exp_ts_users.dmp 和 users_01.dbf 拷貝至主機(jī) TGT1。如果您使用 FTP,那么您將需要指定二進(jìn)制選項(xiàng)。
?
??? 4、
將表空間插入到數(shù)據(jù)庫(kù)中。在操作系統(tǒng)命令提示符下執(zhí)行下面的語句:
?
??? imp tablespaces=users transport_tablespace=y file=exp_ts_users.dmp datafiles='users_01.dbf'
?
??? 在第 4 步之后,目標(biāo)數(shù)據(jù)庫(kù)將有一個(gè)名稱為 USERS 的表空間,并將提供該表空間的內(nèi)容。
?
??? 請(qǐng)記住,系統(tǒng) SRC1 和 TGT1 分別是 Linux 和 Windows。到 Oracle9i 為止,運(yùn)行在 TGT1 上的數(shù)據(jù)庫(kù)不能識(shí)別第 4 步中的數(shù)據(jù)文件 users_01.dbf,從而使得整個(gè)過程無用。您將必須求助其它一些方法(如常規(guī)的導(dǎo)出和導(dǎo)入、創(chuàng)建純文本文件并通過 SQL*Loader 加載,或直接在不同的數(shù)據(jù)庫(kù)間連接加載插入)。
?
??? 在 10g 中,不再需要這些替代方法,因?yàn)槟繕?biāo)數(shù)據(jù)庫(kù)能夠識(shí)別來自另一個(gè)平臺(tái)的數(shù)據(jù)文件。在我們的示例中,源主機(jī)和目標(biāo)主機(jī)運(yùn)行的操作系統(tǒng)的字節(jié)順序是相同的(低地址低字節(jié)序),因此不需要任何轉(zhuǎn)換。
???
??? 這個(gè)功能在數(shù)據(jù)倉(cāng)庫(kù)中特別有用,其中更小的面向?qū)ο蟮臄?shù)據(jù)集市常常在刷新之后從倉(cāng)庫(kù)中進(jìn)行填充。利用 10g,這些數(shù)據(jù)集市現(xiàn)在能夠放在更小、更廉價(jià)的計(jì)算機(jī)(如運(yùn)行 Linux 的 Intel boxes)中,而將數(shù)據(jù)倉(cāng)庫(kù)服務(wù)器放在更大的企業(yè)級(jí)計(jì)算機(jī)中。從本質(zhì)上講,利用可傳輸表空間,您現(xiàn)在可以更好地利用各種硬件和操作系統(tǒng)的組合。
?
?
跨不同字節(jié)順序的平臺(tái)
?
??? 如果平臺(tái)是不同字節(jié)順序的,那么您將如何實(shí)現(xiàn)可傳輸性?正如我之前說明的,目標(biāo)計(jì)算機(jī)的字節(jié)順序如果與源計(jì)算機(jī)的字節(jié)順序不同,那么將不能正確地讀取數(shù)據(jù)文件,因而不可能簡(jiǎn)單地拷貝數(shù)據(jù)文件。但別灰心,在 Oracle 10g RMAN 實(shí)用程序中提供了幫助,它支持將數(shù)據(jù)文件從一種字節(jié)順序向另一種字節(jié)順序轉(zhuǎn)換。
?
??? 在上面的例子中,如果主機(jī) SRC1 運(yùn)行在 Linux 上(低地址低字節(jié)序),而目標(biāo)主機(jī) TGT1 運(yùn)行在 HP-UX 上(低地址高字節(jié)序),那么您需要在第 3 步和第 4 步之間引入另一個(gè)步驟,以進(jìn)行轉(zhuǎn)換。利用 RMAN,您將在源計(jì)算機(jī) 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
?
??? 這個(gè)步驟在目錄 /home/oracle/rman_bkups 中創(chuàng)建了一個(gè)標(biāo)準(zhǔn) RMAN 文件格式 <tablespace_name>_<absolute_datafile_no> 的文件。注意我們沒有觸及表空間 USERS 的數(shù)據(jù)文件;而是為 HP-UX 創(chuàng)建了一個(gè)新文件。現(xiàn)在可以將這個(gè)文件拷貝至目標(biāo)系統(tǒng),剩下的步驟很簡(jiǎn)單。
?
??? 這個(gè) RMAN 轉(zhuǎn)換命令非常強(qiáng)大。按照上面給定的形式,它可以按順序創(chuàng)建數(shù)據(jù)文件。對(duì)于包含多個(gè)數(shù)據(jù)文件的表空間,您可以命令同時(shí)轉(zhuǎn)換并運(yùn)行多個(gè)數(shù)據(jù)文件。要實(shí)現(xiàn)這一目的,您將需要在上述命令中添加一個(gè)子句:
?
parallelism = 4
?
??? 該子句創(chuàng)建四個(gè) RMAN 通道,每一個(gè)通道處理一個(gè)數(shù)據(jù)文件。不過,一種更有用的方法是用一個(gè)步驟轉(zhuǎn)換大量的表空間,在這種情況下并行轉(zhuǎn)換將真正帶來很大的幫助。下面我們將兩個(gè)表空間 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)換后的文件名難于辨認(rèn)并很難與原始文件關(guān)聯(lián)(例如,文件 users01.dbf 變?yōu)?USERS_4)。相反,您還可以使用其它格式來為數(shù)據(jù)文件命名。這個(gè)過程類似于在 Data Guard 中為數(shù)據(jù)文件重命名的過程。您可以使用如下命令:
?
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
?
??? 這將在轉(zhuǎn)換后保留文件名。如果您切換到目錄 /home/oracle/rman_bkups,您將看到文件 users01.dbf 和 users02.dbf,它們對(duì)應(yīng)相同名稱的原始文件。
?
??? 在上述情況下,我們?cè)谠雌脚_(tái)上轉(zhuǎn)換文件。不過,您也可以在目標(biāo)平臺(tái)上轉(zhuǎn)換文件。例如,您可以將文件 users01.dbf 拷貝至運(yùn)行 HP-UX 的主機(jī) TGT1 上,然后利用以下命令將文件轉(zhuǎn)換成 HP-UX 格式:
?
RMAN> convert
2> datafile '/usr/oradata/dw10/dw10/users01.dbf'
3> format '/home/oracle/rman_bkups/%N_%f'
4> ;
?
??? 這種方法將以指定的格式在目錄中創(chuàng)建文件。
?
??? 但為什么您會(huì)想在目標(biāo)平臺(tái)上轉(zhuǎn)換數(shù)據(jù)文件,確切的原因是什么?一個(gè)原因是更短的停機(jī)時(shí)間,這要求表空間僅在拷貝至目標(biāo)主機(jī)期間為 READ ONLY 狀態(tài)。您可以為數(shù)據(jù)文件創(chuàng)建三個(gè)鏡像,使表空間為只讀,分開第三個(gè)鏡像,然后立即使表空間為讀/寫狀態(tài)。然后可以把第三個(gè)鏡像加載到目標(biāo)系統(tǒng)上,并在空閑時(shí)進(jìn)行轉(zhuǎn)換。這種安排使得表空間必須保持為只讀的時(shí)間最少。
?
??? 另一個(gè)原因可能是性能。OLTP 數(shù)據(jù)庫(kù)可能承擔(dān)一個(gè)持續(xù)的負(fù)載,而使用 RMAN 轉(zhuǎn)換操作可能使系統(tǒng)負(fù)載超出期望的范圍。相反,可以把轉(zhuǎn)換操作卸載到數(shù)據(jù)倉(cāng)庫(kù)服務(wù)器上,其中通常提供了更多的 CPU,以進(jìn)行并行操作。
?
?
將外部表用作數(shù)據(jù)傳輸機(jī)制
?
??? Oracle9i 數(shù)據(jù)庫(kù)引入了外部表,外部表使得格式化的純文本文件在數(shù)據(jù)庫(kù)中視為一個(gè)表,此表可以通過常規(guī) SQL 進(jìn)行選擇。假設(shè)您必須使用這種外部表方法將名稱為 TRANS 的表的內(nèi)容從 OLTP 數(shù)據(jù)庫(kù)轉(zhuǎn)移到數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)庫(kù)中。下面是實(shí)現(xiàn)這一目的的步驟。
?
??? 1、
從 OLTP 數(shù)據(jù)庫(kù)中,使用表 TRANS 的內(nèi)容創(chuàng)建一個(gè)純文本文件。該文件可以在目錄 /home/oracle/dump_dir 中命名為 trans_flat.txt。該文件通常是用這條 SQL 語句創(chuàng)建的:
?
??? spool trans_flat.txt
??? select <column_1> ||','|| <column_2> ||','|| ...
??? from trans;
??? spool off
?
??? 2、
利用 ftp、rcp 或其它一些機(jī)制將文件拷貝至數(shù)據(jù)倉(cāng)庫(kù)服務(wù)器中。該文件位于目錄 /home/oracle/dump_dir 中。
?
??? 3、
在數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)庫(kù)上,創(chuàng)建一個(gè)名稱為 dump_dir 的目錄對(duì)象,方法如下:
?
??? create directory dump_dir as '/home/oracle/dump_dir';
?
??? 4、
創(chuàng)建一個(gè)外部表:
?
??? 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、
現(xiàn)在利用任意一種常用的方法(如直接加載插入和合并)將外部表加載到常規(guī)表中。
?
??? 這里最費(fèi)時(shí)的操作是第 1 步,在這個(gè)步驟中創(chuàng)建了純文本文件。您可以使用純 SQL 來創(chuàng)建這個(gè)文件,然后假脫機(jī)到一個(gè)文件 — 一個(gè)簡(jiǎn)單但卻漫長(zhǎng)的過程。您可以使用 Pro*C 或 OCI 程序(替代 SQL*Plus)來將記錄卸載到一個(gè)純文本文件中,以使這個(gè)過程稍微快一些,但它仍將花費(fèi)一段時(shí)間。另一個(gè)“速度障礙”是需要人工指定列 — 又一個(gè)費(fèi)時(shí)的過程。
?
??? 這兩個(gè)問題在 10g 中都已得到了解決。現(xiàn)在您可以利用外部表創(chuàng)建過程快速地將一個(gè)表卸載成可移植的格式。上面的第 1 步變?yōu)檫@條簡(jiǎn)單的 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 中創(chuàng)建了一個(gè)名稱為 trans_dump.dmp 的文件。這個(gè)文件不完全是 ASCII 文本;元數(shù)據(jù)是純文本,但實(shí)際的數(shù)據(jù)是原始格式的。不過,這個(gè)文件是可以移植到不同的操作系統(tǒng) — 類似于導(dǎo)出轉(zhuǎn)儲(chǔ)文件,但與導(dǎo)出不同的是,數(shù)據(jù)下載非常快。您將把這個(gè)文件拷貝到數(shù)據(jù)倉(cāng)庫(kù)服務(wù)器中,然后用與之前提到的相同的方式創(chuàng)建外部表,但這次用這個(gè)文件替換源文件。
?
??? 那么舊的數(shù)據(jù)傳輸機(jī)制和這種數(shù)據(jù)傳輸機(jī)制有什么不同?有一些不同。首先,您可以非常快速地創(chuàng)建一個(gè)可移植的文件,而無需編寫任何復(fù)雜的 SQL,選擇表的列等等。其次,您可以用這種文件作為外部表的輸入,從而使得將數(shù)據(jù)作為一個(gè)常規(guī)的表進(jìn)行查看并在數(shù)據(jù)處理之后將數(shù)據(jù)加載到其它的表中成為可能。您還可以按如下所示方法提高到這種外部表中的數(shù)據(jù)下載的性能。
?
create table trans_dump
organization external
(
type oracle_datapump
default directory dump_dir
location ('trans_dump.dmp')
)
parallel 2
as
select * from trans
/
??? 這些命令創(chuàng)建了相同的文件,只不過是以并行的方式。您應(yīng)當(dāng)這么做,以利用多個(gè)主機(jī) CPU(如果提供的話)。除了并行化之外,您還可以按照如下所示方法將表下載到多個(gè)外部文件中。
?
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
/
?
??? 這些命令創(chuàng)建了兩個(gè)文件 trans_dump_1.dmp 和 trans_dump_2.dmp,而不只是一個(gè)。這種方法在將文件擴(kuò)散到多個(gè)物理設(shè)備或控制器上以減少與 I/O 相關(guān)的等待時(shí)非常有幫助。
?
?
結(jié)論
?
??? 通過使表空間能夠跨平臺(tái)傳輸,10g 為數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)轉(zhuǎn)移提供了一個(gè)強(qiáng)大的解決方案。該特性與外部表下載相結(jié)合,消除了在源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)發(fā)布的阻礙(無論它是 OLTP 數(shù)據(jù)庫(kù)、數(shù)據(jù)倉(cāng)庫(kù)數(shù)據(jù)庫(kù)或數(shù)據(jù)集市數(shù)據(jù)庫(kù))并使您能夠?yàn)樘囟愋偷膽?yīng)用程序作出適當(dāng)?shù)钠脚_(tái)選擇。
?
??? 此外,通過使可傳輸表空間變得可行,10g 使得數(shù)據(jù)刷新更快更頻繁,以便能夠更快地把經(jīng)過分析的數(shù)據(jù)提供給最終用戶。該功能還可以用來通過離線介質(zhì)將數(shù)據(jù)發(fā)布給不同的數(shù)據(jù)庫(kù),而不管它們的主機(jī)系統(tǒng)是什么。利用外部表下載,終于為最終用戶提供了一個(gè)作為 ETL 工具的實(shí)用程序,以用來轉(zhuǎn)移大量的數(shù)據(jù)。
?
?
?
?
?
?
?
?