项目描述:
将Oracle系统数据库的数据通过expdp命令导出为dmp文件后,现需要在另一台电脑/服务器中将dmp文件导入到本地Oracle数据库中
问题1:
用exp命令导出的dmp文件可以用imp命令导入新的数据库中,基本不需要其他操作,但用expdp导出的.dmp文件只能用impdp导入数据库,且会遇到“表空间不存在”这类问题
解决步骤:
- 先创建一个同名的表空间,同名是指和导出时的数据库表空间名称相同
如果不知道导出时的表空间名称,可以暂时随便命名,但是后面要修改,导入数据时会有报错提示,“表空间XXX2不存在”,这时候用alter tablespace XXX1 rename to XXX2; 重命名;CREATE TABLESPACE 表空间名称 DATAFILE ‘D:\XXX.dbf’ SIZE 20m AUTOEXTEND ON;
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字符集的数据库就很容易出现字段长度不够。
解决方法:
- 增加字段长度
- 修改字符集,参考https://blog.csdn.net/iamlaosong/article/details/52316844
数据库原本的characterset字符集是AL32UTF8
修改之后为ZHS16GBK
重新执行impdp命令,导入成功。