Điều gì gây ra Chờ đợi cho lỗi khóa cấp bảng?


8

Chúng tôi đã treo cơ sở dữ liệu hai lần và cố gắng tìm ra nguyên nhân.

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

Ở đây, không gian đĩa đã đầy nên chúng tôi nghĩ rằng vấn đề đã kết thúc sau khi cho nó thêm một chút nhưng ngày hôm sau vào giữa trưa, nó lại bị treo:

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

Điều gì có thể gây ra nó?

Công cụ mặc định Mysql: InnoDB.

Cơ sở dữ liệu có một hỗn hợp các bảng với cả hai công cụ MyISAM và InnoDB.

Đăng nhập tại đây:

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


Hai sự kiện có thể không liên quan, vì bạn nói rằng bạn đã gặp vấn đề về không gian đĩa cùng một lúc và vì đây là hai loại khóa khác nhau mà chúng có thể đã được gây ra bởi những thứ không liên quan. Một khả năng có thể gây ra cho cả hai là một bản sao lưu mysqldump. Bạn đã chạy một bản sao lưu tại thời điểm đó?
Michael - sqlbot

Tất cả các bản sao lưu kết thúc lúc 7:00 sáng và không bao giờ chạy trong giờ làm việc. Cơ sở dữ liệu bị kẹt vào giờ ăn trưa.
Artur Kędzior

Nếu một bảng MyISAM bị khóa trong một Phiên DB, thì phải có một Phiên DB khác đã khóa nó. Vui lòng hiển thị danh sách quá trình đầy đủ vào lần tới khi điều này xảy ra.
RolandoMySQLDBA


@Arturito có lẽ chúng ta cần SHOW FULL PROCESSLISTchứ không phải SHOW PROCESSLISTvì vậy chúng ta có thể thấy toàn bộ truy vấn cho từng luồng ... nhưng vì nó hiện tại, nếu có MyISAMcác bảng liên quan, thì có vẻ như SELECTtruy vấn chạy dài trong 42686 đang chặn UPDATEtruy vấn trong 43506 , đến lượt nó, chặn mọi SELECTtruy vấn theo sau nó.
Michael - sqlbot

Câu trả lời:


8

QUAN SÁT BAN ĐẦU

  • ID tiến trình 42686 cho biết nó đang chuẩn bị thực hiện truy vấn CHỌN
  • Có một số kết nối ngủ
  • Tất cả các quy trình khác không thể có được khóa bảng
  • Tôi đã mong đợi một CẬP NHẬT, XÓA hoặc XÁC NHẬN để thực hiện khóa. Không có quyền sở hữu của bảng trong câu hỏi.
  • Không thể nhìn thấy các truy vấn đầy đủ trong quá trình ID 42.686, nhưng tôi nghi ngờ nó liên quan đến một JOIN, GROUP BYhoặcORDER BY

LÝ THUYẾT LÀM VIỆC

Nếu bạn hết dung lượng đĩa với danh sách quy trình bạn đưa cho tôi, thì chúng ta có thể đổ lỗi cho công cụ lưu trữ MyISAM. Tại sao?

Trong trường hợp cụ thể của bạn, nó không phải là một trong các bảng của bạn. Nếu a JOIN, GROUP BYhoặc ORDER BYđang được thực thi và một bảng tạm thời được ghi vào đĩa (trên các bảng tạm thời đĩa sử dụng công cụ lưu trữ MyISAM), MySQL chỉ cần đóng băng khi hết dung lượng. Làm thế nào để tôi biết điều đó?

Theo Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0

nhập mô tả hình ảnh ở đây Trang 408,409 Mục 29.2 Bulletpoint 11 nói:

Nếu bạn hết dung lượng đĩa trong khi thêm hàng vào bảng MyISAM, sẽ không xảy ra lỗi. Máy chủ tạm dừng hoạt động cho đến khi có chỗ trống, và sau đó hoàn thành thao tác.

Tôi đã thảo luận về tình huống này trước đây

Một cái gì đó cho tôi biết rằng bạn có một trong hai tình huống này

  • bảng tạm thời dựa trên đĩa cho các CHỌN của bạn và cạnh tranh không gian với dữ liệu thông thường của bạn
  • Nếu bảng tạm thời đang hạ cánh trong /tmpphân vùng gốc, thì đó là hết dung lượng

BỀN VỮNG

Gợi ý số 1: Ánh xạ tmpdir sang đĩa khác

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

Gợi ý số 2: Tạo đĩa RAM

Chạy mã này để cài đặt đĩa RAM có sẵn khi khởi động lại 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

Sau đó, ánh xạ tmpdir tới/var/tmpfs

HÃY THỬ MỘT LẦN !!!


Lời khuyên tuyệt vời về RAM Disk - tăng tốc độ tuyệt vời, bạn cần rất nhiều bộ nhớ cho điều đó - giống như làm SSD.
Up_One
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.