Che cosa sta causando In attesa di errori di blocco a livello di tabella?


8

Abbiamo già sospeso il database due volte e stiamo cercando di trovare una causa.

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

Qui lo spazio su disco era pieno, quindi abbiamo pensato che il problema fosse finito dopo averlo dato un po 'di più, ma il giorno dopo a mezzogiorno si è bloccato di nuovo:

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

Cosa potrebbe causarlo?

Motore predefinito Mysql: InnoDB.

Il database ha una combinazione di tabelle con entrambi i motori MyISAM e InnoDB.

Registro pubblicato qui:

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


I due eventi potrebbero non essere correlati, poiché si dice che si è verificato un problema di spazio su disco contemporaneamente e poiché si tratta di due diversi tipi di blocchi, potrebbero essere stati causati da cose non correlate. Una possibilità che avrebbe potuto causare entrambi è un backup con mysqldump. Stavi eseguendo un backup in quel momento?
Michael - sqlbot,

Tutti i backup terminano alle 7:00 del mattino e non vengono mai eseguiti durante l'orario di lavoro. Il database si è bloccato a pranzo.
Artur Kędzior,

Se una tabella MyISAM è bloccata in una sessione DB, deve esserci un'altra sessione DB che l'ha bloccata. Si prega di mostrare l'elenco completo dei processi la prossima volta che ciò accade.
RolandoMySQLDBA,


@Arturito probabilmente abbiamo bisogno SHOW FULL PROCESSLISTpiuttosto che SHOW PROCESSLISTcosì possiamo vedere l'intera query per ogni thread ... ma così com'è ora, se ci sono MyISAMtabelle coinvolte, allora sembra che la SELECTquery di lunga durata in 42686 stia bloccando la UPDATEquery in 43506 , che a sua volta blocca ogni SELECTquery che la segue.
Michael - sqlbot,

Risposte:


8

OSSERVAZIONI INIZIALI

  • ID processo 42686 dice che si sta preparando per eseguire una query SELECT
  • Ci sono alcune connessioni dormienti
  • Tutti gli altri processi non possono acquisire un blocco tabella
  • Mi sarei aspettato un UPDATE, DELETE o INSERT per eseguire il blocco. Non è possibile rivendicare la proprietà della tabella in questione.
  • Non riesco a vedere l'intera query in Process ID 42686, ma ho il sospetto che comporta una JOIN, GROUP BYoORDER BY

TEORIA DI LAVORO

Se hai esaurito lo spazio su disco con l'elenco dei processi che mi hai fornito, allora possiamo dare la colpa al motore di archiviazione MyISAM. Perché?

Nel tuo caso particolare, non è uno dei tuoi tavoli. Se un JOIN, GROUP BYo ORDER BYera in fase di esecuzione e una tabella temporanea veniva scritto su disco (sul disco tabelle temporanee utilizzano il motore di memorizzazione MyISAM) MySQL congela semplicemente quando lo spazio. Come lo so?

Secondo la guida allo studio di certificazione MySQL 5.0

inserisci qui la descrizione dell'immagine Pagina 408.409 Sezione 29.2 Il punto 11 indica:

Se si esaurisce lo spazio su disco durante l'aggiunta di righe a una tabella MyISAM, non si verifica alcun errore. Il server sospende l'operazione fino a quando non diventa disponibile spazio, quindi completa l'operazione.

Ho discusso di questa situazione prima

Qualcosa mi dice che hai una di queste due situazioni

  • tabelle temporanee basate su disco per i tuoi SELECT e in competizione per lo spazio con i tuoi dati regolari
  • Se la tabella temporanea sta atterrando nella /tmppartizione root, questo sta esaurendo lo spazio

SUGGERIMENTI

Suggerimento n. 1: mappare tmpdir su un altro disco

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

Suggerimento n. 2: creare un disco RAM

Esegui questo codice per installare un disco RAM che sarà disponibile al riavvio di 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

Quindi, mappare tmpdir su/var/tmpfs

PROVACI !!!


Ottimi consigli su RAM Disk - grandi guadagni di velocità, hai bisogno di molta memoria per questo - è come creare SSD.
Up_One
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.