Pourquoi mon instance de base de données Amazon RDS for MySQL utilise-t-elle plus de stockage que prévu ?

Lecture de 5 minute(s)
0

Mon instance Amazon Relational Database Service (Amazon RDS) pour MySQL instance utilise plus d'espace que prévu. Quelle en est la raison et comment puis-je optimiser l'espace de stockage sur disque ?

Solution

Vous pouvez utiliser la métrique FreeStorageSpace de Amazon CloudWatch pour surveiller l'espace de stockage disponible pour une instance de base de données RDS DB. Mais FreeStorageSpace ne décrit pas la manière dont l'instance de base de données consomme de l'espace de stockage.

Utilisez les stratégies suivantes pour récupérer de l'espace de stockage :

Exécuter OPTIMIZE TABLE

Les tables consomment de l'espace qui n'est pas activement utilisé, mais Amazon RDS alloue cet espace aux tables de toute façon. Si innodb_file_per_table est activé (il est activé par défaut), vous pouvez récupérer cet espace à l'aide de OPTIMIZE TABLE. OPTIMIZE TABLE fonctionne pour les tables InnoDB, MyISAM et ARCHIVE. Bien qu'Amazon RDS accepte la commande OPTIMIZE TABLE, il exécute en fait la commande ALTER TABLE... FORCE à la place. Lorsque cela se produit, vous recevez un message d'avertissement similaire au suivant : "La table ne prend pas en charge l'optimisation, faites plutôt recréer + analyser à la place." Pour plus d'informations, consultez OPTIMIZE TABLE dans la documentation MySQL.

Pour vérifier la fragmentation, exécutez une requête comme celle-ci :

SELECT
 table_name,
 data_length,
 max_data_length,
 index_length,
 data_free
FROM
 information_schema.tables 
WHERE table_schema='schema_name'
;

La colonne data_free met en évidence la quantité d'espace disponible qui est alloué à une table, mais n'est pas utilisé. Vous pourrez peut-être récupérer cet espace en utilisant OPTIMIZE TABLE. OPTIMIZE TABLE fonctionne si la table est créée dans un tablespace séparé, selon le paramètre de configuration innodb_file_per_table par défaut d'Amazon RDS. Pour plus d'informations, consultez la documentation MySQL sur lesFile-per-table tablespaces.

Réduire l'espace de stockage des tables d'application

Pour identifier l'espace de stockage utilisé par les tables d'application sur l'instance de base de données, exécutez une requête similaire à celle-ci :

SELECT 
 table_schema,
 SUM(data_length + index_length + data_free)/1024/1024 AS total_mb,
 SUM(data_length)/1024/1024 AS data_mb,
 SUM(index_length)/1024/1024 AS index_mb,
 SUM(data_free)/1024/1024 AS free_mb,
 COUNT(*) AS tables,
 CURDATE() AS today 
FROM 
 information_schema.tables
 GROUP BY table_schema
 ORDER BY 2 DESC
;

Pour localiser la plus grande table d'application sur l'instance de base de données, exécutez une requête similaire à celle-ci :

SELECT 
 table_schema,
 table_name,
 (data_length + index_length + data_free)/1024/1024 AS total_mb,
 (data_length)/1024/1024 AS data_mb,
 (index_length)/1024/1024 AS index_mb,
 (data_free)/1024/1024 AS free_mb,
 CURDATE() AS today
FROM 
 information_schema.tables
 ORDER BY 3 DESC
;

Remarque : Le stockage total utilisé par une base de données et une table individuelles ne peut pas être calculé si la base de données comprend des tables avec des colonnes de longueur variable de plus de 768 octets. Cela inclut par exemple BLOB, TEXT, VARCHAR ou VARBINARY.

Réduire le stockage des journaux binaires

L'ajout d'un réplica en lecture conduit le journal binaire de l'instance source à utiliser de l'espace de stockage supplémentaire. Pour déterminer la quantité de stockage utilisée par le journal binaire de l'instance source, vérifiez la métrique CloudWatch BinLogDiskUsage. Une augmentation élevée peut indiquer qu'un ou plusieurs Réplicas en Lecture ne sont pas synchronisés.

Réduire ou désactiver le stockage du journal général et du journal des requêtes lentes

Lorsque vous désactivez les paramètres du journal général et du journal des requêtes lentes, votre instance commence à stocker ces journaux. Il stocke également les sauvegardes de ces journaux. Pour faire tourner ces fichiers et contrôler l'utilisation du disque, consultez mysql.rds_rotate_general_log et mysql.rds_rotate_slow_log.

Remarque : désactivez les journaux de requêtes généraux et lents lorsque vous ne les utilisez pas activement pour résoudre des problèmes.

Gérer ou réduire la taille de l'espace de table système InnoDB

Le tablespace système contient le dictionnaire de données InnoDB et l'espace d'annulation ; sa taille minimale est de 10 Mo. Une fois l'espace alloué, le fichier fera toujours au moins cette taille, bien que les transactions de longue durée puissent consommer plus de stockage disponible.

Par défaut, Amazon RDS définit innodb_file_per_table sur 1. Cela signifie que les données de chaque tablespace sont stockées dans son propre fichier .ibd. Pour récupérer de l'espace marqué comme étant réutilisable pour les tables connexes, utilisez la commande OPTIMIZE TABLE pour redimensionner les fichiers du tablespace par tables ou supprimez une table.

Si innodb_file_per_table est défini à 0, toutes les tables sont également allouées au tablespace du système. La suppression de tables ou d'index et la suppression ou la troncation de données des tables allouées dans le tablespace système marque l'espace précédemment occupé comme réutilisable. Mais innodb_file_per_table ne libère aucun espace dans le système de fichiers.

Comme il n'est pas possible de réduire l'espace disque logique du système sur place, exportez les données de votre base de données actuelle. Importez ensuite les données dans une nouvelle instance. Pour réduire les interruptions, configurez la nouvelle instance MySQL comme réplica de l'instance Amazon RDS source. Lorsque le réplica est synchronisé avec l'instance Amazon RDS source, basculez vers la nouvelle instance.

Remarque : La restauration à partir d'un instantané ou la création d'un réplica en lecture ne vous aidera pas à récupérer de l'espace à partir de l'espace de table système. Cela est dû au fait que les deux méthodes utilisent un instantané du volume de stockage de l'instance source qui contient le tablespace système.


Informations connexes

L'instance de base de données Amazon RDS manque d'espace de stockage Modification d'une instance de base de données Amazon RDS

Comment résoudre l'erreur « MySQL HA_ERR_RECORD_FILE_FULL » lorsque j'utilise Amazon RDS for MySQL ?