Tệp ibdata1 trong thư mục / var / lib / mysql của tôi là gì?


32

Đăng nhập vào bảng điều khiển Webmin của tôi, tôi nhận thấy rằng hầu như tất cả không gian đĩa của tôi đã đầy. Tôi đã tìm kiếm mười tệp / thư mục lớn nhất trên hệ thống của mình và thấy rằng một tệp có tên ibdata1 đang chiếm khoảng 94GB dung lượng. Nó nằm trong thư mục / var / lib / mysql của tôi.

Ibdata1 làm gì? Tôi có an toàn để loại bỏ nó? Giả định của tôi là đó là một loại rác, nhưng đó chỉ là một phỏng đoán hoang dã.

Câu trả lời:


38

Tệp ibdata1này là không gian bảng hệ thống cho cơ sở hạ tầng InnoDB.

Nó chứa một số lớp thông tin quan trọng cho InnoDB

  • Bảng dữ liệu trang
  • Bảng chỉ mục trang
  • Từ điển dữ liệu
  • Dữ liệu điều khiển MVCC
    • Hoàn tác không gian
    • Phân đoạn rollback
  • Bộ đệm ghi đôi (Các trang được viết trong nền để tránh bộ đệm của hệ điều hành)
  • Chèn bộ đệm (Thay đổi chỉ mục phụ)

Vui lòng lưu ý vị trí của ibdata1 trong Vũ trụ InnoDB (ở phía bên phải)

Kiến trúc InnoDB

Bạn có thể tách Trang dữ liệu và chỉ mục ibdata1bằng cách bật innodb_file_per_table . Điều này sẽ khiến bất kỳ bảng InnoDB mới được tạo nào lưu trữ dữ liệu và trang chỉ mục trong một .ibdtệp bên ngoài .

Thí dụ

  • datadir là / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;, tạo ra /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table được bật, Trang dữ liệu / chỉ mục được lưu trữ trong /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table bị vô hiệu hóa, Trang dữ liệu / chỉ mục được lưu trữ trong ibdata1

Bất kể bảng InnoDB được lưu trữ ở đâu, chức năng của InnoDB yêu cầu tìm siêu dữ liệu của bảng và lưu trữ và truy xuất thông tin MVCC để hỗ trợ tuân thủ ACIDCách ly giao dịch .

Dưới đây là những bài viết trước đây của tôi về việc tách dữ liệu bảng và chỉ mục khỏi ibdata1

PHẢI LÀM GÌ TIẾP THEO

Bạn có thể tiếp tục để ibdata1 lưu trữ mọi thứ, nhưng điều đó làm cho việc chụp nhanh LVM trở nên cực kỳ tệ hại (ý kiến ​​cá nhân của tôi).

Bạn cần sử dụng bài đăng StackOverflow của tôi và thu nhỏ tệp đó vĩnh viễn.

Vui lòng chạy truy vấn này:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Điều này sẽ cho biết có thể thu hồi được bao nhiêu không gian lãng phí sau khi áp dụng Dọn dẹp InnoDB.


Cảm ơn vì đầu vào của bạn. Hạn ngạch đĩa của tôi đã được điền đầy đủ - trước khi tôi thực hiện bất kỳ lời khuyên nào trong bài đăng của bạn, tôi có cần dung lượng trống không? Tôi lưu ý rằng bài viết gốc của bạn trên SO đề cập đến việc thực hiện kết xuất SQL, nhưng điều này có lẽ sẽ tạo ra một tệp ~ 90GB mà không có nơi nào để đi.
James

mysqldump sẽ chỉ đại diện logic của các trang dữ liệu, không phải các chỉ mục. Bạn sẽ cần một ổ đĩa khác, có lẽ là một máy chủ từ xa, để kết xuất dữ liệu.
RolandoMySQLDBA

9
Nó trả về 91.25350952148438 cho tôi như SpaceToReclaim. Đây có phải là megabyte không? phần trăm? byte?
Isaac

Tôi biết điều này là quá cũ. Nhưng đối với bất kỳ ai đến đây có vấn đề, bạn cần thay thế số 94bằng kích thước ibdata1tệp của bạn bằng GB và SpaceToReclaimsẽ cung cấp cho bạn kích thước tính bằng GB.
anupsabraham


2

Nếu bạn sử dụng innodb làm công cụ MySQL theo mặc định sẽ lưu trữ tất cả cơ sở dữ liệu của bạn vào ibdata1. Ngoài ra còn có các tệp nhật ký ib_logfile0 và ib_logfile1. Đừng xóa những tập tin đó.


Xóa tập tin đó trên máy chủ của tôi là gì?
Frank
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.