Làm thế nào để bạn xác định tham nhũng bảng InnoDB?


24

Tôi có một số bảng được phân vùng và có một số chỉ mục trên một nô lệ được nhân rộng. Sau khi sao chép snap snap (đã được xác minh an toàn) sang một nô lệ mới và nâng cấp mysqld từ 5.1.42 lên 5.5.15 và khởi động lại sao chép, tôi gặp sự cố InnoDB với thông báo lỗi "Con trỏ không hợp lệ ..."

Những lỗi này đã xảy ra trên 2 máy chủ với phần cứng và O / S khác nhau. Sau khi chạy:

ALTER TABLE .... COALESCE PARTION n;

vấn đề biến mất cho cái bàn đó

Tuy nhiên, câu hỏi của tôi lớn hơn về phạm vi và đó là "Làm thế nào để bạn xác định tham nhũng bảng InnoDB?" hoặc đọc lại "Làm thế nào để bạn đánh giá sức khỏe của bảng InnoDB?" Là "kiểm tra bảng" công cụ duy nhất có sẵn để xác định các vấn đề trước khi vụ tai nạn?

Không chắc có vấn đề gì không, nhưng các sự cố đã xảy ra khi chạy: Phiên bản: socket 5.5.15-55-log ':' /opt/mysql.sock ': 3306 Percona Server (GPL), Phiên bản rel21.0, Phiên bản 158


2
Chào Randy! Tôi nghĩ rằng các câu trả lời ở đây là đáng tin cậy - InnoDB đã xác định tham nhũng của chính mình. Có lẽ bạn nên viết lại câu hỏi của mình, tại sao những gì bạn làm sẽ khiến InnoDB bị hỏng?
Morgan Tocker

Câu trả lời:


18

Morgan đưa ra một gợi ý trong nhận xét của mình rằng InnoDB liên tục kiểm tra các trang bị hỏng bằng cách thực hiện kiểm tra trên các trang mà nó đọc. Nếu InnoDB tìm thấy sự không phù hợp với tổng kiểm tra, nó sẽ sập dừng máy chủ.

Nếu bạn muốn tăng tốc quá trình đó (thay vì đợi InnoDB đọc trang bị hỏng), bạn có thể sử dụng innochecksum:

Vì tổng kiểm tra không khớp sẽ khiến InnoDB cố tình tắt máy chủ đang chạy, nên sử dụng công cụ này tốt hơn là chờ máy chủ sử dụng sản xuất gặp phải các trang bị hỏng.

Một cảnh báo thú vị:

innochecksum không thể được sử dụng trên các tệp không gian bảng mà máy chủ đã mở. Đối với các tệp như vậy, bạn nên sử dụng CHECK TABLE để kiểm tra các bảng trong không gian bảng.

Vì vậy, có, đối với một bảng trực tuyến CHECK TABLEcó lẽ là công cụ (hoặc như được chỉ ra trong một câu trả lời khác mysqlcheck nếu bạn muốn làm nhiều hơn một cơ sở dữ liệu tại một thời điểm.)

Nếu bạn có thể tắt cơ sở dữ liệu của mình, bạn có thể buộc nó kiểm tra bằng cách sử dụng innochecksum

Giai thoại: Trên không gian bảng innodb 29GB (có innodb_file_per_table=1), tập lệnh này mất khoảng 2 phút

#!/bin/bash
for i in $(ls /var/lib/mysql/*/*.ibd)
do
  innochecksum -v $i
done

Tuy nhiên, như một phần thưởng, vì bạn đang chạy Percona, họ đã triển khai một phương pháp mới để kiểm tra tổng thể innodb nhanh . Tôi chưa bao giờ sử dụng nó, nhưng nó có thể tăng tốc quá trình.


1
Gonna hãy thử ở đây, dường như là giải pháp @randymelder đang tìm kiếm +1
marcio

2
Máy chủ Percona có một số tính năng tốt đẹp khác. Xem innodb_corrupt_table_action percona.com/doc/percona-server/5.5/relabilities/ (())
Morgan Tocker

@DTest: innochecksum là con đường để đi. Đây là một người giữ. +1 !!!
RolandoMySQLDBA

@DTest: Hôm nay hãy ngả mũ với bạn về điều này !!!!
RolandoMySQLDBA

@MorganTocker Thú vị. Sẽ phải có được khoảng trống kiến ​​thức của tôi và thực hiện một số nghiên cứu về percona
Derek Downey

6

CẢNH BÁO: trước khi thử bất kỳ hướng dẫn nào trong số này, chúng tôi đặc biệt khuyến nghị xác minh rằng có một bản sao lưu cơ sở dữ liệu của bạn trong tay, chỉ trong trường hợp. (cảm ơn @Nick đã cảnh báo)

Cố gắng sử dụng mysqlchecklệnh. Trên thiết bị đầu cuối:

mysqlcheck -u username -p --databases database1 database2

Lệnh này sẽ đưa ra một danh sách tất cả các bảng và một trạng thái cho bạn biết nếu có một loại tham nhũng nào đó:

table1  OK
table2  OK
table3  OK
tableN  OK

Với điều đó trong tay bạn sẽ biết bạn phải sửa những cái bàn nào. Chỉ trong trường hợp bạn muốn sửa chữa mọi thứ cùng một lúc:

mysqlcheck -u username -p --auto-repair --databases database1 database2 

Tìm hiểu thêm về mysqlcheck: http://dev.mysql.com/doc/refman/5.0/en/mysqlcheck.html

Lưu ý: bạn đã gắn thẻ câu hỏi của bạn với . Tôi không có manh mối về những gì đã được như vậy nên tôi đã googled. Nó dường như là một nhánh của MySQL, nhưng tôi không có lý do gì để tin rằng các lệnh không tương thích (ngón tay đan chéo).


Ai đó đã chỉ cho tôi hướng dẫn này có hướng dẫn cụ thể hơn về phục hồi cơ sở dữ liệu InnoDB cho các tình huống quan trọng hơn khi toàn bộ cơ sở dữ liệu không bắt đầu: http://www.softwareprojects.com/resource/programming/t-how-to-fix-mysql -database-myisam-innodb-1634.html


1
mysqlcheck là từ đồng nghĩa với 'bảng kiểm tra ...' -1
Randomx


Không đúng. Đầu tiên, mysqlcheck là một tiện ích dòng lệnh và CHECK TABLE là một câu lệnh SQL (nó muốn so sánh màu cam với lemmons). Ngoài ra, bạn KHÔNG THỂ kiểm tra toàn bộ cơ sở dữ liệu bằng CHECK TABLE mà không bao gồm TẤT CẢ các tên bảng trong câu lệnh SQL ( nó cũng sẽ không hiệu quả lắm)
marcio

Và mysqlcheck có một tùy chọn để - sửa chữa các bảng bị hỏng trong khi CHECK TABLE chỉ kiểm tra xem các bảng có bị hỏng hay không, nhưng không thể sửa chữa.
marcio

2
@randymelder - Bạn đã sai khi nói mysqlcheck là từ đồng nghĩa với CHECK TABLE. Các tài liệu bạn có liên quan đến trạng thái: " mysqlchecksử dụng câu lệnh SQL CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, và OPTIMIZE TABLEtrong một cách thuận tiện cho người sử dụng Nó xác định các câu lệnh để sử dụng cho các hoạt động bạn muốn thực hiện, và sau đó gửi báo cáo đến máy chủ để được thực thi.. " Đó không phải là một từ đồng nghĩa; đó là một giao diện người dùng cho một tập hợp các câu lệnh.
Nick Chammas

6

Theo Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0, Trang 443,444 Mục 30.4 :

Bạn có thể kiểm tra các bảng InnoDB bằng cách sử dụng lệnh CHECK TABLE hoặc sử dụng chương trình máy khách để đưa ra câu lệnh cho bạn. Tuy nhiên, nếu bảng InnoDB có vấn đề, bạn không thể khắc phục bằng cách sử dụng REPAIR TABLE vì câu lệnh đó chỉ áp dụng cho MyISAM.

Nếu kiểm tra bảng chỉ ra rằng bảng InnoDB có vấn đề, bạn sẽ có thể khôi phục bảng về trạng thái nhất quán bằng cách loại bỏ nó bằng mysqldump, thả nó và tạo lại nó từ kết xuất đó.

Trong trường hợp máy chủ MySQL bị sập hoặc trên máy chủ mà nó chạy, một số bảng InnoDB có thể cần sửa chữa. Thông thường, nó chỉ đơn giản là khởi động lại máy chủ vì công cụ lưu trữ InnoDB thực hiện tự động phục hồi như là một phần của chuỗi khởi động. Trong một số trường hợp hiếm hoi, máy chủ có thể không khởi động được do lỗi tự động khôi phục của InnoDB. Nếu điều đó xảy ra, sử dụng quy trình sau:

  • Khởi động lại máy chủ với tùy chọn --innodb_force_recovery được đặt thành giá trị trong cơn thịnh nộ từ 1 đến 6. Các giá trị này cho thấy mức độ thận trọng ngày càng tăng trong việc tránh sự cố và tăng mức độ chịu đựng cho sự không nhất quán có thể xảy ra trong các bảng được phục hồi. Một giá trị tốt để bắt đầu là 4.

  • Khi bạn khởi động máy chủ với --innodb_force_recovery được đặt thành giá trị khác không, InnoDB coi không gian bảng là chỉ đọc. Do đó, bạn nên kết xuất các bảng InnoDB bằng mysqldump và sau đó thả chúng trong khi tùy chọn có hiệu lực. Sau đó khởi động lại máy chủ mà không có tùy chọn --innodb_force_recovery. Khi máy chủ xuất hiện, khôi phục các bảng InnoDB từ các tệp kết xuất.

  • Nếu các bước trước không thành công, cần phải khôi phục các bảng InnoDB từ bản sao lưu trước.

Vui lòng đọc Tài liệu MySQL trên Phục hồi cưỡng bức InnoDB  


3
FWIW, hướng dẫn chứng nhận có câu trả lời rất chính xác :) Nếu bạn KIỂM TRA BẢNG trên bảng InnoDB và nó thực sự bị hỏng, nó sẽ không bao giờ trở lại là "hỏng", nó sẽ sập máy chủ. Tuyên bố gần như đã lỗi thời trong InnoDB, bởi vì mỗi khi bạn đọc các trang InnoDB, nó đang kiểm tra tham nhũng (thông qua tổng kiểm tra trang).
Morgan Tocker

2

Tôi tự hỏi điều gì xảy ra nếu bất cứ ai sử dụng dữ liệu InnoDB được tạo thông qua Plugin InnoDB và sau đó chuyển sang phiên bản khác của InnoDB. Điều đó có thể tạo ra tham nhũng trang có thể trong mắt của mysqld.

Lưu ý Tài liệu MySQL trên Định dạng tệp InnoDB nói gì về khả năng này:

Nói chung, phiên bản mới hơn của InnoDB có thể tạo bảng hoặc chỉ mục không thể đọc hoặc ghi một cách an toàn với phiên bản trước của InnoDB mà không có nguy cơ gặp sự cố, treo, kết quả sai hoặc hỏng. Plugin InnoDB giới thiệu một cơ chế mới để bảo vệ chống lại các điều kiện này và để giúp duy trì khả năng tương thích giữa các tệp cơ sở dữ liệu và các phiên bản của InnoDB.

Tôi sẽ loại bỏ dữ liệu về nô lệ. Trong thực tế, tôi sẽ chỉ sử dụng sức mạnh vũ phu bằng cách lấy một bãi chứa logic (mysqldump) của dữ liệu:

  • Bỏ tất cả các cơ sở dữ liệu bằng InnoDB trên nô lệ
  • Tắt máy mysql trên nô lệ
  • Xóa ibdata1, ib_logfile0 và ib_logfile1 trên nô lệ
  • Bắt đầu mysql trên nô lệ, để ibdata1, ib_logfile0 và ib_logfile1 được tạo lại
  • mysqldump dữ liệu từ chủ vào nô lệ

Anwser ban đầu của tôi được đăng được coi là 'trường học cũ'. Tuy nhiên, trong trường hợp này, tôi chắc chắn sẽ xem xét các định dạng tệp đang được sử dụng bởi .ibd và / hoặc ibdata1.

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.