思考:
对于 DBA 而言, 常用物理方式的迁移, 物理迁移的优势不必多说, 使用这种方式不必担心对象前后不一致的情况, 而这往往也解决了不懂业务的 DBA 最头疼的问题.
对于开发而言, 常用逻辑方式的迁移, 比如传统的 exp/imp 或者现在的 expdp/impdp, 优势是简单方便, 不需要了解过多的数据库运维知识.
实际上, 在某些数据库升级的场景下, 针对业务数据量不大, 停机时间充裕的迁移专项来说, 也可以考虑采用数据泵逻辑迁移的方式.
那么数据泵的导出导入究竟需要注意哪些事项呢? 本文宗旨是通过构建一个简单的例子来说明.
1. 构建测试用例
2. 查询特殊对象
3. 测试迁移过程
4. 正式迁移过程
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)
来源: https://www.cnblogs.com/jyzhao/p/9030126.html