MONA.Host
Contents
Khi sử dụng máy tính người dùng thường gặp những lỗi phần mềm chẳng hạn như lỗi MySQL Server Has Gone Away, là điều không thể tránh khỏi. Đối với người dùng không am hiểu về kỹ thuật, khắc phục lỗi có thể là thách thức khá lớn, đòi hỏi nhiều thời gian và công sức. Hiểu rõ nguyên nhân gây ra lỗi sẽ giúp bạn xử lý nhanh chóng hơn. Trong bài viết này, MONA Host chia sẻ đến bạn nguyên nhân và cách giải quyết lỗi MySQL Server Has Gone Away hiệu quả, cùng khám phá nhé.
Lỗi Mysql Server Has Gone Away là gì?
Lỗi MySQL Server Has Gone Away xảy ra khi kết nối giữa máy khách (client) và máy chủ cơ sở dữ liệu MySQL gặp gián đoạn trong quá trình truy vấn, dẫn đến máy khách không thể liên lạc với máy chủ.
Nguyên nhân chủ yếu dẫn đến lỗi này là do thời gian chờ (timeout) giữa máy khách và máy chủ vượt mức cho phép. MySQL thiết lập thời gian chờ mặc định là 8 giờ, tuy nhiên, quản trị viên có thể điều chỉnh con số này theo nhu cầu. Khi vượt quá thời gian chờ, kết nối sẽ bị ngắt.

Ngoài ra, lỗi này cũng có thể xảy ra nếu truy vấn yêu cầu truyền tải hoặc nhận dữ liệu lớn hơn khả năng xử lý của máy chủ, dẫn đến máy chủ quá tải và không thể hoàn thành tác vụ.
Với người dùng website mã nguồn WordPress, lỗi ERROR 2006 (HY000) MySQL server has gone away xảy ra khi hosting bị giới hạn tài nguyên. Để khắc phục, bạn cần điều chỉnh các tham số MySQL như max_allowed_packet (kích thước gói tin tối đa) và wait_timeout (thời gian chờ), đồng thời tối ưu hóa truy vấn và nâng cấp tài nguyên máy chủ nếu cần thiết.
Nguyên nhân gây ra lỗi Mysql Server Has Gone Away
Để xử lý lỗi MySQL Server Has Gone Away một cách hiệu quả, đầu tiên bạn cần xác định nguyên nhân gây ra lỗi này. Một số nguyên nhân thường gặp dẫn đến lỗi Mysql server là:
Server hết thời gian chờ
Khi MySQL Server phát hiện một kết nối không hoạt động trong một khoảng thời gian nhất định, nó sẽ tự động đóng kết nối đó để bảo vệ tài nguyên của hệ thống. Khoảng thời gian này được gọi là thời gian chờ (timeout). Nếu mã nguồn của bạn mất quá nhiều thời gian để xử lý một truy vấn, kết nối đó có thể hết thời gian chờ và bị đóng. Khi điều này xảy ra, bạn sẽ nhận được thông báo lỗi Mysql Server Has Gone Away.

Để khắc phục lỗi này, bạn có thể tăng thời gian chờ kết nối bằng cách chỉnh sửa giá trị của biến wait_timeout trong tệp cấu hình my.cnf của máy chủ MySQL. Thay đổi giá trị này sẽ kéo dài thời gian chờ trước khi một kết nối không hoạt động bị đóng.
Ngoài ra, bạn cũng nên kiểm tra mã nguồn của mình để xác định nguyên nhân khiến truy vấn mất quá nhiều thời gian xử lý. Có thể do truy vấn không được tối ưu hóa hoặc có vấn đề nào đó trong cơ sở dữ liệu. Khi đã xác định được nguyên nhân, bạn có thể thực hiện các biện pháp để tối ưu hóa truy vấn và cải thiện hiệu suất của mã nguồn, từ đó tránh được lỗi Mysql Server Has Gone Away.
Truy vấn MySQL lỗi
Một nguyên nhân khác dẫn đến lỗi Mysql Server Has Gone Away có thể bắt nguồn từ các vấn đề liên quan đến truy vấn MySQL chẳng hạn như:

- Kích thước truy vấn quá lớn: Khi truy vấn trả về một lượng lớn dữ liệu, kích thước gói tin có thể vượt quá giới hạn mà máy chủ MySQL cho phép. Điều này thường xảy ra với các câu lệnh SELECT hoặc INSERT có dữ liệu lớn. Để giải quyết, bạn có thể tăng giới hạn kích thước gói tin bằng cách cấu hình tham số max_allowed_packet trên máy chủ MySQL.
- Lỗi trong truy vấn: Nếu truy vấn chứa lỗi cú pháp hoặc lỗi logic, máy chủ MySQL có thể đóng kết nối. Do đó, hãy đảm bảo rằng truy vấn của bạn được viết đúng cú pháp và tuân thủ các quy tắc của MySQL để tránh tình trạng này.
- Lỗi kết nối mạng: Sự cố kết nối mạng giữa ứng dụng và máy chủ MySQL có thể dẫn đến mất kết nối. Hãy kiểm tra đường truyền mạng và đảm bảo rằng không có sự cố mạng gây ra vấn đề này.
Ngoài ra, lỗi này cũng có thể xảy ra khi người dùng chủ động đóng kết nối để thực hiện một truy vấn khác.
Timeout từ TCP / IP quá hạn
Lỗi MySQL Server Has Gone Away có thể xảy ra khi kết nối TCP/IP giữa ứng dụng và máy chủ MySQL bị mất hoặc thời gian chờ vượt quá giới hạn cho phép như:
- Kết nối hết thời gian chờ: Khi thời gian chờ kết nối đã hết và không nhận được phản hồi từ máy chủ MySQL, lỗi này có thể xảy ra.
- Truy vấn mất quá nhiều thời gian: Nếu một truy vấn MySQL mất quá nhiều thời gian để hoàn thành, thời gian chờ truy vấn có thể vượt quá giới hạn và dẫn đến lỗi ERROR 2006 (HY000) MySQL server has gone away
- Lỗi mạng: Mất kết nối mạng hoặc mạng chậm cũng có thể dẫn đến lỗi MySQL Server Has Gone Away
Client vô hiệu hóa việc kết nối lại sau khi timeout
Nếu kết nối bị gián đoạn do hết thời gian chờ, thông thường máy chủ hoặc các thành phần khác sẽ tự động thực hiện kết nối lại. Tuy nhiên, khi máy khách (client) vô hiệu hóa tính năng tự động kết nối lại này, việc mất kết nối với máy chủ sẽ vẫn xảy ra như trước.

Điều này có nghĩa là, sau khi một kết nối bị gián đoạn do timeout, nếu không có cơ chế tự động kết nối lại được kích hoạt, bạn sẽ phải thực hiện kết nối lại thủ công. Việc này có thể gây gián đoạn trong quá trình truyền tải dữ liệu và làm giảm hiệu suất của ứng dụng
Gửi yêu cầu sai lệch đến máy chủ
Khi gửi yêu cầu không đúng đến máy chủ MySQL, bạn có thể gặp lỗi MySQL Server Has Gone Away, một vài lý do phổ biến thường gặp như:
- Truy vấn cú pháp sai: Truy vấn có cú pháp không chính xác khiến máy chủ MySQL không thể hiểu và xử lý.
- Kiểu dữ liệu không phù hợp: Truy vấn sử dụng kiểu dữ liệu không đúng, ví dụ như cố gắng lưu trữ một giá trị không phải là số vào cột số.
- Không tuân thủ quy tắc MySQL: MySQL có các quy tắc ngữ cảnh mà truy vấn phải tuân theo, vi phạm những quy tắc này có thể gây ra lỗi.
Gửi gói tin có kích thước quá lớn tới máy chủ MySQL
Lỗi MySQL Server Has Gone Away thường xuất hiện khi bạn gửi gói tin vượt quá kích thước giới hạn đến máy chủ MySQL. Giới hạn kích thước gói tin mặc định là 16MB, nếu gói tin của bạn lớn hơn giới hạn này, kết nối có thể bị đóng lại.
Để tránh lỗi này, hãy đảm bảo rằng kích thước gói tin của bạn nhỏ hơn giới hạn được cấu hình trên máy chủ. Ngoài ra, bạn có thể nâng cấp lên phiên bản MySQL mới hơn để hỗ trợ kích thước gói tin lớn hơn.
INSERT hoặc thay thế query số lượng quá lớn
Một nguyên nhân khác có thể dẫn đến lỗi MySQL Server Has Gone Away là do bạn thực hiện INSERT hoặc UPDATE quá nhiều hàng trong một truy vấn. Để tránh tình trạng này, bạn nên giảm số lượng hàng được gửi trong mỗi truy vấn bằng cách chia thành nhiều truy vấn nhỏ hơn.

Ví dụ, nếu bạn cần thêm 1.000 hàng vào một bảng, thay vì sử dụng một truy vấn INSERT với 1.000 hàng, hãy chia thành 10 truy vấn INSERT, mỗi truy vấn thêm 100 hàng. Việc này sẽ giúp giảm tải cho máy chủ MySQL và hạn chế khả năng xảy ra lỗi xảy ra.
Cách khắc phục lỗi Mysql Server Has Gone Away hiệu quả
Để khắc phục lỗi MySQL Server Has Gone Away hiệu quả, bạn có thể thử các cách sau:
Tăng set biến Global MySQL
Để khắc phục lỗi MySQL Server Has Gone Away do kích thước gói tin quá lớn, bạn có thể tăng giá trị biến toàn cục max_allowed_packet tạm thời trong MySQL. Dưới đây là các bước thực hiện:
Mở terminal và đăng nhập vào MySQL với quyền root.
Nhập lệnh sau để đăng nhập:
mysql -u root -p
Sau khi đăng nhập, nhập mật khẩu của bạn.
Tiếp theo, nhập lệnh sau để tăng giá trị max_allowed_packet lên 32MB:
sql> SET GLOBAL max_allowed_packet=33554432
Nhấn Enter để thực hiện lệnh.
Giá trị 33554432 tương đương với 32MB, và bạn có thể tăng giá trị này nếu cần thiết. Sau khi thực hiện các bước này, bạn có thể tiếp tục quá trình import dữ liệu.
Cấu hình file dịch vụ MySQL
Để khắc phục lỗi MySQL Server Has Gone Away do gói tin quá lớn một cách lâu dài, bạn có thể điều chỉnh cấu hình trong tệp /etc/my.cnf. Các bước cụ thể như sau:
Mở tệp /etc/my.cnf bằng trình chỉnh sửa văn bản.
Tìm phần [mysqld].
Thêm dòng max_allowed_packet=32M vào cuối phần [mysqld].
Lưu và đóng tệp /etc/my.cnf.
Khởi động lại dịch vụ MySQL bằng lệnh:
/etc/init.d/mysql restart
Giá trị 32M tương đương với 32MB. Bạn có thể điều chỉnh giá trị này dựa trên nhu cầu thực tế của mình.
>> Cách sửa lỗi Server IP address could not be found
Một số ví dụ về lỗi MySQL server has gone away
Một trong những lỗi thường gặp khi làm việc với MySQL là lỗi 2006 MySQL server has gone away. Lỗi này có thể có nhiều nguyên nhân khác nhau, và cũng có nhiều cách để khắc phục. Sau đây MONA Host sẽ liệt kê một số lỗi mà người dùng thường hay gặp:
MySQL wait_timeout
Một trong những nguyên nhân phổ biến dẫn đến lỗi MySQL Server Has Gone Away là giá trị wait_timeout của MySQL quá thấp. Tham số này xác định thời gian mà máy chủ sẽ duy trì kết nối với một thiết bị trước khi ngắt kết nối. Mặc định, wait_timeout được đặt là 28800 giây, nhưng bạn có thể điều chỉnh giá trị này theo nhu cầu.

Điều chỉnh wait_timeout không ảnh hưởng đến hiệu suất hay tính ổn định của kết nối cơ sở dữ liệu. Ngoài ra, bạn cũng nên kiểm tra và cấu hình lại các tham số khác như net_read_timeout và net_write_timeout trong tệp my.cnf để áp dụng các thay đổi mới.
Lỗi PHP config “MySQL connect timeout”
mysql.connect_timeout không chỉ là thời gian chờ để kết nối với MySQL mà còn là thời gian chờ để nhận được phản hồi đầu tiên từ MySQL. Bạn có thể kiểm tra trạng thái của mysql.allow_persists bằng cách điều chỉnh mysql.connect_timeout sao cho phù hợp hoặc lớn hơn wait_timeout trong MySQL.
Bạn cũng có thể thay đổi default_socket_timeout của PHP.
Ví dụ: Đặt thời gian chờ sử dụng default_socket_timeout cho các tập lệnh PHP chạy lâu. Lỗi “MySQL server has gone away” sẽ được khắc phục.
Ngoài ra, bạn có thể tham khảo thêm một số thông tin về lỗi này:
Tham số thời gian chờ mặc định PHP được cấu hình trong php.ini, default_socket_timeout. Nếu không có tham số thời gian chờ nào khác được đặt thì tham số mặc định này sẽ được áp dụng. Mysqlnd không đặt bất kỳ tham số nào khác và do đó các kết nối của các truy vấn kéo dài có thể bị ngắt sau giây default_socket_timeout, gây ra lỗi 2006 – MySQL Server đã biến mất.”
Nếu cần, bạn cũng có thể điều chỉnh max_execution_time và max_input_time trong php.ini, khi thời gian kết nối với PHP vượt quá max_execution_time, bạn sẽ bị ngắt kết nối bởi MySQL.
>> Nguyên nhân và cách fix lỗi Server Execution Failed
MySQL max_allowed_packet
max_allowed_packet dùng để xác định kích thước gói dữ liệu lớn nhất mà MySQL có thể gửi hoặc nhận. Giá trị mặc định của nó là 4MB cho các phiên bản MySQL trước 8.0, và 16MB cho các phiên bản từ 8.0 trở lên. Nếu bạn cố gắng gửi hoặc nhận một tập tin vượt quá giới hạn này, MySQL sẽ ngắt kết nối và báo lỗi. Để khắc phục điều này, bạn cần chỉnh sửa tệp my.cnf và tăng giá trị max_allowed_packet lên một mức phù hợp với nhu cầu của bạn, tối đa là 1GB. Sau đó, bạn phải khởi động lại MySQL để áp dụng thay đổi.

MySQL innodb_log_file_size
Bạn có thể điều chỉnh giá trị của innodb_log_file_size, nhưng nó phải bằng ít nhất 20% và không quá 25% của innodb_buffer_pool_size. Giá trị này càng cao thì thời gian phục hồi dữ liệu khi xảy ra sự cố càng ngắn.
Ví dụ: Nếu bạn thiết lập innodb_buffer_pool_size = 16G và để mặc định innodb_log_files_in_group là ( innodb_log_files_in_group = 2 ), thì bạn nên đặt innodb_log_file_size là 2G. Khi đó, sẽ có 2 tập tin nhật ký có dung lượng là 2GB, tương đương với 25% innodb_buffer_pool_size = 16G.
Lưu ý: Khi bạn thay đổi innodb_log_file_size hoặc innodb_log_files_in_group, bạn phải dừng MySQL, nếu không sẽ gây ra lỗi cho hệ thống.
Hy vọng với bài viết trên của MONA Host đã giúp bạn có thêm thông tin về lỗi mysql server has gone away. Nếu bạn vẫn còn thắc mắc hoặc muốn biết thêm về các lỗi khác liên quan đến MySQL Server, hãy để lại bình luận dưới đây để đội ngũ của MONA Host hỗ trợ giải đáp cho bạn nhanh chóng.
Bài viết liên quan
Đăng ký để nhận các bài nghiên cứu, blog, thông tin mới nhất từ chúng tôi
