使用expdp/impdp迁移数据经验一则

今天在测试环境做一下迁移工作:

1、使用network_linK选项,减少数据落地时间

2、可以使用system等系统用户做impdp,免去目标端创建用户的操作

3、迁移前最好在源端执行以下下面的SQL,把CHAR和VARCHAR类型的字段由按byte计算修改为按char计算,这样可以避免在目标端出现ORA-01401的错误:

set serveroutput on  
DECLARE  
sqlstr varchar2(4000);  
cursor sqlcurs is  
select owner,table_name,column_name,data_type,char_length from dba_tab_columns  
where owner=upper('&username') and table_name like upper('%&tablename%')
and data_type in ('CHAR','VARCHAR2') order by table_name,column_id;  
begin  
for str in sqlcurs loop  
    sqlstr:='ALTER TABLE '||str.owner||'.'||str.table_name||' MODIFY('||str.column_name||' '||str.data_type||'('||str.CHAR_LENGTH||' CHAR'||'))';  
    dbms_output.put_line(sqlstr||';');  
    begin
          execute immediate sqlstr;  
          exception
                  when others then
                  null;
          end;
end loop;  
end;  
/
Enter value for username: DATAEXCHG
Enter value for tablename: 
其实你可能会认为如果使用content=metadata_only先导入表结构,再在目标端修改byte为char,然后再使用content=data_only,那你就错了!!!其实我也这么试过,发现发现还是报错ORA-01401。

后来一看源端的建表DDL语句才发现问题,请看:

CREATE TABLE DATAEXCHG.LOGINFO
(
  LOGID           NUMBER(14,2)                  NOT NULL,
  LOGLEVEL        INTEGER                       NOT NULL,
  LOGTIME         VARCHAR2(14 BYTE)             DEFAULT SYSDATE,
  MODULETYPE      INTEGER                       NOT NULL,
  OBJID           VARCHAR2(21 BYTE),
  ERRORCODE       VARCHAR2(10 BYTE),
  FAILTIMES       INTEGER,
  DESCRIPTION     VARCHAR2(1000 BYTE),
  LASTUPDATETIME  VARCHAR2(14 BYTE)             DEFAULT SYSDATE
)
其实这个SQL看起来很正常,但是当你执行的时候会发现,使用DEFAULT SYSDATE的列会报超长,但是把Byte改成Char就OK了。

所以需要现在源端修改,这是为了避免这些DEFAULT值的列超长。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值