web-dev-qa-db-fra.com

Oracle rétrécissement / récupération d'espace disque logique libre

J'ai un espace de table Oracle 12c d'une taille de 90 Go. Près de 40 Go sont gratuits.

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

L'espace de table a 3 fichiers de données.

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

Comment puis-je réduire l'espace disque logique pour récupérer les 40 Go gratuits (fichiers de données sur disque)? Je ne peux pas avoir de temps d'arrêt.

7
r0tt

Je suis d'accord avec le commentaire d'EdStevens, mais voici quelques autres idées:

Le site Web AskTom a un script qui indiquera exactement combien vous pouvez réduire les fichiers de données existants.

Si cela ne produit pas beaucoup d'économies, vous pouvez trouver les plus gros index sur cet espace table et les reconstruire; c'est une solution temporaire et les index finiraient par redevenir gros, mais si le budget ne permet plus d'espace disque maintenant, essayez cette requête:

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;

Ensuite, si vous trouvez un index nommé ind_big_stuff est énorme, alors

alter index ind_big_stuff rebuild;

De plus, si votre application est une application commerciale, il peut y avoir plusieurs tables avec zéro ligne. Ou si vous avez des tables partitionnées, vous pouvez avoir des partitions avec zéro ligne. Vous pouvez supprimer l'espace qui leur est alloué avec

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

Vous pouvez utiliser le segment creation deferred clause sur une instruction alter table pour des choses comme les tables partitionnées ou les tables dont vous savez qu'elles n'auront pas de lignes.

6
Mark Stewart

Je pense qu'il existe cinq méthodes pour résoudre ce problème de maintenance Oracle:

  • Réorganisation en ligne - Le package de réorganisation de table en ligne Oracle, (dbms_redefinition) est utilisé pour réorganiser les tables pendant qu'elles acceptent les mises à jour. Il conserve les définitions d'index et de contrainte. (Uniquement Enterprise Editon). Aucun temps d'arrêt.
  • Alter table shrink space - L'utilisation de la commande compact de l'espace de réduction de l'espace de table recompactera les lignes, descendra le HWM et libère les extensions inutilisées. Le rétrécissement ne fait que compacter les données. Cela ne garantit pas que les blocs seront placés à l'avant du fichier de données, il est donc possible d'avoir des blocs à la fin du fichier de données, ce qui signifie que le fichier de données ne peut pas être redimensionné plus petit. Il conserve les définitions d'index et de contrainte. Aucun temps d'arrêt.
  • Pompe de données (expdp, impdp) - Méthode hors ligne pour transférer des données et réorganiser les tables. Il conserve les définitions d'index et de contrainte. Temps d'arrêt requis.
  • Alter table move - La commande alter table move déplace les lignes vers le bas dans l'espace inutilisé et ajuste le HWM mais n'ajuste pas l'étendue des segments, et la taille de la table reste la même. La syntaxe de déplacement de la table alter conserve également les définitions d'index et de contrainte. Redimensionnement du fichier de données requis. Temps d'arrêt requis.
  • Créer une table en tant que sélection (CTAS) - Cela copie les lignes de la table dans une zone propre, en abaissant la ligne des hautes eaux, en emballant les lignes de manière dense (comme dicté par PCTFREE) et en libérant de l'espace libre. Redimensionnement du fichier de données requis. Temps d'arrêt requis.
2
r0tt

J'ai cherché une réponse à cette question et l'ai finalement trouvée:

  • (éventuellement) supprimez les tables inutilisées (supprimées) de l'espace disque logique: PURGE TABLESPACE table_space_name;
  • nettoyer l'espace disque logique: ALTER TABLESPACE table_space_name COALESCE;
  • enfin, redimensionnez les fichiers de données: ALTER DATABASE DATAFILE '/u02/Oracle/rbdb1/file1.dbf' RESIZE 100M;

PS: Je ne suis pas sûr du temps d'arrêt, quelqu'un doit vérifier cela.

PPS: pour les tablespace TEMP, utilisez:

  • ALTER TABLESPACE TEMP SHRINK SPACE ; (ajoutez éventuellement KEEP 512M ou similaire)
  • redimensionner les données/fichiers temporaires: ALTER DATABASE TEMPFILE '/u02/Oracle/rbdb1/temp01.dbf' RESIZE 512M;
1
David Balažic

Exécutez le script ci-dessous, il libérera l'espace inutilisé des fichiers de données de l'espace de table respectif.

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
/

Vérifiez les détails sur https://orahow.com/reclaiming-unused-space-in-datafiles/

0
Santosh Tiwary