Colega, no bd Oracle vc ABSOLUTAMENTE NÃO TEM controle de qual informação vai ser armazenada em qual datafile, ok ?? Logicamente falando, a granularidade de controle do armazenamento vai só até a tablespace, dentro da tablespace quando um dado é inserido ou alterado, QUALQUER extent livre vai ser usado, em princípio... Em muitos casos o bd segue a ordem em que os arquivos foram criados, MAS nem isso é garantido. No caso em questão, porém, isso NÃO é relevante, pois para liberar espaço que vc não quer mais deixar alocado bastaria vc fazer um shrink do(s) datafile(s) em questão (comando ALTER DATABASE DATAFILE 'patchcompleto/nomecompletododatafile' RESIZE nnn; onde nnn é o menor tamanho possível, logo acima do último extent alocado. Assim, se hoje vc tem usado digamos 543 Mb no datafile, ele está criado com mais espaço que isso, E vc não quer mais deixar esse espaço extra alocado (pois sabe que não haverá proximamente mais inserts que precisarão do espaço), vc poderia pedir um RESIZE para 543 Mb, aí o espaço que está em uso no datafile continua, MAS o espaço livre é liberado, é isso.... Vc não tem como, mas no caso em questão ** NÃO PRECISA ** remover, "passar dados", alterar fisicamente enfim os datafiles afora o resize pra isso. Um script que pode te ajudar, servir de base pro seu pra encontrar o menor tamanho possível pra se resizear poderia ser : ----------- maxshrink.sql ---------------------------------- REM REM este script foi criado por Tom Kyte. Serve para checar o REM MÍNIMO tamanho usado nos datafiles. REM accept v_tablespaces CHAR prompt 'Tablespace(s) a Incluir, já contém % %, [ENTER] = todas:' set verify off column file_name format a50 word_wrapped column smallest format 999,990 heading "Smallest|Size|Poss." column currsize format 999,990 heading "Current|Size" column savings format 999,990 heading "Poss.|Savings" break on report compute sum of savings on report
column value new_val blksize NOPRINT select value from v$parameter where name = 'db_block_size' / select tablespace_name, file_name, ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest, ceil( blocks*&&blksize/1024/1024) currsize, ceil( blocks*&&blksize/1024/1024) - ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings 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 a.tablespace_name like upper('%&v_tablespaces%') order by 1,2 / column cmd format a200 word_wrapped select 'alter database datafile '''||file_name||''' resize ' || ceil( (nvl(hwm,1)*&&blksize)/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 a.tablespace_name like upper('%&v_tablespaces%') and ceil( blocks*&&blksize/1024/1024) - ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0 order by a.tablespace_name, a.file_name / ==> OBS : pode haver casos onde o datafile tem extent(s) acima do extent livre, nesses casos vc só poderá fazer o RESIZE pra um valor acima do último extent efetivamente usado, os eventuais extents free abaixo disso vc só recuperaria movendo o segmento. []s Chiappa --- Em oracle_br@yahoogrupos.com.br, "Everton Dias" <[EMAIL PROTECTED]> escreveu > > > Pessoal, tenho a seguinte configuração em uma tbs de indices. > Como podem notar tenho 3 datafiles, contendo 1.5 GB, 1.9 GB e 150 MB, porém > se somar os dados dos 3 ocuparia 1 GB. > > Como posso passar os dados para apenas 1 datafile e remover os demais ? > > Obrigado. > > > > total MB Free MB Datafile name > Used MB total KB Free KB Used KB > ---------- ---------- ---------------------------------------------- ---- > ---------- ---------- ----- > 1500 956.13 /u02/app/oracle/oradata/ovdb/cindx01.dbf > 543.88 1536000 979072 > 1900 1383.94 /u02/app/oracle/oradata/ovdb/cindx021.dbf > 516.06 1945600 1417152 > 150 0 /u02/app/oracle/oradata/ovdb/cindx03.dbf > 0 153600 0 0 > > _________________________________________________________________ > MSN Busca: fácil, rápido, direto ao ponto. http://search.msn.com.br >