Apa yang menyebabkan Menunggu kesalahan kunci level tabel?

8

Kami mendapat database yang sudah dua kali menggantung dan mencoba mencari penyebabnya.

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

Di sini ruang disk penuh sehingga kami pikir masalahnya sudah selesai setelah memberikannya lagi tetapi hari berikutnya pada tengah hari itu digantung lagi:

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

Apa yang menyebabkannya?

Mesin Standar Mysql: InnoDB.

Database memiliki campuran tabel dengan mesin MyISAM dan InnoDB.

Log diposting di sini:

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

Artur Kędzior
sumber
Kedua peristiwa itu mungkin tidak terkait, karena Anda mengatakan Anda memiliki masalah ruang disk pada satu waktu dan karena ini adalah dua jenis kunci yang berbeda, mereka mungkin disebabkan oleh hal-hal yang tidak terkait. Salah satu kemungkinan yang bisa menyebabkan keduanya adalah cadangan mysqldump. Apakah Anda menjalankan cadangan pada saat itu?
Michael - sqlbot
Semua cadangan selesai pada jam 7:00 pagi dan tidak pernah berjalan selama jam kerja. Database macet saat makan siang.
Artur Kędzior
Jika tabel MyISAM dikunci dalam satu Sesi DB, harus ada Sesi DB lain yang menguncinya. Tolong tunjukkan daftar proses yang lengkap saat ini terjadi.
RolandoMySQLDBA
@ Arturito kita mungkin perlu SHOW FULL PROCESSLISTdaripada SHOW PROCESSLISTagar kita dapat melihat seluruh kueri untuk setiap utas ... tapi seperti yang ada sekarang, jika ada MyISAMtabel yang terlibat, maka sepertinya SELECTkueri yang berjalan lama di 42686 memblokir UPDATEkueri di 43506 , yang pada gilirannya, memblokir setiap SELECTpermintaan yang mengikutinya.
Michael - sqlbot

Jawaban:

8

PENGAMATAN AWAL

  • ID Proses 42686 mengatakan sedang bersiap untuk menjalankan kueri SELECT
  • Ada beberapa koneksi tidur
  • Semua proses lain tidak dapat memperoleh kunci tabel
  • Saya mengharapkan UPDATE, DELETE, atau INSERT untuk melakukan kunci. Tidak ada yang mengklaim kepemilikan tabel tersebut.
  • Tidak dapat melihat permintaan penuh dalam Proses ID 42.686, tapi aku curiga itu melibatkan JOIN, GROUP BYatauORDER BY

TEORI KERJA

Jika Anda kehabisan ruang disk dengan daftar proses yang Anda berikan kepada saya, maka kita dapat menyalahkan mesin penyimpanan MyISAM. Mengapa?

Dalam kasus khusus Anda, itu bukan salah satu dari tabel Anda. Jika a JOIN,, GROUP BYatau ORDER BYsedang dieksekusi dan tabel temp sedang ditulis ke disk (pada tabel temp disk menggunakan mesin penyimpanan MyISAM) MySQL cukup membeku ketika kehabisan ruang. Bagaimana saya tahu itu?

Menurut Panduan Studi Sertifikasi MySQL 5.0

masukkan deskripsi gambar di sini Halaman 408.409 Bagian 29.2 Bulletpoint 11 mengatakan:

Jika Anda kehabisan ruang disk saat menambahkan baris ke tabel MyISAM, tidak ada kesalahan terjadi. Server menunda operasi sampai ruang tersedia, dan kemudian menyelesaikan operasi.

Saya telah membahas situasi ini sebelumnya

Sesuatu mengatakan kepada saya bahwa Anda memiliki salah satu dari dua situasi ini

  • tabel temp berbasis disk untuk SELECT Anda dan bersaing untuk ruang dengan data reguler Anda
  • Jika tabel temp masuk /tmpdi partisi root, itu kehabisan ruang

SARAN

Saran # 1: Map tmpdir ke disk lain

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

Saran # 2: Buat Disk RAM

Jalankan kode ini untuk menginstal disk RAM yang akan tersedia di Linux reboot.

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

Lalu, petakan tmpdir ke/var/tmpfs

COBALAH !!!

RolandoMySQLDBA
sumber
Saran hebat untuk RAM Disk - peningkatan kecepatan hebat, Anda membutuhkan banyak memori untuk itu - seperti membuat SSD.
Up_One