Oracle imp/impdp 导入dmp文件到数据库

项目描述:

将Oracle系统数据库的数据通过expdp命令导出为dmp文件后,现需要在另一台电脑/服务器中将dmp文件导入到本地Oracle数据库中

问题1:

用exp命令导出的dmp文件可以用imp命令导入新的数据库中,基本不需要其他操作,但用expdp导出的.dmp文件只能用impdp导入数据库,且会遇到“表空间不存在”这类问题

解决步骤:

  1. 先创建一个同名的表空间,同名是指和导出时的数据库表空间名称相同
    CREATE TABLESPACE 表空间名称 
    DATAFILE ‘D:\XXX.dbf’ 
    SIZE 20m 
    AUTOEXTEND ON;
    如果不知道导出时的表空间名称,可以暂时随便命名,但是后面要修改,导入数据时会有报错提示,“表空间XXX2不存在”,这时候用alter tablespace XXX1 rename to XXX2; 重命名;
    ALTER TABLESPACE XXX1 rename to XXX2;
  2. 创建临时表空间
    CREATE TEMPORARY TABLESPACE 临时表空间名称 
    TEMPFILE ‘D:\XXXTEMP.dbf’  
    SIZE 2m 
    AUTOEXTEND ON;
  3. 创建同名用户,密码最好也相同,没有尝试不相同的话能不能成功
    CREATE USER 用户名称
    IDENTIFIED BY 用户密码
    DEFAULT TABLESPACE 授权访问的表空间名称
    TEMPORARY TABLESPACE 临时表空间名称
    --注意临时表空间和默认表空间不能是同一个
  4. 用户授权,需要给sysdba权限
    GRANT CONNECT TO 用户名称; 
    GRANT RESOURSE TO 用户名称; 
    GRANT dba TO 用户名称;
    
  5. 创建逻辑目录directory,把.dmp文件放到这个目录指向的本地物理内存中
    CREATE directory ZZZZ AS "D:\dump";
    --注意directory指向的内存路径中不含中文,只能用英文和下划线
  6. 查看管理员目录,确认逻辑目录是否创建好了
    Select *from dba_directories;
  7. 在命令行使用impdp指令导入dmp文件
    impdp 用户名/密码@localhost/sid directory=ZZZZ dumpfile=YYYY.dmp full=y
    '''
    sid是所用的数据库实例名,ZZZZ写前面设置的逻辑目录,YYYY写要导入的文件的名称
    直接在命令行运行,结尾无分号
    '''

问题2

impdp导入操作可以执行,但遇到错误ORA-12899

原因

导出和导入的数据库字符集不同,汉字占的长度不同。中文在ZHS16GBK中占2个字节,在UTF-8中却占3个字节,所以汉字导入UTF-8字符集的数据库就很容易出现字段长度不够。

解决方法:

  1. 增加字段长度
  2. 修改字符集,参考https://blog.csdn.net/iamlaosong/article/details/52316844

Oracle imp/impdp 导入dmp文件到数据库_第1张图片

 

数据库原本的characterset字符集是AL32UTF8

修改之后为ZHS16GBK

重新执行impdp命令,导入成功。

你可能感兴趣的:(数据库,大数据,oracle,sql)