Nội dung bài viết
#

Lỗi “MySQL server has gone away” và cách khắc phục hiệu quả

Nội dung bài viết

    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.

    lỗi “MySQL server has gone away”

    Để 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_timemax_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ặc innodb_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.

    Mua tên miền .VN tại BKHOST

    Giá chỉ từ 750k/năm. Kiểm tra tên miền .VN đẹp và đăng ký ngay hôm nay!

    mua tên miền vn giá rẻ

    Tôi là Trịnh Duy Thanh, CEO & Founder Công ty Cổ Phần Giải Pháp Mạng Trực Tuyến Việt Nam - BKHOST. Với sứ mệnh mang tới các dịch vụ trên Internet tốt nhất cho các cá nhân và doanh nghiệp trong nước và quốc tế, tôi luôn nỗ lực hết mình nâng cấp đầu tư hệ thống phần cứng, nâng cao chất lượng dịch vụ chăm sóc khách hàng để đem đến những sản phẩm hoàn hảo nhất cho người tiêu dùng. Vì vậy, tôi tin tưởng sẽ đem đến các giải pháp CNTT mới nhất, tối ưu nhất, hiệu quả nhất và chi phí hợp lý nhất cho tất cả các doanh nghiệp.
    Bình luận
    Trượt lên đầu trang
    Miễn phí cước gọi
    Chat ngay qua Zalo
    Chat ngay qua Messenger
    Bạn đã hài lòng với trải nghiệm trên Bkhost.vn?
    Cảm ơn lượt bình chọn của bạn, Chúc bạn 1 ngày tốt lành !