可傳輸資料表空間:使用一組自包含、唯讀資料表空間,只匯出中繼資料,在作業系統層將這些資料表空間的資料檔案拷貝至目標平台,並將中繼資料匯入資料字典。在 Oracle9i 資料庫和更低版本中,可傳輸資料表空間僅限於在目標資料庫和來源資料庫都運行在同一作業系統平台上的少數情況下才有用 — 例如,您不能在 Solaris 和 HP-UX 平台之間傳輸資料表空間。在 Oracle 資料庫 10g 中,這個局限消失了:只要作業系統位元組順序相同,您就可以在平台之間傳輸資料表空間。
對於可傳輸資料表空間有一個重要概念:自包含(Self-Contained)。
在資料表空間傳輸的中,要求資料表空間集為自包含的,自包含表示用於傳輸的內部資料表空間集沒有引用指向外部表格空間集。自包含分為兩種:一般自包含資料表空間集和完全(嚴格)自包含資料表空間集。
常見的以下情況是違反自包含原則的:
索引在內部資料表空間集,而表在外部表格空間集(相反地,如果表在內部資料表空間集,而索引在外部表格空間集,則不違反自包含原則)。
分區表一部分區在內部資料表空間集,一部分在外部表格空間集(對於分區表,要麼全部包含在內部資料表空間集中,要麼全不包含)。
如果在傳輸資料表空間時同時傳輸約束,則對於參考完整性約束,約束指向的表在外部表格空間集,則違反自包含約束;如果不傳輸約束,則與約束指向無關。
表在內部資料表空間集,而lob列在外部表格空間集,則違反自包含約束。
通常可以通過系統包DBMS_TTS來檢查資料表空間是否自包含,驗證可以以兩種方式執行:非嚴格方式和嚴格方式。
以下是一個簡單的驗證過程:
以SYS使用者執行非嚴格自包含檢查(full_check=false):
telnet 172.19.111.38
SQL> connect / as sysdba
SQL> desc dbms_tts;
PROCEDURE DOWNGRADE
FUNCTION ISSELFCONTAINED RETURNS BOOLEAN
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST CLOB IN
INCL_CONSTRAINTS BOOLEAN IN
FULL_CHECK BOOLEAN IN
PROCEDURE KFP_CKCMP
PROCEDURE TRANSPORT_SET_CHECK
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST CLOB IN
INCL_CONSTRAINTS BOOLEAN IN DEFAULT
FULL_CHECK BOOLEAN IN DEFAULT
SQL> exec dbms_tts.transport_set_check('IPAS_ACCT_DATA', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected
執行嚴格自包含檢查(full_check=true):
SQL> exec dbms_tts.transport_set_check('IPAS_ACCT_DATA', TRUE, True);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------------------------------------------------
Index IPAS_ACCT_DATA.IND_ID in tablespace IPAS_ACCT_DATA points to table UTCORE.IPAS_ACCT_DATA in tablespace UTSERS
反過來對於USERS資料表空間來說,非嚴格檢查也是無法通過的:
SQL> exec dbms_tts.transport_set_check('USERS', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------------------------------------------------
Index IPAS_ACCT_DATA.IND_ID in tablespace USERS points to table UTCORE.IPAS_ACCT_DATA in tablespace IPAS_ACCT_DATA
但是可以對多個資料表空間同時傳輸,則一些自包含問題就可以得到解決:
SQL> exec dbms_tts.transport_set_check('USERS,IPAS_ACCT_DATA', TRUE, True);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected
資料表空間自包含確認之後,進行資料表空間傳輸就很方便了,注意必須以sys as sysdba身份進行匯出匯入操作,一般包含如下幾個步驟。
1、在源庫使資料表空間為唯讀。
telnet 172.19.111.38
$ sqlplus '/as sysdba'
SQL> set lines 1000
SQL> col file_name format a50
SQL> select tablespace_name,FILE_NAME from dba_data_files where tablespace_name='IPAS_ACCT_DATA';
TABLESPACE_NAME FILE_NAME
------------------------------ --------------------------------------------------
IPAS_ACCT_DATA /opt/oracle/wacosdata/ipas_acct_data001.dbf
源庫和目標要求compatible參數相容:
SQL> show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 9.2.0
SQL> alter tablespace IPAS_ACCT_DATA read only;
2、從源庫匯出資料表空間。
$ exp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
Username: sys as sysdba
Password: change_on_install
$ ls -otr
...
-rw-r--r-- 1 oracle 51200 Aug 20 19:03 exp_ts_IPAS_ACCT_DATA.dmp
dmp 檔案只包含中繼資料(不是資料表空間的內容)因此它將非常小。
3、將檔案 exp_ts_IPAS_ACCT_DATA.dmp 和 /opt/oracle/wacosdata/ipas_acct_data001.dbf 拷貝至目標主機。如果您使用 FTP,那麼您將需要指定二進位選項。
$ ftp 172.19.111.34
ftp> bi
ftp> ha
ftp> prompt off
ftp> put exp_ts_IPAS_ACCT_DATA.dmp
ftp> put /opt/oracle/wacosdata/ipas_acct_data001.dbf
226 Transfer complete.
local: /opt/oracle/wacosdata/ipas_acct_data001.dbf remote: /opt/oracle/wacosdata/ipas_acct_data001.dbf
ftp> by
傳輸完後可以把源庫資料表空間置為可讀:
$ sqlplus '/as sysdba'
SQL> alter tablespace IPAS_ACCT_DATA read write;
4、在目標主機將資料表空間插入到資料庫中。
telnet 172.19.111.34
$pwd
/opt/oracle
$ls -otr
-rw-r--r-- 1 oracle 51200 Aug 21 11:10 exp_ts_IPAS_ACCT_DATA.dmp
$ls -l /opt/oracle/wacosdata/ipas_acct_data001.dbf
-rw-r----- 1 oracle dba 1073750016 Aug 20 19:05 /opt/oracle/wacosdata/ipas_acct_data001.dbf
$imp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp datafiles='/opt/oracle/wacosdata/ipas_acct_data001.dbf'
Username: sys as sysdba
Password: change_on_install
. importing SYS's objects into SYS
. importing WACOS's objects into WACOS
. . importing table "PIMBALANCELOGDETAIL"
...
Import terminated successfully with warnings.
匯入成功,時間飛快。
最後把該資料表空間置為可寫,目標庫可在此資料表空間讀寫資料了:
SQL> alter tablespace IPAS_ACCT_DATA read write;
然而,在 Oracle9i 資料庫和更低版本中,可傳輸資料表空間僅限於在目標資料庫和來源資料庫都運行在同一作業系統平台上的少數情況下才有用 ? 例如,你不能在 Solaris 和 HP-UX 平台之間傳輸資料表空間。
在 Oracle 資料庫 10g 中,這個局限消失了:只要作業系統位元組順序相同,你就能在平台之間傳輸資料表空間。本文將不就位元組順序展開長篇的討論,但這裡只要提幾句話就足夠了:一些作業系統(包括 視窗系統)在低位記憶體位址中用最低有效位元組儲存多位元組位元據;因此這種系統被稱為低地址低位元組序。相反,其他的作業系統(包括 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 視窗系統 IA (32-bit) Little
8 Microsoft 視窗系統 IA (64-bit) Little
9 IBM zSeries Based Linux Big
10 Linux IA (32-bit) Little
11 Linux IA (64-bit) Little
12 Microsoft 視窗系統 64-bit for AMD Little
13 Linux 64-bit for AMD Little
15 HP Open VMS Little
BBS.bitsCN.com網管論壇
16 Apple Mac OS Big
假設你想從一台在 Intel 體繫結構上運行 Linux 作業系統的主機 SRC1 中將一個資料表空間 USERS 傳輸到運行 Microsoft 視窗系統 作業系統的電腦 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 和 視窗系統。到 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 格式(假定你已使資料表空間變為唯讀): bitsCN.nET中國網管部落格
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:
BBS.bitsCN.com網管論壇
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
bitsCN.Com
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