Nous avons déjà suspendu la base de données deux fois et essayons de trouver une cause.
show processlist
Waiting for global read lock | INSERT INTO {myisam_table} ...
Ici, l'espace disque était plein, donc nous pensions que le problème était résolu après en avoir donné un peu plus, mais le lendemain à midi, il a de nouveau pendu:
show processlist
Waiting for table level lock | UPDATE {myisam_table} ...
Qu'est-ce qui pourrait en être la cause?
Moteur par défaut de Mysql: InnoDB.
La base de données a un mélange de tables avec les moteurs MyISAM et InnoDB.
Journal affiché ici:
http://arturito.net/2013/08/28/mysql-waiting-for-table-level-lock-errors/
JOIN
, GROUP BY
, ou ORDER BY
Si vous n'avez plus d'espace disque avec la liste de processus que vous m'avez donnée, nous pouvons blâmer le moteur de stockage MyISAM. Pourquoi?
Dans votre cas particulier, ce n'est pas une de vos tables. Si un JOIN
, GROUP BY
, ou ORDER BY
était en cours d'exécution et une table temporaire était en cours d'écriture sur le disque (sur les tables temporaires du disque, utilisez le moteur de stockage MyISAM), MySQL se bloque simplement lorsqu'il manque d'espace. Comment le sais-je?
Selon ( Guide d'étude de certification MySQL 5.0
Page 408 409 La section 29.2 Bulletpoint 11 dit:
Si vous manquez d'espace disque lors de l'ajout de lignes à une table MyISAM, aucune erreur ne se produit. Le serveur suspend l'opération jusqu'à ce que de l'espace soit disponible, puis termine l'opération.
J'ai déjà discuté de cette situation
Apr 05, 2013
: échec du démarrage et de l'arrêt du serveur MySQL "Site Offline"Dec 17, 2012
: Comment résoudre MySQL "La table est pleine" erreur 1114 avec Amazon RDS?Apr 25, 2012
: Fichiers journaux très volumineuxMar 15, 2012
: Pourquoi les tables MySQL se bloquent? Comment puis-je l'empêcher?Quelque chose me dit que vous avez l'une de ces deux situations
/tmp
dans la partition racine, c'est à court d'espace[mysqld]
tmpdir = /another/disk/besides/root/partition
Exécutez ce code pour installer un disque RAM qui sera disponible au redémarrage 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
Ensuite, mappez tmpdir à /var/tmpfs