Câu trả lời:
Chỉ từ những từ trong câu hỏi của bạn, tôi nghi ngờ như sau: Rất có thể bạn đã bị vô hiệu hóa innodb_file_per_table .
LƯU Ý: Thông tin sau được dựa trên innodb_file_per_table bị vô hiệu hóa
Khi chèn dữ liệu vào các bảng InnoDB, mọi thứ và bà của nó sẽ nằm trong tệp không gian bảng hệ thống, được gọi là ibdata1. Ibdata1 thực sự chứa gì?
Bảng dữ liệu và chỉ mục trong khi ban đầu phình to ibdata1. Siêu dữ liệu chỉ đơn giản là từ điển dữ liệu + danh sách các không gian bảng được gán trên cơ sở mỗi bảng.
Điều gì về MVCC (Điều khiển đồng thời đa biến) ? Điều này thể hiện các đối tượng systrem được thiết kế để hỗ trợ cách ly giao dịch, rollback, hoàn tác nhật ký, chèn bộ đệm cho các chỉ mục secondayr và bộ đệm ghi đôi.
Bạn cần 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:
Quay trở lại câu hỏi ban đầu của bạn, cách duy nhất để ước tính kích thước của ibdata1 khi tải lại sẽ là chạy truy vấn này trước mysqldump:
SELECT
data_length/power(1024,3) InnoDBData,
index_length/power(1024,3) InnoDBIndexes,
(data_length+index_length)/power(1024,3) InnoDBSize
FROM
information_schema.tables
WHERE
engine='InnoDB';
Điều này sẽ báo cáo kích thước của dữ liệu tính bằng GB. Khi tải lại ibdata1 mới (với innodb_file_per_table bị vô hiệu hóa trong trường hợp của bạn), đây sẽ là quy tắc ngón tay cái cho ước tính kích thước.
Từ kích thước tệp kết xuất, thật khó để đánh giá vì tổng kích thước kết hợp của các trang dữ liệu và trang chỉ mục có thể ít hơn nhiều so với kích thước của ibdata1 kết xuất được tạo từ đó. Sự khác biệt đó sẽ có không gian còn sót lại từ sự đầy hơi của các đối tượng hệ thống MVCC (phân đoạn rollback, hoàn tác nhật ký, bộ đệm ghi đôi, bộ đệm chèn chỉ mục phụ). Từ góc độ khác, các trang dữ liệu có thể nhiều hơn các trang chỉ mục và ngược lại. Điều này có thể là do quá nhiều chỉ mục, thiết kế xấu hoặc chỉ là một lượng dữ liệu hợp lý.
ibdata1
trở nên lớn như vậy trong quá trình khôi phục.