Mysql n'a pas pu écrire dans / tmp puis n'a pas pu redémarrer

11

J'exécutais un orthomclprogramme qui utilise mysql. Ce programme fonctionnait très bien sur le même ordinateur auparavant. Cette fois, j'ai eu un message d'erreur.

DBD::mysql::st execute failed: Can't create/write to file '/tmp/#sql_700_1.MYI' (Errcode: 13) at /usr/local/bioinf/orthomclSoftware-v2.0.9/bin/orthomclPairs line 709, <F> line 14.

J'ai essayé de redémarrer le mysqlserveur, le serveur s'est arrêté mais n'a pas pu démarrer.

sudo service mysql start
start: Job failed to start

/var/log/mysql/error.loget /var/log/mysql.errsont vides. J'ai essayé quelques choses que je trouve ici , y compris la purge et la réinstallation mysql-serveret la suppression ib_logfile*dans /var/lib/mysql.

L'autre chose que j'ai essayée est

sudo dpkg-reconfigure mysql-server-5.5

Les messages d'erreur sont:

/usr/sbin/mysqld: Can't create/write to file '/tmp/ibNzqwO0' (Errcode: 13)
InnoDB: Error: unable to create temporary file; errno: 13
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting

Voici quelques informations de dmesg | grep mysql:

[3115187.338273] init: mysql main process (44255) terminated with status 1
[3115187.338417] init: mysql main process ended, respawning
[3115187.356361] init: mysql post-start process (44256) terminated with status 1
[3116827.473256] type=1400 audit(1396394069.224:132): apparmor="DENIED" operation="open" parent=45387 profile="/usr/sbin/mysqld" name="/home/tmp/" pid=45396 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=0 ouid=0
[3116827.582489] type=1400 audit(1396394069.332:133): apparmor="DENIED" operation="mknod" parent=45387 profile="/usr/sbin/mysqld" name="/home/tmp/#sql_b154_0.MYI" pid=45402 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=0 ouid=0
[3116827.908448] type=1400 audit(1396394069.660:134): apparmor="DENIED" operation="mknod" parent=45317 profile="/usr/sbin/mysqld" name="/home/tmp/ibbPfaqP" pid=45415 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=118 ouid=118
[3116841.623608] type=1400 audit(1396394083.372:139): apparmor="STATUS" operation="profile_replace" name="/usr/sbin/mysqld" pid=45443 comm="apparmor_parser"
[3116841.771621] init: mysql pre-start process (45474) terminated with status 1

Il y avait beaucoup de lignes comme celle-ci.

Quelqu'un pourrait-il m'aider à comprendre ce qui ne va pas avec mon serveur MySQL, s'il vous plaît?

Merci beaucoup.

user264649
la source

Réponses:

15

La raison est que votre /tmpest - lien symbolique vers un autre emplacement, /home/tmp. Mais MySQL est blindé par AppArmor, qui ne permet pas d'écrire librement /home/tmp. Pour remédier à la situation, vous pouvez modifier le /etc/apparmor.d/abstractions/user-tmpet y ajouter de /home/tmpmanière appropriée; pour moi les lignes supplémentaires

  owner /home/tmp/**    rwkl,
  /home/tmp/            rw,

a fait l'affaire.

Antti Haapala
la source
1
Parfait! Résolu le problème immédiatement. J'étais sûr que cela avait quelque chose à voir avec le lien symbolique!
YonoRan
1
J'ai dû redémarrer l'apparmor pour que les changements prennent effet:sudo /etc/init.d/apparmor restart
Nadjib Mami
6

Il semble que vous n'ayez pas les bonnes autorisations /tmp, qui devraient être accessibles en écriture. Vous devriez pouvoir le réparer avec cette commande:

sudo chmod 1777 /tmp

Cela définira les autorisations sur 777(rwx pour tout le monde) et définira également le bit collant qui est recommandé pour le /tmpdir. Comme expliqué dans man chmod:

DRAPEAU DE SUPPRESSION RESTREINT OU EMBOUT AUTOCOLLANT

L'indicateur de suppression restreinte ou bit collant est un bit unique, dont l'interprétation dépend du type de fichier. Pour les répertoires, il empêche les utilisateurs non privilégiés de supprimer ou de renommer un fichier dans le répertoire à moins qu'ils ne soient propriétaires du fichier ou du répertoire; cela s'appelle l'indicateur de suppression restreinte pour le répertoire, et se trouve généralement sur les répertoires accessibles en écriture comme / tmp. Pour les fichiers normaux sur certains systèmes plus anciens, le bit enregistre l'image de texte du programme sur le périphérique d'échange afin qu'il se charge plus rapidement lors de l'exécution; c'est ce qu'on appelle le bit collant.

terdon
la source
@ScottSeverance s'il vous plaît ne changez pas le code en guillemets juste pour le bien du changement. Oui je sais que je citais mais le bloc de code donne un meilleur formatage et respecte l'en-tête et le retrait. Comme vous l'avez modifié, tout est sur la même ligne.
terdon le
1
Je l'ai changé parce que lorsqu'il est formaté en code, je ne peux pas le lire sur mon téléphone sans défilement horizontal constant. Il n'y a vraiment aucun avantage à mettre en forme un devis en tant que code. Si vous n'aimez pas que l'en-tête soit sur la même ligne, il existe des moyens de résoudre ce problème sans interrompre l'affichage des utilisateurs sur les téléphones.
Scott Severance
@ScottSeverance ah, assez juste, je n'avais pas réalisé que cela causait des problèmes sur les téléphones. OK, je le mettrai alors dans un bloc de devis. J'étais juste ennuyé parce que votre édition (sans explication) semble pire sur les navigateurs normaux et vous n'avez pas vérifié qu'elle s'affiche correctement. Et vous venez de modifier à nouveau et c'est parfait, merci!
terdon
1
La mienne est la bonne solution. Mysql est apprarmé et l'apparmeur n'aime pas /tmpêtre déplacé vers un autre emplacement sans changer les confs. Les audits indiquent qu'il ne s'agit pas d'une autorisation refusée sur le système de fichiers, mais des gardes de l'apparmeur.
Antti Haapala