Bạn phải đi với innodb_file_per_table và bạn cần thực hiện một số cách làm sạch với cơ sở hạ tầng hiện tại của InnoDB.
Tôi đã thấy nhiều máy khách lưu trữ DB thiết lập MySQL và để InnoDB ở trạng thái mặc định. Điều này làm cho không gian bảng hệ thống (được gọi là ibdata1) phát triển mạnh mẽ.
Ngay cả khi bạn đã chuyển sang innodb_file_per_table, tệp .ibd sẽ phải được trích xuất từ ibdata1 và ibdata sẽ không bao giờ co lại. Ví dụ: nếu bạn có một bảng có tên mydb.mytable nằm trong ibdata1 chiếm 2GB, để giải nén nó, bạn phải làm như sau:
BƯỚC 01) Thêm cái này vào /etc/my.cnf
[mysqld]
innodb_file_per_table
BƯỚC 02) service mysql restart
BƯỚC 03) ALTER TABLE mydb.mytable ENGINE=InnoDB;
Điều đó sẽ làm cho tập tin /var/lib/mysql/mydb/mytable.ibd
Thật không may, 2GB dung lượng đã bị chiếm chỗ bởi bảng trước khi thay đổi không thể lấy lại được. Tôi đã viết các bài đăng trước đây về cách thức và lý do để dọn dẹp cơ sở hạ tầng của InnoDB:
Khi bạn thực hiện thay đổi lớn này, đừng quên tăng innodb_open_files (mặc định 300) . Nếu không, truy cập đĩa rất hạn chế.
Liên quan đến tham gia, hãy đảm bảo bạn có các chỉ mục phù hợp hỗ trợ các tiêu chí tham gia.
CẬP NHẬT 2012-04 / 02 11:30 EDT
Sử dụng innodb_file_per_table trong một bản cài đặt mới khiến ibdata1 phát triển rất chậm vì tất cả DDL được thực hiện bên ngoài ibdata. Bạn có thể thu nhỏ bất kỳ bảng InnoDB nào như tôi đã đề cập trước đây như sau:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
CẬP NHẬT 2012-04 / 02 16:50 EDT
Khi nói đến các bản sao lưu, hãy cực kỳ cẩn thận tạo các bản sao của các tệp .ibd. Tại sao?
Bên trong mỗi tệp .ibd là giá trị đặc biệt được gọi là framespace_id. Có một danh sách các giá trị framespace_id trong ibdata1. Nếu bạn từng thực hiện bảo trì bảng yêu cầu bỏ và tạo lại bảng, thì không gian bảng sẽ trở nên khác biệt. Tạo một bản sao của tệp .ibd như vậy chỉ có thể được tích hợp lại vào cơ sở dữ liệu để sử dụng nếu bạn cũng tạo một bản sao của ibdata1. Điều đó gây nguy hiểm cho không gian bảng_id của tất cả các bảng InnoDB khác. Theo cách này, tốt hơn là bạn nên thực hiện sao lưu mysqldump vì mysqldumps là bản sao logic của dữ liệu. Nói cách khác, bản sao lưu độc lập với thời điểm của ibdata1 và bạn có thể tự do tải lại mà không gặp vấn đề về khả năng hoạt động.