No Oracle versão 11g:
Após pesquisar no Google, não consigo encontrar uma maneira simples de recuperar espaço livre depois de excluir uma tabela.
Eu encontrei muitas explicações, dizendo como o arquivo de dados se fragmenta, a grande pilha de consultas chatas que você precisa executar para mover o "espaço vazio" no final do arquivo de dados (tabela por tabela ... mesmo quando você tem 200 mesas!?).
Então você deve reduzir o tamanho do arquivo de dados "adivinhando" o quanto você pode reduzi-lo, ou você deve saber exatamente qual é o seu "tamanho do bloco" ... E, finalmente, você não deve esquecer de "reconstruir os índices".
Veja, por exemplo: http://asktom.oracle.com/pls/asktom/f?p=100:11{::::P11_QUESTION_ID:54178027703899
e http://www.oracle-base.com/articles/misc/ReclaimingUnusedSpace.php
Existe um procedimento PL / SQL simples que, dado o nome do espaço de tabela ou o nome do arquivo de dados, seria útil para esse trabalho? Ou qualquer ferramenta similar do Oracle?
fonte
Respostas:
A resposta curta é não . Infelizmente, a maneira de fazer isso no Oracle requer a "grande pilha de consultas chatas". Os artigos aos quais você vinculou são algumas das melhores informações disponíveis sobre o assunto. O arquivo de dados se torna realmente fragmentado, de modo que, mesmo que exista espaço livre abaixo do segmento mais alto, o Oracle não o consolidará automaticamente quando um processo
RESIZE
estiver concluído.Para "desfragmentar" o espaço de tabela, você precisa mover esses segmentos para o início do arquivo de dados e não para o final. Para tabelas, esse é um processo offline, o que significa que a tabela ficará indisponível enquanto a movimentação estiver ocorrendo. Os índices podem ser movidos offline ou, com o Enterprise Edition, podem ser movidos online. Como você tem uma janela de interrupção, recomendo que você siga estas etapas.
A. Reduza os arquivos de dados com espaço livre além da marca d'água máxima. Isso pode ser feito da seguinte maneira (a consulta é semelhante ao procedimento do Frosty Z):
B. Depois de reduzir as coisas acima da marca d'água, descubra quais espaços de tabela ainda se beneficiariam com a movimentação de segmentos.
C. Para cada um desses espaços de tabela, determine quais segmentos precisam ser movidos. (Substitua USERS pelo nome do seu espaço de tabela ou junte-o à consulta anterior)
D. Mova cada tabela e recrie os índices e as estatísticas.
E. Repita a etapa A.
Acabei de criar a maioria dessas consultas, portanto, você deve testá-las completamente antes de usá-las. Suponho que você possa criar um procedimento que usaria
EXECUTE IMMEDIATE
para criar as instruções reais para executar dinamicamente, mas como as consultas receberão ORA-08103: O objeto não existe mais enquanto a movimentação estiver em andamento, acho melhor controlar esse processo manualmente se isso significa um pouco mais de tempo / esforço.fonte
Solução parcial inspirada nesta página :
Ele não reorganiza o espaço livre, mas detecta automaticamente o espaço livre disponível no final dos arquivos de dados e imprime os comandos 'RESIZE' adequados.
fonte
Antes de tentar reduzir os arquivos de dados, pergunte-se: Você criará novos segmentos novamente dentro do espaço de tabela associado em algum momento no futuro não tão distante? Se sim, não há sentido em encolher. O espaço será reutilizado para seus novos segmentos e você poupa muito esforço a si próprio e ao sistema, deixando-o como está.
fonte
Depois de navegar no google por dias, encontrei o exemplo mais simples e claro para recuperar o espaço livre no espaço de tabela após a exclusão. Eu espero que isso ajude
Link: http://www.dbforums.com/oracle/976248-how-reduce-tablespaces-used-space-after-delete-records-2.html
solução:
Vamos criar uma tabela com 9999 linhas, cada uma com tamanho em torno de 1k:
A tabela possui 29 extensões alocadas, totalizando 14,6 milhões:
Vamos excluir TODAS as linhas:
Agora- "surpresa" - a tabela ainda usa as mesmas extensões:
Por quê ? Porque, mesmo que você exclua todas as linhas da tabela, a marca d'água máxima não diminui - nunca diminui, para permitir a máxima concorrência (a Oracle leva muito a sério a maximização da concorrência, ou seja, desempenho e escalabilidade; é a principal razão por trás do sucesso em aplicativos corporativos).
Desalocar o espaço não utilizado (= espaço acima do HWM) não ajuda muito (já que não há muito espaço não utilizado acima do HWM):
Agora, vamos MOVER a tabela, que basicamente significa clonar a tabela (incluindo gatilhos, restrições e assim por diante), transferir as linhas, largar a tabela "antiga" e renomear a nova - tudo feito pelo kernel, tão super seguro mesmo em caso de falha da máquina / servidor:
Agora, temos agora apenas a extensão inicial alocada:
Advertência: normalmente acontece que muitos / todos os índices da tabela ficam INUSÁVEIS após a movimentação (não neste caso, mas estou executando o 9.2.0.4, a versão mais recente, que provavelmente otimizou o processo no caso de tabelas totalmente vazias ):
Se o STATUS não fosse VÁLIDO, você poderia simplesmente reconstruir manualmente o (s) índice (s):
Ou você pode automatizar todo o processo:
Como exemplo, vamos definir manualmente o índice para UNUSABLE:
HTH Alberto
fonte
Como dito anteriormente, você terá que mover todas as mais de 200 tabelas nesse espaço de tabela para liberar espaço no seu arquivo de dados e redimensionar para recuperar o espaço. Mas, em vez de executar todas essas consultas, o 12c Enterprise manager faz essa tarefa. Você precisará navegar para Página inicial do banco de dados> Armazenamento> Espaço de tabela. Selecione o espaço de tabela em que deseja trabalhar e clique em Reorganizar. Ele dará uma opção para visualizar as instruções SQL que estão prestes a serem executadas. Você pode tirar uma cópia deles e executá-lo sozinho ou agendar um trabalho no EM.
Na verdade, ele cria outro espaço de tabela, move todos os objetos para o novo espaço de tabela, reconstrói os índices e descarta os objetos do antigo espaço de tabela.
Existem algumas desvantagens em que posso pensar. Isso deve ser feito fora do horário de pico; caso contrário, ocorrerá um erro ao dizer que o recurso está ocupado. O arquivo de dados (não o espaço de tabela) terá "reorganizado" adicionado ao seu nome, no final.
fonte