Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          <2009年8月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          公告

          話到七分,酒至微醺,筆墨疏宕,言詞婉約,古樸殘破,含蓄醞籍,就是不完而美之最高境界。

          常用鏈接

          留言簿(13)

          隨筆分類(397)

          隨筆檔案(397)

          文章分類(33)

          新聞分類(15)

          收藏夾(74)

          Blog_List

          IT_Web

          My_Link

          最新隨筆

          最新評論

          [Oracle10G新特性]_16.可傳輸表空間
          ?
          ??? 可傳輸表空間在10g中貌似也沒有太大的變化,只是增加了跨平臺之間的傳輸特性。對于一些無法進行傳輸?shù)膶ο螅€是需要加以注意,具體的一些限制可以看一下我以前寫的《使用DBMS_SPACE_ADMIN包傳輸TableSpace》,這篇文章是針對9i的tablespace傳輸?shù)模且恍┗咎匦赃€是一致的。看一下Arup Nanda的處理過程。
          ?
          ---------------------------------------------------------------------
          ?
          可傳輸表空間
          ?
          可傳輸表空間現(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ù)。(有關(guān)字節(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 體系結(jié)構(gòu)上運行 Linux 操作系統(tǒng)的主機 SRC1 中將一個表空間 USERS 傳輸?shù)竭\行 Microsoft Windows 操作系統(tǒng)的計算機 TGT1 上。源平臺和目標平臺都是低地址低字節(jié)序的。表空間 USERS 的數(shù)據(jù)文件是 users_01.dbf。您將按照類似以下的方法來進行操作。
          ?
          ??? 1、 使表空間為只讀:
          ?
          ??? alter tablespace users read only;
          ?
          ??? 2、 導出表空間。在操作系統(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 拷貝至主機 TGT1。如果您使用 FTP,那么您將需要指定二進制選項。
          ?
          ??? 4、 將表空間插入到數(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ù)集市常常在刷新之后從倉庫中進行填充。利用 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)換后的文件名難于辨認并很難與原始文件關(guān)聯(lián)(例如,文件 users01.dbf 變?yōu)?USERS_4)。相反,您還可以使用其它格式來為數(shù)據(jù)文件命名。這個過程類似于在 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,它們對應相同名稱的原始文件。
          ?
          ??? 在上述情況下,我們在源平臺上轉(zhuǎn)換文件。不過,您也可以在目標平臺上轉(zhuǎn)換文件。例如,您可以將文件 users01.dbf 拷貝至運行 HP-UX 的主機 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)建文件。
          ?
          ??? 但為什么您會想在目標平臺上轉(zhuǎn)換數(shù)據(jù)文件,確切的原因是什么?一個原因是更短的停機時間,這要求表空間僅在拷貝至目標主機期間為 READ ONLY 狀態(tài)。您可以為數(shù)據(jù)文件創(chuàng)建三個鏡像,使表空間為只讀,分開第三個鏡像,然后立即使表空間為讀/寫狀態(tài)。然后可以把第三個鏡像加載到目標系統(tǒng)上,并在空閑時進行轉(zhuǎn)換。這種安排使得表空間必須保持為只讀的時間最少。
          ?
          ??? 另一個原因可能是性能。OLTP 數(shù)據(jù)庫可能承擔一個持續(xù)的負載,而使用 RMAN 轉(zhuǎn)換操作可能使系統(tǒng)負載超出期望的范圍。相反,可以把轉(zhuǎn)換操作卸載到數(shù)據(jù)倉庫服務器上,其中通常提供了更多的 CPU,以進行并行操作。
          ?
          ?
          將外部表用作數(shù)據(jù)傳輸機制
          ?
          ??? Oracle9i 數(shù)據(jù)庫引入了外部表,外部表使得格式化的純文本文件在數(shù)據(jù)庫中視為一個表,此表可以通過常規(guī) SQL 進行選擇。假設您必須使用這種外部表方法將名稱為 TRANS 的表的內(nèi)容從 OLTP 數(shù)據(jù)庫轉(zhuǎn)移到數(shù)據(jù)倉庫數(shù)據(jù)庫中。下面是實現(xiàn)這一目的的步驟。
          ?
          ??? 1、 從 OLTP 數(shù)據(jù)庫中,使用表 TRANS 的內(nèi)容創(chuàng)建一個純文本文件。該文件可以在目錄 /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 或其它一些機制將文件拷貝至數(shù)據(jù)倉庫服務器中。該文件位于目錄 /home/oracle/dump_dir 中。
          ?
          ??? 3、 在數(shù)據(jù)倉庫數(shù)據(jù)庫上,創(chuàng)建一個名稱為 dump_dir 的目錄對象,方法如下:
          ?
          ??? create directory dump_dir as '/home/oracle/dump_dir';
          ?
          ??? 4、 創(chuàng)建一個外部表:
          ?
          ??? 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ī)表中。
          ?
          ??? 這里最費時的操作是第 1 步,在這個步驟中創(chuàng)建了純文本文件。您可以使用純 SQL 來創(chuàng)建這個文件,然后假脫機到一個文件 — 一個簡單但卻漫長的過程。您可以使用 Pro*C 或 OCI 程序(替代 SQL*Plus)來將記錄卸載到一個純文本文件中,以使這個過程稍微快一些,但它仍將花費一段時間。另一個“速度障礙”是需要人工指定列 — 又一個費時的過程。
          ?
          ??? 這兩個問題在 10g 中都已得到了解決。現(xiàn)在您可以利用外部表創(chuàng)建過程快速地將一個表卸載成可移植的格式。上面的第 1 步變?yōu)檫@條簡單的 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)建了一個名稱為 trans_dump.dmp 的文件。這個文件不完全是 ASCII 文本;元數(shù)據(jù)是純文本,但實際的數(shù)據(jù)是原始格式的。不過,這個文件是可以移植到不同的操作系統(tǒng) — 類似于導出轉(zhuǎn)儲文件,但與導出不同的是,數(shù)據(jù)下載非常快。您將把這個文件拷貝到數(shù)據(jù)倉庫服務器中,然后用與之前提到的相同的方式創(chuàng)建外部表,但這次用這個文件替換源文件。
          ?
          ??? 那么舊的數(shù)據(jù)傳輸機制和這種數(shù)據(jù)傳輸機制有什么不同?有一些不同。首先,您可以非常快速地創(chuàng)建一個可移植的文件,而無需編寫任何復雜的 SQL,選擇表的列等等。其次,您可以用這種文件作為外部表的輸入,從而使得將數(shù)據(jù)作為一個常規(guī)的表進行查看并在數(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)建了相同的文件,只不過是以并行的方式。您應當這么做,以利用多個主機 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
          /
          ?
          ??? 這些命令創(chuàng)建了兩個文件 trans_dump_1.dmp 和 trans_dump_2.dmp,而不只是一個。這種方法在將文件擴散到多個物理設備或控制器上以減少與 I/O 相關(guān)的等待時非常有幫助。
          ?
          ?
          結(jié)論
          ?
          ??? 通過使表空間能夠跨平臺傳輸,10g 為數(shù)據(jù)倉庫數(shù)據(jù)轉(zhuǎn)移提供了一個強大的解決方案。該特性與外部表下載相結(jié)合,消除了在源數(shù)據(jù)庫和目標數(shù)據(jù)庫之間進行數(shù)據(jù)發(fā)布的阻礙(無論它是 OLTP 數(shù)據(jù)庫、數(shù)據(jù)倉庫數(shù)據(jù)庫或數(shù)據(jù)集市數(shù)據(jù)庫)并使您能夠為特定類型的應用程序作出適當?shù)钠脚_選擇。
          ?
          ??? 此外,通過使可傳輸表空間變得可行,10g 使得數(shù)據(jù)刷新更快更頻繁,以便能夠更快地把經(jīng)過分析的數(shù)據(jù)提供給最終用戶。該功能還可以用來通過離線介質(zhì)將數(shù)據(jù)發(fā)布給不同的數(shù)據(jù)庫,而不管它們的主機系統(tǒng)是什么。利用外部表下載,終于為最終用戶提供了一個作為 ETL 工具的實用程序,以用來轉(zhuǎn)移大量的數(shù)據(jù)。
          ?
          ?
          ?
          有關(guān) 10g 中的傳輸表空間的更多信息,請參見 Oracle 數(shù)據(jù)庫管理員指 的第 8 章的在數(shù)據(jù)庫之間傳輸表空間一節(jié)。
          ?
          ?
          ?
          ?
          ?
          posted on 2009-08-17 22:03 decode360 閱讀(616) 評論(0)  編輯  收藏 所屬分類: 08.DBA
          主站蜘蛛池模板: 哈密市| 双峰县| 盐源县| 象州县| 辽中县| 稻城县| 余庆县| 麻栗坡县| 灵璧县| 三亚市| 孟州市| 枣庄市| 绥芬河市| 灌南县| 南和县| 天镇县| 安多县| 晋城| 德州市| 株洲县| 罗源县| 淳化县| 泽州县| 泰来县| 绿春县| 页游| 井冈山市| 攀枝花市| 朝阳市| 莱芜市| 湖南省| 琼海市| 越西县| 珠海市| 华蓥市| 杨浦区| 洪洞县| 红河县| 奉化市| 达拉特旗| 天全县|