MySQL sử dụng một thủ thuật đã mãi mãi là một phần của hệ thống POSIX. Nó mở tệp tạm thời và ngay lập tức hủy liên kết nó. Do đó, nó không thể xem được trong bất kỳ danh sách thư mục nào. Nhưng các hệ thống POSIX như UNIX và Linux thực sự không nên xóa một tệp chưa được liên kết trong khi một quy trình có một trình xử lý tệp đang mở đối với nó. Vì vậy, khi truy vấn sử dụng bảng tạm kết thúc, nó sẽ đóng trình xử lý tệp và sau đó HĐH sẽ tự động xóa tệp và giải phóng bộ nhớ mà nó đang sử dụng.
Điều này thường tốt hơn so với việc yêu cầu mã máy chủ nhớ xóa tệp tạm thời khi hoàn tất. Nó cũng giải thích như kết thúc chuỗi hoặc sự cố mysqld. Ít nhất nó sẽ không để lại các tệp tạm thời cũ làm tràn lan hệ thống tệp của bạn.
Bạn có thể xem kích thước của các tệp không được liên kết bằng lsof -s
. Tôi sẽ giao nó cho bạn để tìm kiếm các ví dụ về cách sử dụng lệnh đó (Google là bạn của bạn ở đây).
Rất có thể tệp tạm thời sử dụng hết 167GB dung lượng trống của bạn.
Hoặc có thể là tệp tạm thời chỉ sử dụng 8GB, nhưng bạn có thể có 20 luồng thực hiện cùng một truy vấn cùng một lúc. Tôi đã thấy điều đó xảy ra một lần.
Nhưng nhiều khả năng bạn có giá trị tmp_table_size
điều đó đang hạn chế kích thước của bảng tạm thời.
Nếu bạn đạt đến giới hạn, bạn có thể tăng tùy chọn cấu hình đó, dưới dạng một biến phiên khi bạn cần hoặc toàn cục trong my.cnf
.
Nhưng trước tiên tôi sẽ cố gắng tối ưu hóa truy vấn. Tại sao nó cần phải tạo ra các bảng tạm thời lớn như vậy? Nó có thể được tối ưu hóa để kiểm tra ít hàng hơn hoặc có thể tránh hoàn toàn việc tạo bảng tạm thời?