Boa Tarde,
Se bem entendi você está querendo redimencionar os datafiles dessa tablespace
TBS_TABWM_ALL, correto?
Sendo assim como ajuda para saber até onde você pode redimencionar você pode
executar a procedure abaixo:
Com base nos resultados você pode fazer o redimencionamento.
set serveroutput on
execute dbms_output.enable(2000000);
declare
cursor c_dbfile is
select tablespace_name
,file_name
,file_id
,bytes
from sys.dba_data_files
where status !='INVALID'
order by tablespace_name,file_id;
cursor c_space(v_file_id in number) is
select block_id,blocks
from sys.dba_free_space
where file_id=v_file_id
order by block_id desc;
blocksize binary_integer;
filesize binary_integer;
extsize binary_integer;
begin
select value
into blocksize
from v$parameter
where name = 'db_block_size';
for c_rec1 in c_dbfile
loop
filesize := c_rec1.bytes;
<<outer>>
for c_rec2 in c_space(c_rec1.file_id)
loop
extsize := ((c_rec2.block_id - 1)*blocksize + c_rec2.blocks*blocksize);
if extsize = filesize
then
filesize := (c_rec2.block_id - 1)*blocksize;
else
exit outer;
end if;
end loop outer;
if filesize = c_rec1.bytes
then
dbms_output.put_line('Tablespace: '
||' '||c_rec1.tablespace_name||' Datafile: '||c_rec1.file_name);
dbms_output.put_line('Nao pode ser redimensionado.')
;
dbms_output.put_line('.');
else
if filesize < 2*blocksize
then
dbms_output.put_line('Tablespace: '
||' '||c_rec1.tablespace_name||' Datafile: '||c_rec1.file_name);
dbms_output.put_line('Pode ser redimensionado até: '||2*blocksize
||' Bytes, Actual size: '||c_rec1.bytes||' Bytes');
dbms_output.put_line('.');
else
dbms_output.put_line('Tablespace: '
||' '||c_rec1.tablespace_name||' Datafile: '||c_rec1.file_name);
dbms_output.put_line('Pode ser redimensionado até: '||filesize
||' Bytes, Actual size: '||c_rec1.bytes);
dbms_output.put_line('.');
end if;
end if;
end loop;
end;
/
Exemplo de Retorno:
Tablespace: USERS Datafile: C:\ORACLE\ORADATA\USERS.DBF
Pode ser redimensionado até: 22085632 Bytes, Actual size: 104857600
----- Original Message -----
From: rui_madaleno
To: [email protected]
Sent: Tuesday, September 25, 2007 10:37 AM
Subject: [oracle_br] Apagar dados de tabela enorme
Boa Tarde a todos,
na minha base de dados tenho uma tabela de log que cresceu ate aos
20GB, contem dados desde 2005. O script de criacao da tabela é:
CREATE TABLE WORKMG.PP_TRANSFAUX
(
NID_TRANSF NUMBER(28) NOT NULL,
VTRANSFTYPE VARCHAR2(200 BYTE) NOT NULL,
VTRANSF VARCHAR2(4000 BYTE) NOT NULL,
DTRANSFDATE DATE NOT NULL
)
TABLESPACE TBS_TABWM_ALL
Quero apagar os dados dos anos de 2005 e 2006, qual a melhor (e mais
rapida) forma de o fazer ? estou a pensar em fazer algo do tipo:
alter table workmg.pp_transfaux nologging
delete from workmg.pp_transfaux where dtransfdata < to_date('20070101
00:00','yyyymmdd hh24:mi')
depois de apagar os dados quais as accoes aconselhadas ? vou ficar com
um tablespace com um "buraco" de 20GB :(
O meu ambiente:
Oracle 9.2.0.1 sobre windows 2000
Cumprimentos
Rui Madaleno
[As partes desta mensagem que não continham texto foram removidas]