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.
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.
Je pense qu'il existe cinq méthodes pour résoudre ce problème de maintenance Oracle:
J'ai cherché une réponse à cette question et l'ai finalement trouvée:
PURGE TABLESPACE table_space_name;
ALTER TABLESPACE table_space_name COALESCE;
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)ALTER DATABASE TEMPFILE '/u02/Oracle/rbdb1/temp01.dbf' RESIZE 512M;
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/