Comment redimensionner l'espace de table de mon instance de base de données Amazon RDS for Oracle ?

Dernière mise à jour : 03/11/2021

Je souhaite savoir comment gérer ou redimensionner l'espace de table de mon instance de base de données Amazon Relational Database Service (Amazon RDS) for Oracle.

Brève description

Le type d'espace de table par défaut pour les instances de bases de données Amazon RDS for Oracle est bigfile. Les espaces de table bigfile rendent les fichiers de données transparents pour les utilisateurs. Par conséquent, vous pouvez effectuer les opérations directement sur les espaces de table au lieu de gérer chacun des fichiers de données sous-jacents. Les espaces de table bigfile simplifient la gestion des fichiers de données en supprimant la nécessité d'ajouter de nouveaux fichiers de données ou de traiter plusieurs fichiers. La bonne pratique consiste à éviter d'utiliser des espaces de table smallfile pour vos instances RDS for Oracle.

Si votre instance RDS for Oracle possède un espace de table smallfile, vous avez les limitations suivantes :

  • Vous ne pouvez pas redimensionner les fichiers de données. Toutefois, vous pouvez redimensionner l'espace de table en y ajoutant de nouveaux fichiers de données.
  • Vous ne pouvez pas exécuter la requête ALTER DATABASE pour redimensionner ou modifier les configurations des fichiers de données. Cela est dû au fait que la commande ALTER DATABASE n'est pas prise en charge dans RDS for Oracle. Pour plus d'informations, veuillez consulter Limitations RDS for Oracle.
  • Vous devez gérer manuellement le paramètre db_files pour définir le nombre maximum de fichiers de données dans la base de données. Le paramètre db_files peut avoir besoin d'être modifié lorsque le nombre de fichiers de données atteint cette limite.

Par défaut, les espaces de table dans RDS for Oracle sont de type bigfile, avec le paramètre AUTOEXTEND activé. La taille maximale des espaces de table bigfile est de 16 TiB. Lorsque vous insérez des données dans l'espace de table, celui-ci s'étend selon les besoins jusqu'à sa limite maximale configurée ou jusqu'au stockage alloué configuré pour l'instance RDS, la valeur la plus petite étant retenue. Si le stockage alloué pour l'instance RDS est entièrement utilisé, l'instance passe alors à l'état STORAGE_FULL et les espaces de table ne peuvent pas être étendus. Pour résoudre ce problème, vous devez ajouter de l'espace de stockage à votre instance. Pour en savoir plus, veuillez consulter Comment résoudre les problèmes qui se produisent lorsque mes instances de base de données Amazon RDS manquent d'espace de stockage ?

Lorsque des données sont supprimées d'un espace de table, la taille de ce dernier ne diminue pas. Les blocs libres peuvent être réutilisés lorsque de nouvelles données sont insérées. Vous devez redimensionner manuellement l'espace de table pour récupérer l'espace inutilisé.

Solution

Pour redimensionner l'espace de table de votre instance RDS for Oracle, procédez comme suit :

  1. Vérifiez la configuration de l'espace de table.
  2. Augmentez ou diminuez la taille de l'espace de table en fonction de votre cas d'utilisation.

Vérifiez la configuration de l'espace de table.

1.    Exécutez une requête similaire à la suivante pour identifier si l'espace de table est :

  • Permanent, d'annulation ou temporaire
  • smallfile ou bigfile
SQL> SELECT TABLESPACE_NAME, CONTENTS, BIGFILE FROM DBA_TABLESPACES;

2.    Exécutez une requête similaire à la suivante pour vérifier si la fonction AUTOEXTEND est activée, la taille actuelle du fichier de données et la limite maximale configurée :

Pour les espaces de table permanents et d'annulation :

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

Pour les espaces de table temporaires :

SQL> SELECT TABLESPACE_NAME, ROUND(SUM(BYTES)/(1024*1024*1024),2) SUM_GB, ROUND(MAXBYTES/(1024*1024*1024),2) MAX_GB, AUTOEXTENSIBLE FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME, MAXBYTES,AUTOEXTENSIBLE;

Vous remarquerez peut-être les éléments suivants dans la sortie de ces requêtes :

  • Si la fonction AUTOEXTEND n'est pas activée, alors la valeur de MAX_GB est égale à 0.
  • Si l'espace de table est de type smallfile, la valeur de MAX_GB dépend de la taille de bloc utilisée pour créer l'espace de table. Par exemple, la valeur de MAX_GB est de 32 Go si la taille de bloc utilisée est de 8 Ko. Pour plus d'informations, veuillez consulter la documentation Oracle relative aux tailles de bloc non standard.
  • Si l'espace de table est de type bigfile, la valeur de MAX_GB est affichée sous la forme 32 To. Toutefois, en raison des limitations du système d'exploitation dans RDS for Oracle, le fichier ne peut s'étendre que jusqu'à 16 TiB.

Vous pouvez éventuellement exécuter les requêtes suivantes pour obtenir la DDL utilisée pour créer l'espace de table :

SQL> SET LINESIZE 400
SQL> SET LONG 99999
SQL> SELECT DBMS_METADATA.GET_DDL('TABLESPACE','example-tablespace') FROM DUAL;

Vous pouvez obtenir les informations requises sur l'espace de table à partir de la DDL renvoyée.

Augmenter la taille de l'espace de table

Si vous avez activé la fonction AUTOEXTEND, vous n'avez pas besoin d'augmenter la taille de l'espace de table, quel que soit son type. Dans ce cas, l'espace de table est automatiquement redimensionné selon les besoins.

Si vous n'avez pas activé la fonction AUTOEXTEND et que vous souhaitez redimensionner l'espace de table, procédez comme suit :

Pour les espaces de table bigfile : redimensionnez l'espace de table à l'aide de la commande ALTER TABLESPACE. Vous pouvez spécifier la taille en kilo-octets (K), mégaoctets (M), gigaoctets (G) ou téraoctets (T). L'espace de table bigfile possède un seul fichier de données, et cette commande redimensionne le fichier de données unique sous-jacent qui y est associé.

SQL> ALTER TABLESPACE example-tablespace RESIZE 50G;

Pour les espaces de table smallfile : vous pouvez redimensionner l'espace de table uniquement en y ajoutant d'autres fichiers de données. Vous ne pouvez pas redimensionner ou modifier la configuration des fichiers de données actuels.

SQL> ALTER TABLESPACE example-tablespace ADD DATAFILE SIZE 1G AUTOEXTEND ON;

Réduire la taille de l'espace de table

Si l'espace de table est de type smallfile, vous ne pouvez pas gérer les fichiers de données sous-jacents. Pour augmenter la taille de l'espace de table, ajoutez un nouveau fichier de données. Lorsque vous ajoutez un nouveau fichier de données, assurez-vous de choisir les bonnes valeurs pour AUTOEXTEND, SIZE et MAXSIZE. Ces valeurs ne peuvent pas être modifiées ultérieurement. Pour réduire la taille de l'espace de table smallfile, créez un nouvel espace de table avec l'espace souhaité et déplacez toutes vos données manuellement vers celui-ci.

Si votre espace de table est de type bigfile, choisissez l'une des méthodes suivantes pour réduire sa taille en fonction du type de données qu'il contient :

Espaces de table permanents : vous ne pouvez pas réduire la taille d'un espace de table permanent à une valeur inférieure à son seuil supérieur. Si vous tentez de le faire, votre opération de redimensionnement échoue avec l'erreur suivante :

ORA-03297: file contains used data beyond requested RESIZE value

Supposons toutefois qu'un espace de table ait une taille de 50 Go avec un seuil supérieur de 40 Go. Vous pouvez ensuite réduire la taille de l'espace de table à 40 Go en exécutant une requête similaire à la suivante :

SQL> ALTER TABLESPACE example-tablespace RESIZE 40G;

Vous ne pouvez pas réduire la taille d'un espace de table à une valeur inférieure à son seuil supérieur. Dans ce cas, vous pouvez effectuer l'une des opérations suivantes :

  • Réorganisez les objets de l'espace de table.
  • Créez un nouvel espace de table et migrez tous les objets vers celui-ci. Ensuite, supprimez l'ancien espace de table.

Espaces de table temporaires : vous pouvez réduire la taille de votre espace de table temporaire à l'aide de la commande SHRINK.

Exemple :

SQL> ALTER TABLESPACE example-tablespace SHRINK SPACE KEEP 100M;

Pour redimensionner les espaces de table temporaires dans un réplica en lecture, utilisez le package rdsadmin.rdsadmin_util.resize_temp_tablespace :

SQL> EXEC rdsadmin.rdsadmin_util.resize_temp_tablespace('example-tablespace','100M');

Pour plus d'informations, veuillez consulter Redimensionnement de l'espace de table temporaire dans un réplica en lecture.

-ou-

Vous pouvez créer un autre espace de table temporaire de la taille de votre choix, puis le définir comme espace de table temporaire par défaut.

1.    Exécutez la requête suivante pour afficher l'espace de table temporaire par défaut actuel :

SQL> SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';

2.    Exécutez la requête suivante pour créer un nouvel espace de table temporaire :

SQL> CREATE TEMPORARY TABLESPACE example-tablespace TEMPFILE SIZE 100M;

3.    Exécutez la requête suivante pour définir le nouvel espace de table temporaire comme espace de table temporaire par défaut :

SQL> EXEC RDSADMIN.RDSADMIN_UTIL.ALTER_DEFAULT_TEMP_TABLESPACE(TABLESPACE_NAME => 'example-tablespace');

Pour modifier l'espace de table temporaire d'un utilisateur spécifique, vous pouvez effectuer les opérations suivantes :

1.    Exécutez la requête suivante pour afficher l'espace de table temporaire par défaut actuel de l'utilisateur :

SQL>  SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS where USERNAME='example_username';

2.    Exécutez la requête suivante pour modifier l'espace de table temporaire par défaut de l'utilisateur :

SQL> ALTER USER example_username TEMPORARY TABLESPACE example-tablespace;

Espaces de table d'annulation : essayez d'abord de réduire la taille de l'espace de table d'annulation à l'aide de la commande ALTER TABLESPACE.

Exécutez la requête suivante pour identifier l'espace de table d'annulation actuellement utilisé :

SQL> SHOW PARAMETER UNDO_TABLESPACE;

Exécutez une requête similaire à la suivante pour réduire la taille de l'espace de table d'annulation :

SQL> ALTER TABLESPACE example-tablespace RESIZE 500M;

Cette requête s'exécute correctement s'il n'y a aucun segment d'annulation dans le stockage qui doit être supprimé.

Si la requête ci-dessus ne s'exécute pas correctement, procédez comme suit :

1.    Créez un nouvel espace de table d'annulation :

Exécutez une requête similaire à la suivante pour créer un nouvel espace de table d'annulation :

SQL> CREATE UNDO TABLESPACE example-new-tablespace DATAFILE SIZE 1G AUTOEXTEND ON MAXSIZE 100G;

2.    Définissez l'espace de table nouvellement créé comme espace de table d'annulation par défaut :

Définissez le paramètre d'initialisation UNDO_TABLESPACE dans le groupe de paramètres pour qu'il pointe vers l'espace de table nouvellement créé. Pour plus d'informations, veuillez consulter Modification de paramètres dans un groupe de paramètres de bases de données.

Exemple :

UNDO_TABLESPACE = example-new-tablespace

Ce paramètre est un paramètre dynamique et n'entraîne aucun temps d'arrêt pour appliquer la modification. Toutefois, une bonne pratique consiste à redémarrer l'instance de base de données après cette modification. Pour plus d'informations, veuillez consulter Managing undo.

Exécutez la requête suivante pour vérifier que le nouvel espace de table d'annulation est l'espace de table par défaut :

SQL> SHOW PARAMETER UNDO_TABLESPACE;

3.    Supprimez l'ancien espace de table d'annulation :

Exécutez une requête similaire à la suivante pour supprimer l'ancien espace de table d'annulation :

SQL> DROP TABLESPACE example-tablespace INCLUDING CONTENTS AND DATAFILES;