- Este tópico contém 18 respostas, 4 vozes e foi atualizado pela última vez 14 anos, 4 meses atrás por
felipeg.
-
AutorPosts
-
26 de outubro de 2011 às 5:29 pm #101379
bohnstedt
ParticipanteBom dia Senhores(as),
Como sou iniciante no Oracle, peço por favor uma ajuda. Como eu estou com problema de espaço em um dos banco de dados, fiz uns selects que me trouxeram todos os usuarios e seus tamanhos ocupados na dba_segments, e então eu fiz uns drop user cascade. Mesmo assim não liberou espaço, continua a mesma coisa. Eu gostaria de saber como eu faço para realizar uma desfragmentação na tablespace.
Aguardo um retorno
Abraços
Att,
Fábio Bohnsedt
26 de outubro de 2011 às 5:51 pm #101381felipeg
ParticipanteOlá
Então, o seu problema não é fragmentação e sim realocação de espaço.
Não confunda os dois 8)Nesse caso verifique o espaço liberado e depois use o comando resize.
Segue o comando.
select a.TABLESPACE_NAME,
a.BYTES bytes_used,
b.BYTES bytes_free,
b.largest,
round(((a.BYTES-b.BYTES)/a.BYTES)*100,2) percent_used
from
(
select TABLESPACE_NAME,
sum(BYTES) BYTES
from dba_data_files
group by TABLESPACE_NAME
)
a,
(
select TABLESPACE_NAME,
sum(BYTES) BYTES ,
max(BYTES) largest
from dba_free_space
group by TABLESPACE_NAME
)
b
where a.TABLESPACE_NAME=b.TABLESPACE_NAME
order by ((a.BYTES-b.BYTES)/a.BYTES) desc
E esse para resize:
ALTER DATABASE DATAFILE '.dbf' RESIZE M ou G;
Atenciosamente,
Felipe.26 de outubro de 2011 às 6:11 pm #101383rman
Participante@bohnstedt
Uma vez alocado espaço no tablespace, o mesmo não é desalocado quando é feito a remoção dos objetos. A única forma é através do resize do datafile citado pelo felipeg.
26 de outubro de 2011 às 6:37 pm #101384jspaulonci
ParticipanteBoa tarde, uma vez que o Oracle escreveu no datafile, mesmo dropando os objetos não é possível dar resize, a tablespace necessita ser recriada.
SQL> create tablespace tbsd_fragmentacao datafile ‘+dgdados2’ size 5m autoextend off;
Tablespace created.
SQL> create table clientes (id varchar2(50),nome varchar2(50)) tablespace tbsd_fragmentacao;
Table created.
SQL> begin
for r in 1..1000000 loop
insert into clientes values (‘1111111111111111111111111111′,’222222222222222222222222222’);
commit;
end loop;
end;
/
begin
*
ERROR at line 1:
ORA-01653: unable to extend table SYS.CLIENTES by 128 in tablespace
TBSD_FRAGMENTACAO
ORA-06512: at line 3SQL> drop table clientes purge;
Table dropped.
SQL> select file_name from dba_data_files where tablespace_name = ‘TBSD_FRAGMENTACAO’;
FILE_NAME
+DGDADOS2/db/datafile/tbsd_fragmentacao.320.765549011
SQL> alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m;
alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m
*
ERROR at line 1:
ORA-03214: File Size specified is smaller than minimum requiredAbraços
26 de outubro de 2011 às 7:05 pm #101388bohnstedt
ParticipanteBom pessoal agradeço pelas respostas mais ainda eu estou na duvida,
Até então eu entendi que uma vez escrito no datafile, quando eu drop usuario cascade ainda continua lá. O @jspaulonci, eu não tenho como dropar a tablespace e criá-la novamente, pois existem aqui na empresa, vários schema apontando para ela, vc me entende???. O exemplo que vc me passou abaixo já aconteceu comigo:
“SQL> alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m;
alter database datafile ‘+DGDADOS2/migracao/datafile/tbsd_fragmentacao.320.765549011’ resize 1m
*
ERROR at line 1:
ORA-03214: File Size specified is smaller than minimum required ”Nesse caso o que eu estou entendendo é que está havendo um disperdicio de espaço e que senão tiver outro jeito, o Oracle não sabe gerenciar o espaço, pessoal me desculpem se eu estou falando bobagem, é que infelizmente ainda não está claro.
Abraço a todos
26 de outubro de 2011 às 7:15 pm #101390rman
Participante@bohnstedt
Datafile é o arquivo fisico que o sistema operacional conhece, quando você apaga os objetos de um usuário é liberado espaço na tablespace, mas o datafile continua do mesmo tamanho. Quanto de espaço você gostaria de liberar para o sistema operacional ? Quando o espaço na tablespace é liberada, você criar novos objetos neste espaço, o Oracle vai gerenciar isso muito bem.
Mas vai pensando em adquirir novos discos, pois é questão de tempo pra ficar sem espaço novamente.
26 de outubro de 2011 às 7:25 pm #101391jspaulonci
ParticipanteO RMAN está coberto de razão.
O datafile fica com a HWM no último extent criado pelo segment, por isso não dá para fazer resize pra baixo.
Quanto a questão dos usuário apontando pra quele ou pra outro tablespace isso pouco importa, pense no seguinte. Onde está o meu segmento ? isso sim importa.
Uma solução a fazer é renomear essa sua tablespace para outro nome e cria-la com o nome que vc quer novamente, isso é transparente para a aplicação.
alter tablespace nome_que_eu_quero rename to nome_qualquer;
create tablespace nome_que_eu_quero tststsssststst;
Em seguida vc pode agendar horários para fazer o move dos objetos para essa tablespace e depois dropar a tablespace com o nome antigo.
Esse recurso está presente do 10g pra cima
26 de outubro de 2011 às 7:36 pm #101392bohnstedt
ParticipanteLegal, aos poucos eu vou entendendo. Peço desculpas pois estou me deparando com situações que nunca peguei, então fica um pouco dificil de entender.
Como eu poderia renomear, e os datafiles???? A tablespace é lógica e os datafiles são fisicos, se eu renomear os datafiles com os dados vão junto correto??? Como eu faço criando uma outra tablespace com os dados desses datafiles????
Como eu posso mover os objetos para essa nova tablespace????
Att,
Fábio Bohnstedt
26 de outubro de 2011 às 7:50 pm #101393jspaulonci
Participantebohnstedt vamos pensar na maneira mais segura.
Manipulação de datafiles não é como manipular, qualquer outro arquivo do SO. Sob a perspectiva do SO até é a mesma coisa, porem sob a perspectiva do Oracle não.
A movimentação pode ser feita através do comando alter table nome_da_tabela nove tablespace nova_tablespace;
Depois disso vc precisa dar rebuild nos indices pois eles ficarão em stado de unusable.
alter index nome_do_indice rebuild tablespace nova_tablespace;
Pesquise um pouco mais sobre o que colocamos para você, e como você está iniciando, sugiro testar o procedimento em desenvolvimento ou homologação.
26 de outubro de 2011 às 8:10 pm #101394felipeg
Participante[quote=”jspaulonci”:jzxhvzj7]Boa tarde, uma vez que o Oracle escreveu no datafile, mesmo dropando os objetos não é possível dar resize, a tablespace necessita ser recriada.
[/quote]Prezados, boa tarde
Peço desculpas na demora, estava em almoço
@Joao Paulo, discordo da sua afirmação pois o reszie funciona muito bem para datafiles que possuem espaço a ser liberado.
http://download.oracle.com/docs/cd/B283 … les003.htm
Manually Resizing a DatafileYou can manually increase or decrease the size of a datafile using the ALTER DATABASE statement. This enables you to add more space to your database without adding more datafiles. This is beneficial if you are concerned about reaching the maximum number of datafiles allowed in your database.
For a bigfile tablespace you can use the ALTER TABLESPACE statement to resize a datafile. You are not allowed to add a datafile to a bigfile tablespace.
Manually reducing the sizes of datafiles enables you to reclaim unused space in the database. This is useful for correcting errors in estimates of space requirements.
O que eu acho que ocorreu no seu exemplo foi que o espaço minimo alocado para o seu datafile era menor que o espaço definido por padrão na alocação (Extent Mangaement).
Tente verificar o INITIAL EXTENT dessa tablespace que você criou como exemplo, quanto é?
Segue o meu exemplo
sys@ORCL> create tablespace teste_resize datafile '/u02/teste_resize.dbf' size 5m autoextend off;Tablespace created.
sys@ORCL> create table clientes (id varchar2(50),nome varchar2(50)) tablespace teste_resize;
Table created.
sys@ORCL> begin
for r in 1..1000000 loop
insert into clientes values ('1111111111111111111111111111','222222222222222222222222222');
commit;
end loop;
end;
/
2 3 4 5 6 7
begin
*
ERROR at line 1:
ORA-01653: unable to extend table SYS.CLIENTES by 128 in tablespace TESTE_RESIZE
ORA-06512: at line 3sys@ORCL> sys@ORCL> select count(*) from clientes;
COUNT(*)
58032sys@ORCL> drop table clientes purge;
Table dropped.
sys@ORCL> select file_name from dba_data_files where tablespace_name = 'TESTE_RESIZE';
FILE_NAME
/u02/teste_resize.dbf
sys@ORCL> alter database datafile '/u02/teste_resize.dbf' resize 1m;
Database altered.
sys@ORCL> select tablespace_name, bytes/1024/1024 from dba_data_files where tablespace_name = 'TESTE_RESIZE';
TABLESPACE_NAME BYTES/1024/1024
TESTE_RESIZE 1
sys@ORCL> select tablespace_name, initial_extent from dba_tablespaces where tablespace_name='TESTE_RESIZE';
TABLESPACE_NAME INITIAL_EXTENT
TESTE_RESIZE 65536
Atenciosamente,
Felipe.26 de outubro de 2011 às 8:12 pm #101396bohnstedt
Participantecara, eu acho q entendi. Primeiramente esse processo tem que ser feito com o banco de preferencia fora. Ai então eu renomearia essa tablespace para outro nome e criaria uma nova tablespace.
Com o comando ALTER TABLE “OWNER”.”TABELA” MOVE TABLESPACE “NOVA_TABLESPACE”;
Eu começo a fazer a movimentação e nisso libera o espaco correto?
A respeito do indice eu faço a mesma coisa? E depois eu faço um rebuild neles?
Me fala uma coisa, tem como fazer um calculo para saber a quantidade de tempo que irá demorar?????
Abraços e obrigado
Fábio Bohnstedt
26 de outubro de 2011 às 8:22 pm #101399bohnstedt
ParticipanteBom pessoal eu procurei algumas coisas e encontrei esse script:
select ‘alter database datafile ”’ || file_name || ”’ resize ‘ ||
ceil( (nvl(hwm,1)81921.2)/1024/1024 ) || ‘m;’ cmd
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
and ceil( (nvl(hwm,1)81921.2)/1024/1024 ) 100
/E acabou liberando espaço. Olha realmente a opção de criar uma nova tablespace mover todos os objetos para lá e depois voltar novamente, dá um trampo pra caramba.
26 de outubro de 2011 às 8:23 pm #101401felipeg
ParticipanteFábio,
Vamos do começo.
Só pra explicar rapidamente, acho que o rman já fez isso.
Sobre o conceito de Tablespaces sugiro ler este aritgo do Eduardo, muito bom por sinal:http://www.oracle.com/technetwork/pt/ar … 0-ptb.html
Sobre o seu problema, eu passei um comando para analisar o tamanho dos objetos lembra?
Poderia por gentileza me retornar ele para que possamos ter uma idéia da sua situação.E por último, você chegou a tentar o resize? deu algum erro?
O fato de dar erro não significa que não funciona 8)Acho mais fácil assim, se quiser estou a disposição.
Atenciosamente,
Felipe.26 de outubro de 2011 às 8:25 pm #101402felipeg
Participante[quote=”bohnstedt”:26qmzwxb]Bom pessoal eu procurei algumas coisas e encontrei esse script:
select ‘alter database datafile ”’ || file_name || ”’ resize ‘ ||
ceil( (nvl(hwm,1)81921.2)/1024/1024 ) || ‘m;’ cmd
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
and ceil( (nvl(hwm,1)81921.2)/1024/1024 ) 100
/E acabou liberando espaço. Olha realmente a opção de criar uma nova tablespace mover todos os objetos para lá e depois voltar novamente, dá um trampo pra caramba.[/quote]
Foi o que eu disse desde o começo hahaha
A diferença é que você pegou o comando pronto, no que eu citei você iria ver os tamanhos e escolher o melhor valor 8)Atenciosamente,
Felipe.26 de outubro de 2011 às 8:36 pm #101403bohnstedt
ParticipanteFelipe,
Obrigado pela ajuda, o que realmente eu tinha ficado na duvida, foi pq uma vez eu rodei um comando similar o que eu coloquei no script, e realmente deu que o espaço estava alocado, vc entendeu????? Me fala uma coisa para que serve essa coluna largest???
Segue abaixo minhas tablespaces
TABLESPACE_NAME BYTES_USED BYTES_FREE LARGEST %_USED
SYSTEM 1854930944 11403264 9437184 99.39
SYSAUX 1339031552 68812800 64225280 94.86
TBS_IX_SYX 1890582528 336658432 315621376 82.19
TBS_DT_SYX 4184866816 826015744 7602176 80.26
TBS_LOB_SYX 2961178624 663486464 493879296 77.59
USERS 102236160 23658496 16252928 76.86
INDEX0 3.0207E+10 9508356096 4066377728 68.52
TESTE_ARCHIVE 482344960 214958080 80740352 55.43
DATA0 6.1691E+10 2.8932E+10 4160749568 53.1
UNDOTBS1 2097152000 2022572032 1645215744 3.56
DATA_GERAL01 3145728000 3143172096 1571815424 .08
INDEX_GERAL01 2621440000 2620391424 2620391424 .04Obrigado
[/img]
-
AutorPosts
- Você deve fazer login para responder a este tópico.