AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 192625
Accepted
r0tt
r0tt
Asked: 2017-12-08 06:08:46 +0800 CST2017-12-08 06:08:46 +0800 CST 2017-12-08 06:08:46 +0800 CST

Oracle reduzindo/recuperando espaço de tabela livre

  • 772

Eu tenho um tablespace Oracle 12c com o tamanho de 90 GB. Quase 40 GB são gratuitos.

TB1 54 %    90880   41383   49497   46  98304   50 %    ONLINE  PERMANENT

O tablespace tem 3 arquivos de dados.

E:\ORACLE\ORADATA\xx\TB1.DBF    33554416    True    100 
F:\ORACLE\ORADATA\xx\TB1_2.DBF  33554416    True    100 
G:\ORACLE\ORADATA\xx\TB1_3.DBF  25344000    True    100

Como posso reduzir o tablespace para recuperar os 40 GB gratuitos (arquivos de dados no disco)? Eu não posso ter um tempo de inatividade.

oracle oracle-12c
  • 6 6 respostas
  • 74767 Views

6 respostas

  • Voted
  1. Best Answer
    Mark Stewart
    2017-12-09T10:05:23+08:002017-12-09T10:05:23+08:00

    Concordo com o comentário de EdStevens, mas aqui estão algumas outras ideias:

    O site do AskTom tem um script que listará exatamente quanto você pode reduzir os arquivos de dados existentes.

    Se isso não gerar muita economia, você poderá encontrar os maiores índices nesse tablespace e reconstruí-los; essa é uma solução temporária e os índices acabariam ficando grandes novamente, mas se o orçamento não permitir mais espaço em disco agora, tente esta consulta:

    select segment_name, sum(bytes)/1024/1024 as mb 
    from dba_segments 
    where tablespace_name='TB1' and segment_type like 'INDEX%'
    group by segment_name
    order by mb;
    

    Então, se você achar que um índice chamado ind_big_stuffé enorme, então

    alter index ind_big_stuff rebuild online;
    

    Além disso, se seu aplicativo for um aplicativo comercial, pode haver várias tabelas com zero linhas. Ou se você tiver tabelas particionadas, poderá ter algumas partições com zero linhas. Você pode soltar o espaço alocado a eles com

    exec dbms_space_admin.drop_empty_segments(schema_name=>'HR');
    

    Você pode usar a segment creation deferredcláusula em uma instrução alter table para coisas como tabelas particionadas ou tabelas que você sabe que não terão nenhuma linha.

    • 9
  2. r0tt
    2017-12-12T07:34:22+08:002017-12-12T07:34:22+08:00

    Eu acho que existem cinco métodos para lidar com esse problema de manutenção do oráculo:

    • Reorganização online - O pacote de reorganização de tabelas online do Oracle, (dbms_redefinition) é usado para reorganizar tabelas enquanto elas estão aceitando atualizações. Ele preserva as definições de índice e restrição. (Somente Enterprise Edition). Sem tempo de inatividade.
    • Alter table shrink space - Usar o comando alter table shrink space compact irá reempacotar as linhas, mover para baixo o HWM e liberar extensões não utilizadas. A redução apenas compacta os dados. Não garante que os blocos serão colocados na frente do arquivo de dados, então é possível ter blocos no final do arquivo de dados, o que significa que o arquivo de dados não pode ser redimensionado. Ele preserva as definições de índice e restrição. Sem tempo de inatividade.
    • Bomba de dados (expdp, impdp) – Método offline para transferir dados e reorganizar tabelas. Ele preserva as definições de índice e restrição. Tempo de inatividade necessário.
    • Alter table move - O comando alter table move move as linhas para o espaço não utilizado e ajusta o HWM, mas não ajusta as extensões dos segmentos, e o tamanho da tabela permanece o mesmo. A sintaxe alter table move também preserva as definições de índice e restrição. Redimensionamento do arquivo de dados necessário. Tempo de inatividade necessário.
    • Criar tabela como seleção (CTAS) - Isso copia as linhas da tabela em uma área limpa, diminuindo a marca d'água alta, empacotando as linhas densamente (conforme ditado pelo PCTFREE) e liberando espaço livre. Redimensionamento do arquivo de dados necessário. Tempo de inatividade necessário.
    • 4
  3. David Balažic
    2018-06-02T07:31:21+08:002018-06-02T07:31:21+08:00

    Procurei uma resposta para isso e finalmente encontrei:

    • (opcionalmente) remova tabelas não utilizadas (descartadas) do tablespace:PURGE TABLESPACE table_space_name;
    • limpe o tablespace:ALTER TABLESPACE table_space_name COALESCE;
    • finalmente, redimensione os arquivos de dados:ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/file1.dbf' RESIZE 100M;

    PS: Não tenho certeza sobre o tempo de inatividade, alguém por favor verifique isso.

    PPS: Para tablespaces TEMP, use:

    • ALTER TABLESPACE TEMP SHRINK SPACE ;(opcionalmente adicionar KEEP 512Mou similar)
    • redimensione os dados/arquivos temporários:ALTER DATABASE TEMPFILE '/u02/oracle/rbdb1/temp01.dbf' RESIZE 512M;
    • 2
  4. r0tt
    2021-03-02T07:12:37+08:002021-03-02T07:12:37+08:00

    Muito eficaz também é mover tudo para outro novo tablespace online:

    ## Lobs
    select 'ALTER TABLE '||s.owner||'.'||l.table_name||' MOVE LOB('||l.column_name||') STORE AS (TABLESPACE USERNAME) online;' 
      from dba_segments s, dba_lobs l
     where s.segment_name = l.segment_name
       and s.tablespace_name = 'USERNAME'
       and segment_type='LOBSEGMENT'
       and partition_name is null;
    
    ## Tables move
    select 'ALTER TABLE '||owner||'.'||table_name||' move tablespace '||'USERNAME online;' from dba_tables where tablespace_name='USERS'and Owner='USERNAME';
    
    
    ## Move / rebuild indexes 
    select 'ALTER INDEX '||owner||'.'||index_name||' REBUILD TABLESPACE '||'USERNAME_INDEX parallel 8 online;' 
    from dba_indexes where tablespace_name='USERS';
    
    
    ## Lob Index move 
    select 'alter table '||owner||'.'||table_name||' move lob ('||column_name||') store as '||SEGMENT_NAME||' (tablespace USERNAME_INDEX);'from dba_lobs where OWNER='USERNAME' and tablespace_name='USERS';
    
    ##
    Check Lob indexes
    select index_name,index_type, table_name,table_type, tablespace_name from dba_indexes where tablespace_name='USERNAME' order by 3;
    select index_name,index_type, table_name,table_type, tablespace_name from dba_indexes where owner='USERNAME' and index_type='LOB' and tablespace_name='USERS' order by 3;
    
    • 1
  5. Santosh Tiwary
    2019-08-19T00:17:46+08:002019-08-19T00:17:46+08:00

    Execute o script abaixo, ele liberará espaço não utilizado dos arquivos de dados do respectivo tablespace.

    column value new_val blksize
    select value from v$parameter where name = 'db_block_size'
    /
    
    set pages 0
    set lines 300
    column cmd format a300 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 ceil( blocks*&&blksize/1024/1024) -
          ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
    /
    

    Verifique os detalhes em https://orahow.com/reclaiming-unused-space-in-datafiles/

    • 0
  6. user219764
    2020-12-05T07:19:59+08:002020-12-05T07:19:59+08:00

    https://orahow.com/reclaim-unused-space-in-oracle/ Tem 2 abordagens para identificar e recuperar espaço.

    • -4

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve