Je viens de découvrir table_definition_cache
et j'essaie de décider sur quoi le régler. Je déconne avec ma configuration à cause de problèmes de performances.
Sur un serveur, j'ai 36599 tables et lorsque j'exécute SHOW GLOBAL STATUS
la valeur des tables ouvertes est 930312. table_definition_cache
est défini sur 20k.
Sur un autre serveur, j'ai 45349 tables et lorsque j'exécute SHOW GLOBAL STATUS
la valeur des tables ouvertes est 94383. table_definition_cache
est réglé sur 40k.
Je ne sais pas trop sur quoi le régler sur table_definition_cache
valeur car il semble que le serveur fasse beaucoup d'ouverture/échange.
Les deux serveurs sont CentOS 6 et fonctionnent
Version du serveur: 5.6.32-78.0 Percona Server (GPL), Release 78.0, Revision 8a8e016
Merci d'avoir regardé! J'apprécie grandement vos commentaires.
J'espère que ces liens peuvent vous aider à décider de votre réglage fin. Un peu plus tard, ma réponse, désolé.
J'ai pu résoudre certains problèmes dans la version 5.5 MySQL en utilisant ces informations.
Ici: vous pouvez vérifier comment calculer votre table_open_cache
open_tables
et opened_tables
mysql> show global status like 'open%';
Le nombre de tables ouvertes pour tous les threads. L'augmentation de cette valeur augmente le nombre de descripteurs de fichiers requis par mysqld. Vous pouvez vérifier si vous devez augmenter le cache de table en vérifiant la variable d'état Opened_tables. Si la valeur de Opened_tables est grande et que vous n'utilisez pas souvent FLUSH TABLES (ce qui oblige simplement à fermer et rouvrir toutes les tables), vous devez augmenter la valeur de la variable table_open_cache.
Table cache hit rate = table_open_cache*100/Opened_tables
En général, il devrait être supérieur à 50%. Vous devez donc augmenter la valeur de table_open_cache, si vous êtes en dessous de cette valeur, bien qu'il existe de nombreuses raisons d'avoir une valeur élevée de Opened_tables. Comme FLUSH TABLES, toutes les tables ouvertes seront fermées et rouvertes, ce qui augmentera considérablement la valeur Opened_tables.
Table_open_cache = total_tables*Threads_connected
Comme tous les threads (utilisateur) n'ont généralement pas accès à toutes les tables. Je pense que vous devez définir 50% de la valeur calculée. Parce qu'une valeur trop élevée de cette variable a d'autres effets secondaires. Ainsi, la formule devient
Table_open_cache = total_tables*Threads_connected*.50
table_open_cache
vous devez également régler open_files_limit
variable système.En général, c'est 2x de table_open_cache
.
open_files_limit= Table_open_cache*2
open_files_limit
n'est pas une variable dynamique. Vous devez donc le définir dans le fichier my.cnf et redémarrer MySQL.Assurez-vous que votre système d'exploitation peut gérer le nombre de descripteurs de fichiers ouverts requis par le
table_open_cache
réglage.
Réf. https://techinfobest.com/optimize-mysql-table_open_cache/
Et ici: la documentation MySQL nous donne la formule pour définir table_definition_cache
basé sur table_open_cache
Taille. (oui, je sais, le lien est pour la version 5.7, mais dans la version 5.5 doc il n'y a aucune mention de la formule), donc vous devez d'abord définir la taille de table_open_cache
, c'est la raison pour laquelle je donne le lien ci-dessus.
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_table_definition_cache
Ensuite, vous devez surveiller l'état de COM_STMT_REPREPARE
et Open_table_definitions
pour voir ce qui se passe sur le serveur. Si vous avez des applications qui utilisent prepared statements
et recevoir le message error code [1615]Prepared statement needs to be re-prepared
, est un signal que MySQL vide les tables de définition mises en cache. ( https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_need_reprepare =)
Enfin: des informations sur les raisons pour lesquelles MySQL est réparé stmt
https://dev.mysql.com/doc/refman/5.5/en/statement-repreparation.html
Opened_tables est inutile sans Uptime. Quel est le quotient de ceux-ci? Je recommande de le garder sous 2 par seconde.