Oracle數據遷移方案

數據遷移通俗的說就是將數據從一個地方轉移到另一個地方。主要使用場景有:根據正式系統搭建測試環境、從內網複製到外網、數據庫服務器硬件升級等。根據需要遷移的數據量大小、系統架構,可採取不同的遷移方法。

注:以下所說方法,不考慮數據的增量更新、不考慮數據的實時同步、不考慮數據的邏輯轉換。如果有這些需求,建議使用第三方ETL工具或使用Oracle的其他數據同步技術。

一、常用示例
1.1 如何在客戶現場搭建測試環境?
常規方案,使用imp/exp工具,先在源庫執行直接路徑導出操作,然後在目標庫執行導入操作。IMP/EXP的執行速度主要受限於磁盤及網絡。
數據量:1.5G
導出用時:5分鐘
導入用時:23分鐘
導出文件大小:641M
導出導入環境:單CPU,700M內存。爲力求最大速度,使用直接路徑導出、設置最大I/O緩衝、導入導出文件都放在服務器上執行。

1.2 還有沒有更快的辦法?
有,仍然使用impdp/expdp。只是不再將數據導出後導入,而是直接將數據從源庫導入到目的庫。
CMD> Impdp  testi@目標庫  directory=DMPDIR  schemas=TESTI
network_link=源庫dblink  remap_schema=TESTI:TESTA
上面語句的操作是將源庫的TESTI用戶的數據,導入到目標庫的TESTA用戶下。
這個操作是局域網內遷移數據最方便的工具,不過也可能是速度最慢的工具。

1.3 有沒有還快一點的方法?
有,換用impdp/expdp。同樣在源庫執行導出,在目標庫執行導入。操作速度能得到極大提升。IMPDP/EXPDP速度主要受限於磁盤,與網絡無關。
原數據大小:1.5G
expdp導出操作用時:5分鐘
impdp導入操作用時:22分鐘
導出文件大小:588M
導出導入環境:單CPU,700M內存,並行度 = 1
??你不是說這個會更快麼?爲什麼速度跟1.1的imp/exp差不多啊?
請看第四部分總結的解釋。

1.4 你還敢再快一點麼?
使用表空間遷移。將表空間的元數據導出,和數據文件一起,複製到新庫。執行元數據導入。一般來說,整個導入導出的數據量不到5M。速度相當快,但使用限制比較多。
導出時間:1分鐘
導入時間:3分鐘
導出文件:60M + 數據文件1.5G

1.5 如何將數據從linux環境轉到windows環境?
查看v$transportable_platform,如果數據編碼一致,可嘗試直接複製數據文件。否則使用rman或impdp/expdp或imp/exp。

1.6 如果你有一個excel格式的數據表,需要遠程更新到客戶數據庫上,怎麼更新?
使用pl/sql developer,複製、粘貼、提交。

1.7 如果你需要將正式庫的幾張表,遷移到測試庫來,怎麼弄快些?

用dblink+腳本,或者使用impdp遠程導入。


二、局部數據的遷移

2.1、廣域網的遷移
2.1.1 pl/sql developer
廣域網下小數據量的遷移,常用pl/sql developer工具來完成。
在本地打開excel文件,複製數據。然後通過“遠程桌面”,到遠程服務器的pl/sql界面上粘貼,就可以了。操作簡單方便。
第一步:在本地複製數據

第二步:打開遠程桌面


第三步:在遠程機器的pl/sql裏面粘貼數據

第四步:保存數據

這種方法在小數據量下很好用。大數據量時,一個表一個表的粘貼比較麻煩,且一粘貼可能就卡在那裏了,得等10來分鐘。
 2.1.2 imp/exp
廣域網內大數據量的遷移,通常使用imp/exp工具。先在源庫上使用exp工具,導出數據壓縮包,通過網絡發送到目標數據庫。在目標數據庫上再imp。
第一步:本機連接到源庫上,執行exp
Exp一般使用直接路徑導出,速度可以達到常規路徑導出的3倍以上。


參數解釋:
Parfile:指定導出的參數配置文件
Log:導出日誌輸出到哪個文件
recordlength=65535:設置最大I/O緩衝爲64K(該參數最大64K)
Direct=y:數據經直接路徑導出,不再經SGA導出
Owner=testi:僅導出用戶testi的數據。
第二步:本機連接到目標庫上,執行imp

Parfile:指定導入的參數配置文件
Log:導入日誌輸出到哪個文件
Feedback=1000:每導入1000行,在屏幕上輸出一個”.”
Buffer=10000000:設置導入緩衝區大小
Fromuser=testi:僅導入testi用戶的數據
Touser=testi:將數據導入到新用戶testi下。


2.2、局域網內遷移

局域網內的數據遷移,方案比較靈活。常用的方法有:imp/exp、impdp/expdp、dblink+腳本、表空間遷移。
其中imp/exp在2.1.2已有介紹,這裏主要介紹其他方法:
2.2.1 dblink+腳本
2.2.1.1 基本介紹
通過dblink將多個分佈式數據庫連接起來,對外提供統一的服務。可以實現在一個數據庫上,訪問多個分佈式數據庫。使用“dblink+腳本”的方法來轉移數據,配置靈活,但腳本寫起來比較麻煩。需要爲每張表單獨寫腳本。
2.2.1.2 實施方案
主要配置分兩步:
1) 創建數據庫連接
create database link LINKNAME connect to DBUSER identified by password
    using '(DESCRIPTION =
                              (ADDRESS_LIST =
                                      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.9)(PORT = 1521))
                            )
                            (CONNECT_DATA =
                                    (SERVICE_NAME =ORCL)
                              )
                  )';
2) 執行抽取腳本
如:將表B的數據抽取到表A中。
Create table A as select * from B@LINKNAME;
對每張需要同步的表分別寫腳本。
2.2.2 impdp/expdp
2.2.2.1 基本介紹
Impdp/expdp就是imp/exp的升級版,在Oracle 10g開始引入。
其主要加強功能如下:
1) 性能優化,導入導出速度明顯提升
2) 提供並行執行的能力,加快導入導出速度
3) 提供交互式界面,可隨時暫停導入導出操作
4) 提供多種表加載策略,如:追加、替換、跳過等
5) 提供數據庫對象間的直接交換功能。
6) 提供導出文件大小估計功能
7) 提供導入、導出進度查看功能
8) 自動在導出文件目錄下生成導入、導出日誌文件。
但impdp/expdp也有比較明顯的限制。
1) 與imp/exp工具生成的數據包不兼容
2) 能遠程調用,但導入導出文件必須放到服務器上
總體來說,impdp/expdp優勢還是很明顯的,所以能使用impdp/expdp時,儘量不使用imp/exp。
2.2.2.1 實施方案
Impdp/expdp的使用,主要分爲三步:
1) 創建目錄映射
在數據庫上,創建到操作系統目錄的映射:
Create directory DMPDIR as‘c:\oracle\dump\’;
授予用戶USER01對該目錄的讀寫權限:
Grant read ,write on directoryDMPDIR toUSER01;

2) 執行導出腳本

導出:



參數解釋:
Directory:數據文件導出到哪個路徑下,這裏是指定第一步創建的directory。
Dumpfile:導出文件名
Logfile:日誌文件名
Parallel:設置導出job的並行度,如果對導出速度有較高要求,可設置CPU數 - 1
Job_name:爲導出job命名
SCHEMAS:指定導出哪個用戶的數據。
3) 執行數據導入腳本
首先仿照第一步,在目標庫上創建操作系統目錄映射。然後將第二步的導出文件拷貝到目標數據庫對應目錄下。然後執行以下腳本:


參數解釋:
Directory:導入文件所在的路徑
Dumpfile:導入文件名
Logfile:指定生成日誌文件的存放位置
Parallel:指定操作並行度
job_name:指定導入job名稱
SCHEMAS:指定要導入的用戶名
REMAP_SCHEMA =TESTI:TESTB:指定將TESTI用戶的數據,導入到TESTB用戶下
TABLE_EXISTS_ACTION=REPLACE:如果要導入的表已經存在,直接替換。

2.2.2.3 界面介紹

1) 導出界面

可看到整個導出文件,約需要749.5M的存儲空間。當然,expdp也支持只評估空間,不導出數據。
2) 狀態查看界面
如果想要查看數據導入進度,新開一個窗口,執行以下腳本:
>expdp test@target  ATTACH=TESTIMP
> status

 2.2.3 表空間遷移
2.2.3.1 基本介紹
表空間遷移,相當於將一個數據庫的文件,直接用U盤拷貝到另一個數據庫使用。雖然這個原理簡單,但操作複雜。
這個操作限制比較多:
1) 原數據庫與目標數據庫數據庫字符集相同、國家字符集必須相同。可查看視圖v$nls_parameters確認;
2) 源庫與目標數據庫最好是同一Oracle版本;
3) 不能搬移SYS和SYSTEM用戶對象所在表空間。
2.2.3.2 實施方案
表空間的遷移,可以用imp/exp或impdp/expdp來完成,主要分3步:
1) 完成表空間集的自包含檢查
SQL> exec  dbms_tts.transport_set_check(‘TBS1’,true);
執行完成後,查詢:select * from v$transport_set_violations;
如果沒查出數據,表明可以執行表空間遷移。否則根據查詢結果採取其他方法。
2) 執行表空間導出
SQL>alter tablespace users read only;
CMD>expdp test@orcl  directory=DMPDIR  dumpfile=tbs_dmp.dmp
transport_tablespace= USERS
3) 執行表空間導入
將第二步生成的tbs_dmp.dmp文件、表空間USERS對應的數據文件USER01.DBF通過U盤,拷貝到目標庫,在目標庫上執行導入:
CMD> impdp test@orcl  directory=DMPDIR  dumpfile=tbs_dmp.dmp
transport_tablespace=y  tablespaces=USERS  transport_datafiles=’c:\...\USER01.DBF’
SQL> alter tablespace users read write;
2.2.3.3 界面介紹

表空間傳輸,只是導出表空間的元數據,插入到新庫中,因此速度很快。

三、整庫遷移
整庫遷移,一般用於環境的第一次搭建過程中。就是將整個數據庫原封不動的挪到別的機器上。比較適合搭建獨立的測試環境時使用。
整庫遷移也可以使用前面介紹的imp/exp、impdp/expdp工具,但是速度奇慢,且經常報錯。不如下面的方法好用。
3.1 冷備遷移
冷備遷移,就是將源數據庫關閉,然後將數據文件拷貝到新機器的相同位置,直接打開新庫就可以了。這個遷移過程,操作相對來說簡單一些,也比較好控制,但有其侷限性:不能跨操作系統硬件平臺及數據庫大版本。
Windows下的遷移步驟大致如下:
1) 關閉源數據庫
2) 根據源庫數據文件地址,在新機器上建立相應的操作系統目錄
3) 將源庫的數據文件、控制文件、參數文件、密碼文件等拷貝到新庫所在機器
4) 啓動源數據庫
5) 創建控制文件中記錄的其他目錄
6) 使用oradim創建實例
7) 啓動目標數據庫
8) 執行utlrp.sql腳本,編譯所有無效對象。

3.2 RMAN遷移
用RMAN做整庫遷移,比較方便,主要優點是可以跨操作系統硬件平臺。
下面是一個將linux系統遷移到wimdows系統的具體實施步驟(當然在32位linux和32位windows之間,可以直接複製數據文件,無需這麼麻煩,此處爲舉例演示):
1) 以read only模式打開數據庫
SQL>startup open read only;
2) 轉換數據文件
CMD> RMAN target /
RMAN> run{
convert database transport script '/home/Oracle/temp/transcript.sql'
on target platform convert script '/home/oracle/temp/convert.sql'
to platform 'Microsoft Windows IA (32-bit)'
db_file_name_convert('/oracle/oradata/orcl','/home/oracle/temp');
};
3) 將參數文件、數據文件、轉換腳本,拷貝到windows平臺上
4) 在windows平臺上建立數據庫實例,然後依次執行腳本convert.sql、transcript.sql
5) 打開數據庫,執行utlrp.sql,編譯無效數據庫對象。

四、總結
4.1 如何選擇遷移方案
不同的遷移方案,所花費的時間可能在10分鐘+到10小時+之間波動……..
方案選對了,你可以分分鐘搞定,否則就得熬夜加班了。
總的來說,如果你要遷移數據,考慮工具的優先順序如下:
把本文檔從後往前看,就得到下面這順序了……..
1) 如果遷移整個數據庫,首選冷備遷移和RMAN遷移。否則首選表空間遷移
2) impdp/expdp
3) imp/exp
4) dblink+腳本
具體選擇哪種方案,要根據實施環境而定。也許你謀劃很久的方案,環境並不支持。但總有一種適合你。

4.2 impdp/expdp與imp/exp到底有什麼區別?
Impdp/expdp = imp/exp + direct mor + parallel
Impdp/expdp比imp/exp快,最主要就是因爲它具有並行執行的特性,且默認是直接路徑導出。
除了性能優勢外,impdp/expdp還提供了幾個比較誘人的功能:
1) 提供並行執行的能力,加快導入導出速度
2) 提供交互式界面,可隨時暫停導入導出操作
3) 提供多種表加載策略,如:追加、替換、跳過等
4) 提供數據庫對象間的直接交換功能。
5) 提供導出文件大小估計功能
6) 提供導入、導出進度查看功能
7) 自動在導出文件目錄下生成導入、導出日誌文件。
回到最開始的問題,爲什麼imp/exp和impdp/expdp的導入導出速度差不多?
因爲本次測試使用impdp/expdp工具時,設置的並行度爲1。喪失了最主要的特性,能快的起來麼。
既然這個並行度這麼重要,那設置多少合適呢?設置太高,服務器CPU直接飆升至100%,導入速度還得不到提升。設置太低,完全看不到提速的效果。推薦設置:等於服務器CPU數,但不要高於dmp文件的個數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章