项目描述:
将Oracle系统数据库的数据通过expdp命令导出为dmp文件后,现需要在另一台电脑/服务器中将dmp文件导入到本地Oracle数据库中
问题1:
用exp命令导出的dmp文件可以用imp命令导入新的数据库中,基本不需要其他操作,但用expdp导出的.dmp文件只能用impdp导入数据库,且会遇到“表空间不存在”这类问题
解决步骤:
先创建一个同名的表空间,同名是指和导出时的数据库表空间名称相同CREATE TABLESPACE 表空间名称 DATAFILE ‘D:\XXX.dbf’ SIZE 20m AUTOEXTEND ON;
如果不知道导出时的表空间名称,可以暂时随便命名,但是后面要修改,导入数据时会有报错提示,“表空间XXX2不存在”,这时候用alter tablespace XXX1 rename to XXX2; 重命名;
ALTER TABLESPACE XXX1 rename to XXX2;
创建临时表空间
CREATE TEMPORARY TABLESPACE 临时表空间名称 TEMPFILE ‘D:\XXXTEMP.dbf’ SIZE 2m AUTOEXTEND ON;
创建同名用户,密码最好也相同,没有尝试不相同的话能不能成功
CREATE USER 用户名称IDENTIFIED BY 用户密码DEFAULT TABLESPACE 授权访问的表空间名称TEMPORARY TABLESPACE 临时表空间名称--注意临时表空间和默认表空间不能是同一个
用户授权,需要给sysdba权限
GRANT CONNECT TO 用户名称; GRANT RESOURSE TO 用户名称; GRANT dba TO 用户名称;
创建逻辑目录directory,把.dmp文件放到这个目录指向的本地物理内存中
CREATE directory ZZZZ AS "D:\dump";--注意directory指向的内存路径中不含中文,只能用英文和下划线
查看管理员目录,确认逻辑目录是否创建好了
Select *from dba_directories;
在命令行使用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字符集的数据库就很容易出现字段长度不够。
解决方法:
增加字段长度修改字符集,参考/iamlaosong/article/details/52316844数据库原本的characterset字符集是AL32UTF8
修改之后为ZHS16GBK
重新执行impdp命令,导入成功。