zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    大战设计模式【13】—— 组合模式
    大战设计模式【12】—— 迭代器模式
    大战设计模式【11】—— 模板方法模式
    大战设计模式【10】—— 外观模式
    linux命令进阶
    ansible普通用户su切换
    Ansible 进阶技巧
    ansible playbook对错误的处理
    ansible示例,离线安装etcd
    (原)centos7安装和使用greenplum4.3.12(详细版)
  • 原文地址:https://www.cnblogs.com/jyzhao/p/9030126.html
Copyright © 2011-2022 走看看