使用Oracle可傳輸表空間的特性複製資料(3)跨平臺的傳輸實踐

junsansi發表於2008-01-11

終於要進入實踐了,我們假設現有資料庫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 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;

例項名     資料庫版本      作業系統平臺                   位元組順序

---------- --------------- ------------------------------ ---------------

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> SELECT * FROM TRANSPORT_SET_VIOLATIONS;

未選定行

如果表空間集滿足自包含檢查,則檢視返回空記錄。

執行嚴格方式的檢查:

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 成功完成

這裡簡單介紹一下本例中呼叫的引數:

DUMPFILE:表示匯出檔案的檔名

DIRECTORY這個DIRECTORY所指可並不是實際的物理目錄喲,它是物理路徑在oracle中的一個別名,這樣一旦你需要呼叫路徑就非常方便,不需要寫繁長的路徑,修改路徑的時候也同樣很方便,只需要修改directory別名這一處即可。在10g中預設建立了一個名為DATA_PUMP_DIR,其路徑指向到:$ORACLE_BASE\10.2.0\admin\SID NAME\dpdump,此處我們直接引用。

TRANSPORT_TABLESPACES:對於TTS操作這是個必須指定的引數,指定要傳輸的表空間。

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.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-136003/,如需轉載,請註明出處,否則將追究法律責任。

相關文章