写这篇文章的时候我还在加班做数据库备份~
事情是这样的,在做oracle数据库迁移达梦的时候,要求先从某个生产库导出一些生产数据表结构,导入另一台oracle做一个模拟库来进行迁移演练,对这个用户下的 表结构利用expdp estimate进行数据量大小预估后我就进行了expdp导出,只花了几分钟,错误不在这里,而是在新库导入的时候出现,当我在新库创建好directory映射目录和导入用户后,我就毛毛躁躁进行impdp导入操作,我第一次的命令是如下
impdp sjtbk/********** dumpfile=expdp.dmp logfile=impdp.log DIRECTORY=data schemas=sjtbk
然后悲剧出现了,在生产库的时候存在一些唯一约束,外键对象,复合索引等,没有进行相应对象导出,所以导入时报一堆错误,以下例举错误详情
先查看imp日志
第一个错误:
ORA-00959 表空间 'XXX'不存在,ORA-39111 ,ORA-39112
原因是在源库(生产库)创建表,索引等内容时指定了表空间,而在目的库(演练库)没有这个表空间而报错,并且源库中的schema和别的用户相互授权了,但导出的dmp中没有包含所有的用户,并且目标库也没有这些用户。
解决方法:在impdp导入命令里添加transform 参数
transform=segment_attributes:n
加上这个参数后,就会倒进用户默认的表空间,因为目的库新建的用户没有指定表空间,所以是默认USERS表空间。
完整impdp命令
impdp sjtbk/********* dumpfile=expdp.dmp logfile=impdp.log DIRECTORY=data schemas=sjtbk transform=segment_attributes:n ignore=y;
这个时候又出现了新的错误
第二个错误:
ORA-39171: 作业出现可恢复的等待。
ORA-01653: 表 SJTBK.E_SM_ALTERRECODER 无法通过 8192 (在表空间 USERS 中) 扩展,原因是USERS表空间不足了。
解决方法:对USERS表空间进行扩容
alter tablespace users add datafile '/path/path/users11.dbf' size 31G;
可以继续导入了
服了,又来新的错误。
第三个错误:
ORA-39083 ORA-00001
这个报错我想的解决方法是禁用约束,想一想就行了,不想解决~
第四个错误
ORA-01917
原因是源库中的schema和别的用户相互授权了,但导出的dmp中没有包含所有的用户,并且目标库也没有这些用户。所以就有用户或角色不存在。(这些不存在的用户或角色太多了~不知道这个库建表的人是怎么想的关联这么多用户)。这个错不想解决,狗才新建用户呢
第五个错误
字符集匹配错误
源库的字符集是AMERICAN_CHINA.ZHS16GBK,而目的库的字符集是SIMPLIFIED CHINESE_CHINA.AL32UTF8
虽然报了很多错,但是后面也导入了表结构。
最后面的结果是导入了346张表,源库表是多少来着,反正相差不大,就是不知道缺失约束,主键外键了没有,反正大概率不能用了
所以我就还是老老实实的做全库备份然后异机恢复吧,数据泵工具是真不好用。
加班备份全库数据,,重新选择rman来做备份恢复,对我来说相对不容易出现问题。。。
over