日前,处理了一则IMPDP导入失败的问题,到现在为止,还有一些问题无解,防止日后忘掉,也为了看看有没有高手给说说,故记录。
某日上午,同事问,是不是Oracle ImpDp的文件多大,undo表空间就要多大?我认为,undo不过是处理一致性读的,ImpDp作为导入工具,这个ImpDp无论如何也不能对Undo造成太大影响,故说不必吧,结果同事说,他导入200g的数据时候(其中只有一个业务主表的数据),Impdp报临时表空间不足的问题。
偶VPN到DB上,借机看看这套系统,这也是我们产品线目前应用中数据量最大的环境,Oracle DB配置如下:
OS :Redhat linux as4 64bit
Cpu Intel 8核心,型号忘了
Memory 32G
这个时候查看下主表数据,基本上是个查询就挂起,产看undo表空间,undo的唯一数据文件已经是32g了,默认情况,这个是最大值了已经。。。。。。。。
这个主表是个分区表,导入失败了,但是表空间显示占用了,就是看不到数据。
查看了下undo中的对象,有一个居然是32.1G,这个很邪门,一定是Oracle的bug,或者是我的Toad显示有问题。。。。。。。。。。
由于当时ImpDp已经取消了,但undo空间一直占用,我猜测,这个是Oracle的BUG,impdp异常退出了,有些资源没有及时清理。可惜呀,没有OTN的ID。
当时数据库非常慢,外部链接基本上是这种情况:连接上,只要对那个主表有DML,当前连接马上就断掉,在v$session中program字段马上变成了空,本来正常情况,也就50~60个sessions,这个异常情况下,居然有140多个session了,(这个系统没有个稍微专业一点的管理人员,哪怕如我一般也好,虽然我很菜,所以参数都是默认的,除了sga调整过,还是我上次调整的)其他80多个都是program为空的情况。。。。
关键是客户领导马上要看,问题很棘手呀。
然后先应付过去领导,怎么应付就不说了,丢人了点。
应付过去之后,我认为把undo清理一下,然后恢复下主表应该就没有问题了。
接下来开始按照我的思路来:
创建新的undo,进行切换。
create undo tablespace 。
alter system set undotablespace。
然后删除之前的undo,提示删除不掉。
然后加入隐藏参数,_CORRUPTED_ROLLBACK_SEGMENTS
create pfile from spfile
修改pfile,按照pfile启动,删除undo,这次成功了。
然后导出主表数据,300w左右,truncate这个表 ,之前占用的数据文件释放了,然后导入,重启数据库,一切正常了。
按照说明还要全库导出导入的,想想,算了。若还有问题,让他们重装吧就。
总结:
首先,impdp是不是真的是多大的文件,比如只有一个表,然后这个表数据200g,就要准备200g的数据文件。
第二,undo中记录的和这个表相关的到底是什么,如果是闪回的话,就太恐怖了,几百G的数据,undo直接不用玩了。
第三,我这种处理方式有没有啥大的隐患?
哎,行文能力不足,下次自己读的时候,修改下吧。