美文网首页
Oracle expdp及imdpd乱记

Oracle expdp及imdpd乱记

作者: yahzon | 来源:发表于2019-05-28 10:37 被阅读0次

    先上结论:
    新数据库如果是 AL32UTF-8 ,因为字符集大,所以同样的内容,占用的字节多。结果就是容易触发一个错误:

    ORA-12899: value too large for column CONADDR (actual: 64, maximum: 60)
    

    为了避免导入时发生这个错误,解决思路就是:
    dmp文件使用的字符集和导入目标服务器字符集一致。
    为了达到这一目标,最简单的方式:

    --  保证导入目标服务器的字符集,客户端和服务器一致
    SQL> select userenv('language') from dual;  --服务器字符集
    SQL> !env|grep NLS; --客户端字符集
    
    -- 用目标服务器的客户端,执行导出命令,导出dmp文件, 导出时完成字符集转换工作
    
    另一种比较便捷的方法是先导入表定义,再修改长度,再导入数据。
    
    1.先将表定义导入
    imp ldy/oracle file=exp_tab_ldy.dmp tables=exp_tab rows=n
    
    2.将刚导入的表定义修改,拼写脚本如下:
    SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' MODIFY (' ||
           COLUMN_NAME || ' ' || DATA_TYPE || '(' || CEIL(DATA_LENGTH * 1.5) ||
           '));'
      FROM DBA_TAB_COLUMNS
     WHERE OWNER = 'LDY'
       AND DATA_TYPE IN ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2')
       AND TABLE_NAME IN ('EXP_TAB');
    
    3.再将数据导入
    imp ldy/oracle file=exp_tab_ldy.dmp tables=exp_tab ignore=y
    
     
    
    如果表比较多,例如近1个小时内只有imp导入创建的表,可以使用如下脚本:
    SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' MODIFY (' ||
           COLUMN_NAME || ' ' || DATA_TYPE || '(' || CEIL(DATA_LENGTH * 1.5) ||
           '));'
      FROM DBA_TAB_COLUMNS
     WHERE OWNER = 'LDY'
       AND DATA_TYPE IN ('CHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2')
       AND (OWNER, TABLE_NAME) IN
           (select distinct owner, object_name
              from dba_objects
             where object_type like 'TABLE%'
               and created > sysdate - 1/24);
    
    
    

    impdp XXUSER/xxPwd dumpfile=nc501.dmp directory=DATA_PUMP_DIR REMAP_SCHEMA=NNC_DATA:NC501 parallel=2 exclude=CONSTRAINT exclude=INDEX
    nc501.dmp 必需放到 DATA_PUMP_DIR对应路径中。

    select * from dba_directories where directory_name like '%PUMP%'

    因为导入数据,需要大量权限:

    grant connect,dba to XXUSER;
    grant read, write on directory DATA_PUMP_DIR to XXUSER;

    expd xxxusername/xxxpwd@orcl dumpfile=xxx.dmp schemas=anotherUsername
    log=D:\bak\xxx.log buffer=4096000 recordlength=65535 direct=y statistics=none

    导出环境:
    windows: hkey_local_mechine\software\oracle\key_oraDb11g_home1
    SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    导入环境
    Linux:
    env|grep NLS
    NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8

    导入:
    先修改导入环境,NLS_LANG:
    export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

    export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"

    create tablespace xxx datafile '/u01/app/oracle/oradata/orcl/xxx.dbf' size 2048M;

    create user xxx identified by pwdxxx default tablespace xxxspacename temporary tablespace temp;

    相关文章

      网友评论

          本文标题:Oracle expdp及imdpd乱记

          本文链接:https://www.haomeiwen.com/subject/amjrtctx.html