Tại sao tất cả các bảng MySQL InnoDB bị phân mảnh?


10

Vì một số lý do, tất cả các bảng InnoDB trong máy chủ MySQL của tôi đang được liệt kê dưới dạng phân mảnh khi tôi chạy mysqltuner. Tôi chỉ cài đặt máy chủ vài giờ trước (trên OSX Lion) và nó có một loạt dữ liệu mới được nhập từ các tệp bó trong đó.

Tôi đã thử chuyển đổi tất cả các bảng trong một cơ sở dữ liệu sang MYISAM và chắc chắn số lượng các bảng bị phân mảnh đã giảm. Thật kỳ lạ, ngay sau khi tôi chuyển đổi các bảng đó trở lại InnoDB, số lượng bảng bị phân mảnh lại tăng trở lại. Điều này trái với nghiên cứu của tôi cho đến nay cho thấy rằng việc chạy ALTER TABLE table_name ENGINE=INNODB;nên khắc phục sự phân mảnh.

Sau một chút googling tôi chạy:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

Mà được cho là liệt kê tất cả các bảng bị phân mảnh (nó thực sự trả về cùng số lượng kết quả như đầu ra mysqltuner cho số lượng bảng bị phân mảnh). Mỗi mục nhập có chính xác cùng một số trong data_free_MBcột (hiện tại là 7.00000000).

Đây thực sự là một vấn đề thực sự hay một cái gì đó mysqltuner đang làm sai? Nếu nó là một vấn đề, làm thế nào để tôi sửa chữa nó?

BIÊN TẬP

Tôi càng ngày càng nghi ngờ rằng tôi là một thằng ngốc và phân mảnh 7 MB là cho toàn bộ tệp, không phải cho mỗi bảng. Bất cứ ai có thể xác nhận nếu đó là trường hợp?


Bạn có thực sự nghĩ rằng 7 MB miễn phí là một vấn đề?
David Schwartz

@DavidSchwartz Không phải là đầu mối, đó là lý do tại sao tôi hỏi;) Có 2314 bảng, mỗi bảng có 7 MB miễn phí và tôi không biết điều đó có nghĩa là gì. Tôi không chắc tại sao mysqltuner sẽ chỉ cho tôi con số đó nếu đó không phải là nguyên nhân tiềm ẩn gây lo ngại. Tôi đã hy vọng ai đó ở đây có thể cho tôi biết mức độ quan tâm của việc đưa ra các con số và tôi có thể làm gì để giảm thiểu vấn đề vì các phương pháp 'tiêu chuẩn' không hoạt động
Clive

Di chuyển câu hỏi này theo yêu cầu của người dùng trong một cờ.
Daniel Beck

Hầu hết các chi tiết mà mysqltuner hiển thị chỉ dành cho thông tin. Không phải tất cả mọi thứ là một vấn đề. Nếu nó là một vấn đề nó sẽ nói rõ ràng như vậy. Điều này được chỉ định là một vấn đề?
John Gardeniers

@JohnGardeniers Tôi tin là như vậy, thông điệp là : [!!] Total fragmented tables: 2314, mà tôi khá chắc chắn chỉ ra một vấn đề (với dấu chấm than màu đỏ kép)
Clive

Câu trả lời:


5

Theo nhận xét của tôi ở trên, không phải tất cả đầu ra từ sqltuner đều chỉ ra lỗi. Trừ khi tập lệnh nói rất rõ rằng đó là một vấn đề, thường là ở dòng tiếp theo, theo sau là các đề xuất để khắc phục, thì đó chỉ là một mục thông tin.


3

Khi bạn bật innodb_file_per_table , tất cả những gì bạn đã làm là thiết lập một giao thức để làm cho bất kỳ bảng InnoDB mới nào được tạo trong một .ibdtệp bên ngoài . Tất cả các bảng InnoDB mà bạn đã tạo trước đó vẫn được nhúng trong ibdata1.

Với innodb_file_per_table bị tắt, bất cứ khi nào bạn chạy

ALTER TABLE table_name ENGINE=INNODB;

tất cả những gì nó làm là nối các trang dữ liệu và chỉ mục của bảng vào ibdata1. Điều này sẽ làm cho bảng tồn tại trong các trang liền kề và loại bỏ phân mảnh, Nhược điểm là ibdata1 phát triển nhanh chóng.

SỰ GIỚI THIỆU

Bạn sẽ cần xuất tất cả dữ liệu, xóa ibdata1, ib_logfile0, ib_logfile1 và tải lại.

Tôi đã viết lên làm thế nào và tại sao để làm điều này

CẬP NHẬT 2012-08-15 12:05 EDT

Bạn có thể muốn xem xét chính tập lệnh mysqltuner.pl. IMHO Tôi nghĩ rằng nó đang sử dụng một công thức cũ để đo sự phân mảnh. Hãy chắc chắn rằng bạn có phiên bản mới nhất của mysqltuner.

Để đo sự phân mảnh của các bảng InnoDB được lưu trữ bên ngoài, tôi đã viết một bài về đó vào ngày 11 tháng 4 năm 2012 (Xem Cập nhật ở phía dưới cho ngày 19 tháng 4 năm 2012)


1
Ahhh ok, bây giờ mọi thứ có ý nghĩa hơn nhiều, cảm ơn. Tôi đã kết thúc việc xuất dữ liệu, xóa hoàn toàn MySQL, sau đó cài đặt lại (nhưng thêm innodb_file_per_tablevào tệp conf trước khi khởi động máy chủ và nhập lại). Trước đó, tôi đã nhận được tất cả các loại lỗi InnoDB (các loại thực sự xấu ... có nghĩa là tôi phải chạy với innodb_force_recoverycấp 6 chỉ để lấy dữ liệu ra!) Và tất cả các loại 'ngày của tệp nhật ký đã ở trong tương lai!' lỗi. Những thứ đó dường như đã dừng lại nhưng tôi vẫn còn một vài bảng phân mảnh. Tôi sẽ để mắt đến nó, cảm ơn lần nữa vì đầu vào
Clive

tuyệt vời! Đây là rất nhiều thông tin. Cảm ơn @RolandoMySQLDBA!
Sudhi
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.