Mon instance de base de données Amazon Relational Database Service (Amazon RDS) sur MySQL utilise plus d'espace que prévu. Pourquoi cela se produit-il et comment puis-je optimiser le stockage sur disque ?

Vous pouvez utiliser la métrique Amazon CloudWatch FreeStorageSpace pour surveiller l'espace de stockage disponible pour une instance de base de données RDS, mais cette métrique n'indique pas la manière dont l'instance de base de données consomme le stockage.

Il existe certaines stratégies simples que vous pouvez mettre à profit pour récupérer de l'espace de stockage :

Exécuter OPTIMIZE TABLE

L'espace consommé par les tables n'est pas nécessairement utilisé, mais il est malgré tout alloué aux tables. Si innodb_file_per_table est activé (valeur par défaut), vous pouvez récupérer cet espace à l'aide de OPTIMIZE TABLE.

Pour vérifier la fragmentation, vous pouvez utiliser une requête similaire à la suivante :

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 pouvez récupérer cet espace à l'aide de OPTIMIZE TABLE si la table a été créée dans un espace de table distinct conformément au paramètre de configuration RDS innodb_file_per_table par défaut.

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

Pour connaître la quantité de stockage utilisée par les tables d'application sur votre instance de base de données, vous pouvez exécuter une requête similaire à la suivante :

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 de votre instance de base de données, vous pouvez exécuter une requête similaire à la suivante :

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 (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 principale à utiliser de l'espace de stockage supplémentaire. Pour déterminer la quantité de stockage utilisée par le journal binaire de l'instance principale, 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. Pour plus d'informations, consultez Accès aux journaux binaires MySQL.

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

L'activation des paramètres de journal général et de journal des requêtes lentes entraîne le stockage de ces journaux et des sauvegardes de ces journaux par votre instance de base de données. 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 : Pour éviter les problèmes potentiels de performances et d'utilisation du disque, désactivez le journal général et le journal des requêtes lentes lorsque vous ne les utilisez pas activement à des fins de dépannage.

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

L'espace de table 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, RDS définit innodb_file_per_table à 1, ce qui signifie que les données de chaque espace de table sont stockées dans leur 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 d'espace de table par tables ou supprimez une table.

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

Puisqu'il n'est pas possible de réduire l'espace de table système sur place, exportez les données de votre base de données actuelle, puis importez ces données dans une nouvelle instance. Pour réduire les temps d'arrêt, configurez votre nouvelle instance MySQL en tant que subordonnée de l'instance principale RDS source. Lorsque la subordonnée est synchronisée avec l'instance principale RDS source, basculez vers la nouvelle instance. Pour plus d'informations sur la réplication manuelle, consultez Réplication avec une instance MySQL ou MariaDB s'exécutant à l'extérieur d'Amazon RDS.

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 l'espace de table système.


Cette page vous a-t-elle été utile ? Oui | Non

Retour au Centre de connaissances AWS Support

Vous avez besoin d'aide ? Consultez le site du Centre AWS Support.

Date de publication : 03/11/2015

Date de mise à jour : 28/12/2018