Il y a deux choses que vous pouvez faire pour atténuer l'impact de cette situation.
OPTION #1 : Augmenter les variables tmp_table_size et/ou taille max_heap_table_size
Ces options régissent la taille d'une table temporaire en mémoire avant qu'elle ne soit considérée comme trop grande et qu'elle ne soit mise sur disque comme une table temporaire MyISAM. Plus ces valeurs sont grandes, moins vous aurez de chances d'obtenir le message "copying to tmp table on disk". Assurez-vous que votre serveur dispose de suffisamment de RAM et d'espace de stockage. max_connexions est modérément configuré si une seule connexion DB a besoin de beaucoup de RAM pour ses propres tables temporaires.
OPTION #2 : Utiliser un disque RAM pour les tables tmp
Vous devriez être en mesure de configurer un disque RAM sous Linux, puis de définir le paramètre tmpdir dans mysql comme étant le dossier dans lequel le disque RAM est monté.
Pour commencer, configurez un disque RAM dans le système d'exploitation.
Créez un dossier dans le Linux appelé /var/tmpfs
mkdir /var/tmpfs
Ensuite, ajoutez cette ligne à /etc/fstab (par exemple, si vous voulez un disque de 16 Go de RAM)
none /var/tmpfs tmpfs defaults,size=16g 1 2
et redémarrez le serveur.
Note : Il est possible de créer un disque RAM sans redémarrer. Rappelez-vous simplement de toujours ajouter la ligne susmentionnée à /etc/fstab pour avoir le disque RAM après un redémarrage du serveur.
Maintenant pour MySQL :
Ajouter cette ligne dans /etc/my.cnf
[mysqld]
tmpdir=/var/tmpfs
et redémarrez mysql.
OPTION #3 : Placez la table tmp sur le disque RAM dès que possible (en supposant que vous ayez appliqué l'OPTION #2 en premier).
Il se peut que vous souhaitiez forcer les tables tmp vers le disque RAM aussi rapidement que possible afin que MySQL ne s'essouffle pas à migrer de grandes tables tmp en mémoire vers un disque RAM. Ajoutez simplement ceci au fichier /etc/my.cnf :
[mysqld]
tmpdir=/var/tmpfs
tmp_table_size=2K
et redémarrez mysql. Cela fera que même la plus petite table temporaire sera créée directement dans le disque RAM. Vous pouvez périodiquement lancer ls -l /var/tmpfs
pour voir les tables temporaires aller et venir.
Essayez-le ! !!
CAVEAT
Si vous ne voyez rien d'autre que des tables temporaires dans /var/tmpfs 24/7, cela pourrait avoir un impact sur la fonctionnalité/les performances du système d'exploitation. Pour vous assurer que /var/tmpfs n'est pas surpeuplé, essayez de régler vos requêtes. Une fois que vous l'aurez fait, vous devriez voir moins de tables temporaires se matérialiser dans /var/tmpfs.
1 votes
Je ne suis pas un expert de MySql, mais vous feriez probablement mieux d'optimiser la requête et/ou le schéma.
8 votes
Je vote pour classer cette question comme "pas une vraie question". La question n'inclut pas la requête SQL à optimiser, ni l'élément
SHOW CREATE TABLE
pour montrer quels index, ni leEXPLAIN
rapport montrant le plan d'optimisation actuel.3 votes
Je suis d'accord avec @Bill Karwin pour dire qu'il faut voir les requêtes, les déclarations de création de table, et/ou les plans EXPLAIN. Ma réponse résoudrait le problème que vous voyez mais permettrait aux mauvaises requêtes de gonfler la RAM. Connaître la nature de vos requêtes éliminerait probablement le besoin de reconfigurer la RAM ou mysql.
13 votes
@ votants proches, jetez un coup d'œil à la réponse géniale à cette question et considérez combien de visiteurs cette question a pu apporter à SO. Votez pour Laissez ouvert !