web-dev-qa-db-fra.com

Maux de tête Mysql 5.6 sur Mac OSX

Plusieurs de mes collègues et moi avons récemment mis à niveau de MySQL 5.5 vers MySQL 5.6 en utilisant homebrew sur nos Mac pour tester localement avant de mettre à niveau nos serveurs. Depuis cette mise à niveau, nous avons tous rencontré des erreurs MySQL intermittentes lors de l'exécution de notre code Rails:

Lost connection to MySQL server at 'sending authentication information', system error: 32

Nous avons essayé de refaire nos noms d'utilisateur et mots de passe dans notre base de données et d'augmenter le délai d'expiration de la connexion, mais aucun des deux n'a résolu le problème. Les journaux d'erreurs ne mentionnent pas le problème. La seule solution de contournement que nous avons trouvée lorsque nous rencontrons le problème est de tuer mysql et de le redémarrer. J'ai même remarqué cette erreur plus récemment en utilisant mysql -u root -p sur la ligne de commande. Il semble qu'une fois que j'ai commencé à obtenir cette erreur, je ne peux pas dépasser mon nombre actuel de connexions, quel que soit le nom d'utilisateur que j'utilise. Si je ferme une connexion, je peux en rouvrir une.

Nous avons les environnements suivants:

  • certains d'entre nous: Rails 3.2, Ruby 2, mysql2 0.3.13, MySQL 5.6.12, Mac OSX 10.8.4
  • d'autres d'entre nous: Rails 3.2, Ruby 1.9, mysql2 0.3.13, MySQL 5.6.10, Mac OSX 10.8.4

Des idées ce qui pourrait être à l'origine de cela?

Merci! Julie

48
Julie

Aucune des réponses ici ne m'a aidé, mais j'ai finalement réussi à faire fonctionner MySQL 5.6.

TROIS options pour corriger MySQL 5.6:

  1. (confirmé) Modifier /etc/my.cnf (créer s'il n'existe pas) et ajouter:

    [mysqld]
    innodb_file_per_table = OFF
    

et redémarrez MySQL. Ensuite, pour que cela fonctionne, vous devrez vider vos bases de données dans un fichier SQL (mysqldump), puis supprimer et recréer les bases de données, puis recharger les données.

  1. Modifier la valeur ulimit par défaut d'OSX (suggérée par l'utilisateur Github sodabrew ): https://superuser.com/questions/261023/how-to-change-default-ulimit-values-in -mac-os-x-10-6

  2. Ajoutez l'option suivante à la section [mysqld] de my.cnf: table_open_cache = 250. Par défaut, il est défini sur 2000, ce qui est bien supérieur à l'ulimit par défaut d'OSX. Cette solution n'est également pas recommandée, car elle nuit aux performances de votre MySQL - elle oblige MySQL à rouvrir souvent les tables, si vous en avez plus de 250: https://mariadb.com/kb/en/ optimizing-table_open_cache /

Pourquoi cette erreur se produit-elle?

Depuis MySQL 5.6, l'option innodb_file_per_table est activée par défaut, ce qui signifie que les données de chaque table sont stockées dans son propre fichier. La limite par défaut OSX du nombre de fichiers ouverts est de 256 par processus. Normalement, ce n'est pas un problème, mais dans mon cas, j'exécute des tests unitaires en parallèle, ce qui crée 8 bases de données avec 405 tables chacune. OSX a une limite du nombre de descripteurs de fichiers ouverts par processus. Cette réponse StackOverflow suggère que cette limite est 256, ce qui explique parfaitement mon problème: avant MySQL 5.6 toutes les données de toutes ces 8 bases de données étaient dans UN fichier.

Merci à mon collègue Thomas L. qui a trouvé un rapport de bogue MySQL qui faisait allusion à cette solution!

67
Alex Kovshovik

Nous avons eu le même problème. Cela l'a corrigé pour nous

project-root$ mysql.server stop
project-root$ gem uninstall mysql2
project-root$ bundle install
project-root$ mysql.server start
7
Cody Swann

C'est un problème avec la dernière version de mysql qui est installée via homebrew.

5.6.x crée le problème. rétrograder à 5.5.x a résolu le problème pour moi.

Vous pouvez installer les anciennes versions de formule assez facilement avec homebrew:

brew versions mysql vous donnera le sha que vous devez payer dans/usr/local pour pouvoir installer une ancienne version

   cd /usr/local
   git checkout 336c976
   brew info mysql

Cela vous montrera 5.5.29 comme la version mysql. Vous pouvez ensuite désinstaller mysql sur la base de ces instructions et réinstaller simplement en exécutant

   brew install mysql

et en exécutant le processus d'installation normal avec homebrew:

  unset TMPDIR
  mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp

J'espère que cela pourra aider.

Vous pouvez extraire master dans/usr/local après avoir réinstallé l'ancienne version de mysql. La commande brew versions vous donne même la commande de simplement extraire la formule pour mysql, mais je ne pense pas que cela présente des avantages par rapport à la simple vérification de l'ensemble du référentiel pour le sha, puis au retour à master après l'installation de l'ancienne version de mysql.

4
Michael Klein

J'ai rencontré ce problème avec mysql 5.6.16, fraîchement installé via Homebrew sur Mavericks, avec rbenv et Rails etc.

Décidé de redémarrer avant de passer en revue les autres solutions ici. Problème résolu!

Donc, si vous n'avez pas redémarré depuis l'installation de mysql, etc., je vous recommande de redémarrer avant de parcourir les réponses ici.

0
James

Nous avons constaté que l'utilisation des correctifs suivants nous corrige:

brew install mysql --use-llvm

C'est sur un Rails 2.3 dessus de REE (1.8.7) dans rbenv sur OSX 10.8. YMMV

0
John Athayde

J'ai le même problème sur la même configuration (mysql 5.6.12). Je viens de mettre à jour mysql avec homebrew vers la version 5.6.13 et le problème a disparu.

0
Fabio