Đây là một trong những chủ đề gây tranh cãi nhất mà tôi từng xử lý trong nhiều năm qua với tư cách là một DBA của MySQL và trong DBA StackExchange.
Nói một cách nhẹ nhàng, đơn giản là không có cách nào khác để thu nhỏ ibdata1 . Với innodb_file_per_table bị vô hiệu hóa, mỗi khi bạn chạy OPTIMIZE TABLE
trên bảng InnoDB, ibdata1 sẽ phát triển nhanh chóng. Dữ liệu được loại bỏ bằng cách sử dụng DROP TABLE
và DROP DATABASE
không thể được khôi phục vì chúng là DDL, không phải DML. Tôi tin rằng Oracle và MSSQL có thể phục hồi DDL. MySQL không thể làm điều đó.
Có một số loại thông tin cư trú trong ibdata1
- Bảng dữ liệu
- Bảng chỉ mục
- Bảng MetaData
- Dữ liệu điều khiển MVCC
- Double Write Buffer (Viết nền để ngăn chặn sự phụ thuộc vào bộ đệm của hệ điều hành)
- Chèn bộ đệm (Quản lý các thay đổi đối với các chỉ mục phụ không duy nhất)
Sử dụng innodb_file_per_table=1
sẽ cho phép bạn tạo các bảng mới với dữ liệu bảng và chỉ mục bảng được tạo bên ngoài ibdata1. Bạn có thể trích xuất bất kỳ bảng nào vẫn còn bên trong ibdata1 bằng cách sử dụng ALTER TABLE ... ENGINE=InnoDB;
hoặc OPTIMIZE TABLE
nhưng điều đó sẽ để lại khoảng trống không sử dụng lớn đó trong ibdata1.
Mặc dù vậy, bạn phải dọn sạch cơ sở hạ tầng InnoDB. Tôi đã viết bài đăng StackExchange về cách và lý do để làm điều này:
Tin tốt
Bạn chỉ phải đổ dữ liệu, tải lại một lần nữa và không bao giờ xem lại vấn đề này nữa . Chạy OPTIMIZE TABLE
sau đó sẽ thực sự thu nhỏ .ibd
tệp vùng bảng cho bất kỳ bảng InnoDB nào.