Tôi có câu trả lời đầy đủ cho cái này.
Khi innodb_file_per_table được đặt vào vị trí và các bảng InnoDB mới có thể được thu nhỏ bằng cách sử dụng ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
Điều này sẽ thu nhỏ các .ibd
tệp mới ĐẢM BẢO.
Nếu bạn chạy ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
trên bảng InnoDB được tạo trước khi bạn sử dụng innodb_file_per_table, nó sẽ lấy dữ liệu và chỉ mục cho bảng đó ra khỏi tệp ibdata1 và lưu trữ trong .ibd
tệp, Điều này sẽ không bao giờ được sử dụng lại toàn bộ chim bồ câu trong ibdata1 .
Các ibdata1
tập tin thường chứa bốn loại thông tin
Đây là cách được đảm bảo để thu nhỏ tệp ibdata1 mãi mãi ...
BƯỚC 01) MySQLDump tất cả các cơ sở dữ liệu vào một tệp văn bản SQL (gọi nó là SQLData.sql)
BƯỚC 02) Bỏ tất cả các cơ sở dữ liệu (ngoại trừ các lược đồ mysql, information_schema và Performance_schema)
BƯỚC 03) Tắt máy mysql
BƯỚC 04) Thêm các dòng sau vào /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Sidenote: Bất kể thiết lập của bạn cho innodb_buffer_pool_size, hãy đảm bảo innodb_log_file_size là 25% của innodb_buffer_pool_size.
- BƯỚC 05) Xóa ibdata1, ib_logfile0 và ib_logfile1 ( xem cập nhật bên dưới trước khi xóa! )
Tại thời điểm này, chỉ nên có lược đồ mysql trong / var / lib / mysql
- BƯỚC 06) Khởi động lại mysql
Điều này sẽ tạo lại ibdata1 ở mức 10MB (không định cấu hình tùy chọn), ib_logfile0 và ib_logfile1 ở mức 1G mỗi
- BƯỚC 07) Tải lại SQLData.sql vào mysql
ibdata1
sẽ phát triển nhưng chỉ chứa siêu dữ liệu bảng và dữ liệu MVCC không liên tục.
Mỗi bảng InnoDB sẽ tồn tại bên ngoài ibdata1
Giả sử bạn có một bảng InnoDB có tên mydb.mytable. Nếu bạn đi vào /var/lib/mysql/mydb
, bạn sẽ thấy hai tệp đại diện cho bảng
mytable.frm
(Tiêu đề công cụ lưu trữ)
mytable.ibd
(Trang chủ của dữ liệu bảng và chỉ mục bảng cho mydb.mytable
)
ibdata1
sẽ không bao giờ chứa dữ liệu và chỉ mục InnoDB nữa.
Với tùy chọn innodb_file_per_table/etc/my.cnf
, bạn có thể chạy OPTIMIZE TABLE mydb.mytable
OR ALTER TABLE mydb.mytable ENGINE=InnoDB;
và tệp /var/lib/mysql/mydb/mytable.ibd
sẽ thực sự co lại.
Tôi đã thực hiện điều này nhiều lần trong sự nghiệp của mình với tư cách là một DBA MySQL mà không gặp nhiều vấn đề sau đó. Trên thực tế, lần đầu tiên tôi làm điều này, tôi đã thu gọn tệp ibdata1 50GB thành 50MB.
Hãy thử một lần. Nếu bạn có thêm câu hỏi về điều này, gửi email cho tôi. Tin tôi đi Điều này sẽ làm việc trong ngắn hạn và trên đường dài.
CẬP NHẬT 2013/07/02 15:08 EDT
Có một sự cảnh báo về vấn đề này mà tôi đã cập nhật trong các bài đăng khác của tôi nhưng tôi đã bỏ lỡ điều này: Tôi đang cập nhật câu trả lời của mình thêm một chút với innodb_fast_shutdown vì tôi đã sử dụng để khởi động lại mysql và dừng mysql để làm điều này. Bây giờ, một bước này rất quan trọng vì mọi giao dịch không được cam kết có thể có các bộ phận chuyển động khác trong và ngoài Nhật ký giao dịch InnoDB ( Xem Cơ sở hạ tầng của InnoDB ).
Xin lưu ý rằng việc đặt innodb_fast_shutdown thành 2 cũng sẽ xóa sạch các bản ghi nhưng các phần chuyển động hơn vẫn tồn tại và được chọn trên Crash Recovery trong quá trình khởi động của mysqld. Cài đặt 0 là tốt nhất.