近日做ODI迁移时,做数据库的导入报错,原因是导出库和导入库的表空间不一样,exp/imp报错咯。
后来通过expdp/impdp实现数据表空间的转移。
具体步骤如下:
1、使用sys用户登录,在导出库和导入库中分别创建directory
create or replace directory expdir as '/home/oracle/'
create or replace directory DPUMPDIR as '/home/oracle/upload/'
2、将directory的读写权限授权给导出、导入用户
grant read,write on directory DPUMPDIR to JJE_ODI_REPO;
grant read,write on directory DPUMPDIR to snpw;
3、导出、导入时需要登录服务器执行expdp/impdp,原因为expdp和impdp为服务器命令。
expdp QA_SOA/oracle$testdb directory=expdir dumpfile=WORKBACK.DUMP
impdp snpw/oracle$esbdb directory=DPUMPDIR remap_schema=QA_SOA:SNPW remap_tablespace=DEV_ODI_USER:JJE_ODI_USER dumpfile=WORKBACK.DUMP
其中impdp的两个参数remap_schema和remap_tablespace是进行shema和表空间转换的。使用方法为:remap_schema=QA_SOA:SNPW 含义为将数据从Schema:QA_SOA导入Schema:SNPW,使用方法类似imp中的fromuser=QA_SOA touser=SNPW;remap_tablespace=DEV_ODI_USER:JJE_ODI_USER 含义为从将表空间从DEV_ODI_USER转移为JJE_ODI_USER。
常见报错:
1、没有给导入、导出用户对directory授权读写
2、在客户端进行导入、导出操作,常见图片中的错误
另外,网上有一种转移表空间的方法,即还是可以使用exp /imp的命令实现:
1、将目标库的A表空间重命名,与源库的表空间B名字保持一致
2、使用exp/imp命令,进行源库导出,目标库导入
3、将目标库表空间重命名,命名为A
DBA Vicky说这种方式也是可行的,但是总觉得麻烦,而且正式库这么操作,让人担心,
第一种方法据说速度快,而且跨字符集也没问题,还是第一种操作方法好。