終於要進入實踐了,我們假設現有數據庫a:SID=jssweb做為源數據庫,數據庫b:SID=jsstts做為目標數據庫。從數據庫a復制表空間JSsweb到數據庫b。下面是具體操作步驟:
一、確認平台是否支持(Determine if Platforms are Supported and Endianness)
檢查平台版本以及Endian,確認是否支持我們的傳輸條件。如果是不同平台間的傳輸,本步操作必不可少。
例如:
E:\ORA10G>set Oracle_sid=JSsweb
首先連接到源數據庫。
E:\ORA10G>sqlplus "/ as sysdba"
SQL> col name heading ''實例名'' for a10
SQL> col version heading ''數據庫版本'' for a15
SQL> col platform_name heading ''操作系統平台'' for a30
SQL> col endian_format heading ''字節順序'' for a15
執行查詢,獲取平台信息
SQL> SELECT d.NAME, i.VERSION, d.PLATFORM_NAME, ENDIAN_FORMAT
2 FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d, V$INSTANCE i
3 WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME
4 and d.DB_UNIQUE_NAME = i.INSTANCE_NAME;
實例名 數據庫版本 操作系統平台 字節順序
---------- --------------- ------------------------------ ---------------
JSSWEB 10.2.0.1.0 Microsoft Windows IA (32-bit) Little
然後連接到目標數據庫,執行同樣的查詢。
[Oracle@JSsLinux ~]$ echo $Oracle_SID
JSstts
[Oracle@JSsLinux ~]$ sqlplus "/ as sysdba"
SQL> col name heading ''實例名'' for a10
SQL> col platform_name heading ''操作系統平台'' for a30
SQL> col endian_format heading ''字節順序'' for a15
SQL> SELECT d.NAME, i.VERSION, d.PLATFORM_NAME, ENDIAN_FORMAT
2 FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d, V$INSTANCE i
3 WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME
4 and d.DB_UNIQUE_NAME = i.INSTANCE_NAME;
實例名 數據庫版本 操作系統平台 字節順序
---------- --------------- ------------------------------ ---------------
JSSTTS 10.2.0.1.0 Linux IA (32-bit) Little
SQL>
上述查詢可以得到數據庫版本、操作系統平台以及ENDIAN。結合我們上節提供的傳輸版本對照表確認是否滿足我們的傳輸要求。呵呵,這裡我們運氣不錯,雖然是兩個不同的操作系統平台,但由於都采用了Oracle10g,並且字節順序相同,不僅支持跨平台傳輸而且還可以省掉字節轉換的操作。
二、選擇自包含的表空間集(Pick a Self-Contained Set of Tablespaces)
待傳輸的表空間集中對象可能會存在與其它對象邏輯或物理上的關聯,但這裡我們要強調的就是可傳輸的表空間集必須是自包含的,前面我們提到使用DBMS_TTS包的TRANSPORT_SET_CHECK過程來驗證待傳輸表空間集是否自包含,TRANSPORT_SET_CHECK過程可以以兩種方式執行:非嚴格方式和嚴格方式。
提示,使用sys用戶執行DBMS_TTS包的過程,或者是被賦於EXECUTE_CATALOG_ROLE角色的用戶。
嚴格方式驗證就是在調用TRANSPORT_SET_CHECK過程時指定FULL_CHECK參數為TRUE。嚴格方式不只檢查表空間集引用的對象是否自包含,同時會檢查被其它表空間引用的對象,引用者是否在表空間集中。
文字太繞口,以本次演示中要傳輸的表空間為例。
表空間JSsweb有表DEPT,其索引DEPT.IDX_DEPT_DEPTNO在users表空間。
SQL> exec dbms_tts.transport_set_check(''JSsweb'', TRUE);
PL/SQL 過程已成功完成。
未選定行
如果表空間集滿足自包含檢查,則視圖返回空記錄。
執行嚴格方式的檢查:
SQL> exec dbms_tts.transport_set_check(''JSsweb'', TRUE , TRUE);
PL/SQL 過程已成功完成。
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
--------------------------------------------------------------------------------
Index JSS.IDX_DEPT_DEPTNO in tablespace USERS points to table JSS.DEPT in tables
pace JSSWEB
不滿足自包含驗證,SELECT語句返回違反的信息,你可以根據其提示進行修正。
提示:如果要檢查的表空間有多個,相互之間以逗號分隔即可。
三、生成可傳輸表空間集(Generate a Transportable Tablespace Set)
執行export操作的用戶需要被賦於EXP_FULL_DATABASE 角色。
再次提示,生成可傳輸表空間集之前,必須將要傳輸的表空間置為read-only,不然你就得選擇通過RMAN備份生成表空間集了。
確認所選擇的表空間都是自包含之後,按照下列步驟進行操作。
1、將表空間置為READ-ONLY;
SQL> ALTER TABLESPACE JSSWEB READ ONLY;
表空間已更改。
2、使用Data Dump導出表空間集元數據
SQL> host
進入操作系統命令行
E:\ORA10G>expdp system/verysafe
DUMPFILE=expdp_JSsweb.dmp DIRECTORY=DATA_PUMP_DIR TRANSPORT_TABLESPACES=JSsweb
.....................................
.....................................
啟動 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** DUMPFILE=expdp_JSsweb.dmp DIRECTORY=DA
TA_PUMP_DIR TRANSPORT_TABLESPACES=JSsweb
處理對象類型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
處理對象類型 TRANSPORTABLE_EXPORT/TABLE
處理對象類型 TRANSPORTABLE_EXPORT/INDEX
處理對象類型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
處理對象類型 TRANSPORTABLE_EXPORT/COMMENT
處理對象類型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
已成功加載/卸載了主表 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01"
******************************************************************************
SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 的轉儲文件集為:
E:\ORA10G\PRODUCT\10.2.0\ADMIN\JSSWEB\DPDUMP\EXPDP_JSSWEB.DMP
作業 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" 已於 10:54:43 成功完成
這裡簡單介紹一下本例中調用的參數:
l DUMPFILE:表示導出文件的文件名
l DIRECTORY:這個DIRECTORY所指可並不是實際的物理目錄喲,它是物理路徑在Oracle中的一個別名,這樣一旦你需要調用路徑就非常方便,不需要寫繁長的路徑,修改路徑的時候也同樣很方便,只需要修改directory別名這一處即可。在10g中默認創建了一個名為DATA_PUMP_DIR,其路徑指向到:$Oracle_BASE\10.2.0\admin\SID NAME\dpdump,此處我們直接引用。
l TRANSPORT_TABLESPACES:對於TTS操作這是個必須指定的參數,指定要傳輸的表空間。
l TRANSPORT_FULL_CHECK:如果你希望執行嚴格自包含導出的話,可以指定本參數值為Y。
EXPDP的參數還有很多,要查看其全部參數,可以通過調用expdp help=y的方式獲得,如果想明確各參數的詳細解釋,可以參考Oracle® Database UtilitIEs。
提示:EXPDP只是導出的待傳輸表空間的目錄結構信息(元數據),並不包含實際數據,因此導出的速度非常快,而且文件也很小,所以千萬表看到它很小,就以為導出的文件有問題。
3、如果兩平台間的字節順序不一致的話,中間需要有個轉換過程,前章操作步驟裡也曾深入分析過,我們此次演示中不存在字節順序不一致的問題,所以此步跳過,留待後續展現。
四、傳輸表空間集到目標庫(Transport the Tablespace Set)
復制表空間對應的數據文件以及表空間元數據導出文件到目標庫,這個技術含量是黑低的嘛,FTP(使用二進制方式傳輸)、網絡共享或拿個u盤等等都可行,條條大路通目標嘛。但是復制的時候需要注意路徑,復制目的地應該以目標庫為准,
比如DIRECTORY的指向路徑,如果你仍然想使用DATA_PUMP_DIR的話就得先確認目標庫是否存在這個對象,以及這個對象在目標庫中對應的物理路徑是什麼,表空間的元數據導出文件應該復制到這個路徑下:
SQL> select * from dba_directorIEs where directory_name=''DATA_PUMP_DIR'';
OWNER DIRECTORY_NAME DIRECTORY_PATH
---------- --------------- ----------------------------------------
SYS DATA_PUMP_DIR /opt/ora10g/admin/JSstts/dpdump/
數據文件復制完之後,千萬表忘將源庫中的表空間狀態置為read-write,切記切記。
SQL> alter tablespace JSSWEB read write;
表空間已更改。
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
JSSWEB ONLINE
已選擇6行。
五、導入表空間集(Import the Tablespace Set)
注意,如果傳輸的表空間集block_size與目標庫的默認block_size不同,那你的第一步就得是設置目標庫中DB_nK_CACHE_SIZE的初始化參數。
1、導入元數據
[Oracle@jssLinux ~]$ impdp system/verysafe DUMPFILE=EXPDP_JSSWEB.DMP DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES=/opt/ora10g/oradata/jsstts/jssweb.dbf REMAP_SCHEMA=(jss:JSsl)
Import: Release 10.2.0.1.0 - Production on 星期一, 05 11月, 2007 14:02:33
Copyright (c) 2003, 2005, Oracle. All rights reserved.
連接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已成功加載/卸載了主表 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01"
啟動 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/******** DUMPFILE=EXPDP_JSSWEB.DMP DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES=/opt/ora10g/oradata/jsstts/jssweb.dbf REMAP_SCHEMA=(jss:JSsl)
處理對象類型 TRANSPORTABLE_EXPORT/PLUGTS_BLK
處理對象類型 TRANSPORTABLE_EXPORT/TABLE
處理對象類型 TRANSPORTABLE_EXPORT/INDEX
處理對象類型 TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
處理對象類型 TRANSPORTABLE_EXPORT/COMMENT
處理對象類型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
作業 "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" 已於 14:02:40 成功完成
IMPDP的命令形式與EXPDP完成相同,只是有個別參數不同。以上述為例:
l DUMPFILE:與前文EXPDP介紹相同
l DIRECTORY:與前文EXPDP介紹相同
l TRANSPORT_DATAFILES:被傳輸的數據文件路徑,如果有多個,以逗號分隔。
l REMAP_SCHEMA:此參數並非必須。參數的功能是指定傳輸的表空間中對象的歸屬。白話點說就是源庫中對象屬於schema A,對目標庫後你想將其對象歸屬於schema B,則可以通過此參數指定。如果不指定參數的話,則表空間中對象在目標庫中仍然屬於schema A,前提是存在A用戶,如果不存在的話導入會報錯,提醒你要麼更改所屬對象要麼創建用戶A。如果有多個schema的歸屬需要轉移,那就指定多個REMAP_SCHEMA參數即可。
2、如果需要,將剛導入的表空間狀態置為read-write
剛導入的表空間默認是read-only狀態(因為你在源庫將其置為read-only啦),如果需要,別忘了更改其狀態。SQL> alter tablespace JSSWEB read write;
表空間已更改。
注:前文中生成導入導出文件也可由EXP/IMP命令生成,具體EXP/IMP的命令語法與EXPDP/IMPDP非常類似這裡就不詳述了,大家可以通過調用HELP=Y參數獲取其幫助信息。需要注意的是,如果表空間中包含XMLTypes,那你只能使用EXP/IMP命令執行導出/導入,並確認CONSTRAINTS和TRIGGERS參數被設置為Y。
傳輸成功!黑黑,大家也都是這麼認為的吧。En,為了不影響大家的美好心情,俺是絕對不會告訴大家由於三思在導出時並未執行嚴格自包含造成DEPT表的索引丟失這種小事的:)