Oracle 10G 最佳20位新特性:SQL Advisor 和 ADDM
2024-08-29 13:37:48
供稿:網友
可傳輸表空間現在可以跨平臺移植,從而使得數據發布更快更輕易。此外,外部表下載使得通過轉換進行數據轉移的任務更簡單更快。
您如何將數據從一個數據庫轉移到另一個數據庫?在現有的幾種方法中,有一種方法尤為出色:可傳輸表空間。在這種方法中,您使用一組自包含、只讀的表空間,只導出元數據,在操作系統層將這些表空間的數據文件拷貝至目標平臺,并將元數據導入數據字典 — 這個過程稱為插入。
操作系統文件拷貝一般比其它傳統的數據轉移方法(如導出/導入或 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。您將按照類似以下的方法來進行操作。
使表空間為只讀:
alter tablespace users read only;
導出表空間。在操作系統提示符下執行:
eXP tablespaces=users transport_tablespace=y file=exp_ts_users.dmp
exp_ts_users.dmp 文件只包含元數據(不是表空間 USERS 的內容)因此它將非常小。
將文件 exp_ts_users.dmp 和 users_01.dbf 拷貝至主機 TGT1。假如您使用 FTP,那么您將需要指定二進制選項。
將表空間插入到數據庫中。在操作系統命令提示符下執行下面的語句:
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)。
相反,您還可以使用其它格式來為數據文件命名。這個過程類似于在