Pular para o conteúdo
  • Este tópico contém 11 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 5 meses atrás por juliano_sf.
Visualizando 12 posts - 1 até 12 (de 12 do total)
  • Autor
    Posts
  • #87357
    Anderson_
    Participante

      Bom dia.

      Gostaria de uma informação.

      Estou fazendo uma limpeza em uma tabela que por sinal é muitoooo grande.
      Preciso mesmo limpar essa tabela.
      Deixar com poucos meses de registros.
      Mas estou tendo um problema.

      Quando mando deletar vários meses, de 6 meses a 1 anos, a minha tablespace de UNDO esta ficando cheia. Chega ficar com 99 % usada. E por isso acabou atrapalhando o processo de outros usuário do Oracle.

      Existe alguma forma de deletar os registros que desejo sem afetar a tabela de UNDO.??

      Muito Obrigado.

      #87358
      David Siqueira
      Participante

        Opa e ai anderson tudo bem?
        Bom, a idéia inicial cara é que você crie um processo pra essa deleção com commits a cada 1000 registros ou mais, afim de liberar espaço de undo durante seu processo.

        Outra opção é você olhar seu parametro de UNDO_RETENTION pode ser que esteja muito alto, mantendo por maior tempo os dados na área de Undo desnecessariamente.

        Uma outra opção seria tirar a opção de LOGGING da tabela evitando assim que gere redo, mais isso não é lá uma pratica muito recomendada.

        Você pode também tentar criar uma tabela auxiliar com os dados que você precisa ( será necessário espaço em disco suficiente) com a mesma estrutura da tabela original porem contendo só a massa que você deseja manter, e feito isso você TRUNCA tabela gigante , isso não gerara REDO e consequentemente não consumirá sua Tablespace.

        Outra maneira é exporta a tabela com o parametro query pegando apenas os dados pertinentes e truncando a original após fazer o backup do que precisa, e depois basta reimportar, tomando o cuidade de desfragmetala antes disso, reorganizando espaços utilizado e elimininado buracos em seu banco.

        Bom , hehe..acho que são essas as possibilidades que eu tentaria.
        Espero ter te ajudado.

        Abraço.
        David.

        #87367
        Anderson_
        Participante

          Bom David.

          Você poderia me ajudar a criar esse processo.?
          Pois eu não sei como contar as linhas.

          Outra coisa.:
          O UNDO_RETENTION no oracle esta com 1800.
          Se for alterado, precisa reiniciar o banco pra que ele funcione.??

          Muito Obrigado.

          #87372
          eversonpiza
          Participante

            Anderson,

            Para fazer o commit a cada 1000 registros vc teria que fazer algo assim:


            declare
            cursor crTabela
            select t.rowid rid
            from tabela t
            where

            vCommit number := 0;

            begin
            for c in crTabela loop
            delete from tabela where rowid = c.rid;
            vCommit := vCommi + 1;
            if vCommit >= 1000 then
            commit;
            vCommit := 0;
            end if;
            end loop;
            commit;
            end;
            /
            [/code]

            #87373
            David Siqueira
            Participante

              Opa!..
              Vamos lá

              Obs.: Antes de iniciar faça um backup desta tabela caso dê algo errado você pode voltar a situação normal.

              1) Faça o levantamento da massa de dados que precisa ser mantida. Veja com o pessoal de desenvolvimento se esta tabela possui um campo de data que determine o periodo , tendo isso em mãos faça o seguinte select:

              SELECT COUNT(*) FROM TABELA WHERE CAMPO DATA =(data inicial dos dados que precisam permanecer na tabela);
              veja quantas linhas lhe trará este resultado.

              2) faça esse mesmo count só que para os registros que serão deletados, passando o periodo até a data em que pretende mantelos.

              3) tendo isso em mãos você poderá usar quaisquer um dos métodos que lhe disse.

              4) seria mais ou menos isso mesmo que você fez em seu cursor para deletar os registros.

              5) quanto ao parametro de UNDO_RETENTION pode ser trocado a qualquer momento com o BANCO ONLINE, via ALTER SYSTEM mesmo, porém atente para o valor que vai usar se for a menor, pois pode influenciar nas demais atividades de seu Banco de dados.

              Abraço.

              #87374
              Anderson_
              Participante

                Bom David.
                Rodei o comando que vc me passou.
                da um erro.
                como ficou.

                SQL> declare
                cursor crTabela
                select t.rowid rid
                from act110b t
                where t.databkp= 1000 then
                commit;
                vCommit := 0;
                end if;
                end loop;
                commit;
                end;
                /
                select t.rowid rid
                *
                ERRO na linha 3:
                ORA-06550: line 3, column 5:
                PLS-00103: Encountered the symbol “SELECT” when expecting one of the following:
                ( ; is return
                The symbol “is” was substituted for “SELECT” to continue.


                se eu rodar o
                select t.rowid rid
                from act110b t
                where t.databkp<='12/07/2007';

                o select retorna.

                RID

                AAAr5rAAEAAA3PPAAz
                AAAr5rAAEAAA3PPAA0
                AAAr5rAAEAAA3PPAA1
                AAAr5rAAEAAA3PPAA2
                AAAr5rAAEAAA3PPAA3
                AAAr5rAAEAAA3PPAA4
                AAAr5rAAEAAA3PPAA5
                AAAr5rAAEAAA3PPAA6
                AAAr5rAAEAAA3PPAA7
                AAAr5rAAEAAA3PPAA8

                #87383
                David Siqueira
                Participante

                  o Select COUNT(*) deu erro?
                  Que tipo de erro?

                  #87388
                  eversonpiza
                  Participante

                    Anderson,

                    Na linha:
                    cursor crTabela

                    Faltou colocar o ‘is’
                    O correto seria ficar assim:

                    cursor crTabela is

                    Mas vale a pena seguir as recomendações do David antes de rodar esse script, pois ele já vai sair apagando.

                    #87396
                    Anderson_
                    Participante

                      vlw pessoal…
                      funcionou..
                      esta deletando..

                      só tem um problema…

                      A tablespace de UNDO ja estava qse cheia..
                      com 99.5 %
                      agora ela encheu.
                      mas continua deletando os registros.

                      #87398
                      Marcio68Almeida
                      Participante

                        Se continua trabalhando é por que você está vendo a marca d´água, não quer dizer que esteja realmente cheia…

                        #87399
                        David Siqueira
                        Participante

                          Exatamente..é como o Marcio disse, o comportamento da área de UNDO é ciclico, e quem comanda o tempo de retenção dos dados nesta mesma área é o parametro de RETENçÃO, com certeza você esta olhado a HWM mesmo.

                          Após o término do processo você poderia baixar seu undo RETENTION para que ele liberasse mais área e depois que a tablespace estiver com seu consumo normalizado volte para os 1800 que estava, é apenas uma sugestão.

                          Abraço.

                          #87444
                          juliano_sf
                          Participante

                            Opa,

                            Deixa eu te sugerir outra solução:

                            — LIMPAR A TABELA TAB1

                            1) CREATE TABLE TAB1_TMP AS SELECT * FROM TAB1 WHERE DATA > SYSDATE -30

                            2) TRUNCATE TABLE TAB1;

                            3) INSERT INTO TAB1 SELECT * FROM TAB1_TMP;

                            4) COMMIT;

                            Obviamente, faça um export da tabela antes de truncar… Já tive este problema e esta solução foi a mais rapida.

                            Att,

                          Visualizando 12 posts - 1 até 12 (de 12 do total)
                          • Você deve fazer login para responder a este tópico.