Mysql đóng kết nối sau khi truy vấn

Tôi đang cố gắng kết nối với phiên bản Cơ sở dữ liệu Amazon Aurora MySQL của mình và gặp phải lỗi "Quá nhiều kết nối". Giá trị kết nối tối đa cho phiên bản CSDL của tôi là bao nhiêu và làm cách nào để điều chỉnh giá trị này?

Mô tả ngắn

Nếu máy khách gặp phải lỗi "Quá nhiều kết nối" khi bạn cố gắng kết nối với phiên bản hoặc cụm cơ sở dữ liệu Amazon Aurora MySQL, thì điều này có nghĩa là tất cả các kết nối khả dụng đang được sử dụng bởi các máy khách khác. Điều này được xác định bởi tham số max_connections

Bạn có thể thấy bất kỳ triệu chứng nào sau đây

  • Chỉ số DatabaseConnections trong Amazon CloudWatch gần bằng hoặc gần với giá trị max_connections cho phiên bản Aurora MySQL DB của bạn
  • Giá trị của tham số max_connections cao hơn bộ nhớ khả dụng do lớp phiên bản CSDL cung cấp cho các kết nối. Kiểm tra các dấu hiệu như giá trị chỉ số FreeableMemory thấp trong CloudWatch
  • Bạn nhận được LỖI 1040(). Quá nhiều lỗi kết nối trong nhật ký lỗi MySQL

Bạn có thể đạt đến giá trị max_connections vì những lý do sau

  • Số lượng máy khách/ứng dụng kết nối với phiên bản CSDL tăng đột ngột hoặc tăng dần. Điều này có những nguyên nhân sau
    • Tăng khối lượng công việc dẫn đến tăng kết nối
    • Khóa mức bảng/hàng dẫn đến tăng kết nối máy khách/ứng dụng
  • Máy khách/ứng dụng không đóng kết nối đúng cách sau khi kết thúc hoạt động
  • Giá trị cao hơn cho các tham số thời gian chờ kết nối như wait_timeout và/hoặc Interactive_timeout có thể dẫn đến sự gia tăng kết nối đang ngủ

Trước khi bạn giải quyết lỗi kết nối tối đa, trước tiên hãy xem tất cả các chuỗi hiện đang chạy trên phiên bản CSDL của bạn. Sau đó, kích hoạt đăng nhập trên phiên bản DB của bạn

Hiển thị các chuỗi hiện đang chạy trên phiên bản Aurora MySQL DB

Lệnh SHOW FULL PROCESSLIST cho biết các luồng nào hiện đang chạy trên phiên bản CSDL của bạn. Đăng nhập vào phiên bản CSDL của bạn rồi chạy truy vấn sau

Bạn cũng có thể chạy truy vấn sau để nhận được tập hợp kết quả tương tự

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST

Ghi chú. Bạn phải cấp cho tài khoản người dùng của mình đặc quyền quản trị cho máy chủ MySQL PROCESS để xem tất cả các luồng đang chạy trên phiên bản CSDL MySQL. Mặt khác, SHOW PROCESSLIST chỉ hiển thị các luồng được liên kết với tài khoản MySQL mà bạn đang sử dụng. Để biết thêm thông tin, hãy xem tài liệu MySQL về Đặc quyền do MySQL cung cấp

Ghi chú. SHOW FULL PROCESSLIST và INFORMATION_SCHEMA. Các câu lệnh PROCESSLIST có thể ảnh hưởng tiêu cực đến hiệu suất vì chúng yêu cầu một mutex

Cho phép đăng nhập trên phiên bản Aurora MySQL DB

Nghị quyết

Giải quyết lỗi kết nối tối đa bằng một trong các phương pháp sau

  • Xem lại các kết nối hiện có và nếu có thể, hãy chấm dứt chúng để giải phóng áp lực kết nối. Ví dụ: bắt đầu bằng cách kết thúc kết nối ở trạng thái ngủ
  • Tăng số lượng kết nối tối đa tới phiên bản CSDL của bạn

Chấm dứt các kết nối hiện có trên phiên bản CSDL của bạn

Chấm dứt phiên người dùng hoặc truy vấn hiện đang chạy trên phiên bản CSDL của bạn bằng cách chạy các lệnh rds_kill và rds_kill_query

CALL mysql.rds_kill(thread-ID);
CALL mysql.rds_kill_query(thread-ID);

Tăng số lượng kết nối tối đa tới phiên bản CSDL của bạn

Tăng số lượng kết nối tối đa tới phiên bản CSDL của bạn bằng các phương pháp sau

  • Ghi chú. Thay đổi quy mô lớp phiên bản DB gây ra sự cố ngừng hoạt động
  • Đặt giá trị lớn hơn cho thông số max_connections bằng cách sử dụng nhóm thông số cấp phiên bản tùy chỉnh. Việc tăng tham số max_connections không gây ra sự cố ngừng hoạt động, nhưng nếu phiên bản CSDL của bạn đang sử dụng nhóm tham số mặc định thì hãy thay đổi nhóm tham số thành nhóm tham số tùy chỉnh. Thay đổi nhóm tham số gây ra sự cố ngừng hoạt động. Để biết thêm thông tin, hãy xem Làm việc với các nhóm tham số DB

Ghi chú. Số lượng kết nối tối đa được phép đối với phiên bản CSDL Aurora MySQL được xác định bởi tham số max_connections trong nhóm tham số cấp phiên bản cho phiên bản CSDL. Xem ví dụ sau

max_connections = GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})

Kiểm tra giá trị hiện tại của tham số max_connections cho phiên bản CSDL của bạn. Để thực hiện việc này, hãy kiểm tra nhóm tham số được đính kèm với phiên bản CSDL của bạn hoặc bằng cách chạy truy vấn sau

select @@max_connections;

Tham số max_connections có các thông số kỹ thuật sau

  • Có thể được đặt trên cả cụm tham số DB và nhóm tham số phiên bản DB. Tuy nhiên, cài đặt tham số cấp phiên bản có hiệu lực
  • Giá trị được phép là một số nguyên trong phạm vi 1-16000
  • Về bản chất là động (không cần khởi động lại để thay đổi giá trị tham số này)

Để biết thêm thông tin về giá trị mặc định của max_connections cho mỗi lớp phiên bản CSDL có sẵn cho Aurora MySQL, hãy xem Số kết nối tối đa tới một phiên bản CSDL Aurora MySQL

Ghi chú. Các phiên bản Cơ sở dữ liệu MySQL của Aurora MySQL và Amazon Relational Database Service (Amazon RDS) có lượng chi phí bộ nhớ khác nhau. Giá trị max_connections có thể khác đối với các phiên bản Aurora MySQL và RDS MySQL DB sử dụng cùng một lớp phiên bản. Các giá trị được liệt kê chỉ áp dụng cho Aurora MySQL

Các phương pháp hay nhất để điều chỉnh tham số max_connections

Đảm bảo xem xét những điều sau đây khi làm việc với tham số max_connections cho phiên bản CSDL của bạn

  • Các giới hạn kết nối mặc định được điều chỉnh cho các hệ thống sử dụng các giá trị mặc định cho những người sử dụng bộ nhớ chính khác, chẳng hạn như nhóm bộ đệm và bộ đệm truy vấn. Nếu bạn thay đổi các cài đặt này cho cụm DB của mình, hãy xem xét điều chỉnh giới hạn kết nối để tính đến việc tăng hoặc giảm bộ nhớ khả dụng trên các phiên bản DB
  • Đặt max_connections cao hơn một chút so với số lượng kết nối tối đa mà bạn muốn mở trên mỗi phiên bản CSDL
  • Nếu bạn cũng đã bật performance_schema, hãy cẩn thận với cài đặt tham số max_connections. Các cấu trúc bộ nhớ Lược đồ hiệu suất được định cỡ tự động dựa trên các biến cấu hình máy chủ, bao gồm max_connections. Bạn đặt biến càng cao, Lược đồ hiệu suất sử dụng bộ nhớ càng nhiều. Trong một số trường hợp nghiêm trọng, điều này có thể dẫn đến sự cố hết bộ nhớ trên các loại phiên bản nhỏ hơn, chẳng hạn như T2 và T3. Cách tốt nhất là để max_connections ở giá trị mặc định nếu bạn đang sử dụng Lược đồ hiệu suất. Nếu bạn định tăng max_connections lên một giá trị cao hơn đáng kể so với giá trị mặc định, hãy cân nhắc việc tắt Lược đồ hiệu suất. Ghi chú. Nếu bạn bật Thông tin chi tiết về hiệu suất cho một phiên bản Aurora MySQL DB, thao tác này sẽ tự động bật Lược đồ hiệu suất

Bạn cũng có thể xem xét các tham số kết nối MySQL sau để điều chỉnh

  • chờ_thời gian chờ. Số giây máy chủ đợi hoạt động trên kết nối tệp TCP/IP hoặc UNIX không tương tác trước khi đóng nó
  • Interactive_timeout. Số giây máy chủ đợi hoạt động trên một kết nối tương tác trước khi đóng nó
  • net_read_timeout. Số giây để chờ thêm dữ liệu từ kết nối TCP/IP trước khi hủy đọc
  • net_write_timeout. Số giây chờ đợi trên các kết nối TCP/IP để ghi một khối trước khi hủy ghi
  • max_execution_time. Thời gian chờ thực thi cho câu lệnh SELECT, tính bằng mili giây
  • max_connect_errors. Máy chủ bị chặn khỏi các kết nối tiếp theo nếu có nhiều hơn số lượng kết nối bị gián đoạn này
  • max_user_connections. Số lượng kết nối đồng thời tối đa được phép cho bất kỳ tài khoản MySQL cụ thể nào

Ghi chú. Bài viết này không bao gồm các giá trị được đề xuất hoặc tùy chỉnh cho các tham số này vì các giá trị này thay đổi tùy theo từng trường hợp sử dụng

Tôi có nên đóng kết nối MySQL sau mỗi truy vấn không?

Việc đóng các kết nối đang mở và giải phóng các tập kết quả là tùy chọn. Tuy nhiên, bạn nên đóng kết nối ngay sau khi tập lệnh hoàn thành việc thực hiện tất cả các hoạt động cơ sở dữ liệu của mình, nếu tập lệnh vẫn còn nhiều việc phải xử lý sau khi nhận được kết quả.

MySQL có tự động đóng kết nối không?

Lý do phổ biến nhất cho lỗi máy chủ MySQL đã biến mất là máy chủ đã hết thời gian chờ và đóng kết nối. Theo mặc định, máy chủ sẽ đóng kết nối sau 8 giờ nếu không có gì xảy ra . Bạn có thể thay đổi giới hạn thời gian bằng cách đặt biến wait_timeout khi khởi động mysqld.

Làm cách nào để đóng dòng lệnh kết nối MySQL?

Bạn cũng có thể kết thúc phiên bằng cách phát hành câu lệnh EXIT hoặc (trong Unix) bằng cách nhập Ctrl-D . Cách bạn chỉ định tham số kết nối cho mysql cũng áp dụng cho các chương trình MySQL khác như mysqldump và mysqladmin.

Bạn có nên để mở kết nối cơ sở dữ liệu?

Để có thời gian phản hồi nhanh và thông lượng cao, thực sự tốt nhất là giữ cho các kết nối cơ sở dữ liệu luôn mở và sử dụng lại chúng cho các yêu cầu tiếp theo . Hầu hết các khung cơ sở dữ liệu đều cung cấp một số loại cơ chế nhóm kết nối trong đó trình xử lý yêu cầu có thể nhận kết nối cơ sở dữ liệu cho công việc của nó và sau đó đưa nó trở lại nhóm.