Cái đó ibdata1
không thu hẹp là một tính năng đặc biệt khó chịu của MySQL. Các ibdata1
tập tin có thể không thực sự được thu nhỏ trừ khi bạn xóa tất cả các cơ sở dữ liệu, loại bỏ các tập tin và tải lại một bãi chứa.
Nhưng bạn có thể cấu hình MySQL để mỗi bảng, bao gồm các chỉ mục của nó, được lưu trữ dưới dạng một tệp riêng biệt. Theo cách đóibdata1
sẽ không phát triển lớn. Theo nhận xét của Bill Karwin, điều này được bật theo mặc định kể từ phiên bản 5.6.6 của MySQL.
Đó là một thời gian trước đây tôi đã làm điều này. Tuy nhiên, để thiết lập máy chủ của bạn sử dụng các tệp riêng biệt cho mỗi bảng, bạn cần thay đổi my.cnf
để kích hoạt tính năng này:
[mysqld]
innodb_file_per_table=1
http://dev.mysql.com/doc/refman/5.5/en/innodb-multipl-tablespaces.html
Khi bạn muốn lấy lại không gian từ ibdata1
bạn thực sự phải xóa tệp:
- Thực hiện một
mysqldump
trong tất cả các cơ sở dữ liệu, quy trình, trình kích hoạt, ngoại trừ mysql
vàperformance_schema
cơ sở dữ liệu
- Bỏ tất cả cơ sở dữ liệu trừ 2 cơ sở dữ liệu trên
- Dừng mysql
- Xóa
ibdata1
vàib_log
tập tin
- Bắt đầu mysql
- Khôi phục từ bãi chứa
Khi bạn khởi động MySQL ở bước 5, ibdata1
và ib_log
các tệp sẽ được tạo lại.
Bây giờ bạn phù hợp để đi. Khi bạn tạo một cơ sở dữ liệu mới để phân tích, các bảng sẽ được đặt trong ibd*
các tệp riêng biệt chứ không phải trong ibdata1
. Vì bạn thường bỏ cơ sở dữ liệu ngay sau đó, các ibd*
tệp sẽ bị xóa.
http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Bạn có thể đã thấy điều này:
http://bugs.mysql.com/orms.php?id=1341
Bằng cách sử dụng lệnh ALTER TABLE <tablename> ENGINE=innodb
hoặc OPTIMIZE TABLE <tablename>
người ta có thể trích xuất dữ liệu và các trang chỉ mục từ ibdata1 để tách các tệp. Tuy nhiên, ibdata1 sẽ không thu nhỏ trừ khi bạn thực hiện các bước trên.
Về information_schema
điều đó, không cần thiết cũng không thể bỏ. Thực tế nó chỉ là một loạt các khung nhìn chỉ đọc, không phải các bảng. Và không có tệp nào liên quan đến chúng, thậm chí không có thư mục cơ sở dữ liệu. Việc informations_schema
sử dụng bộ nhớ db-engine và được loại bỏ và được tạo lại khi dừng / khởi động lại mysqld. Xem https://dev.mysql.com/doc/refman/5.7/en/inatures-schema.html .