Chào các bạn, cùng đến với bài viết Fix lỗi ‘MySQL server has gone away’ khi import database nhé.
Chúng ta có một tình huống như thế này : bạn có 1 database đã được dump ra file tầm 20MB, bạn chuyển file database đó sang vps/server mới và tiến hành import database đó vào hệ thống mới thì gặp phải lỗi sau :
# mysql -u root -p'pass' demo_db < demo_db.sql MySQL Error 2006 (HY000) at line 406: MySQL server has gone away
Bạn thử import đi ? import lại nhưng vẫn lỗi như trên. Nếu bạn gặp tình huống này thì dưới đây là cách giải quyết cơ bản nhất.
Nguyên nhân
Tình huống này là do khi mà hoạt động import CSDL vào CSDL mới, phải thực hiện gửi nội dung SQL-statement trong file dump cho dịch vụ MySQL, nhưng dung lượng packet chứa SQL-statement vượt quá quy định ‘max_allowed_packet‘ thì dịch vụ MySQL sẽ tự động ngắt kết nối hoạt động import hay kết nối.
Tất nhiên là vẫn còn những thông báo lỗi có liên quan đến việc tinh chỉnh ‘max_allowed_packet’, nhưng trong trường hợp này cách giải quyết sẽ là tăng giá trị ‘max_allowed_packet‘ lên.
Khắc phục
– Hãy tăng giá trị ‘max_allowed_packet‘ ở giá trị cao hơn dung lượng database bạn cần import vào. Ở ví dụ này, database của bạn có dung lượng là 20MB, thì hãy tăng giá trị ‘max_allowed_packet‘ lên 32MB. Có 2 cách để tăng :
1. Tăng tạm thời set biến ‘global’ MySQL
– Chúng ta sẽ tăng giá trị ‘max_allowed_packet‘ bằng cách set biến GLOBAL max_allowed_packet của dịch vụ MySQL đang hoạt động , không cần phải khởi động lại dịch vụ MySQL. Giá trị của bạn sẽ là : 32 x 1024 x 1024
# mysql -u root -p Enter password: mysql> SET GLOBAL max_allowed_packet=33554432
Rồi tiến hành import lại.
2. Cấu hình file dịch vụ MySQL
– Với việc thiết lập cấu hình trong file /etc/my.cnf thì khi dịch vụ MySQL có khởi động lại cũng sẽ luôn set giá trị đúng với con số mong muốn. Nếu lúc đầu tiên bạn cần tăng giá trị này thì cần khởi động lại dịch vụ MySQL.
# vi /etc/my.cnf [mysqld] max_allowed_packet=32M ...
# /etc/init.d/mysql restart
Cám ơn các bạn đã theo dõi bài viết.