最近在oracle中在导入时总是出现死锁,没办法只能杀死掉这个然后从导
我的数据库有几十张表,而且有很多分区表,总的数量也挺大,大概五十多G,所以导出时都是并发德将每个分区单独导出,最后大概能有一千个dmp文件吧,然后并发导入,给我的感觉是导入的并发数低时不容易出现,并发数高时就容易出现死锁(一般24个CPU我就用24个并发),这个锁是概率性的,一般两三个并发时出现概率很小,但就要花很长时间
请问导入时出现死锁是什么原因,如何能避免死锁?

解决方案 »

  1.   

    1、再dump目录下查trace,搞清楚哪个表导致了死锁。
    2、死锁的根本原因是主键或唯一索引在不同transition下产生重复,查该表的导入逻辑,看什么情况下会出现死锁。有个办法可以帮助查找重复数据,先把该表的主键和索引删除,倒入数据后重建,主键或者哪个索引数据发生重复的话,重建就会失败。然后具体寻找重复的数据。
      

  2.   

    你能不能把问题描述得更详细一点。第一步,找出造成死锁的表或者分区。我前一个项目也做大数据量的导入导出,每天要处理的纪录超过2.5亿条。考虑到效率,没有用exp/imp,而使用代码生成文本文件,18个并发进程到处大小大约在16G左右的文本文件大约20分钟。再用18个进程通过sqlldr导入,加上重建索引,大约耗时30分钟。这个效率应该可以了。你的数据量更大,耗时应该更多。可以考虑是否采用增量更新,只导出更新过的纪录在导入,那数据量就能明显减小了。总之,在处理大数据量操作的时候,要考虑尽可能多的方案。
      

  3.   

    首先,我们要确认这个问题是死锁,这个你必须先查dump目录下的trace文件,当然如果每次你在Oracle因死锁而报错之前就kill掉session,那恐怕找不到明确的trace信息。
    *、你可以尝试让多等一段时间直到Oracle在某个session报错为止,从而确诊造成死锁的原因。
    *、当发觉死锁现象时(通常我用TOAD监控session,如果有两个session以上不再有任何io的话,基本上是互相被锁了),检查v$lock,找出问题行。网上很多这方面的资料,比如
    http://www.orafaq.com/node/854
    http://www.psoug.org/reference/deadlocks.html
    *、死锁可能并非由重复主键或索引引起,我曾经遇上过表存储参数不合理引起的死锁(多个记录抢同一个dbblock),但具体怎么解决的记不清了。这里有篇文章可以参考。
    http://it.toolbox.com/blogs/confessions/how-to-use-oracle-25-understanding-deadlocks-17029有个建议,如果你的表空间是采用uniform size的话,建议用segment auto management模式重建,对于大表性能提高很非常明显的帮助,同时能避免很多由于存储参数不合适引起的问题。