Comment résoudre les problèmes liés à l'utilisation par mon instance de base de données Amazon RDS MySQL d'un espace de stockage plus grand que prévu ?
Date de la dernière mise à jour : 14/11/2019
Mon instance de base de données Amazon Relational Database Service (Amazon RDS) sur MySQL utilise un espace de stockage plus grand que prévu. Quelle est la raison et comment optimiser l'espace de stockage sur disque ?
Solution
Vous pouvez utiliser la métrique FreeStorageSpace Amazon CloudWatch pour surveiller l'espace de stockage disponible d'une instance de base de données RDS, mais cette métrique n'indique pas la façon dont l'instance consomme le stockage.
Utilisez les stratégies suivantes pour récupérer de l'espace de stockage :
Exécuter OPTIMIZE TABLE
De l'espace consommé par les tables n'est pas activement utilisé, mais alloué quand même à la table. Si le paramètre innodb_file_per_table est activé (il l'est par défaut), vous pouvez récupérer cet espace en utilisant OPTIMIZE TABLE. OPTIMIZE TABLE fonctionne pour les tables InnoDB, MyISAM et ARCHIVE, et bien qu'Amazon RDS accepte la commande OPTIMIZE TABLE, Amazon RDS exécute ALTER TABLE... FORCE. Dans ce cas, vous pouvez recevoir un message d'avertissement similaire à « Table does not support optimize ,recate+analyze instead » (La table ne pend pas en charge l'optimisation. Exécution de la recréation et de l'analyse à la place). Pour plus d'informations, consultez OPTIMIZE TABLE dans la documentation MySQL.
Pour recherchez la fragmentation, exécutez une requête similaire à 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 indique la quantité d'espace libre allouée à une table, qui n'est pas activement utilisé. Il peut être possible de récupérer cet espace avec OPTIMIZE TABLE si la table est créée dans un tablespace distinct conformément au paramètre de configuration par défaut innodb_file_per_table Amazon RDS. Pour plus d'informations, reportez-vous à Tablespaces File-Per-Table dans la documentation MySQL.
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 : l'espace de stockage total utilisé par une base de données et une table ne peut pas être calculé si la base de données contient des tables avec des colonnes de longueur variable de plus de 768 octets (par exemple, BLOB, TEXT, VARCHAR ou VARBINARY).
Réduire le stockage du journal binaire
L'ajout d'un réplica en lecture amène le journal binaire de l'instance principale à utiliser un espace de stockage supplémentaire. Pour déterminer l'espace de stockage utilisé par le journal binaire sur l'instance principale, vérifiez la métrique CloudWatch BinLogDiskUsage. Une forte augmentation 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 le journal des requêtes lentes
Lorsque vous activez les paramètres du journal général et du journal des requêtes lentes, l'instance de base de données stocke ces journaux et leurs sauvegardes. Pour effectuer une rotation de 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 pour résoudre des problèmes.
Gérer ou réduire la taille du tablespace système InnoDB
Le tablespace système contient le dictionnaire des données InnoDB et l'espace d'annulation. Il démarre à 10 Mo. Une fois l'espace alloué, le fichier aura au minimum cette taille, même si les transactions de longue durée peuvent utiliser plus d'espace de stockage disponible.
Par défaut, Amazon RDS définit innodb_file_per_table sur 1, ce qui signifie que les données de chaque tablespace sont stockées dans leur propre fichier .ibd. Pour récupérer l'espace marqué comme étant réutilisable pour les tables associées, utilisez la commande OPTIMIZE TABLE pour redimensionner les fichiers tablespace de chaque table ou supprimez une table.
Si innodb_file_per_tableest définit sur 0, toutes les tables sont également allouées au tablespace système. La suppression de tables ou d'index ou la suppression ou la troncature des données des tables allouées dans le tablespace système marque l'espace précédemment occupé comme étant réutilisable. Cependant, cette commande ne libère pas d'espace dans le système de fichiers.
Comme il n'est pas possible de réduire le tablespace système sur place, exportez les données de la base de données en cours, puis importez-les dans une nouvelle instance. Pour réduire les interruptions, configurez la nouvelle instance MySQL comme réplica de l'instance principale Amazon RDS source. Lorsque le réplica est synchronisé avec l'instance principale Amazon 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 permet pas de récupérer l'espace du tablespace 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
Cette page vous a-t-elle été utile ?
Cette page peut-elle être améliorée ?
Vous avez besoin d'aide ?