Cách giải quyết quá nhiều kết nối và lỗi nghiêm trọng trong mysql chạy trên vps


9

Tôi đang chạy một danh sách PHP ứng dụng trên máy chủ linode của mình, đồng thời chạy 12 tập lệnh PHP, mỗi tập lệnh mở một kết nối MySQL. Bây giờ khi tôi truy cập PHPlist, nó thường hiển thị lỗi này:

Lỗi nghiêm trọng: Xin lỗi, máy chủ hiện đang quá bận, vui lòng thử lại sau.

Khi tôi đang cố gắng truy cập phpMyAdmin, nó hiển thị cho tôi lỗi # 1040. Đầu ra của các tập lệnh PHP chạy qua các croncông việc cho thấy:

Cảnh báo PHP: mysqli_connect (): (HY000 / 1040): Quá nhiều kết nối

Tôi đang sử dụng ngăn xếp LAMP trên máy chủ với phpMyAdmin; các topđầu ra trong chương trình thiết bị đầu cuối mysqldsử dụng 100-130% CPU. Khi tôi đang cố gắng khắc phục sự cố này, tôi đã nhận được một số manh mối:

  • Tăng biến max_connection: Tôi đang sử dụng 200 (100 theo mặc định)
  • Mở bộ đệm bảng: 512 (400 theo mặc định)

Có rất nhiều biến để đặt nhưng tôi không thể xác định được biến nào, tôi sẽ nhận được một số tham chiếu từ: quá nhiều kết nốihttp://dev.mysql.com/doc/refman/5.5/en/table-cache. html

Nhưng theo cách sử dụng của tôi, làm thế nào để tăng bộ nhớ và bộ nhớ tối đa là gì đối với tôi.

Trên máy chủ của tôi, tôi đang sử dụng khoảng 12 tập lệnh PHP, ứng dụng PHPlist để gửi email và cơ sở dữ liệu chính để đăng ký người dùng.

Xin vui lòng giúp tôi giải quyết vấn đề này.

Câu trả lời:


12

Trước tiên bạn cần làm là chạy truy vấn này:

SELECT user,host FROM mysql.user
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';

Điều này sẽ liệt kê tất cả người dùng có đặc quyền SUPER . Hầu hết người dùng thực hiện xử lý DB liên quan đến ứng dụng không yêu cầu đặc quyền này. Theo Tài liệu MySQL , những người có đặc quyền SUPER có thể làm như sau:

  • Chạy CHANGE MASTER TO để kiểm soát tọa độ sao chép
  • Giết hoặc mysqladmin killgiết chủ đề thuộc các tài khoản khác
  • Nhật ký BINary PURGE để xóa hệ thống nhật ký nhị phân
  • Thực hiện thay đổi cấu hình bằng cách sử dụng SET GLOBAL để sửa đổi các biến hệ thống toàn cầu
  • lệnh gỡ lỗi mysqladmin
  • cho phép hoặc vô hiệu hóa đăng nhập
  • thực hiện cập nhật ngay cả khi biến hệ thống * read_only * được bật
  • bắt đầu và dừng sao chép trên các máy chủ nô lệ
  • đặc điểm kỹ thuật của bất kỳ tài khoản nào trong thuộc tính DEFINER của các chương trình và chế độ xem được lưu trữ
  • ĐÂY LÀ MỘT ĐIỀU QUAN TRỌNG NHẤT CHO VẤN ĐỀ CỦA BẠN :: Cho phép bạn kết nối (một lần) ngay cả khi đạt đến giới hạn kết nối được điều khiển bởi biến hệ thống max_connections .

Bạn sẽ cần phải đăng nhập với quyền root @ localhost và thu hồi đặc quyền SUPER như sau:

UPDATE mysql.user SET super_priv='N'
WHERE super_priv='Y' AND
CONCAT(user,'@',host) <> 'root@localhost';
FLUSH PRIVILEGES;

Khi bạn thực hiện việc này, bất cứ khi nào tất cả người dùng tràn ngập kết nối mysql, chỉ root@localhostcó thể đăng nhập. Rốt cuộc, nếu tất cả mọi người và bà của anh ta có đặc quyền SIÊU, điều này sẽ root@localhostkhông bao giờ kết nối trước những người khác. Nếu max_connections ở mức 200 và bạn cần nâng nó lên 300 mà không phải khởi động lại mysqld, bạn có thể tự động tăng max_connections bằng lệnh này:

mysql> SET GLOBAL max_connections = 300;

Điều đó sẽ cho phép nhiều kết nối có hiệu lực ngay lập tức, nhưng đừng tự ý tăng số lượng theo ý thích. Bạn phải chắc chắn rằng mysql có đủ RAM để phù hợp với sự gia tăng.

CAVEAT: Nếu bạn thay đổi max_connections thành 300, vui lòng đặt nó vào /etc/my.cnf

[mysqld]
max_connections=300

Bạn có thể chạy mysqltuner.pl trên MySQL DB Server của bạn. Nếu bạn không có nó, thì hãy chạy như sau:

cd
wget mysqltuner.pl
perl mysqltuner.pl

Dòng thứ 3 trong mục Đo lường hiệu suất có điều này

-------- Performance Metrics -------------------------------------------------
[--] Up for: 8d 20h 46m 22s (8M q [10.711 qps], 129K conn, TX: 90B, RX: 19B)
[--] Reads / Writes: 4% / 96%
[--] Total buffers: 2.1G global + 5.4M per thread (2000 max threads)
[OK] Maximum possible memory usage: 12.6G (80% of installed RAM)

Xem 5,4M mỗi luồng? Điều đó được nhân với max_connections. Trong ví dụ này, đó sẽ là tối đa khoảng 10,8G RAM. Do đó, mỗi lần bạn nâng cấp max_connections, bạn nên chạy mysqltuner.pl và kiểm tra xem bạn có đang nhấn HĐH quá nhiều bộ nhớ không.

Trong mọi trường hợp, việc giới hạn những người có đặc quyền SUPER cho người dùng như vậy cơ hội để giảm thiểu lũ lụt mysqld với Kết nối DB.


Tôi gặp lỗi này khi thử perl mysqltuner.pl "Đã cố sử dụng thông tin đăng nhập từ tài khoản bảo trì debian, nhưng họ đã thất bại."
Shashank

Tôi đang thử điều này trên máy chủ Ubuntu cục bộ của mình, nó cho thấy mức sử dụng bộ nhớ tối đa, nhưng trên vps của tôi, nó cho thấy sự thất bại và tôi không thể đăng nhập vào phpmyadmin nhưng đăng nhập thành công trong thiết bị đầu cuối mysql
Shashank

Cmd này wget mysqltuner.pl, đã tải xuống index.html, nhưng nó là một tệp perl, vì vậy tôi đã đổi tên nó thành mysqltuner.pl và cmd tiếp theo perl mysqltuner.plhoạt động.
MotsM Biến

2
  1. Biến toàn cục max_connectionsxác định số lượng kết nối đồng thời tối đa tới MySQL. Hãy chắc chắn rằng bạn có giá trị cao cho biến này. Bạn có thể tăng giá trị này lên 300 hoặc 400 và thử khởi động lại MySQL sau khi cài đặt này.
  2. Thiết kế ứng dụng của bạn sao cho kết nối MySQL được giữ mở trong một khoảng thời gian rất ngắn.
  3. Bạn cũng nên kiểm tra xem mã máy khách không sử dụng các kết nối liên tục (chẳng hạn như mysql_pconnect ()) không đúng cách.

Cũng thực hiện Flush status;lệnh trên máy chủ MySQl để giảm giá trị này.

Tôi hy vọng những gợi ý này sẽ giúp.


0

Kiểm tra xem đĩa của bạn đã đầy chưa, điều này có thể gây ra lỗi tương tự:

df -h

sẽ hiển thị cho bạn không gian còn lại trên mỗi phân vùng, bạn có thể phải kiểm tra phân vùng gốc /(hoặc / var / trong trường hợp bạn có thêm phân vùng cho việc này):

df -h /
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.