2012-09-15 52 views
11

Đột nhiên (không có bất kỳ thay đổi mã có liên quan), chúng tôi đang nhận lỗi khóa qua kỷ lục hoạt động như:Làm cách nào để khắc phục sự cố Lỗi thời gian chờ của MySQL với Rails?

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE `items` SET `state` = 'reserved', `updated_at` = '2012-09-15 17:58:21' WHERE `items`.`id` = 248220 

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: DELETE FROM `sessions` WHERE `sessions`.`id` = 41997883 

Chúng tôi không làm các giao dịch của chúng ta trong cả hai của các mô hình này, do đó, các giao dịch duy nhất được xây dựng trong các mô hình đường ray. Chưa có sự đột biến về lưu lượng truy cập hoặc khối lượng yêu cầu.

Các lỗi này xuất hiện khi truy vấn "mới" cố gắng chạy trên bảng bị khóa và phải đợi, làm thế nào để chúng ta thấy những gì nó đang chờ đợi? Làm cách nào để chúng tôi tìm ra phần nào của mã của chúng tôi đang phát hành các truy vấn khóa bảng trong thời gian dài?

Bất kỳ ý tưởng nào về nơi chúng tôi có thể xem hoặc cách điều tra nguyên nhân của việc này?

+0

Bạn có thể thử thực hiện phương pháp vô hiệu hóa khóa khoảng cách như vậy: innodb_locks_unsafe_for_binlog = 1, nó có thể gây ra một số bản ghi ảo. đọc thêm về nó [ở đây] (http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_locks_unsafe_for_binlog) – Yarneo

+0

Động cơ DB cơ bản là gì? Nếu INNODB của nó, bạn có thể đăng 'hiển thị trạng thái innodb' không? – ethrbunny

+0

SHOW ENGINE INNODB STATUS https://gist.github.com/3758910 – chrishomer

Trả lời

3

Hãy xem pt-deadlock-logger, trong khi không liên quan trực tiếp đến đường ray, sẽ cung cấp cho bạn một lượng đáng kể thông tin về deadlocks xảy ra.

http://www.percona.com/doc/percona-toolkit/2.1/pt-deadlock-logger.html

Có một writeup tốt đẹp với một số ví dụ: http://www.mysqlperformanceblog.com/2012/09/19/logging-deadlocks-errors/

Công cụ này rất đơn giản và hữu ích. Nó giám sát đầu ra của SHOW ENGINE INNODB STATUS và đăng nhập các deadlocks mới vào một tập tin hoặc một bảng mà chúng ta có thể xem xét sau này. Hãy xem nó hoạt động như thế nào với một ví dụ.

Bài báo tiếp tục giải thích rằng điều này có thể đăng nhập thông tin về bế tắc như các truy vấn liên quan đến, nơi tổ chức, id chủ đề vv

Tôi cũng đã tìm thấy nó hữu ích để truy vấn tiền tố với ý kiến ​​để cho phép theo dõi, chẳng hạn như tệp hoặc mô-đun, chức năng, ngay cả người dùng nào. Các bình luận truy vấn thường được chuyển xuống tất cả các cách để các công cụ chẩn đoán như thế này, và có thể giúp theo dõi các phần của mã và trong trường hợp nào gây ra deadlocks.

Các vấn đề liên quan