使用數據泵進行HIS數據庫遷移

 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個小時的停機時間,完成了遷移,但整個過程比較複雜,可另行文描述。

相關文章
相關標籤/搜索