Oracle數據庫邏輯遷移之數據泵的注意事項


環境:數據遷移,版本 11.2.0.4 -> 12.2.0.1
思考:
對於DBA而言,常用物理方式的遷移,物理遷移的優勢不必多說,使用這種方式不必擔心對象前后不一致的情況,而這往往也解決了不懂業務的DBA最頭疼的問題。
對於開發而言,常用邏輯方式的遷移,比如傳統的exp/imp或者現在的expdp/impdp,優勢是簡單方便,不需要了解過多的數據庫運維知識。
實際上,在某些數據庫升級的場景下,針對業務數據量不大,停機時間充裕的遷移專項來說,也可以考慮采用數據泵邏輯遷移的方式。
那么數據泵的導出導入究竟需要注意哪些事項呢?本文宗旨是通過構建一個簡單的例子來說明。

1.構建測試用例

我的想法是,構建一個小的測試用例,但盡可能的包含更多類型的對象,從而模擬現實絕大部分的場景。 那么,仔細的思考下,我們至少需要創建: - 1.1 用戶的默認數據表空間、索引表空間、臨時表空間 - 1.2 多個用戶schema,擁有不同的角色權限 - 1.3 用戶下建有表(普通堆表、索引組織表、全局臨時表、分區表、簇表、外部表),表上的約束(主鍵、外鍵) - 1.4 用戶下建有索引(B-Tree索引、bitmap索引、函數索引、分區索引) - 1.5 用戶下有視圖(普通視圖、物化視圖) - 1.6 用戶下有同義詞(public的同義詞,private的同義詞) - 1.7 用戶下有dblink(public的dblink,private的dblink) - 1.8 用戶下有存儲過程、函數、觸發器、包、包體、序列

2.查詢特殊對象

**2.1 查詢public database link** select dbms_metadata.get_ddl('DB_LINK',DB_LINK,'PUBLIC') FROM DBA_DB_LINKS where owner='PUBLIC';
SYS@jyzhao1 >select dbms_metadata.get_ddl('DB_LINK',DB_LINK,'PUBLIC') FROM DBA_DB_LINKS where owner='PUBLIC';

SYS@jyzhao1 >set long 999999
SYS@jyzhao1 >/

DBMS_METADATA.GET_DDL('DB_LINK',DB_LINK,'PUBLIC')
--------------------------------------------------------------------------------

  CREATE PUBLIC DATABASE LINK "TO_JYZHAO_LD"
   CONNECT TO "LUDAN" IDENTIFIED BY VALUES ':1'
   USING 'JYZHAO'

SYS@jyzhao1 >

2.2 查詢public synonym

SYS@jyzhao1 >SELECT DBMS_METADATA.GET_DDL('SYNONYM',a.SYNONYM_NAME,a.owner) FROM DBA_SYNONYMS a where a.owner ='PUBLIC' and table_owner in ('JINGYU','LUDAN');

DBMS_METADATA.GET_DDL('SYNONYM',A.SYNONYM_NAME,A.OWNER)
--------------------------------------------------------------------------------

  CREATE OR REPLACE PUBLIC SYNONYM "PUBIC_DEPT" FOR "JINGYU"."DEPT"


  CREATE OR REPLACE PUBLIC SYNONYM "PUBIC_EMP" FOR "JINGYU"."EMP"


SYS@jyzhao1 >

2.3 查詢外部表

SYS@jyzhao1 >select * from dba_external_tables;

OWNER                          TABLE_NAME                     TYP TYPE_NAME                      DEF DEFAULT_DIRECTORY_NAME         REJECT_LIMIT                             ACCESS_
------------------------------ ------------------------------ --- ------------------------------ --- ------------------------------ ---------------------------------------- -------
ACCESS_PARAMETERS                                                                PROPERTY
-------------------------------------------------------------------------------- ----------
SH                             SALES_TRANSACTIONS_EXT         SYS ORACLE_LOADER                  SYS DATA_FILE_DIR                  100                                      CLOB
RECORDS DELIMITED BY NEWLINE CHARACTERSET US7ASCII                               ALL
    TERRITORY AMERICAN
    BADFILE log_file_dir:'ext_1v3.bad'
    LOGFILE log_file_dir:'ext_1v3.log'
    FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '^' LDRTRIM
    ( PROD_ID         ,
      CUST_ID         ,
      TIME_ID         DATE(10) "YYYY-MM-DD",
      CHANNEL_ID      ,
      PROMO_ID        ,
      QUANTITY_SOLD   ,
      AMOUNT_SOLD     ,
      UNIT_COST       ,
      UNIT_PRICE
    )

SYS@jyzhao1 >

3.測試遷移過程

主要測試邏輯遷移的可行性,為之后正式停機時的操作奠定基礎。
--創建目錄(兩端):
create directory xdump as '/public/xdump';
create directory xdump as '/public/xdump';

--expdp導出:
nohup expdp system/oracle schemas=JINGYU,LUDAN directory=xdump dumpfile=db1_zs_SCHEMA_%U.dmp logfile=expdp_db1_zs_SCHEMA.log PARALLEL=4 cluster=n &

--impdp導入:
nohup impdp system/oracle schemas=JINGYU,LUDAN directory=xdump REMAP_TABLESPACE=DBS_D_JINGYU:USERS,DBS_I_JINGYU:USERS,TEMP_JINGYU:TEMP table_exists_action=replace dumpfile=db1_zs_SCHEMA_%U.dmp logfile=impdp_db1_zs_SCHEMA.log parallel=4 cluster=n &

4.正式遷移過程

正式遷移需要做的事情: - 4.1 鎖定遷移的業務用戶 - 4.2 殺掉業務會話 - 4.3 關閉job分別在兩端 - 4.4 源端導出並傳送 - 4.5 目標端准備並導入 - 4.6 創建public對象 - 4.7 解鎖業務用戶 - 4.8 目標端開啟job - 4.9 配合應用測試
--4.1 鎖定遷移的業務用戶
alter user JINGYU account lock;
alter user LUDAN account lock;

--4.2 殺掉業務會話
select * from v$session where username in ('JINGYU','LUDAN');
select 'alter system kill session ''' || sid || ',' || SERIAL# || ''';' from v$session where username in ('JINGYU','LUDAN');
ps -ef|grep LOCAL=NO|grep -v grep|xargs kill -9

--4.3 關閉job分別在兩端
show parameter job_queue_process
SYS >alter system set job_queue_processes=0;

--4.4 源端導出並傳送
nohup expdp system/oracle schemas=JINGYU,LUDAN directory=xdump dumpfile=db1_zs_SCHEMA_%U.dmp logfile=expdp_db1_zs_SCHEMA.log PARALLEL=4 cluster=n &

- 4.6 創建public對象
根據查詢的public對象,直接創建即可。

- 4.7 解鎖業務用戶
在遷移升級失敗,遭遇不可抗力,最終導致環境確實需要回退時才可以。
alter user JINGYU account unlock;
alter user LUDAN account unlock;

- 4.8 目標端開啟job
SYS >alter system set job_queue_processes=1000;

- 4.9 配合應用測試
略

延伸MOS文檔:

  • Oracle Server - Export DataPump and Import DataPump FAQ (文檔 ID 556636.1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM