今天在测试环境做一下迁移工作:
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值的列超长。