Tại sao MySQL tạo ra nhiều tệp MYD tạm thời?


9

Trên máy chủ Debian Linux, lưu trữ nhiều trang web PHP / MySQL (thư viện ảnh), đôi khi tôi có các tệp "nhiều" như thế /tmp/#sql_6405_58.MYD.

Ví dụ hôm nay:

[2012-12-15 15:18:11] /tmp/#sql_6405_6.MYD : 88MB
[2012-12-15 15:18:11] /tmp/#sql_6405_3.MYD : 22MB
[2012-12-15 15:18:11] /tmp/#sql_6405_4.MYD : 138MB
[2012-12-15 15:18:11] /tmp/#sql_6405_10.MYD : 88MB
...
[2012-12-15 15:18:11] /tmp/#sql_6405_9.MYD : 15MB
[2012-12-15 15:18:11] /tmp/#sql_6405_65.MYD : 49MB
[2012-12-15 15:18:11] /tmp/#sql_6405_44.MYD : 69MB

(59 tệp cùng lúc, hơn 6GB ... có, tôi giám sát các tệp lớn trong / tmp)

Thật không may, /tmptrên cùng một phân vùng /và nó tạm thời phá vỡ máy chủ web, vì /tôi cho rằng đã đầy. Sau đó các tập tin biến mất và máy chủ trở lại bình thường.

Tất cả các tên tập tin theo #sql_6405_*.MYDmẫu. Tôi muốn hiểu hoạt động MySQL nào ngụ ý rất nhiều tệp tạm thời. Tôi có khoảng 2000 cơ sở dữ liệu trên máy chủ này. Có thể biết cơ sở dữ liệu nào có liên quan?


1
Tôi đoán chúng là dữ liệu tạm thời cho các hoạt động lớn sử dụng filesortvà 6405 là bộ vi xử lý của mysql để tách các tệp tạm thời khỏi các phiên bản máy chủ khác nhau.

Tôi có nên yêu cầu một quản trị viên di chuyển câu hỏi của tôi?

Câu trả lời:


14

Có một số tùy chọn có thể khiến các bảng tạm thời cụ thể hóa thành các bảng MyISAM hoặc có thể được cấu hình để trì hoãn nó. Hãy ghi nhớ rằng cho các bảng tạm thời dựa trên đĩa, không có .frmtác phẩm, nhưng chỉ .MYD.MYIfile (tất nhiên. File .MYI không bao giờ được sử dụng vì nó là chỉ số không thể một bảng temp nội bộ).

Dưới đây là các tùy chọn:

Bạn cũng nên xem xét Tài liệu MySQL về Sử dụng Bảng Temp Nội bộ

Các tình huống trong đó các bảng tạm thời trong bộ nhớ được thực hiện là

  • Nếu có mệnh đề ORDER BY và mệnh đề GROUP BY khác hoặc nếu ORDER BY hoặc GROUP BY chứa các cột từ các bảng khác với bảng đầu tiên trong hàng đợi nối, một bảng tạm thời được tạo.
  • DISTINCT kết hợp với ORDER BY có thể yêu cầu một bảng tạm thời.
  • Nếu bạn sử dụng tùy chọn SQL_SMALL_RESULT, MySQL sử dụng bảng tạm thời trong bộ nhớ, trừ khi truy vấn cũng chứa các phần tử (được mô tả sau) yêu cầu lưu trữ trên đĩa.

Khi bảng tạm thời trong bộ nhớ vượt quá mức tối thiểu (tmp_table_size hoặc max_heap_table_size), mysqld thực hiện như sau:

  • Tạm dừng truy vấn
  • Sao chép nội dung của bảng trong bộ nhớ vào bảng tạm thời MyISAM
  • Loại bỏ bảng trong bộ nhớ
  • Tiếp tục truy vấn, gửi dữ liệu tạm thời vào bảng tạm thời MyISAM

Các tình huống trong đó các bảng tạm thời trong bộ nhớ được bỏ qua có lợi cho đĩa là

  • Sự hiện diện của cột BLOB hoặc văn bản trong bảng
  • Sự hiện diện của bất kỳ cột nào trong mệnh đề GROUP BY hoặc DISTINCT lớn hơn 512 byte
  • Sự hiện diện của bất kỳ cột nào lớn hơn 512 byte trong danh sách CHỌN, nếu UNION hoặc UNION ALL được sử dụng

Một số sự tích cực là cần thiết để giảm việc tạo bảng tạm thời trên đĩa

  • Đặt tham gia_buffer_size lớn hơn
  • Đặt sort_buffer_size lớn hơn
  • Đặt tmp_table_size và max_heap_table_size lớn hơn
  • Điều chỉnh truy vấn để giảm thiểu hoặc thậm chí ngăn các bảng tạm thời
  • Tạo các chỉ mục để tạo chế độ xem dữ liệu được định sẵn từ các bảng riêng lẻ
  • Cài đặt thêm RAM để chứa các bảng tạm thời trong bộ nhớ lớn

Nếu sau khi siêng năng như vậy, vẫn còn các bảng tạm thời được hình thành trên Đĩa, thì đây là một động thái tuyệt vọng: Ánh xạ tạo bảng tạm thời dựa trên đĩa vào bộ nhớ.

Đây là một cách nhanh chóng và bẩn thỉu để thiết lập Đĩa RAM 16 GB bằng tmpdir

BƯỚC01) Tạo thư mục đĩa RAM

mkdir /var/mysql_tmpfs

BƯỚC02) Thêm cái này vào my.cnf

[mysqld]
tmpdir=/var/mysql_tmpfs

BƯỚC03) Thêm cái này vào / etc / fstab

echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab

BƯỚC04) Tải lại / etc / fstab

mount -a

BƯỚC05) service mysql restart

Sau này, tất cả bảng tạm thời trở thành MyISAM được ghi vào Đĩa RAM. Điều này sẽ tăng tốc độ tạo bảng tạm thời dựa trên đĩa.

Hãy thử một lần !!!


1

Đây là những truy vấn được đưa lên đĩa vì kết quả quá lớn đối với bộ nhớ.

Khi truy vấn được thực hiện, không gian sẽ xóa.

Không có cách nào khớp các tệp tạm thời này một cách dứt khoát với các truy vấn, nhưng bạn có thể nhận được manh mối để đoán chính xác từ SHOW FULL PROCESSLIST; hoặc SHOW INNODB TÌNH TRẠNG; hoặc bằng cách xem trong nhật ký lỗi của bạn nếu các truy vấn không thành công.


1

Bất cứ khi nào chúng tôi sử dụng các câu lệnh thay đổi trên bảng Nó sẽ tạo các tệp tạm thời # sql_6405_3.MYD và sau khi hoàn thành, nó sẽ ném đầu ra và biến mất.

Việc thay đổi trên các bảng làm cho MySQL sao chép toàn bộ dữ liệu vào các tệp tạm thời # sql.xxx.MYD và thực hiện các thay đổi đối với các tệp tạm thời sau đó thả các tệp dữ liệu gốc tablename.MYD và đổi tên các tệp tạm thời thành tên bảng.

Ngoài ra đối với một số truy vấn sắp xếp loại, nó tạo các tệp tạm thời.

Khi tôi truy ra. Điều này xảy ra.


0

Tôi nghĩ rằng bạn có thể tìm thấy các truy vấn được đề cập trên nhật ký truy vấn chậm, vì các truy vấn tạo bảng tạm thời lớn thường chạy trong một thời gian dài, đây là cách giúp tôi hôm nay trên một máy chủ nơi tôi tìm thấy /tmpphân vùng đầy vì tương tự Tệp tạm thời của MySQL lớn, đó là tệp 4G, tôi tìm thấy truy vấn trên nhật ký truy vấn chậm và báo cáo truy vấn cho nhà phát triển và họ đã tìm thấy lỗi trên truy vấn và họ sẽ sửa nó, có vẻ như đó là một lệnh giới hạn của MySQL nên nó đã chạy trong một thời gian dài và đã viết một tệp tạm thời 4G và điền vào /tmpphân vùng.

Và có một cách khác bạn có thể tìm thấy nguyên nhân gây ra tệp tạm thời lớn này, đó là tệp nhị phân để bạn không thể đọc trực tiếp nhưng tôi thấy bạn có thể grep văn bản chứa trên đó bằng cách sử dụng lệnh Linux như thế này,

strings name-of-mysql-temp-file

Tôi chắc chắn từ các từ văn bản những gì truy vấn MySQL đã chạy và tạo ra nó.

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.