1、前言:node
本文記錄了,一次實際使用數據泵工具expdp/impdp的遷移數據庫的過程。
源庫: 爲11g R2(11.1.0.6),os爲windows,
目標庫:爲10gR2(10.2.0.4), os爲AIX 6.1。
遷移的平臺是異構的(從windows到aix)且版本不相同,沒法經過物理備份進行還原,只能使用邏輯方式進行遷移,目前有兩種選擇:
a.傳統導入/導出的工具(exp/imp),優勢是簡單易用,也有必定的經驗積累。缺點是沒有並行能力,速度較慢。遷移的醫院,整個數據庫雖然只有80g,但因爲源庫的硬件使用了長達6年,性能不好,沒法在規定停機的時間內完成遷移;還有就是沒法不少新的數據類型。
b.10g或以上版本提供的數據泵工具(expdp/impdp)。相比傳統的exp/imp工具,速度有質的變化,但因爲工具較新,穩定性與我的使用經驗相對欠缺。
2、關鍵技術:
綜合對比,我決定選擇使用數據泵來實施本次遷移。其中主要利用了幾個數據泵的關鍵待性:
a.跨版本遷移數據庫;使用version參數來實現,version參數的格式以下:
version='發行版本串',好比version='10.2.0',使用這個參數後,將不會導出version參數指定的不支持的數據庫對象類型;因爲Oracle從10g纔開始出現數據泵工具,所以沒法使用將version指定爲'10.1'如下的版本。這樣低版本的數據泵工具就能夠識別高版本導出的dump文件。
b.並行導出/導入的能力,經過parallel參數來實現。
我認爲並行操做是expdp/impdp的最吸引人的特性之一,能夠最大的利用io與cpu資源,來加快導出/導入的響應的時間。開啓並行後,oracle會將大於250m的表,分解成多個數據段,由不一樣的從屬進程進行IO操做。使用並行時,須要注意的點:
1).並行進程的個數,通常能夠cpu數據量的2倍或與cpu數量相同。能夠根據系統資源的狀況靈活調整。
2).並行進程與dump文件集的關係。dump文件集中的文件數量不要少於並行進程的數量,不然可能致使多個進程爭用dump文件的狀況。能夠在dumpfile參數中使用"%U"佔位符來自動生成dump文件集。好比指定dumpfile=expdp_full%U.dmp生成的文件名會是expdp_full01.dmp,xpdp_full02.dmp,...以此類推,文件個數與並行進程數相同。
3).元數據(Metadata,也就是數據庫對象的定義,好比存儲過程、函數、表定義等)沒法使用並行進程來建立,但package body除外。
4).含有lob對象的表沒法使用並行。
5).在導入時,建立索引imp也能夠自動使用併發。
3、實際的遷移過程 sql
1.中止源服務器上db,估計5分鐘,因爲是集羣環境,使用srvctl命令更爲簡單:
srvctl stop database -d orcl
2.中止監聽,能夠在一個節點上執行,兩個節點的監聽都須要中止;而後從新打開數據庫,通過這一步後,客戶端將沒法鏈接到數據庫了。
srvctl stop listener -n nodename
srvctl start instance -d orcl -i orcl1
3.只啓動一個實例,使用export導出數據庫,因爲當前是11g數據庫,須要指定版本(version參數):數據庫
export ORACLE_SID=orcl1
--將全庫與電子病歷圖形分開導出,同時運行。全庫的會先導出完成,導出完成便可傳遞數據和在小機端進行導入操做。
expdp system/oracle DUMPFILE=expdp_full_%U.dmp DIRECTORY=dump LOGFILE=expdpfull.log FULL=y parallel=8 version='10.2.0' exclude=TABLE:\"IN (select table_name from dba_tables where table_name='電子病歷圖形' and owner='ZLHIS')\"
expdp system/oracle DUMPFILE=expdp_dzbltxs.dmp DIRECTORY=dump LOGFILE=expdp_dzbltx.log tables=ZLHIS.電子病歷圖形 version='10.2.0'
整個數據庫中,電子病歷圖形是最大的,且這個表包括了lob列,沒法使用並行操做。實際過程也證實,除了這個表的全庫導出,只須要1個小時,而這一表的導出就須要3個小時。這樣,分開來導出就不須要電子病歷圖表這個表導出,便可開始導入操做。利用這個時間差,可極大的減小總的操做時間。
4.使用ftp命令傳輸備份文件,必定注意使用二進制方式傳輸,估計40分鐘:windows
h:
cd h:\expdp
ftp 192.168.0.162
cd /backup
binary
mput expdpfull01.dmp
使用ftp傳輸數據,可使用一些ftp工具,但切記使用二進制方式進行傳輸,不然文件dump傳遞到小型機後可能不可用。
5.在小型機上只開啓一個實例,開始導入數據庫,使用並行度8,正式庫的數據導入準備工做在數據導出期間先進行,這些工做主要爲了加快導入的速度作的一些調整:服務器
a.關閉歸檔,減小歸檔的文件操做,可必定程度上減小停機時間
b.建立表空間同時;加大undo表空間到20g,temp表空間爲10g; 原庫有一個temp01的臨時表空間,注意導入完成後,刪除這個臨時表空間。
1)先建立表空間,執行/backup/create_ts.sql腳本。
2)將表空間設置爲自動增加,這是生成修改腳本的sql:
select 'alter database datafile '||file#||' autoextend on ;' from v$datafile
select 'alter database tempfile '||file#||' autoextend on ;' from v$tempfile
在Oracle對datafile與tempfile均可以使用文件編號(file#)來代替完整的文件名,以此來簡化咱們的命令。
3)加大undo段與臨時段
alter database datafile '+DATA/orcl/UNDOTBS01.DBF' resize 20g;
alter database tempfile '+DATA/orcl/temp01.DBF' resize 10g;
加大temp表空間是由於,建立索引時,須要大量地的排序操做,當內存中沒法完成排序時,須要使用temp表空間來完成排序。網絡
c.關閉pga自動管理,並加大*_area_size參數爲100m
alter system set workarea_size_policy=manual;
alter system set sort_area_size=104857600;
建立索引時,須要大量地的排序操做,加大排序區以使,排序儘可能在內存中完成,能夠起到比較明顯的加塊索引建立的效果。但Oracle 10g默認是使用pga自動管理,沒法手動設置排序區,因此須要先關閉pga自動管理。
d.建立目錄對象
create directory dump as '/backup';
grant read,write on directory dump to system;
數據泵工具是服務端工具,導入/導出進程的io操做只能在oracle服務端,須要建立一個目錄對象來保存dump文件與log文件。
e.加一組4g的logfile ,導入時,會產生大量的redo日誌,加一組這樣的日誌,能夠減小日誌切換的頻繁,以加快導入速度。
alter database add logfile thread 1 group 5 '+DATA/orcl/redo05.log' size 4g;
f.執行導入,一樣使用並行操做,兩個dump文件分開導入。
export ORACLE_SID=orcl1
impdp system/zlsoft DUMPFILE=expdpfull%U.dmp directory=dump full=y LOGFILE=impdpfull.log parallel=8 exclude=SCHEMA:\" in ('SYS','SYSTEM','OUTLN','MGMT_VIEW','FLOWS_FILES','MDSYS','ORDSYS','EXFSYS','DBSNMP','WMSYS','WKSYS','WK_TEST','CTXSYS','ANONYMOUS','SYSMAN','XDB','WKPROXY','ORDPLUGINS','FLOWS_030000','OWBSYS','SI_INFORMTN_SCHEMA','OLAPSYS','SCOTT','ORACLE_OCM','TSMSYS','XS$NULL','MDDATA','DIP','APEX_PUBLIC_USER','SPATIAL_CSW_ADMIN_USR','SPATIAL_WFS_ADMIN_USR')\"
impdp system/zlsoft DUMPFILE=expdp_dzbltx.dmp directory=dump LOGFILE=impdp_dzblt.log tables=ZLHIS.電子病歷圖形 parallel=4
測試時間3.5小時
6.收集統計信息,40分鐘,下面已經可使用.
--數據字典統計信息,這個腳本的規則是,大於50m的對象就使用並行度爲8,採樣比5%的收集方式來加快收集統計信息的速度
exec dbms_stats.gather_dictionary_stats(estimate_percent => 100,degree => 4,cascade => true);
--ZLHIS對象,大於50m的表使用8的併發,並採樣5%:
select 'exec dbms_stats.gather_table_stats(ownname => ''ZLHIS'',tabname => '''||table_name
||''',estimate_percent => '||decode(sign(b.BYTES/1024/1024-50),1,5,100) ||',method_opt => ''for all indexed columns size auto'',cascade => true,force => true,degree => '
||decode(sign(b.BYTES/1024/1024-50),1,8,1)||');'
from dba_tables a,dba_segments b where a.table_name=b.segment_name and b.segment_type='TABLE'
and a.owner='ZLHIS'
order by b.BYTES desc
--ZLTOOLS對象,採樣100%
exec dbms_stats.gather_schema_stats(ownname => 'ZLTOOLS',estimate_percent => 100,degree => 4,cascade => true,force => true);
特別強調一點,數據遷移後,數據通過了重整,從新收集統計信息是一個保證cbo獲得最優執行計劃的必須保證。
7.清除特殊設置,20分鐘
a.設置sort_area_size爲默認值,同時開啓pga自動管理。
alter system set sort_area_size=65536 scope=spfile;
alter system set hash_area_size=131072;
alter system set workarea_size_policy=auto;
shutdown immediate;
startup;
b.恢復undo與temp表空間爲正常值
alter database datafile '+DATA/orcl/UNDOTBS01.DBF' resize 8g;
alter database tempfile '+DATA/orcl/temp01.DBF' resize 4g;
--刪除原來的temp01表空間,使用默認的temp表空間
select 'alter user '||username||' temporary tablespace temp;'
from dba_users where temporary_tablespace='TEMP01'
drop tablespace temp01 ;
c.刪除4g的logfile,若是是當前日誌,須要切換日誌;
select * from v$logfile;
alter system switch logfile;
alter database drop logfile group 5;
d.從新開始歸檔,須要從新啓動db.
8.從新編譯失效對象
a. 受權特殊對象:
grant select on v_$session to public;
grant select on dba_role_privs to public;
b. 使用pl/sql編譯失效的ZLHIS對象,有幾個中文亂碼的存儲過程須要調整。
c. 最後使用utlrp.sql腳本編譯失效對象。ZLHIS中大量的私用同義詞,在導入完成後,不少都是處於invalid狀態,須要從新編譯。oracle提供了$ORACLE_HOME/rdbms/admin/utlrp.sql腳原本編譯數據庫中的失效對象,最吸引個人是這個腳本的並行編譯的能力,可極大的加快編譯的速度。
9.斷開老服務器的網絡session
10.修改小型機rac的public ip與vip,與老服務器相同,並從新啓動監聽。20分鐘,因爲是RAC環境,這一步操做比較麻煩,主要的命令是
srvctl modify nodeapps -n p710a -A 192.168.0.4/255.255.255.0/en0
詳細步驟,請參考Metalink文檔:276434.1 <Modifying the VIP or VIP Hostname of a 10g Oracle Clusterware Node>併發
11.應用測試,通知使用,遷移完成。oracle
12.最後來提一個很是有用的expdp/impdp的命令。在導出/導入中,常常有可能某些緣由,致使任務導常停止;這時候可使用attach參數附加到先前的expdp/impdp做業中,expdp/impdp在做業中會建立一個用來記錄做業狀態的表,這個表就是做業能夠繼續的緣由。做業名在在日誌有記錄,也能夠經過查詢dba_datapump_jobs來得到。attach的語法以下:
ATTACH=[schema_name.]job_name
Schema_name用於指定方案名,job_name用於指定導出做業名.注意,若是使用ATTACH選項,在命令行除了鏈接字符串和ATTACH選項外,不能指定任何其餘選項,示例以下:
Expdp system/oracle ATTACH=system.expdp_full_jobapp
四 總結 數據泵是個優秀的工具,特別是大數據的邏輯遷移,性能相比傳統的exp/imp有質的提高,但傳統的exp/imp仍是有他的優點,最大的優點就是exp/imp不是服務器端工具,部署更爲便利,且支持的版本更多。 整個遷移共計時間4.5小時,原來預計的7小時左右;因爲導入時間大大優於估計時間,實際共消耗時間4.5小時,整個遷移過程很是順利。若是是9i遷移到異構的平臺,在使用exp/imp的狀況下,除了表的數據之外,也能夠手動實現部分並行操做,主要是索引與約束的建立。曾經在一個醫院將190g的zlhis,也只用了4個小時的停機時間,完成了遷移,但整個過程比較複雜,可另行文描述。