- Este tópico contém 11 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 5 meses atrás por
juliano_sf.
-
AutorPosts
-
19 de junho de 2009 às 4:28 pm #87357
Anderson_
ParticipanteBom 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.
19 de junho de 2009 às 5:01 pm #87358David Siqueira
ParticipanteOpa 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.19 de junho de 2009 às 7:35 pm #87367Anderson_
ParticipanteBom 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.
19 de junho de 2009 às 8:46 pm #87372eversonpiza
ParticipanteAnderson,
Para fazer o commit a cada 1000 registros vc teria que fazer algo assim:
declare
cursor crTabela
select t.rowid rid
from tabela t
wherevCommit 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]19 de junho de 2009 às 9:30 pm #87373David Siqueira
ParticipanteOpa!..
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.
19 de junho de 2009 às 9:41 pm #87374Anderson_
ParticipanteBom 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
AAAr5rAAEAAA3PPAA819 de junho de 2009 às 10:12 pm #87383David Siqueira
Participanteo Select COUNT(*) deu erro?
Que tipo de erro?19 de junho de 2009 às 10:22 pm #87388eversonpiza
ParticipanteAnderson,
Na linha:
cursor crTabelaFaltou colocar o ‘is’
O correto seria ficar assim:cursor crTabela isMas vale a pena seguir as recomendações do David antes de rodar esse script, pois ele já vai sair apagando.
20 de junho de 2009 às 12:05 am #87396Anderson_
Participantevlw 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.20 de junho de 2009 às 12:13 am #87398Marcio68Almeida
ParticipanteSe continua trabalhando é por que você está vendo a marca d´água, não quer dizer que esteja realmente cheia…
20 de junho de 2009 às 12:19 am #87399David Siqueira
ParticipanteExatamente..é 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.
22 de junho de 2009 às 11:08 pm #87444juliano_sf
ParticipanteOpa,
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,
-
AutorPosts
- Você deve fazer login para responder a este tópico.