Kết nối người dùng là gì - khi nào được tạo và hủy?


7

Chúng tôi đã nhận được một lỗi không liên tục trên trang web ra:

Cảnh báo: mysql_connect () [function.mysql-connect]: Người dùng '557574_prod' đã vượt quá tài nguyên 'max_user_connections' (giá trị hiện tại: 10)

Điều này ngăn trang web khỏi bị truy cập và hiệu quả là nó bị sập.

(rõ ràng việc tăng 'max_user_connections' sẽ khắc phục nhưng đó không phải là một tùy chọn thông qua sơ đồ lưu trữ của chúng tôi)

Tôi có thể đã 'sửa' nó, nhưng tôi không chắc chắn 100% tôi hiểu vấn đề & tôi muốn làm rõ. Tôi nghĩ vấn đề phải do quá nhiều công việc định kỳ sử dụng hết các kết nối (chúng tôi có một vài hoạt động mỗi phút) và tôi đã cắt giảm số lượng công việc định kỳ & điều đó dường như làm giảm số lượng lỗi. Tôi đã tạo một tài khoản người dùng riêng cho các công việc định kỳ, vì vậy nếu đó là vấn đề thì nên giải quyết ngay.

Tuy nhiên, hệ thống đăng nhập của chúng tôi không ghi lại lỗi khi nó xảy ra, vì vậy tôi vẫn quan tâm.

Vì vậy, tôi đang hỏi: cái gì tạo thành một 'user_connection' trong MySQL?

  • Có một kết nối riêng cho mỗi cuộc gọi DB không?
  • nếu không, khi nào các cuộc gọi DB yêu cầu một kết nối riêng?
  • Tại sao lỗi này chỉ xảy ra trên các trang web sản xuất trực tiếp? có lẽ có một kết nối riêng cho mỗi ip hoặc simialr duy nhất?

Tôi cảm thấy tôi đang suy nghĩ quá mức. . .


Đây là một câu hỏi rất hữu ích để cộng đồng suy ngẫm về bây giờ và tư vấn về sau. +1 !!!
RolandoMySQLDBA

Câu trả lời:


10

Xin lưu ý trang điểm của mysql.user:

mysql> show create table mysql.user\G
*************************** 1. row ***************************
       Table: user
Create Table: CREATE TABLE `user` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(16) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Password` char(41) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
  `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
  `ssl_cipher` blob NOT NULL,
  `x509_issuer` blob NOT NULL,
  `x509_subject` blob NOT NULL,
  `max_questions` int(11) unsigned NOT NULL DEFAULT '0',
  `max_updates` int(11) unsigned NOT NULL DEFAULT '0',
  `max_connections` int(11) unsigned NOT NULL DEFAULT '0',
  `max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',
  `plugin` char(64) COLLATE utf8_bin DEFAULT '',
  `authentication_string` text COLLATE utf8_bin,
  PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
1 row in set (0.00 sec)

Lưu ý cột max_user_connections. Nó đặt một lệnh cấm về số lượng kết nối mà người dùng có thể thực hiện mỗi giờ. Kiểm tra và đảm bảo rằng người dùng '557574_prod' không kết nối với mysql hàng tấn lần trong vòng chưa đầy một giờ.

Điều này được sử dụng cùng với tùy chọn max_user_connections mà bạn có thể đặt trong /etc/my.cnf

Vui lòng thay đổi max_user_connections trong /etc/my.cnf hoặc, nếu người dùng cá nhân có tập hợp cột này, cột đó mysql.user.max_user_connections. Nếu bạn không có quyền kiểm soát cấu hình đối với my.cnf và bạn không thể thực hiện SQL đối với lược đồ mysql, thì bạn hãy cầu xin và khẩn cầu công ty lưu trữ của bạn tăng các giới hạn đó cho bạn.

Tôi tin rằng bạn có thể đặt max_user_connections làm biến phiên, nhưng bạn có thể cần một số đặc quyền nhất định, có thể là SIÊU.

Đối với việc thiết lập kết nối, bạn cần giữ cho các kết nối đó mở. Có lẽ gửi một nhịp tim của một số loại bằng cách thực hiện một CHỌN. Nhưng đoán xem sao ??? Các cột db max_questions giám sát các truy vấn CHỌN mỗi giờ và max_updates giám sát các CHERTN, CẬP NHẬT, XÓA mỗi giờ. YOu có thể cần kiểm tra các cột này trong mysql.user. Bạn có thể nhanh chóng kiểm tra những con số đó bằng:

SHOW GRANTS;

Tôi không chắc chắn nếu giới hạn kết nối mỗi giờ của người dùng là cho mỗi luồng hoặc mỗi người dùng. Bạn có thể trả lời nhanh chóng bằng cách kết nối với DB một cách mạnh mẽ bằng cách sử dụng 2 hoặc 3 kết nối DB cùng một lúc và thông báo lỗi sẽ tự hiển thị. Tùy thuộc vào cách tính số lượng kết nối, có lẽ "HIỂN THỊ TÌNH TRẠNG THÍCH 'Kết nối';" Nó sẽ đạt đến giới hạn tối đa của kết nối trong một kết nối hoặc nó có thể là tổng của giá trị trạng thái kết nối của tất cả các kết nối.

Vui lòng kiểm tra các giá trị Wait_timeout và Interactive_timeout. Mặc định là 28800 trong một máy chủ độc lập. Họ có thể đã được thiết lập. Bạn không thể đặt chúng trong một kết nối hiện tại. Bạn phải có thể đặt chúng như sau: (cho các lần sắp tới mới)

SET GLOBAL interactive_timeout = 86400;
SET GLOBAL wait_timeout = 86400;

Nếu bạn không thể chạy ngay cả những lệnh này, xin chia buồn !!! :


À, tôi thậm chí không có đặc quyền CHỌN cho mysql.user, nhưng một cuộc trò chuyện với sự hỗ trợ được tiết lộ rằng họ đã đặt giới hạn tỷ lệ cho chúng tôi vì có quá nhiều truy vấn chậm. bất kể, tôi thấy bài viết của bạn thông tin và hữu ích như mọi khi.
Nhạc chuông

Rất tốt đẹp viết lên.
Derek Downey

Làm rõ, có một số giới hạn về số lượng kết nối của người dùng. max_user_connections giới hạn các kết nối đồng thời, không phải kết nối mỗi giờ.
Brad Koch
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.