O Mysql não pôde gravar em / tmp e falhou ao reiniciar

11

Eu estava executando o orthomclprograma que usa mysql. Este programa funcionou muito bem no mesmo computador antes. Dessa vez, recebi uma mensagem de erro.

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.

Eu tentei reiniciar o mysqlservidor, o servidor desligou, mas falhou ao iniciar.

sudo service mysql start
start: Job failed to start

/var/log/mysql/error.loge /var/log/mysql.errestão vazios. Eu tentei algumas coisas que eu encontrei aqui, incluindo purga e reinstalar mysql-servere remoção ib_logfile*em /var/lib/mysql.

A outra coisa que tentei é

sudo dpkg-reconfigure mysql-server-5.5

As mensagens de erro são:

/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

Aqui estão algumas informações 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

Havia muitas linhas assim.

Alguém poderia me ajudar a descobrir o que há de errado com o meu servidor MySQL, por favor?

Muito Obrigado.

user264649
fonte

Respostas:

15

A razão para isso é que você /tmpestá vinculado a outro local /home/tmp,. Mas o MySQL é blindado pelo AppArmor, que não permite escrever livremente /home/tmp. Para remediar a situação, você pode editar /etc/apparmor.d/abstractions/user-tmpe adicionar o /home/tmplocal adequadamente; para mim as linhas extras

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

fez o truque.

Antti Haapala
fonte
1
Perfeito! Resolvido o problema imediatamente. Eu tinha certeza de que tinha algo a ver com o link simbólico!
YonoRan 24/03
1
Eu tive que reiniciar o AppArmor para que as alterações entrem em vigor:sudo /etc/init.d/apparmor restart
Nadjib Mami
6

Parece que você não tem as permissões corretas /tmp, o que deve ser gravável mundialmente. Você deve poder corrigi-lo com este comando:

sudo chmod 1777 /tmp

Isso definirá as permissões para 777(rwx para todos) e também definirá o bit adesivo recomendado para o /tmpdiretório. Como explicado em man chmod:

BANDEIRA DE EXCLUSÃO RESTRITA OU BOCADO PEGAJOSO

O sinalizador de exclusão restrita ou bit fixo é um bit único, cuja interpretação depende do tipo de arquivo. Para diretórios, impede que usuários sem privilégios removam ou renomeiem um arquivo no diretório, a menos que sejam proprietários do arquivo ou diretório; isso é chamado de sinalizador de exclusão restrita para o diretório e geralmente é encontrado em diretórios graváveis ​​em todo o mundo como / tmp. Para arquivos regulares em alguns sistemas mais antigos, o bit salva a imagem de texto do programa no dispositivo de troca, para que seja carregado mais rapidamente quando executado; isso é chamado de bit pegajoso.

Terdon
fonte
@ScottSeverance, não altere o código para aspas apenas por uma questão de mudança. Sim, eu sei que estava citando, mas o bloco de código fornece uma melhor formatação e respeita o cabeçalho e o recuo. Do jeito que você editou, tudo está na mesma linha.
terdon
1
Eu mudei porque, quando está formatado como código, não consigo lê-lo no meu telefone sem rolagem horizontal constante. Realmente não há benefício em formatar uma cotação como código. Se você não gosta do cabeçalho na mesma linha, há maneiras de corrigir isso sem interromper a exibição dos usuários nos telefones.
Scott Separação
@ ScottSeverance ah, é justo, eu não tinha percebido que isso causava problemas nos telefones. OK, vou colocá-lo em um bloco de cotação então. Fiquei chateado porque a sua edição (sem explicação) parece pior em navegadores normais e você não verificou se é renderizada corretamente. E você acabou de editar novamente e é perfeito, obrigado!
terdon
1
O meu é a solução correta. O Mysql é aparentado e o apparmor não gosta de /tmpser movido para outro local sem alterar os confs. As auditorias informam que não é o caso de permissão negada no sistema de arquivos, mas os guardas do aparmor.
Antti Haapala