由于业务需要最近又接触了dmp文件。两年前曾经做过一些相关的导入导出,但是没有记录,这次把遇到的坑都记录一下。
oracle在10g以后的版本中提供了新的迁移工具EXPDP/IMPDP,此工具无需设置客户端字符集,而是由ORACLE自动去识别并完全字符集的转换。在实际操作中,比exp/imp要简便不少。
1)在这边的坑主要是exp导出的dmp文件只能由imp导入,而expdp导出的只能由impdp导入,两者不能混用。
可能遇到的报错如下:
ORA-39001: 参数值无效
ORA-39000: 转储文件说明错误
ORA-39143: 转储文件 “.dmp” 可能是原始的导出转储文件
IMP-00038: Could not convert to environment character set`s handle
IMP-00000: Import terminated unsuccessfully
原因:因为文件导出是用的expdp导出,而导入时用imp导入,所以导出和导入格式不一样。
2)其次要注意的就是两者的参数不同。imp导入的时候参数file需要打全文件路径,而impdp是不能带有路径的。需要提前把文件放到dpdump里以参数dumpfile直接选择文件。
可能遇到的报错如下:
ORA-39001: 参数值无效
ORA-39000: 转储文件说明错误
ORA-39088: 文件名不能包含路径说明
3)导入导出用户不一致。使用expdp/impdp时用户必须要一致,不然会报错。而使用exp/imp时,只是会报警告但不妨碍迁移。解决办法:
emp/imp用法:
formuser=导出用户 touser=导入用户;
empdp/impdp用法:
remap_schema=导出用户:导入用户
可能遇到的报错如下:
ORA-39126: 对象类型xxx创建失败, 出现错误:
ORA-01918: 用户 'xxx' 不存在
警告:这些对象由xxx导出,而不是当前用户
oracle的数据表需要手动建表空间。导入时需要建原数据表同名的表空间。
可能遇到的报错如下:
ORA-39083: 对象类型 TABLE:"XXX"."XXX" 创建失败, 出现错误:
ORA-00959: 表空间 'xxx' 不存在
解决:在oracle sql developer中创建一下表空间就行了。
Create tablespace 表空间名 datafile '数据文件' size 空间大小 Autoextend On Next 10000m Maxsize Unlimited;
Autoextend On Next 10000m Maxsize Unlimited 是自动扩容且最大不限(注意:虽然是最大不限的,但是实际操作中还是发现单个数据文件最大为32GB,超过这一大小就需要2个文件,超过64GB则需要3个,以此类推。后经查询oracle可管理的最大数据块为2的22次方个,而根据单个数据块大小大小的不同,其最大容量也是不同的。对于OLTP应用,数据块的大小通常为8K,这样,算下来,单个数据文件的大小最大为(2^22)*8K=32G)
增加一个数据文件的语句:Alter Tablespace 表空间名 Add Datafile '数据文件' Size 空间大小 Autoextend On Next 10000m Maxsize Unlimited;
tips:在此附上一个小贴士,创建数据文件的时候是需要等待的,初始建的越大等待时间越久,既然已经选了让它自己“长大“,在一开始的时候可以定的很小,比如100m。
可能遇到的报错:
ORA-01658: 无法为表空间中的段创建 INITIAL 区
这就是表空间容量不够,加大一下就好。
impdp username/password dumpfile=dumpname full=y ignore=y remap_schema=UserA:UserB
ignore=y 表示忽略创建表时的错误。在执行时被替换为 table_exists_action=append
附上一张导入成功的图,大功告成!
如图,107G的文件大概需要1小时零6分钟。数据大小的话,表空间文件花了240G。以上数据仅供参考。