mysql số lượng lớn các bảng đã mở - điều này có nghĩa là gì và làm thế nào tôi có thể giảm?


7

Tôi có 300 cơ sở dữ liệu với tối đa 59 bảng mỗi cái. Nhà cung cấp dịch vụ lưu trữ của tôi nói rằng tôi có rất nhiều bảng đã mở. Tôi không có bất kỳ vấn đề hiệu suất; nhưng nó gây ra sự cố với sao lưu (Tôi sử dụng cơ sở dữ liệu đám mây của rackspace sử dụng Percona XtraBackup)

Điều gì có thể gây ra rất nhiều bảng mở và làm thế nào tôi có thể giảm điều này? Tôi không nhận được quá nhiều lưu lượng truy cập và hiệu suất là tốt. Tôi không chắc tôi hiểu chính xác những gì đã mở bảng là gì.

Tôi đã table_definition_cacheđặt thành 4096vì tôi không thể chạy truy vấn trên lượt xem cho đến khi tôi tăng nó.

mysql> SHOW GLOBAL STATUS LIKE 'Open_%';
mysql> +--------------------------+----------+
    -> | Variable_name            | Value    |
    -> +--------------------------+----------+
    -> | Open_files               | 7        |
    -> | Open_streams             | 0        |
    -> | Open_table_definitions   | 4102     |
    -> | Open_tables              | 4096     |
    -> | Opened_files             | 44025318 |
    -> | Opened_table_definitions | 1660409  |
    -> | Opened_tables            | 1857375  |
    -> +--------------------------+----------+

Dưới đây là các lệnh được yêu cầu:

https://gist.github.com/blasto333/aa4241a4e37447961188356719ea6984

Câu trả lời:


6

table_open_cache là cài đặt có nhiều khả năng khiến chủ nhà rời khỏi lưng bạn.

SHOW VARIABLES LIKE '%open%'; Và hệ thống đã hoạt động được bao lâu khi STATUSbị bắt? (Cần "mỗi giây", không tính tuyệt đối.)

Cung cấp cho tôi kích thước ram, SHOW VARIABLESSHOW GLOBAL STATUS; Tôi sẽ phê bình hàng tá thứ.

Có bất kỳ bảng PARTITIONednào? (Mỗi 'phân vùng' thực sự là một 'bảng' riêng biệt.)

Ngoài ra, hãy suy nghĩ lại 300x59 của bạn; Đó là những con số lớn vừa phải.

Phân tích VARIABLES & TÌNH TRẠNG

Quan sát: Phiên bản: 5.6.17-log; RAM 4 GB; Thời gian hoạt động = 145d 22:45:14; Bạn không chạy trên Windows; Chạy phiên bản 64 bit; Bạn dường như đang chạy hoàn toàn (hoặc chủ yếu) InnoDB.

Các vấn đề quan trọng hơn

key_buffer_size - thấp hơn đến 20M; 400M của bạn đang lãng phí RAM.

table_open_cache dường như đang làm tốt. Vì vậy, tôi không thấy sự cần thiết phải tăng giới hạn tệp mở. (Cũng không có hại gì.)

Rất nhiều lần quét bảng, v.v. Đề nghị bạn hạ long_query_time xuống 1 và bật Slow_query_log. Sau đó, chúng ta có thể xem trong Slowlog mà các truy vấn cần cải thiện - thông qua các chỉ mục tổng hợp hoặc các kỹ thuật khác.

expire_logs_days hiện tại là 1. Bạn chỉ có một ngày để phát hiện ra rằng một cái gì đó bị hỏng trong bản sao và / hoặc binlog trước khi bạn mất thông tin.

Xóa hầu hết hoặc tất cả các cuộc gọi BẢNG TỐI ƯU.

Chi tiết và các quan sát khác

(Opened_tables) = 0,15 / giây - Đây là một tỷ lệ khá thấp và khá đáng nể. Rốt cuộc, bạn đã thức dậy được 20 tuần và đây là một 'bộ đếm'. Chỉ ra 20 tuần cho nhà cung cấp Hosting. table_open_cache là số lượng mục trong bộ đệm cho các bảng "Đã mở". Có lẽ có một loạt các mở trong khi sao lưu, nhưng không mở phần còn lại của thời gian? Đối với "Tôi đã đặt table_def định_cache thành 4096 vì tôi không thể chạy truy vấn trên lượt xem cho đến khi tôi tăng nó." - XEM của bạn chạm vào hàng trăm hoặc hàng ngàn bảng? (Yike!)

((key_buffer_size - 1.2 * Key_blocks_use * 1024) / _ram) = (400M - 1.2 * 4180 * 1024) / 4096M = 9.6% - Phần trăm RAM bị lãng phí trong key_buffer. - Giảm key_buffer_size.

(Key_blocks_use * 1024 / key_buffer_size) = 4,180 * 1024 / 400M = 1,0% - Phần trăm của key_buffer được sử dụng. Dấu nước cao. - Hạ key_buffer_size để tránh việc sử dụng bộ nhớ không cần thiết.

(innodb_buffer_pool_size / _ram) = 2.306,867,200 / 4096M = 53,7% -% RAM được sử dụng cho InnoDB buffer_pool - Chỉ với 4GB RAM, điều này có thể ổn, trừ khi bạn có các ứng dụng khác trong cùng một máy chủ.

(table_open_cache) = 4.096 - Số lượng mô tả bảng vào bộ đệm - Hàng trăm thường là tốt. Tuy nhiên, bạn có rất nhiều bảng, vì vậy, điều này có thể ổn, hoặc thậm chí quá nhỏ.

(table_open_cache_instances) = 1 - Đề xuất thay đổi thành 8.

Table_open_cache_overflows và _misses mỗi cái nhỏ hơn 0,1 / giây. - cái bàn_open_cache đủ lớn.

(Open_tables / table_open_cache) = 100% - Nhưng, vì bạn đã Up được vài tháng, điều này không hẳn là xấu.

((Com_show_create_table + Com_show_fields) / Câu hỏi) = (153314 + 9291657) / 543294681 = 1.7% - Khung nghịch ngợm - dành rất nhiều nỗ lực để khám phá lại lược đồ. - Khiếu nại với nhà cung cấp bên thứ 3.

Truy vấn bộ đệm - các giá trị TÌNH TRẠNG khác nhau cho thấy rằng nó khá tốt khi nó đứng.

(Gener_t tránh các đốm màu, vv

(Com_rollback / Com_commit) = 646,634 / 1329015 = 48,7% - Rollback: Tỷ lệ cam kết - Rollback rất tốn kém; thay đổi logic ứng dụng

(Chọn_scan) = 16,557,535 / 12609914 = 1,3 / giây - quét toàn bộ bảng - Thêm chỉ mục / tối ưu hóa truy vấn (trừ khi chúng là các bảng nhỏ)

(Chọn_scan / Com_select) = 16,557,535 / 57256550 = 28,9% -% số lượt chọn thực hiện quét toàn bộ bảng. (Có thể bị đánh lừa bởi các thói quen được lưu trữ.) - Thêm chỉ mục / tối ưu hóa truy vấn

((Com_stmt_prepare - Com_stmt_c Đóng) / (Com_stmt_prepare + Com_stmt_c Đóng) - Thêm Đóng.

(binlog_format) = MIXED - TUYÊN BỐ / ROW / MIXED. ROW được ưa thích; nó có thể trở thành mặc định

(expire_logs_days) = 1 - Thời gian sớm tự động lọc binlog (sau nhiều ngày này) - Quá lớn (hoặc không) = tiêu tốn dung lượng đĩa; quá nhỏ = cần phản ứng nhanh với sự cố mạng / máy.

(Slow_query_log) = OFF - Có ghi nhật ký truy vấn chậm hay không. (5.1.12)

(long_query_time) = 10,000000 = 10 - Ngắt (Giây) để xác định truy vấn "chậm". - Gợi ý 2

(max_connect_errors) = 10.000 - Một bảo vệ nhỏ chống lại tin tặc. - Có lẽ không quá 200.

(Kết nối) = 28.367.185 / 12609914 = 2.2 / giây - Kết nối - Tăng Wait_timeout; sử dụng tổng hợp?

(Max_use_connections / max_connections) = 167/410 = 41% - Đề xuất hạ max_connections xuống, giả sử, 200.

(innodb_io_capacity_max) = 800 - Điều này khá thấp, nhưng có lẽ OK.

(report_port) = 1 - Điều này có thể xấu, nhưng tôi không có kinh nghiệm để cụ thể hơn. Hầu hết mọi người để nó ở 3306.

Com_create_db cứ sau 4 phút và Com_drop_db cứ sau 2 phút - Rất cao; chuyện gì đang xảy ra vậy

Com_optizes = 4.9 / giờ - TỐI ƯU hầu như vô dụng, đặc biệt là trên InnoDB.


4GB ram. Tôi đã đăng 2 lệnh đó ( gist.github.com/blasto333/aa4241a4e37447961188356719ea6984 ). Máy chủ của tôi đã xem xét nó và thực hiện giới hạn tệp mở 70.000 mà trước đó là 32.000. Họ nói họ không thấy bất kỳ vấn đề hiệu suất nào; nhưng tôi đoán quá trình sao lưu khá tốn tài nguyên (được thực hiện trên máy chủ nô lệ). Bảng KHÔNG được phân vùng. Tất cả các cơ sở dữ liệu innodb với 2 loại lược đồ khác nhau (1 hoặc loại khác)
Chris Muench

Tôi đã thêm các phân tích vào câu trả lời của tôi. Chôn ở giữa là một câu trả lời cho câu hỏi ban đầu của bạn về Opened_tables. (Tôi cần nhiều số để tạo ra một câu trả lời rõ ràng.)
Rick James

1

Nếu bạn đang sử dụng MyISAM, hãy chuyển đổi sang InnoDB và bạn có thể thấy số lượng này giảm. Không có cách nào khác để giảm điều này trừ khi bạn ngừng truy vấn chúng.

Tăng bảng_open_cache và table_def định_cache & quan sát các số liệu thống kê ... Tăng mức này càng nhiều càng tốt! Có thể bạn cũng cần tăng trình xử lý tệp hệ thống và đó là một cách để đi.

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.