Khi bạn thấy lỗi “MySQL server has gone away” điều đó cho biết rằng MySQL Server đang bị hết thời gian chờ kết nối. Thời gian chờ mặc định của MySQL là sau 8 giờ tức 28800 giấy sẽ tự động đóng kết nối. Tuy nhiên thời gian chờ này sẽ có thể thiết lập tùy theo máy chủ, DBA hay các nhà phát triển ứng dụng.
Để khắc phục lỗi “MySQL server has gone away” là không dễ dàng, do nó liên quan đến nhiều lớp và ứng dụng hay cấu hình của dịch vụ. Bài viết dưới đây BKHOST sẽ liệt kê một số giải pháp phổ biến giúp sửa lỗi trên.
Ví dụ lỗi “MySQL server has gone away”
Có nhiều cách để ghi lại lỗi này, dưới đây sẽ liệt kê một số cách. Ngoài ra, lỗi này còn là dấu hiệu nhận biết của một lỗi sâu hơn như sự cố của hệ thống hay lỗi của ứng dụng hoặc dịch vụ từ xa. Lúc này bạn cần kiểm tra tất các bản nhật ký ghi lỗi trong thời gian cụ thể để điều tra nguyên nhân gốc sinh ra lỗi.
Sau đây là ví dụ về lỗi:
General error: 2006 MySQL server has gone away Error Code: 2013. Lost connection to MySQL server during query Warning: Error while sending QUERY packet PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
MySQL wait_timeout
Lỗi này xuất hiện do thời gian chờ của MySQL đã vượt quá thời gian chờ tối đa. MySQL wait_timeout
được tính theo số giây mà máy chủ chờ để kết nối với một thiết bị, nên đảm bảo rằng thời gian này không quá thấp, mặc định là 28800 giây. Bạn có thể cài đặt wait_timeout tùy ý mà không có giới hạn và nó không làm ảnh hưởng đến kết nối cơ sở dữ liệu. Bạn cũng có thể kiểm tra thêm các biến như net_read_timeout
, net_write_timeout
và thêm dòng my.cnf
để thực hiện điều chỉnh của bạn:
{{EJS0}}
“MySQL connect timeout” trong PHP config
Tùy chọn mysql.connect_timeout
không chỉ dùng để hiển thị thời gian chờ kết nối mà còn là chờ đợi phản hồi đầu tiên từ MySQL. Để kiểm tra xem mysql.allow_persists
có đang bật hay không, bạn có thể điều chỉnh mysql.connect_timeout
để khớp hoặc vượt quá wait_timeout
trong MySQL.
{{EJS1}}
Ngoài ra bạn còn có thể điều chỉnh default_socket_timeout
của PHP. Ví dụ: Tạo thời gian chờ sử dụng default_socket_timeout cho tập lệnh PHP đang chạy chậm.
Lúc này lỗi “MySQL server has gone away” sẽ được giải quyết.
Bạn có thể tham khảo đoạn trích sau trước chỉ trích khi xảy ra lỗi:
“PHP theo mặc định đặt thời gian chờ đọc là 60 giây cho các luồng. Điều này được đặt qua
php.ini
,default_socket_timeout
. Mặc định này áp dụng cho tất cả các luồng không đặt giá trị thời gian chờ nào khác. mysqlnd không đặt bất kỳ giá trị nào khác và do đó các kết nối của các truy vấn đang chạy dài có thể bị ngắt kết nối sau giây default_socket_timeout dẫn đến thông báo lỗi 2006 – MySQL Server đã biến mất.”
default_socket_timeout = 90
Bạn có thể điều chỉnh max_execution_time
và max_input_time
trong php.ini nếu bạn có nhu cầu, khi thời gian kết nối với PHP cao hơn max_execution_time bạn sẽ bị ngắt kết nối bởi MySQL.
{{EJS2}}
MySQL max_allowed_packet
max_allowed_packet
là kích thước tối đa của gói, nó có kích thước mặc định là 4MB để MySQL kết nối các gói lớn hơn không cụ thể, nhưng kể từ MySQL 8 thì kích thước mặc định đã tăng lên 16MB. Khi MySQL nhận tập tin quá lớn, bạn có thể bị đóng kết nối vì nó cho rằng có gì đó không ổn. Bạn có thể tăng max_allowed_packet trong my.cnf và khởi động lại MySQL để khắc phục vấn đề này với kích thước tối đa 1GB.
MySQL innodb_log_file_size
Bạn có thể tùy chỉnh biến innodb_log_file_size
nhưng phải băng 25% của innodb_buffer_pool_size
và không dưới 20%. Số liệu này càng lớn thì khả năng khôi phục sự cố cơ sở dữ liệu càng mấy thời gian.
Ví dụ: Nếu bạn đặt kích thước innodb_buffer_pool_size
= 16G và cài đặt innodb_log_files_in_group
mặc định là ( innodb_log_files_in_group
= 2 ), thì innodb_log_file_size của bạn phải là 2G. Lúc này sẽ có 2 tệp ghi lại nhật ký được tạo kích thước là 2GB, bằng 25% innodb_buffer_pool_size
= 16G.
CẢNH BÁO: Khi thay đổi
innodb_log_file_size
hoặcinnodb_log_files_in_group
bạn cần tắt MySQL, nếu không sẽ gây ảnh hưởng đến quá trình hoạt động của hệ thống.
Các nguyên nhân khác gây ra lỗi “MySQL server has gone away”
Kết nối MySQL từ xa
Như đã đề cập ở đầu bài thì lỗi này có thể chỉ là dấu hiệu của một lỗi sâu hơn. Ví dụ: Các kết nối MySQL từ xa từ dịch vụ của bên thứ 3.
Bộ mã và đối chiếu cơ sở dữ liệu MySQL
Việc thay đổi bộ ký tự cơ sở dữ liệu mặc định là latin1 và đối chiếu mặc định thành latin general ci có thể giải quyết một số trường hợp gây ra lỗi “MySQL server has gone away”.
Vượt quá cài đặt MySQL max_connections
Max connection thiết lập số lượng kết nối máy khách đồng thời, nhưng cần lưu ý với thiết lập này. Do việc thiết lập quá lớn có thể làm cạn kiệt bộ nhớ hoặc các tài nguyên khác và tăng chi phí lập lịch. Để an toàn, bạn hãy đặt max connections gần gấp đôi số lượng kết nối máy khách mặc định.
Ví dụ: Sau thời gian dài sử dụng, kết nối máy khách đồng thời tối đa là 114, hãy đặt thành max_connections
= 250.
Cách giải quyết lỗi “MySQL server has gone away” khác
Oracle đã cung cấp một trang web giúp tự loại bỏ lỗi “MySQL server has run away… . Khi sử dụng các phương pháp này bạn cần đảm bảo rằng MySQL vẫn đang hoạt động trong khi thực hiện các câu truy vấn.
Trích: “Bạn có thể kiểm tra xem máy chủ MySQL đã chết và khởi động lại bằng cách thực thi phiên bản mysqladmin và kiểm tra thời gian hoạt động của máy chủ. Nếu kết nối máy khách bị hỏng do mysqld gặp sự cố và khởi động lại, bạn nên tập trung vào việc tìm ra lý do cho sự cố. ”
{{EJS3}}
{{EJS4}}
Tổng kết về lỗi “MySQL server has gone away”
Các nguyên nhân và phương pháp khắc phục lỗi “MySQL server has gone away” mà chúng tôi đã đề cập trên đây sẽ giúp bạn giải quyết vấn đề kết nối MySQL Server.
Nếu bạn còn bất cứ thắc mắc gì về lỗi lỗi “MySQL server has gone away” hoặc muốn tìm hiểu thêm những lỗi thường gặp khác, hãy để lại bình luận ở bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.
P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.