Lỗi MySQL 2006: Máy chủ mysql đã biến mất


238

Tôi đang chạy một máy chủ tại văn phòng của mình để xử lý một số tệp và báo cáo kết quả cho máy chủ MySQL từ xa.

Quá trình xử lý tệp mất một thời gian và quá trình chết giữa chừng với lỗi sau:

2006, MySQL server has gone away

Tôi đã nghe nói về cài đặt MySQL, Wait_timeout , nhưng tôi có cần thay đổi nó trên máy chủ tại văn phòng của tôi hoặc máy chủ MySQL từ xa không?


2
nó phụ thuộc vào máy chủ phù thủy đó đưa ra lỗi
bksi


11
Đối với những người đến đây từ Google: Nếu thay đổi max_allowed_packetkích thước hoặc wait_timeoutsố lượng không khắc phục được, hãy kiểm tra mức sử dụng bộ nhớ của bạn. Tôi đã nhận được cùng một lỗi và nó đã được gây ra bởi máy chủ của tôi hết bộ nhớ. Tôi đã thêm một tệp hoán đổi 1GB và nó đã sửa nó.
Pikamander2

2
@ Pikamander2 cảm ơn vì gợi ý!
ihsan

4
Oh! Vì vậy, tất cả là dối trá? Máy chủ Mysql thực sự không đi đâu cả? Nó vẫn ở ngay trong máy chủ của tôi chứ? Whao! :))
Damilola Olowookere

Câu trả lời:


32

Có thể dễ dàng hơn để kiểm tra nếu kết nối và thiết lập lại nếu cần.

Xem PHP: mysqli_ping để biết thông tin về điều đó.


Điểm hay, nếu bạn có một quy trình không liên tục thì tốt hơn là giải phóng kết nối của bạn để bạn không sử dụng hết tất cả các kết nối. Xây dựng lại kết nối thường rẻ. +1
Yzmir Ramirez

1
vào năm 2018: mysqli_ping bị trục xuất
fb

@fb những gì được sử dụng để làm điều đó với PDO?
beppe9000

359

Tôi đã gặp điều này nhiều lần và tôi thường thấy câu trả lời là cài đặt mặc định rất thấp max_allowed_packet.

Nâng nó trong /etc/my.cnf(dưới [mysqld]) lên 8 hoặc 16M thường sửa nó. (Mặc định trong MySql 5.7 4194304là 4 MB.)

[mysqld]
max_allowed_packet=16M

Lưu ý: Chỉ cần tạo dòng nếu nó không tồn tại

Lưu ý: Điều này có thể được đặt trên máy chủ của bạn khi nó đang chạy.

Sử dụng set global max_allowed_packet=104857600. Điều này đặt nó thành 100MB.


28
Lưu ý rằng điều này có thể được đặt trên máy chủ của bạn khi nó đang chạy. Sử dụng: "đặt toàn cầu max_allowed_packet = 104857600". LƯU Ý: Giá trị của tôi đặt thành 100MB.
rickumali

26
Đối với người dùng xampp, có thể tìm thấy my.cnf tại: C: \ xampp \ mysql \ bin \
Valentin Despa

3
trên WAMP: C: \ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini, đặt max_allowed_packet = 500M trong [wampmysqld]
Elia Weiss

2
Đã sửa lỗi của tôi rồi :)
Altaf Hussain

2
Lưu ý quan trọng: Tôi đã phải khởi động lại máy chủ mysql của mình để hiệu ứng này có hiệu lực. tức là mysql.server stop, mysql.server start(tháng 10 năm 2018, MySQL v5.7, MacOS)
Nitin Nain

41

Tôi đã có cùng một vấn đề nhưng thay đổi max_allowed_packettrong my.ini/my.cnftập tin theo [mysqld]thực hiện các mẹo.

thêm một dòng

max_allowed_packet = 500M

bây giờ restart the MySQL servicekhi bạn đã hoàn thành


5
Anh chàng kia viết 16 triệu, bạn viết 500M, ý nghĩa của cài đặt này là gì?
pal4life

1
@ pal4life Đó là kích thước tối đa của các câu lệnh chèn được phép. Điều gì sẽ xảy ra nếu câu lệnh chèn của bạn lớn hơn 16M (Nếu câu lệnh bao gồm các cột longblob hoặc hơn) Để ở bên an toàn hơn, hãy làm cho nó lớn như 500M nếu bạn đang chèn một lượng dữ liệu khổng lồ.
Sathish D

Điều này làm việc cho tôi nhưng tôi không biết tại sao. Giá trị mặc định là 1M nhưng khi tôi thay đổi thành 100M thì lỗi đã biến mất. Vấn đề bắt đầu khi tôi đặt Wait_timeout = 30 trong nỗ lực giảm số lượng luồng không hoạt động trên máy chủ của tôi.
Vincent

36

Tôi đã sử dụng lệnh sau trong dòng lệnh MySQL để khôi phục cơ sở dữ liệu MySQL có kích thước hơn 7GB và nó hoạt động.

set global max_allowed_packet=268435456;

tự hỏi tại sao điều này đã bị hạ thấp? có nghĩa là lỗi liên quan đến kích thước gói ...
FlorinelChis

Điều này đã giải quyết vấn đề của tôi, nó không liên quan đến câu hỏi theo cách trực tiếp nhưng sẽ giúp mọi người có vấn đề khác này.
Migerusantte

Để kiểm tra xem đã thay đổi hay xem giá trị hiện tại, người ta có thể sử dụngshow variables like 'max_allowed_packet';
Marcin

16

Lỗi: 2006 ( CR_SERVER_GONE_ERROR )

Tin nhắn: Máy chủ MySQL đã biến mất

Nói chung, bạn có thể thử lại kết nối và sau đó thực hiện lại truy vấn để giải quyết vấn đề này - thử như thế 3-4 lần trước khi từ bỏ hoàn toàn.

Tôi sẽ cho rằng bạn đang sử dụng PDO. Nếu vậy thì bạn sẽ bắt Ngoại lệ PDO, tăng bộ đếm và sau đó thử lại nếu bộ đếm dưới ngưỡng.

Nếu bạn có một truy vấn gây ra thời gian chờ, bạn có thể đặt biến này bằng cách thực hiện:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

Trong đó 300 là số giây bạn nghĩ thời gian tối đa mà truy vấn có thể mất.

Thông tin thêm về cách giải quyết các vấn đề kết nối Mysql.

EDIT: Hai cài đặt khác bạn có thể muốn sử dụng là net_write_timeoutnet_read_timeout.


16

Trong MAMP (phiên bản không chuyên nghiệp) tôi đã thêm

--max_allowed_packet=268435456

đến ...\MAMP\bin\startMysql.sh

Tín dụng và biết thêm chi tiết tại đây


Cảm ơn rất nhiều cho việc này!
TechyDude

Làm! Cảm ơn bạn!
Simon Franzen

11

Lỗi này xảy ra do hết hạn Wait_timeout.

Chỉ cần truy cập máy chủ mysql kiểm tra Wait_timeout của nó:

mysql HIỂN THỊ BIỂU TƯỢNG THÍCH 'Wait_timeout'

mysql đặt toàn cầu Wait_timeout = 600 # 10 phút hoặc thời gian chờ tối đa bạn cần

http://sggidel.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html


Tôi không hiểu tại sao mọi người lại đánh giá thấp câu trả lời này?! Là hữu ích cho tôi.
Basil Musa

11

Có một số nguyên nhân gây ra lỗi này.

Liên quan đến MySQL / MariaDB:

  • wait_timeout - Thời gian tính bằng giây mà máy chủ chờ kết nối hoạt động trước khi đóng.
  • interactive_timeout - Thời gian tính bằng giây mà máy chủ chờ kết nối tương tác.
  • max_allowed_packet- Kích thước tối đa tính bằng byte của gói hoặc chuỗi được tạo / trung gian. Đặt lớn như BLOB lớn nhất, theo bội số của 1024.

Ví dụ về my.cnf :

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

Máy chủ liên quan:

  • Máy chủ của bạn có bộ nhớ đầy - kiểm tra thông tin về RAM với free -h

Khung liên quan:

  • Kiểm tra cài đặt khung của bạn. Django sử dụng ví dụ CONN_MAX_AGE(xem tài liệu )

Cách gỡ lỗi:

  • Kiểm tra giá trị của các biến MySQL / MariaDB.
    • với sql: SHOW VARIABLES LIKE '%time%';
    • dòng lệnh: mysqladmin variables
  • Bật độ dài cho lỗi:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • Kiểm tra tài liệu để biết thêm thông tin về lỗi

9

Trên cửa sổ, những kẻ sử dụng xampp nên sử dụng đường dẫn này xampp / mysql / bin / my.ini và thay đổi max_allowed_packet (trong phần [mysqld]) theo kích thước bạn chọn. ví dụ

max_allowed_packet=8M

Một lần nữa trên php.ini (xampp / php / php.ini) thay đổi upload_max_filesize kích thước lựa chọn. ví dụ

upload_max_filesize=8M

Đã cho tôi một cơn đau đầu đôi khi cho đến khi tôi phát hiện ra điều này. Hy vọng nó giúp.


đây nên là câu trả lời được chọn
bysanchy

Tôi không thể tìm thấy upload_max_filesizebiến. Nó luôn luôn không được nhận ra trong mysql của tôi
Aminah Nuraini

9

Tôi đã gặp lỗi tương tự trên máy chủ Ubuntu DigitalOcean của tôi.

Tôi đã thử thay đổi max_allowed_packet và cài đặt Wait_timeout nhưng cả hai đều không sửa nó.

Hóa ra máy chủ của tôi đã hết RAM. Tôi đã thêm một tệp hoán đổi 1GB và nó đã khắc phục vấn đề của tôi.

Kiểm tra bộ nhớ của bạn free -hđể xem nếu đó là những gì gây ra nó.


1
Cảm ơn bạn rất nhiều! Tôi đã có cùng một vấn đề trên DigitalOcean của tôi và giải pháp này đã hoạt động! Tôi đã chạy nhiều phiên bản của tập lệnh của mình nhưng sau một số luồng, nó đột nhiên dừng lại và giết tất cả các kết nối hiện có. Bây giờ tất cả đều tốt.
Stalinko

7

Đó là vấn đề RAM đối với tôi.

Tôi đã gặp vấn đề tương tự ngay cả trên một máy chủ có 12 lõi CPU và RAM 32 GB. Tôi đã nghiên cứu thêm và cố gắng giải phóng RAM. Đây là lệnh tôi đã sử dụng trên Ubuntu 14.04 để giải phóng RAM:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Và, nó đã sửa mọi thứ. Tôi đã đặt nó dưới cron để chạy mỗi giờ.

crontab -e

0 * * * * bash /root/ram.sh;

Và, bạn có thể sử dụng lệnh này để kiểm tra lượng RAM miễn phí có sẵn:

free -h

Và, bạn sẽ nhận được một cái gì đó như thế này:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G

5

Trong trường hợp của tôi, nó là giá trị thấp của open_files_limit biến, điều này đã chặn quyền truy cập của mysqld vào các tệp dữ liệu.

Tôi đã kiểm tra nó với:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

Sau khi tôi thay đổi biến thành giá trị lớn, máy chủ của chúng tôi đã hoạt động trở lại:

[mysqld]
open_files_limit = 100000

5

Nếu bạn đang sử dụng WAMPSERVER 64 bit, vui lòng tìm kiếm nhiều lần xuất hiện của max_allowed_packet vì WAMP sử dụng giá trị được đặt trong [wampmysqld64] và không phải giá trị được đặt trong [mysqldump], mà đối với tôi là vấn đề, tôi đã cập nhật sai. Đặt cái này thành cái gì đó như max_allowed_packet = 64M.

Hy vọng rằng điều này sẽ giúp những người dùng Wamperver khác ngoài kia.


5

Điều này thường chỉ ra các vấn đề kết nối hoặc thời gian chờ máy chủ MySQL . Nói chung có thể được giải quyết bằng cách thay đổi Wait_timeoutmax_allowed_packet trong my.cnf hoặc tương tự.

Tôi muốn đề xuất những giá trị sau:

chờ đợi_outout = 28800

max_allowed_packet = 8M


4

Đối với Hộp Vagrant, đảm bảo bạn phân bổ đủ bộ nhớ cho hộp

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end

1
Cảm ơn bạn vì điều này :)
SynackSA

4

Kịch bản không thể xảy ra là bạn có tường lửa giữa máy khách và máy chủ buộc thiết lập lại TCP vào kết nối.

Tôi gặp vấn đề đó và tôi thấy tường lửa F5 của công ty chúng tôi đã được định cấu hình để chấm dứt các phiên không hoạt động trong thời gian rảnh hơn 5 phút.

Một lần nữa, đây là kịch bản không thể xảy ra.


4

Luôn luôn là một ý tưởng tốt để kiểm tra nhật ký của máy chủ Mysql, vì lý do tại sao nó biến mất.

Nó sẽ cho bạn biết.


4

Nếu bạn đang sử dụng máy chủ xampp:

Truy cập xampp -> mysql -> bin -> my.ini

Thay đổi tham số dưới đây:

max_allowed_packet = 500M

innodb_log_file_size = 128M

Điều này đã giúp tôi rất nhiều :)


3

bỏ ghi chú bên dưới trong của bạn my.ini/my.cnf, điều này sẽ chia tệp lớn của bạn thành phần nhỏ hơn

# binary logging format - mixed recommended
# binlog_format=mixed

ĐẾN

# binary logging format - mixed recommended
binlog_format=mixed

3

Tôi đã tìm thấy giải pháp cho "# 2006 - Máy chủ MySQL đã biến mất" lỗi này. Giải pháp chỉ là bạn phải kiểm tra hai tập tin

  1. config.inc.php
  2. config.sample.inc.php

Đường dẫn của các tệp này trong windows là

C:\wamp64\apps\phpmyadmin4.6.4

Trong hai tệp này, giá trị này:

$cfg['Servers'][$i]['host']must be 'localhost' .

Trong trường hợp của tôi, đó là:

$cfg['Servers'][$i]['host'] = '127.0.0.1';

thay đổi nó thành:

"$cfg['Servers'][$i]['host']" = 'localhost';

Đảm bảo trong cả hai:

  1. config.inc.php
  2. tập tin config.sample.inc.php nó phải là 'localhost'.

Và bộ cuối cùng:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

Sau đó khởi động lại Wamperver.


Để thay đổi tên người dùng và mật khẩu phpmyadmin

Bạn có thể trực tiếp thay đổi tên người dùng và mật khẩu của phpmyadmin thông qua tệp config.inc.php

Hai dòng này

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

Tại đây bạn có thể cung cấp tên người dùng và mật khẩu mới. Sau khi thay đổi, lưu tệp và khởi động lại máy chủ WAMP.


2

Tôi nhận được thông báo Error 2006 trong phần mềm máy khách MySQL khác nhau trên máy tính để bàn Ubuntu của tôi. Hóa ra phiên bản trình điều khiển JDBC của tôi đã quá cũ.


2

Đây có thể là một vấn đề về kích thước tệp .sql của bạn.

Nếu bạn đang sử dụng xampp. Chuyển đến bảng điều khiển xampp -> Nhấp vào cấu hình MySql -> Mở my.ini.

Tăng kích thước gói.

max_allowed_packet = 2M -> 10M

2

Có một cách dễ dàng hơn nếu bạn đang sử dụng XAMPP. Mở bảng điều khiển XAMPP và nhấp vào nút cấu hình trong phần mysql.
nhập mô tả hình ảnh ở đây

Bây giờ bấm vào my.ini và nó sẽ mở trong trình chỉnh sửa. Cập nhật max_allowed_packet theo kích thước yêu cầu của bạn.

nhập mô tả hình ảnh ở đây

Sau đó khởi động lại dịch vụ mysql. Bấm vào dừng trên dịch vụ Mysql bấm bắt đầu lại. Đợi vài phút. nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Sau đó thử chạy lại truy vấn Mysql của bạn. Hy vọng nó sẽ làm việc.


2

MAMP 5.3, bạn sẽ không tìm thấy my.cnf và việc thêm chúng không hoạt động vì max_allowed_packet được lưu trữ trong các biến.

Một giải pháp có thể là:

  1. Truy cập http: // localhost / phpmyadmin
  2. Chuyển đến tab SQL
  3. Chạy SHOW VARIABLES và kiểm tra các giá trị, nếu nó nhỏ thì chạy với các giá trị lớn
  4. Chạy truy vấn sau, nó đặt max_allowed_packet thành 7gb:

    đặt max_allowed_packet toàn cầu = 268435456;

Đối với một số người, bạn cũng có thể cần tăng các giá trị sau:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;

0

Đối với người dùng sử dụng XAMPP, có 2 tham số max_allowed_packet trong C: \ xampp \ mysql \ bin \ my.ini.


0

Lỗi này về cơ bản xảy ra vì hai lý do.

  1. Bạn có RAM quá thấp.
  2. Kết nối cơ sở dữ liệu được đóng lại khi bạn cố gắng kết nối.

Bạn có thể thử mã này dưới đây.

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

Nó giảm nhẹ lỗi bất kể lý do đằng sau nó, đặc biệt là vì lý do thứ hai.

Nếu nguyên nhân là do RAM thấp, bạn phải tăng hiệu quả kết nối cơ sở dữ liệu từ mã, từ cấu hình cơ sở dữ liệu hoặc đơn giản là tăng RAM.


0

Chỉ trong trường hợp này giúp bất cứ ai:

Tôi đã gặp lỗi này khi tôi mở và đóng các kết nối trong một chức năng sẽ được gọi từ một số phần của ứng dụng. Chúng tôi có quá nhiều kết nối nên chúng tôi nghĩ rằng có thể nên sử dụng lại kết nối hiện có hoặc vứt bỏ nó và tạo một kết nối mới như vậy:

  public static function getConnection($database, $host, $user, $password)
 {
 if (!self::$instance) {
  return self::newConnection($database, $host, $user, $password);
 } elseif ($database . $host . $user != self::$connectionDetails) {

tự :: $ dụ-> truy vấn ('KILL CONNMENT_ID ()'); tự :: $ dụ = null; return self :: newConnection ($ cơ sở dữ liệu, $ host, $ user, $ password); } tự trả về :: $ dụ; } Hóa ra chúng ta đã quá kỹ lưỡng với việc giết chóc và vì vậy các quy trình thực hiện những điều quan trọng trên kết nối cũ không bao giờ có thể kết thúc việc kinh doanh của họ. Vì vậy, chúng tôi đã bỏ những dòng này

  self::$instance->query('KILL CONNECTION_ID()');
  self::$instance = null;

và vì phần cứng và thiết lập của máy cho phép, chúng tôi đã tăng số lượng kết nối được phép trên máy chủ bằng cách thêm

max_connections = 500

vào tập tin cấu hình của chúng tôi. Điều này đã khắc phục vấn đề của chúng tôi bây giờ và chúng tôi đã học được điều gì đó về việc giết các kết nối mysql.


-5

Nếu bạn biết bạn sẽ ngoại tuyến trong một thời gian, bạn có thể đóng kết nối của mình, xử lý, kết nối lại và viết báo cáo của bạn.


2
Đây thực sự là một câu trả lời khả thi, vì MySQL đóng kết nối nhàn rỗi sau tám giờ.
Bojan Hrnkas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.