Lý do nội bộ cho quá trình tiêu diệt chiếm thời gian dài trong mysql


7

Tôi đã sao chép cấu trúc của một bảng lớn với (đó là bảng InnoDB btw)

CREATE TABLE tempTbl LIKE realTbl 

Sau đó, tôi đã thay đổi một chỉ mục và điền vào nó để tôi có thể chạy thử nghiệm. Điền vào nó đã được thực hiện bằng cách sử dụng:

INSERT INTO  `tmpTbl` 
SELECT *
FROM `realTbl`

Việc này mất quá nhiều thời gian, vì vậy tôi muốn dừng bài kiểm tra này. 1

Tôi đã giết quá trình trong khi nó ở trạng thái "Gửi dữ liệu": hiện tại nó đã bị "giết" và vẫn ở trạng thái "Gửi dữ liệu".

Tôi biết một số quy trình bị giết cần hoàn nguyên các thay đổi và do đó có thể mất nhiều thời gian để giết so với thời gian chúng chạy, nhưng tôi không thể tưởng tượng được tại sao bây giờ lại xảy ra trường hợp này: Toàn bộ bảng cần phải được dọn sạch.

Tôi tò mò về những gì đang xảy ra sẽ dừng / giết một truy vấn đơn giản như thế này rất lâu. Để cung cấp cho bạn một số số: phần chèn đã chạy trong một hoặc 3 giờ, giờ đây, phần sát đã gần với 5 7. Có vẻ như nó chạy một cái DELETEcho mọi thứ INSERTnó đã làm, và việc xóa mất nhiều thời gian hơn thì chèn đã làm gì? Điều đó thậm chí sẽ hợp lý?

.


1) Tôi chưa biết tại sao (đó là một bảng lớn, 10 triệu hàng, nhưng sẽ mất nhiều thời gian như vậy?), Nhưng đó là một điều khác / không phải là một phần của câu hỏi này :). Có thể là bài kiểm tra của tôi có thể thông minh hơn hoặc nhanh hơn, nhưng đó không phải là câu hỏi bây giờ: D


1
Cơ hội của tôi tìm kiếm câu trả lời cho cùng một câu hỏi là gì! : o
Graham

Câu trả lời:


11

Lý do giết mất quá lâu rất có thể là do các rollback được phát hành bởi giao dịch innodb. Từ mẹo hiệu suất của InnoDB :

Cảnh giác với các rollback lớn của các khối chèn: InnoDB sử dụng bộ đệm chèn để lưu I / O của đĩa trong các chèn, nhưng không có cơ chế nào như vậy được sử dụng trong một rollback tương ứng. Một rollback giới hạn đĩa có thể mất 30 lần để thực hiện như chèn tương ứng. Giết quá trình cơ sở dữ liệu không giúp ích gì vì việc khôi phục bắt đầu lại khi khởi động máy chủ.

Chỉnh sửa: Các phương pháp phục hồi lực innodb có thể được sử dụng cho bạn (rất vui vì bạn đã làm điều này trên môi trường thử nghiệm)

Bạn có thể giết tiến trình mysqld và đặt innodb_force_recovery thành 3 để đưa cơ sở dữ liệu lên mà không cần rollback, sau đó DROP bảng đang gây ra rollback runaway.

Và lần sau, chèn một tập hợp con dữ liệu nhỏ mỗi lần. 10 triệu hàng không nên mất nhiều thời gian để chèn, nhưng có thể có nhiều lý do. Không biết môi trường của bạn, tôi không thể đưa ra lời khuyên về điều đó.


Tóm lại: Tôi là fscked ... Tôi có vui vì đây là môi trường thử nghiệm không ...
Nanne

@nanne đã thêm một chút về cách buộc phục hồi. Vui mừng trên môi trường thử nghiệm!
Derek Downey

Tôi chỉ tìm thấy trích dẫn đó, tôi sẽ thử nó. @ nội dung: bạn đã đúng: thậm chí tôi không nghĩ rằng nó có thể mất nhiều thời gian như vậy, vì vậy không bao giờ xem xét bất kỳ giải pháp thay thế nào :)
Nanne

@Nanne ra khỏi đầu tôi, tôi muốn nói rằng bạn innodb_buffer_pool_sizequá thấp. Xem phần 'Đĩa I / O' của tài liệu mẹo hiệu suất để biết các tùy chọn khác.
Derek Downey

Tôi sẽ kiểm tra xem, cảm ơn. Dù sao, việc tiêu diệt và phục hồi lực lượng dường như đã có hiệu quả, nhưng tôi không thể dừng quá trình này. Cuối cùng tôi chỉ làm một kill -9việc phải làm với nó.
Nanne

2

Tôi có thể thấy một hoạt động lộn xộn trong này. TmpTbl là InnoDB. Tải dữ liệu mới vào nó sẽ tạo ra một số hoạt động MVCC . Điều này sẽ chồng các thay đổi trong nhật ký làm lại (được đặt trong ib_logfile0 và ib_logfile1, có lẽ một số cũng sẽ có trong ibdata1).

Khi bạn giết INSERT, tất cả các thay đổi (đối với mỗi hàng, một bản ghi mới thay cho bản ghi) đối với bảng InnoDB phải được khôi phục.

Bạn có thể có thể giết mysqld và khởi động lại mysqld chỉ để gặp một số điều này trong giai đoạn phục hồi sự cố khi khởi động mysql.


Tôi nghĩ rằng tôi hiểu nó, nhưng ý nghĩa của câu cuối cùng đó là gì? Rằng nếu tôi giết thứ đó, giai đoạn phục hồi có thể bắt đầu lại 'rollback'? Điều đó sẽ không tốt. Bây giờ tôi chỉ để cho nó chạy, nhưng giờ đã đến 7 giờ, điều này thật vô lý. Bạn có thể tư vấn ủng hộ hoặc chống lại việc giết mysqld?
Nanne

Vâng, bạn đã nhận được điểm. NHƯ đến câu cuối cùng, @DTest giải thích thêm một chút.
RolandoMySQLDBA
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.