Pular para o conteúdo

Fóruns Banco de dados Oracle ORA-00001 violação de PK em importação ORA-00001 violação de PK em importação

#104303
Thiago
Participante

    Log de Erro do import:

    Import: Release 11.2.0.3.0 – Production on Wed Aug 22 01:11:26 2012

    Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.

    Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
    With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
    Data Mining and Real Application Tes

    Export file created by EXPORT:V11.02.00 via direct path
    import done in US7ASCII character set and AL16UTF16 NCHAR character set
    import server uses WE8ISO8859P15 character set (possible charset conversion)
    . importing LF’s objects into LF
    . importing LF’s objects into LF
    . . importing subpartition “LF_NF_SAIDA”:”CAPA_2012_05_OUTROS_37″
    IMP-00019: row rejected due to ORACLE error 1
    IMP-00003: ORACLE error 1 encountered
    ORA-00001: unique constraint (LF.PK_NF_SAIDA) violated

    Pessoal… Boa Noite….
    Fiz o post.. com o intuito de compartilhar o problema com vocês, busquei na internet, vasculhei tudo, mas oque me levou a ver o problema e a ter a solução foi uma serie de análises em busca ao sucesso rsrsr

    Bom vamos lá, meu import tinha 90GB

    1 – no primeiro momento fiz o import na base com o seguinte parfile:

    userid=lf/lf_1431
    tables=(LF_NF_SAIDA:CAPA_2012_05_OUTROS_37)
    rows=y
    file=exp_saida_201205.dmp
    log=imp_saida_201205.log
    statistics=none
    grants=n
    constraints=n
    indexes=n
    ignore=y
    feedback=1000000
    buffer=10000000
    recordlength=65535
    commit=n

    vejamos que eu tenho como parametro o commit=n, coloquei de proposito, sabendo que o commit=n carrega mais rapido, mas esqueci de verificar se existia espaço na tablespace UNDO
    pra entrar o meu import, bom deixei de um dia pro outro, quando cheguei me deparei com o estouro da UNDO, beleza fazer oque colocar o parametro commit=y e colocar novamente o import,
    simples sem mistério, como sempre precavido fiz um select count(*) na subpartition CAPA_2012_05_OUTROS_37 que obtive como retorno 0 registros !!!!!

    Otimo beleza… agora só carregar!!!, rodei o import, e tomei o erro de violação de PK…. Pensei pô a subpartition está vazia, mas só pra dar aquela assegurada
    rodei um “ALTER TABLE TABLE_NAME TRUNCATE SUBPARTITION SUBPARTITION_NAME. Pensei Opa.. beleza agora vai!!!!!!!
    Doce e mera ilusão.. coloquei o import novamente e o mesmo erro, comecei a achar que o arquivo de Export estava com os arquivo duplicados, fui na tabela fiz um select para verificar se havia duplicidade
    e pra minha surpresa o registro nao estava duplicado, ai começou o meu cabelo a coçar, minha cara mudou, já comecei a ficar puto com a porcaria de um exp/imp simples, velho, antigo…..
    Fiz o post na espectativa que alguem tive-se uma ideia pois eu já tinha tentado bastante coisa.

    Já estava sem forçar e com esse problema o dia todo fui dormir as 04:00 da manha e as 06:00 já estava de pé, vim decidido a resolver o problema,
    Quebrando muito a cabeça, resolvi largar a M**** do import.
    Criar um Db_link de um banco pra outro e fazer via Insert, tive alguns problemas na criação do DB_LINK pois no servidor tinha o mesmo SID que apontava pra 2 servidores diferentes
    otimo e eu super feliz e calmo, pois nao fui eu quem o configurou, liguei pro pessoal e pedi um usuario com direitos pra fazer a modificação, nao quiseram me dar, ai forcei eles mesmos a fazerem a alteração.

    Conssegui criar o Db_link, beleza como nao sou bobo meti um insert /+ APPEND */ as select /+ PARALLEL 24 */ meti na maquina e vamo q vamo acompanhar..

    não é que o Insert deu erro, de violação de PK tambem.. Pronto aí eu comecei a tentar penssar em saidas, pensei po vou verificar esse dado, quando fui na base que estava tentando importar ele existia mesmo, pensei como ele existe se a subpartition dele está 0
    a unica explicação é que esse dado que estou trazendo nao está caindo na subpartição certa!

    Fui olhar o Max_value das subpartiçoes e partiçoes, até que me deparei com o seguinte quadro:

    [color=#FF0000]Partition Name Max Value
    CAPA_2012_07 TO_DATE(‘ 2012-09-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_06 TO_DATE(‘ 2012-08-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_05 TO_DATE(‘ 2012-07-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_04 TO_DATE(‘ 2012-06-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)[/color]
    CAPA_2012_03 TO_DATE(‘ 2012-04-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_02 TO_DATE(‘ 2012-03-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_01 TO_DATE(‘ 2012-02-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2011_12 TO_DATE(‘ 2012-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)

    Olhei e falei pultz lógico que a supartition que eu estou verificando está zerada e que o dado existe, pois ele estava caindo em uma partition que nao deveria cair a 2012_04, pois a distribuição do Max_value, fugiu do padrão como podemos notar! Bom fiquei feliz e Pau da vida ao mesmo tempo, por causa da alma caridosa que fez isso na base, mas contudo fazer oque vamos corrigir neh…

    Salvei os dados referente à todo o periodo de 2012 em uma tabela temporaria, dropei todas as partitions desde 2012_04, criar as partiçoes corretamente, voltei com os dados !

    vejamos a distribuição do Max_Value:

    Partition Name Max Value
    [b][color=#FF0000]CAPA_2012_12 TO_DATE(‘ 2013-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_11 TO_DATE(‘ 2012-12-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_10 TO_DATE(‘ 2012-11-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_09 TO_DATE(‘ 2012-10-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_08 TO_DATE(‘ 2012-09-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_07 TO_DATE(‘ 2012-08-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_06 TO_DATE(‘ 2012-07-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_05 TO_DATE(‘ 2012-06-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_04 TO_DATE(‘ 2012-05-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_03 TO_DATE(‘ 2012-04-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_02 TO_DATE(‘ 2012-03-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2012_01 TO_DATE(‘ 2012-02-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)
    CAPA_2011_12 TO_DATE(‘ 2012-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’, ‘NLS_CALENDAR=GREGORIAN’)[/color][/b]

    Com o Max_Value devidamente restaurado, dei um ALTER TABLE TRUNCATE PARTITION no mes 2012_05, e importei todo o mês 05, ao inves de importar somente uma subpartition somente,

    e pra minha felicidade está rodando e até agora sem erros.. e logicamente coloquei commit=y pra nao estourar a UNDO novamente rsrsrss…..

    Bom pessoal quiz compartilhar com vocês pois procurei um bucado pela internet e nao achei nenhuma solução pro meu problema !!! e pra mostrar que temos que tentar de tudo, se eu tivesse jogado a toalha, quando me depara-se com esse problema novamente continuaria sem saber resolver.
    Agora eu já tenho mais uma saida pra quando acontecer novamente rsrsrs…

    Abração pessoal!!!!!