LRI 2006 (HY000): Máy chủ MySQL đã biến mất


309

Tôi gặp lỗi này khi tôi cố gắng tìm nguồn tệp SQL lớn (một INSERTtruy vấn lớn ).

mysql>  source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

Không có gì trong bảng được cập nhật. Tôi đã thử xóa và xóa bảng / cơ sở dữ liệu, cũng như khởi động lại MySQL. Không có những điều này giải quyết vấn đề.

Đây là kích thước gói tối đa của tôi:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

Đây là kích thước tập tin:

$ ls -s file.sql 
79512 file.sql

Khi tôi thử phương pháp khác ...

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away

2
Làm thế nào lớn của một tập tin này là? Có thể vượt quá cài đặt max_allowed_packet không?
Marc B

1
Ok, không phải vậy đâu. Hãy thử rút ra các truy vấn riêng lẻ từ tệp và tự chạy chúng trong màn hình. một cái gì đó trong đó gây ra sự cố / ngắt kết nối.
Marc B

Các truy vấn tôi lấy ngẫu nhiên từ tệp hoạt động tốt. Tôi đã tạo SQL bằng lập trình và thoát đúng mọi thứ. Vì vậy, tôi không chắc điều gì sẽ gây ra lỗi nếu có.
bgcode

1
Tôi cũng có vấn đề tương tự ...
maaz

Câu trả lời:


561
max_allowed_packet=64M

Thêm dòng này vào my.cnftập tin giải quyết vấn đề của tôi.

Điều này hữu ích khi các cột có giá trị lớn, gây ra sự cố, bạn có thể tìm thấy lời giải thích ở đây .

Trên Windows, tệp này được đặt tại: "C: \ ProgramData \ MySQL \ MySQL Server 5.6"

Trên Linux (Ubuntu): / etc / mysql


3
giải pháp này đã giải quyết vấn đề đã nêu cho tôi; không có gì có thể được thực hiện thông qua cấu hình / tùy chọn chỉ phía máy khách và tôi không sẵn sàng đi xuống một giải pháp lập trình thông qua PHP hoặc khác.
Richard Sitze

154
Bạn cũng có thể đăng nhập vào cơ sở dữ liệu dưới dạng root (hoặc đặc quyền SUPER) và làm set global max_allowed_packet=64*1024*1024;- không yêu cầu khởi động lại MySQL cũng như
đánh bại

3
CÁi này đã sửa nó giúp tôi. my.cnf có thể được đặt trong thư mục / etc.
Sam Vloeberghs

8
Bạn sẽ có thể đặt nó trên dòng lệnh, điều này sẽ tránh việc chỉnh sửa tạm thời một tệp hệ thống: <code> mysql --max_allowed_packet = 1GM </ code>
Jan Steinman

6
Đối với bất cứ ai đang tìm kiếm vị trí của tệp my.cnf, bạn có thể kiểm tra câu trả lời này . Cũng đừng quên khởi động lại mysql bằng cách gõ: sudo service mysql restartđể các thay đổi đối với tệp my.cnf có hiệu lực.
consuela

148

Bạn có thể tăng gói được phép tối đa

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet


3
Điều này làm việc cho tôi, trong khi câu trả lời được chấp nhận thì không. Tôi đoán giá trị cao hơn của câu trả lời này là gốc rễ của giải pháp cho tôi.
John Bubriski

Tôi đặt max_allowed_packet = 1024M trong my.cnf
Csaba Toth

1
Đó là máy chủ. Bạn cũng cần phải làm điều đó trong máy khách, như "mysql --max_allowed_packet = 1073741824".
Jan Steinman

Điều này làm việc cho tôi. một câu hỏi là "1073741824" theo byte
user2478236

66

Bản cập nhật toàn cầu và cài đặt my.cnf không hoạt động đối với tôi vì một số lý do. Truyền max_allowed_packetgiá trị trực tiếp cho khách hàng làm việc ở đây:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql

4
Theo trang web MySQL, cả câu trả lời được đánh dấu và điều này nên được sử dụng.
Zenexer

2
Đừng quên tải lại các tệp cấu hình hoặc khởi động lại máy chủ sau khi thay đổi các cài đặt này
Csaba Toth

2
Hãy ghi nhớ bằng cách sử dụng --max_allowed_packetchỉ ảnh hưởng đến khách hàng. Cũng xem xét sửa đổi máy chủ mysql (mysqld) bằng cách chỉnh sửa max_allowed_packettrong /etc/my.cnftệp và khởi động lại máy chủ mysql của bạn.
Fleuv

Lưu ý rằng các giá trị thân thiện của con người là "50M" hoặc "1G" hoạt động trên cli và trong my.cnf. dev.mysql.com/doc/refman/8.0/en/USE-system-variables.html
txyoji

36

Nói chung là lỗi:

Lỗi: 2006 ( CR_SERVER_GONE_ERROR) - Máy chủ MySQL đã biến mất

có nghĩa là khách hàng không thể gửi câu hỏi đến máy chủ .


mysql nhập khẩu

Trong trường hợp cụ thể của bạn trong khi nhập tệp cơ sở dữ liệu qua mysql, điều này rất có thể có nghĩa là một số truy vấn trong tệp SQL quá lớn để nhập và chúng không thể được thực thi trên máy chủ, do đó máy khách bị lỗi trong lần xảy ra lỗi đầu tiên.

Vì vậy, bạn có những khả năng sau đây:

  • Thêm tùy chọn bắt buộc ( -f) mysqlđể tiến hành và thực hiện phần còn lại của các truy vấn.

    Điều này hữu ích nếu cơ sở dữ liệu có một số truy vấn lớn liên quan đến bộ đệm mà không liên quan.

  • Tăng max_allowed_packetwait_timeout trong cấu hình máy chủ của bạn (ví dụ ~/.my.cnf).

  • Kết xuất cơ sở dữ liệu bằng cách sử dụng --skip-extended-inserttùy chọn để phá vỡ các truy vấn lớn. Sau đó nhập lại.

  • Hãy thử áp dụng --max-allowed-packettùy chọn cho mysql.


Lý do phổ biến

Nói chung, lỗi này có thể có nghĩa là một số điều, chẳng hạn như:

  • một truy vấn đến máy chủ không chính xác hoặc quá lớn,

    Giải pháp: Tăng max_allowed_packetbiến .

    • Hãy chắc chắn rằng biến nằm dưới [mysqld]phần, không [mysql].

    • Đừng ngại sử dụng số lượng lớn để thử nghiệm (như 1G).

    • Đừng quên khởi động lại máy chủ MySQL / MariaDB.

    • Kiểm tra kỹ giá trị được đặt đúng bằng cách:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
  • Bạn đã hết thời gian chờ từ kết nối TCP / IP ở phía máy khách.

    Giải pháp: Tăng wait_timeoutbiến .

  • Bạn đã cố chạy một truy vấn sau khi kết nối với máy chủ đã bị đóng.

    Giải pháp: Một lỗi logic trong ứng dụng nên được sửa chữa.

  • Tra cứu tên máy chủ không thành công (ví dụ: sự cố máy chủ DNS) hoặc máy chủ đã được bắt đầu với --skip-networkingtùy chọn.

    Một khả năng khác là tường lửa của bạn chặn cổng MySQL (ví dụ 3306 theo mặc định).

  • Các chủ đề đang chạy đã bị giết, vì vậy hãy thử lại.

  • Bạn đã gặp một lỗi trong đó máy chủ đã chết trong khi thực hiện truy vấn.

  • Một máy khách đang chạy trên một máy chủ khác không có các đặc quyền cần thiết để kết nối.

  • Và nhiều hơn nữa, vì vậy hãy tìm hiểu thêm tại: B.5.2.9 Máy chủ MySQL đã biến mất .


Gỡ lỗi

Dưới đây là một vài ý tưởng gỡ lỗi cấp chuyên gia:

  • Kiểm tra nhật ký, vd

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
  • Kiểm tra kết nối của bạn thông qua mysql, telnethoặc các chức năng ping (ví dụ mysql_pingtrong PHP).

  • Sử dụng tcpdumpđể đánh hơi giao tiếp MySQL (sẽ không hoạt động đối với kết nối ổ cắm), ví dụ:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
  • Trên Linux, sử dụng strace. Trên BSD / Mac, hãy sử dụng dtrace/ dtruss, vd

    sudo dtruss -a -fn mysqld 2>&1

    Xem: Bắt đầu với DTracing MySQL

Tìm hiểu thêm về cách gỡ lỗi máy chủ hoặc máy khách MySQL tại: 26.5 Gỡ lỗi và chuyển MySQL .

Để tham khảo, hãy kiểm tra mã nguồn trong sql-common/client.ctệp chịu trách nhiệm ném CR_SERVER_GONE_ERRORlỗi cho lệnh máy khách.

MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
          arg, arg_length))
{
  set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
  goto end;
}

--quick không làm việc cho tôi nhưng --skip-extend-insert đã làm!
ớt

20

Chỉ trong trường hợp, để kiểm tra các biến bạn có thể sử dụng

$> mysqladmin variables -u user -p 

Điều này sẽ hiển thị các biến hiện tại, trong trường hợp này là max_allowed_packet và như ai đó đã nói trong câu trả lời khác, bạn có thể đặt tạm thời với

mysql> SET GLOBAL max_allowed_packet=1072731894

Trong trường hợp của tôi, tệp cnf không được tính đến và tôi không biết tại sao, vì vậy mã SET GLOBAL thực sự hữu ích.


Tuyệt vời để có thể xem tất cả các cài đặt cấu hình trong một lần. Cảm ơn!
DrB

20

Tôi đã khắc phục lỗi ERROR 2006 (HY000) at line 97: MySQL server has gone awayvà di chuyển thành công tệp> 5GB sql bằng cách thực hiện hai bước theo thứ tự:

  1. Đã tạo /etc/my.cnf như những người khác đã đề xuất, với các nội dung sau:

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
  2. Gắn cờ --force --wait --reconnectvào lệnh (tức là mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).

Lưu ý quan trọng: Cần thực hiện cả hai bước, vì nếu tôi không thực hiện các thay đổi đối với tệp /etc/my.cnf cũng như nối thêm các cờ đó, một số bảng bị thiếu sau khi nhập.

Hệ thống được sử dụng: OSX El Capitan 10.11.5; mysql Ver 14,14 Phân phối 5.5.51 cho osx10.8 (i386)


2
Tôi đang nhận được lỗi ngay cả sau khi làm theo tất cả các hướng dẫn.
Santosh Hegde

Đối với những người đang chạy vấn đề này trong một máy chủ được chia sẻ, không thể thay đổi tệp cấu hình, giải pháp này hoạt động rất tốt.
Felipe Costa

@SantoshHegde Có thể đã quá muộn nhưng sau khi bạn thay đổi my.cnf, bạn cần khởi động lại dịch vụ mysql của mình.
Jason Liu

11

Tôi đã có cùng một vấn đề nhưng việc thay đổi max_allowed_packet trong tệp my.ini / my.cnf trong [mysqld] đã tạo ra mánh khóe.

thêm một dòng

max_allowed_packet=500M

Bây giờ khởi động lại dịch vụ MySQL sau khi bạn hoàn thành.


@babonk có nhưng câu trả lời này hữu ích hơn vì nó nói dưới phần cần phải đi
Jason Wheeler

11

Bạn cũng có thể đăng nhập vào cơ sở dữ liệu dưới dạng root (hoặc đặc quyền SUPER) và làm

set global max_allowed_packet=64*1024*1024;

cũng không yêu cầu khởi động lại MySQL. Lưu ý rằng bạn nên sửa my.cnftệp của mình như được nêu trong các giải pháp khác:

[mysqld]
max_allowed_packet=64M

Và xác nhận thay đổi sau khi bạn khởi động lại MySQL:

show variables like 'max_allowed_packet';

Bạn cũng có thể sử dụng dòng lệnh, nhưng điều đó có thể yêu cầu cập nhật các tập lệnh start / stop có thể không tồn tại trong các bản cập nhật và bản vá hệ thống.

Theo yêu cầu, tôi đang thêm câu trả lời của riêng mình ở đây. Vui mừng khi thấy nó hoạt động!


9

Giải pháp là tăng các giá trị được cung cấp wait_timeoutvà các connect_timeouttham số trong tệp tùy chọn của bạn, dưới [mysqld]thẻ.

Tôi đã phải khôi phục bản sao lưu mysql 400 MB và điều này đã làm việc cho tôi (các giá trị tôi đã sử dụng dưới đây hơi cường điệu, nhưng bạn nhận được điểm):

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000

Blockquote


1
Tuyệt quá. Điều này giúp tôi nhận được một lỗi khác mà tôi có thể giải quyết :)
jrosell

6

Một vài điều có thể xảy ra ở đây;

  • Bạn INSERTđang chạy dài và máy khách bị ngắt kết nối. Khi nó kết nối lại, nó không chọn cơ sở dữ liệu, do đó xảy ra lỗi. Một tùy chọn ở đây là chạy tệp bó của bạn từ dòng lệnh và chọn cơ sở dữ liệu trong các đối số, như vậy;

$ mysql db_name <source.sql

  • Một cách khác là chạy lệnh của bạn thông qua phphoặc một số ngôn ngữ khác. Sau mỗi câu lệnh chạy dài, bạn có thể đóng và mở lại kết nối, đảm bảo rằng bạn được kết nối khi bắt đầu mỗi truy vấn.

Một điều đáng nói nữa là tôi nhận được lỗi gần như ngay lập tức sau sourcelệnh
bgcode

Nếu bạn gặp lỗi ngay sau lệnh nguồn, thì có khả năng MySQL không thích điều gì về truy vấn. Bạn đã kiểm tra nhật ký chung?
Chris Henry

Tôi phải tìm ra cách kiểm tra nhật ký chung .. Tôi trên MAMP và tôi không chắc nó sẽ ghi nó theo mặc định.
bgcode

Tôi đã chọn chỉ giải quyết nó bằng truy vấn PHP và cắt nó ra.
bgcode


2

Tôi gặp phải lỗi này khi tôi sử dụng Mysql Cluster, tôi không biết câu hỏi này có phải do sử dụng cụm hay không. Vì lỗi là hoàn toàn giống nhau, vì vậy hãy đưa ra giải pháp của tôi ở đây. Nhận được lỗi này vì các nút dữ liệu đột nhiên sụp đổ. Nhưng khi các nút gặp sự cố, bạn vẫn có thể nhận được kết quả chính xác bằng cách sử dụng cmd:

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

Và mysqld cũng hoạt động chính xác. Lúc đầu, tôi không thể hiểu điều gì sai. Và khoảng 5 phút sau, kết quả ndb_mgm cho thấy không có nút dữ liệu nào hoạt động. Sau đó tôi nhận ra vấn đề. Vì vậy, hãy thử khởi động lại tất cả các nút dữ liệu, sau đó máy chủ mysql đã hoạt động trở lại và mọi thứ đều ổn.

Nhưng có một điều kỳ lạ với tôi, sau khi tôi mất máy chủ mysql cho một số truy vấn, khi tôi sử dụng cmd like show tables, tôi vẫn có thể nhận được thông tin trả về như thế 33 rows in set (5.57 sec), nhưng không có thông tin bảng nào được hiển thị.


1

Đối với amazon RDS (đó là trường hợp của tôi), bạn có thể thay đổi max_allowed_packetgiá trị tham số thành bất kỳ giá trị số nào theo byte có ý nghĩa đối với dữ liệu lớn nhất trong bất kỳ thao tác chèn nào bạn có thể có (ví dụ: nếu bạn có một số giá trị blob 50mb trong phần chèn của mình, hãy đặt max_allowed_packetđến 64M = 67108864), mới hoặc hiện có parameter-group. Sau đó áp dụng nhóm tham số đó cho phiên bản MySQL của bạn (có thể yêu cầu khởi động lại thể hiện).


Nếu bạn làm việc với Amazon RDS thì điều này hoạt động. Bạn không thể đặt các giá trị toàn cầu trong RDS, như SabaGra đã chỉ ra, nếu bạn đi và sửa đổi nhóm tham số tùy chỉnh DB của mình, hãy tìm max_allowed_packet parametervà đặt nó ở kích thước phù hợp (hoặc nếu bạn có các đốm màu thực sự lớn, hãy đặt nó thành giá trị tối đa 1073741824 ) nó nên hoạt động.
G_Style

Bạn có nhận được một thất bại nhất quán khi tải cùng một tập dữ liệu hoặc hoàn toàn ngẫu nhiên không? hỏi vì tôi có cùng một vấn đề nhưng nó hoàn toàn ngẫu nhiên, sẽ thất bại 5 lần và sau đó làm việc vào ngày 5. Ngoài ra, di chuyển đến máy cục bộ của tôi và chạy từ studio hình ảnh có vẻ hữu ích nhưng thỉnh thoảng tôi vẫn sẽ gặp lỗi.
BilliD

0

Nếu nó kết nối lại và nhận được kết nối ID 2, máy chủ gần như chắc chắn đã bị sập.

Liên hệ với quản trị viên máy chủ và yêu cầu họ chẩn đoán sự cố. Không có SQL không độc hại nào làm sập máy chủ và đầu ra của mysqldump chắc chắn không nên.

Có lẽ là trường hợp quản trị viên máy chủ đã mắc một số lỗi vận hành lớn như gán kích thước bộ đệm lớn hơn giới hạn không gian địa chỉ của kiến ​​trúc hoặc nhiều hơn dung lượng bộ nhớ ảo. Nhật ký lỗi MySQL có thể sẽ có một số thông tin liên quan; họ sẽ giám sát điều này nếu họ có thẩm quyền.


0

Đây là một vấn đề hiếm gặp hơn nhưng tôi đã thấy điều này nếu ai đó đã sao chép toàn bộ thư mục / var / lib / mysql như một cách di chuyển DB của họ sang máy chủ khác. Lý do nó không hoạt động là vì cơ sở dữ liệu đang chạy và sử dụng tệp nhật ký. Đôi khi nó không hoạt động nếu có các bản ghi trong / var / log / mysql. Giải pháp là sao chép các tập tin / var / log / mysql.


0

Đối với người dùng Drupal 8 đang tìm giải pháp cho lỗi nhập DB:

Ở cuối tệp kết xuất sql có thể ra lệnh chèn dữ liệu vào bảng "webprofiler". Đó là tôi đoán một số tệp nhật ký gỡ lỗi và không thực sự quan trọng để trang web hoạt động để tất cả điều này có thể được gỡ bỏ. Tôi đã xóa tất cả các chèn đó bao gồm LOCK TABLES và UNLOCK TABLES (và mọi thứ ở giữa). Nó ở dưới cùng của tập tin sql. Vấn đề được mô tả ở đây:

https://www.drupal.org/project/devel/issues/2723437

Nhưng không có giải pháp cho nó bên cạnh việc cắt bớt bảng đó.

BTW Tôi đã thử tất cả các giải pháp từ các câu trả lời ở trên và không có gì khác giúp được.


0

Tôi đã thử tất cả các giải pháp trên, tất cả đều thất bại.

Tôi đã kết thúc với việc sử dụng -h 127.0.0.1thay vì sử dụng mặc định var/run/mysqld/mysqld.sock.


0

Thông báo lỗi này cũng xảy ra khi bạn tạo SCHema với BỘ SƯU TẬP khác với thông báo được sử dụng trong kết xuất. Vì vậy, nếu bãi chứa

CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

bạn cũng nên phản ánh điều này trong đối chiếu SCHema:

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

Tôi đã sử dụng utf8mb4_general_ci trong lược đồ, vì tập lệnh của tôi xuất phát từ bản cài đặt V8 mới, hiện đang tải DB trên bản 5.7 cũ bị hỏng và khiến tôi phát điên.

Vì vậy, có lẽ điều này giúp bạn tiết kiệm một số giờ bực bội ... :-)

(MacOS 10.3, mysql 5.7)


-1

nếu không có câu trả lời nào giải quyết được vấn đề cho bạn, tôi đã giải quyết nó bằng cách xóa các bảng và tạo lại chúng tự động theo cách này:

when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT

sau đó chỉ cần sử dụng bản sao lưu này với db của bạn và nó sẽ xóa và tạo lại các bảng bạn cần.

Sau đó, bạn chỉ sao lưu dữ liệu và thực hiện tương tự, và nó sẽ hoạt động.


-3

Làm thế nào về việc sử dụng máy khách mysql như thế này:

mysql -h <hostname> -u username -p <databasename> < file.sql

Điều này sẽ không hoạt động nếu tập tin sql si quá lớn ... đó là những gì câu hỏi về.
lesolorzanov
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.