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

Vous pouvez utiliser le métrique FreeStorageSpace d'Amazon CloudWatch pour surveiller l'espace de stockage disponible pour une instance de base de données RDS, mais ce métrique ne décrit pas comment l'instance de base de données utilise le stockage.

Quelques stratégies vous permettent de récupérer de l'espace de stockage :

Exécuter OPTIMIZE TABLE

Une partie de l'espace utilisé par des tables n'est pas utilisé activement, mais il leur est tout de même alloué. Si innodb_file_per_table est activé (ce qui est le cas par défaut), vous pouvez récupérer cet espace en utilisant OPTIMIZE TABLE.

Pour vérifier le degré de fragmentation, vous pouvez utiliser une requête semblable à celle qui suit :

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 indique la quantité d'espace libre alloué à une table sans être utilisé activement. Vous pouvez récupérer cet espace avec OPTIMIZE TABLE si la table est créée dans un espace disque logique distinct, conformément au paramètre de configuration innodb_file_per_table RDS par défaut.

Réduire le stockage des tables d'applications

Pour consulter la quantité de stockage utilisée par des tables d'applications sur votre instance de base de données, vous pouvez exécuter une requête semblable à celle qui suit :

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'applications sur votre instance de base de données, vous pouvez exécuter une requête semblable à celle qui suit :

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 ne peut pas être calculé si la base de données comprend des tables avec des colonnes de longueur variable dépassant 768 octets (comme BLOB, TEXT, VARCHAR ou VARBINARY).

Réduire le stockage de journaux binaires

L'ajout d'une réplica en lecture conduit le journal binaire d'instances principal à utiliser un espace de stockage supplémentaire. Pour découvrir combien de stockage est utilisé par le journal binaire sur l'instance maître, consultez la métrique CloudWatch BinLogDiskUsage. Une croissance élevée peut indiquer qu'une ou plusieurs réplicas en lecture ne sont pas synchronisées. Pour obtenir plus d'informations, consultez Accès aux journaux binaires MySQL.

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

Suite à l'activation des paramètres de journal général et de journal des requêtes lentes, votre instance de base de données commence à stocker ces journaux et leurs sauvegardes. 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 tout problème potentiel d'utilisation de disque et de performances, désactivez les journaux généraux et des requêtes lentes lorsque vous ne les utilisez pas activement pour la résolution des problèmes.

Gérer ou réduire la taille d'espace disque logique du système InnoDB

L'espace disque logique du système comprend le dictionnaire de données InnoDB et l'espace d'annulation, et il commence à 10 Mo. Une fois l'espace alloué, le fichier fera toujours au moins cette taille, même si des transactions à exécution longue peuvent utiliser plus de stockage disponible.

Par défaut, RDS définit innodb_file_per_table sur 1, ce qui signifie que toutes les données de chaque espace disque logique sont stockées dans leur propre fichier .ibd. Pour récupérer de l'espace marqué comme réutilisable pour les tables liées, utilisez la commande OPTIMIZE TABLE pour effectuer un redimensionnement des fichiers de l'espace disque logique ou réduire une table.

Si innodb_file_per_table est défini sur 0, toutes les tables sont également allouées à un espace disque logique système. Réduire des tables ou des index, ou supprimer ou tronquer des données de tables allouées dans l'espace disque logique du système marque l'espace précédemment occupé comme réutilisable, mais cette commande ne libère pas d'espace sur le système de fichiers.

Étant donné qu'il n'est pas possible de réduire l'espace disque logique du système sur place, vous devez exporter les données de votre base de données actuelle, puis importer les données dans une nouvelle instance. Afin de réduire les périodes d'interruption, configurez votre nouvelle instance MySQL comme subordonnée de l'instance maître RDS source. Lorsque le subordonné est synchronisé avec l'instance maître RDS source, passez à la nouvelle instance. Pour obtenir des informations sur la réplication manuelle, consultez Réplication avec une instance MySQL ou MariaDB en cours d'exécution externe à Amazon RDS.

Remarque : la restauration depuis un instantané ou la création d'une réplica en lecture n'aidera pas à récupérer de l'espace auprès de l'espace disque logique du système, étant donné que les deux méthodes utilisent un instantané du volume de stockage d'instance source qui inclut l'espace disque logique du 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 : 02/04/2018