¿Qué está causando los errores de bloqueo de nivel de tabla en espera?

8

Ya colgamos la base de datos dos veces e intentamos encontrar una causa.

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

Aquí el espacio en disco estaba lleno, así que pensamos que el problema había terminado después de darle un poco más, pero al día siguiente al mediodía volvió a colgar:

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

¿Qué podría estar causándolo?

Motor predeterminado de Mysql: InnoDB.

La base de datos tiene una mezcla de tablas con los motores MyISAM e InnoDB.

Registro publicado aquí:

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

Artur Kędzior
fuente
Es posible que los dos eventos no estén relacionados, ya que usted dice que tuvo un problema de espacio en disco al mismo tiempo y que estos son dos tipos diferentes de bloqueos, podrían haber sido causados ​​por cosas no relacionadas. Una posibilidad que podría haber causado a ambos es una copia de seguridad con mysqldump. ¿Estaba ejecutando una copia de seguridad en ese momento?
Michael - sqlbot
Todas las copias de seguridad finalizan a las 7:00 a.m. y nunca se ejecutan durante las horas de trabajo. La base de datos se atascó a la hora del almuerzo.
Artur Kędzior
Si una tabla MyISAM está bloqueada en una sesión DB, tiene que haber otra sesión DB que la bloquee. Muestre la lista de procesos completa la próxima vez que esto suceda.
RolandoMySQLDBA
@Arturito probablemente necesitemos en SHOW FULL PROCESSLISTlugar de SHOW PROCESSLISTver la consulta completa para cada hilo ... pero tal como está ahora, si hay MyISAMtablas involucradas, entonces parece que la consulta de larga duración SELECTen 42686 está bloqueando la UPDATEconsulta en 43506 , que a su vez bloquea todas las SELECTconsultas que le siguen.
Michael - sqlbot

Respuestas:

8

OBSERVACIONES INICIALES

  • El ID de proceso 42686 dice que se está preparando para ejecutar una consulta SELECT
  • Hay algunas conexiones para dormir
  • Todos los demás procesos no pueden adquirir un bloqueo de tabla
  • Hubiera esperado una ACTUALIZACIÓN, BORRAR o INSERTAR para hacer el bloqueo. No se reclama la propiedad de la tabla en cuestión.
  • No se puede ver la consulta completa en el identificador de proceso 42686, pero sospecho que se trata de una JOIN, GROUP BYoORDER BY

TEORIA DE TRABAJO

Si te quedaste sin espacio en disco con la lista de procesos que me diste, entonces podemos echarle la culpa al motor de almacenamiento MyISAM. ¿Por qué?

En su caso particular, no es una de sus tablas. Si una JOIN, GROUP BYo ORDER BYse estaba ejecutando y una tabla temporal se estaba escribiendo en el disco (en el disco tablas temporales utilizan el motor de almacenamiento MyISAM) de MySQL simplemente se congela cuando está fuera del espacio. Cómo sé eso ?

De acuerdo con la Guía de estudio de certificación MySQL 5.0

ingrese la descripción de la imagen aquí Página 408,409 La sección 29.2 Punto 11 dice:

Si se queda sin espacio en disco al agregar filas a una tabla MyISAM, no se produce ningún error. El servidor suspende la operación hasta que haya espacio disponible y luego completa la operación.

He discutido esta situación antes

Algo me dice que tienes una de estas dos situaciones

  • tablas temporales basadas en disco para sus SELECT y competir por espacio con sus datos regulares
  • Si la tabla temporal está aterrizando en /tmpla partición raíz, se está quedando sin espacio

SUGERENCIAS

Sugerencia n. ° 1: asigne tmpdir a otro disco

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

Sugerencia n. ° 2: crear un disco RAM

Ejecute este código para instalar un disco RAM que estará disponible en el reinicio de 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

Luego, asigne tmpdir a/var/tmpfs

DARLE UNA OPORTUNIDAD !!!

RolandoMySQLDBA
fuente
Un gran consejo sobre RAM Disk (grandes ganancias de velocidad, necesita mucha memoria para eso) es como hacer SSD.
Up_One