O que está causando Esperando por erros de bloqueio no nível da tabela?

8

Já temos o banco de dados pendurado duas vezes e tentando encontrar uma causa.

show processlist
Waiting for global read lock | INSERT INTO {myisam_table} ...

Aqui o espaço em disco estava cheio, então pensamos que o problema havia terminado depois de dar um pouco mais, mas no dia seguinte, ao meio-dia, ele travou novamente:

show processlist
Waiting for table level lock | UPDATE {myisam_table} ... 

O que poderia estar causando isso?

Mecanismo padrão do Mysql: InnoDB.

O banco de dados possui uma mistura de tabelas com os mecanismos MyISAM e InnoDB.

Log publicado aqui:

http://arturito.net/2013/08/28/mysql-waiting-for-table-level-lock-errors/

Artur Kędzior
fonte
Os dois eventos podem não estar relacionados, pois você diz que teve um problema de espaço em disco ao mesmo tempo e, como esses são dois tipos diferentes de bloqueios, eles podem ter sido causados ​​por coisas não relacionadas. Uma possibilidade que poderia ter causado os dois é um backup mysqldump. Você estava executando um backup no momento?
Michael - sqlbot
Todos os backups terminam às 7:00 e nunca são executados durante o horário de trabalho. O banco de dados ficou preso na hora do almoço.
Artur Kędzior 28/08/2013
Se uma tabela MyISAM estiver bloqueada em uma sessão de banco de dados, deve haver outra sessão de banco de dados que a bloqueou. Por favor, mostre a lista de processos completa da próxima vez que isso acontecer.
RolandoMySQLDBA 28/08
@Arturito provavelmente precisamos, em SHOW FULL PROCESSLISTvez de SHOW PROCESSLISTpodermos ver a consulta inteira para cada thread ... mas como está agora, se houver MyISAMtabelas envolvidas, parece que a SELECTconsulta de longa duração em 42686 está bloqueando a UPDATEconsulta em 43506 , que está, por sua vez, bloqueando todas as SELECTconsultas que a seguem.
Michael - sqlbot

Respostas:

8

OBSERVAÇÕES INICIAIS

  • O ID do processo 42686 diz que está se preparando para executar uma consulta SELECT
  • Existem algumas conexões para dormir
  • Todos os outros processos não podem adquirir um bloqueio de tabela
  • Eu esperava que um UPDATE, DELETE ou INSERT fizesse o bloqueio. Não há como reivindicar a propriedade da tabela em questão.
  • Não pode ver a consulta completa em Process ID 42686, mas eu suspeito que envolve um JOIN, GROUP BYouORDER BY

TEORIA DO TRABALHO

Se você ficou sem espaço em disco com a lista de processos que você me forneceu, podemos culpar o mecanismo de armazenamento MyISAM. Por quê?

No seu caso particular, não é uma das suas tabelas. Se a JOIN,, GROUP BYou ORDER BYestava sendo executado e uma tabela temporária estava sendo gravada no disco (nas tabelas temporárias do disco usam o mecanismo de armazenamento MyISAM), o MySQL simplesmente congela quando está sem espaço. Como eu sei disso?

De acordo com o Guia de Estudo de Certificação do MySQL 5.0

insira a descrição da imagem aqui A Seção 29.2, boletim 11, diz:

Se você ficar sem espaço em disco ao adicionar linhas a uma tabela MyISAM, nenhum erro ocorrerá. O servidor suspende a operação até que o espaço fique disponível e, em seguida, conclui a operação.

Eu já discuti essa situação antes

Algo me diz que você tem uma dessas duas situações

  • tabelas temporárias baseadas em disco para seus SELECTs e competindo por espaço com seus dados regulares
  • Se a tabela temporária estiver chegando na /tmppartição raiz, está ficando sem espaço

SUGESTÕES

Sugestão 1: Mapear tmpdir para outro disco

[mysqld]
tmpdir = /another/disk/besides/root/partition

Sugestão # 2: Crie um disco RAM

Execute esse código para instalar um disco RAM disponível na reinicialização do Linux.

RAMDISK_SIZE=32g
service mysql stop
mkdir /var/tmpfs
echo "none   /var/tmpfs  tmpfs  defaults,size=${RAMDISK_SIZE} 1 2" >> /etc/fstab
mount -t tmpfs -o size=${RAMDISK_SIZE} none /var/tmpfs
cp -R /var/lib/mysql/* /var/tmpfs
mv /var/lib/mysql /var/lib/mysql_old
ln -s /var/tmpfs /var/lib/mysql
chown -R mysql:mysql /var/tmpfs
chown -R mysql:mysql /var/lib/mysql
service mysql start

Em seguida, mapeie tmpdir para/var/tmpfs

DE UMA CHANCE !!!

RolandoMySQLDBA
fonte
Um ótimo conselho sobre o disco RAM - grandes ganhos de velocidade, você precisa de muita memória para isso - é como criar SSD.
Up_One