Máy chủ MySQL đã biến mất khi nhập tệp sql lớn


259

Tôi đã cố gắng nhập một tệp sql lớn thông qua phpMyAdmin ... Nhưng nó vẫn hiển thị lỗi

'Máy chủ MySql đã biến mất'

Phải làm sao?


3
Giá trị của bạn cho max_allowed_packet và Wait_timeout là gì?
daemonofchaos

1
bạn có thể cố gắng tăng gấp đôi max_allowed_packet. Một chút thô, nhưng nếu nó hoạt động bạn có thể tìm thấy một giá trị lành mạnh.
Nanne

1
Cảm ơn đã cười Cole Johnson. Điều đó thật tuyệt! CƯỜI LỚN! :)
mbrinson

Tôi thấy nó thường xuyên, tình cờ. Nhưng tôi không thể tái tạo lỗi tương tự một lần nữa. Và, do đó nhận ra rằng nó có thể là năng động. Đôi khi, nếu máy khách gửi quá nhiều SQL đến máy chủ (ví dụ: từ một vòng lặp), điều này có thể xảy ra. Tìm lý do thực sự cho lỗi này là quan trọng. Kiểm tra nhật ký truy vấn của bạn để biết các mẫu SQL lặp lại để tìm ra manh mối.
Boudel tối đa

đôi khi bạn nhận được điều này khi dung lượng ổ đĩa của bạn thấp
pramodtech

Câu trả lời:


376

Như đã nêu ở đây :

Hai lý do phổ biến nhất (và sửa lỗi) cho máy chủ MySQL đã biến mất (lỗi 2006) là:

Máy chủ đã hết thời gian và đóng kết nối. Làm thế nào để khắc phục:

  1. kiểm tra xem biến Wait_timeout trong tệp cấu hình my.cnf của mysqld có đủ lớn không. Trên Debian : sudo nano /etc/mysql/my.cnf, đặt wait_timeout = 600giây (bạn có thể điều chỉnh / giảm giá trị này khi hết lỗi 2006) sudo /etc/init.d/mysql restart. Tôi đã không kiểm tra, nhưng giá trị mặc định cho Wait_timeout có thể vào khoảng 28800 giây (8 giờ).

  2. Máy chủ đánh rơi một gói không chính xác hoặc quá lớn. Nếu mysqld nhận được một gói quá lớn hoặc không chính xác, nó giả định rằng đã xảy ra sự cố với máy khách và đóng kết nối. Bạn có thể tăng giới hạn kích thước gói tối đa bằng cách tăng giá trị của max_allowed_packet trong tệp my.cnf. Trên Debian : sudo nano /etc/mysql/my.cnf, được đặt max_allowed_packet = 64M(bạn có thể điều chỉnh / giảm giá trị này khi hết lỗi 2006) sudo /etc/init.d/mysql restart.

Biên tập:

Lưu ý rằng các tệp tùy chọn MySQL không có sẵn các lệnh của chúng dưới dạng các nhận xét (ví dụ như trong php.ini). Vì vậy, bạn phải gõ bất kỳ thay đổi / tinh chỉnh trong my.cnfhay my.inivà đặt chúng trong mysql/datathư mục hoặc trong bất kỳ của những con đường khác, theo nhóm thích hợp các tùy chọn như [client], [myslqd]vv Ví dụ:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Sau đó khởi động lại máy chủ. Để nhận giá trị của chúng, hãy nhập máy khách mysql:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
Trong trường hợp của tôi, đó là biến max_allowed_packet . Nó được đặt thành mặc định là 1 MB (bạn có thể thấy điều này bằng cách chạy SHOW VARIABLEStruy vấn MySQL) và tệp tôi đang nhập có một vài bản ghi rất lớn. Tôi đã mở tệp my.ini (tôi đang chạy Windows) và đặt giá trị này : max_allowed_packet = 64M, khởi động lại MySQL và chạy lại quá trình nhập.
Brent Matzelle

Tôi đã tải các tệp lớn lên cơ sở dữ liệu bằng webissues. Điều này đã giúp, cảm ơn ... :-)
inf3rno

@BrentMatzelle Điều đó chắc chắn đã giải quyết vấn đề "Mysql đã biến mất". Cảm ơn!
asprin

2
Tôi không thể tìm thấy wait_timeoutdòng
Oki Erie Rinaldi

5
trong trường hợp có cửa sổ (với Xampp), đó là tệp my.ini và innodb_lock_wait_timeout
Ananda

98

Đối với tôi giải pháp này không hiệu quả nên tôi đã thực hiện

SET GLOBAL max_allowed_packet=1073741824;

trong máy khách SQL của tôi.

Nếu không thể thay đổi điều này với dịch vụ MYSql đang chạy, bạn nên dừng dịch vụ và thay đổi biến trong tệp "my.ini".

Ví dụ:

max_allowed_packet=20M

1
Điều này làm việc cho tôi trên MAMP (OS X) khi các câu trả lời phổ biến khác không có. Nhưng nó là vĩnh viễn?
atwixtor

2
@atwixtor không, thiết lập các biến như thế này cho đến khi máy chủ được khởi động lại. và sau đó chúng được đặt lại về giá trị mặc định.
d.raev

1
Đó là một mẹo nhỏ, trên máy XAMPP thử nghiệm trên Windows, tôi đã phải sửa đổi cả php.initệp (như được đề xuất bởi @GBD trong câu trả lời) và tệp cấu hình MySQL my.iniđể làm cho nó hoạt động.
Gruber

2
Tôi khuyên bạn nên thêm rằng bạn có thể kiểm tra kích thước hiện tại vớiSHOW variables LIKE 'max_allowed_packet'
Arth

Điều này không vĩnh viễn ở chỗ giá trị sẽ được đặt lại khi máy chủ khởi động lại (cuối cùng), nhưng nó cũng không chỉ dành cho phiên hiện tại. Đặt max_allowed_packettrong một máy khách và sau đó nhập .sqltệp lớn trong phiên khác sẽ hoạt động tốt.
VoteyDiscipl

21

Nếu bạn đang làm việc trên XAMPP thì bạn có thể khắc phục sự cố Máy chủ MySQL đã biến mất với các thay đổi sau ..

mở tệp my.ini vị trí my.ini của tôi là (D: \ xampp \ mysql \ bin \ my.ini)

thay đổi các giá trị biến sau

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

samp cho wamp, max_allowed_packet = 64M
Andrew

19

Nếu bạn đang chạy với các giá trị mặc định thì bạn có rất nhiều chỗ để tối ưu hóa cấu hình mysql của bạn.

Bước đầu tiên tôi khuyên bạn là tăng max_allowed_packet lên 128M.

Sau đó tải xuống tập lệnh MySQL Tune Primer và chạy nó. Nó sẽ cung cấp các đề xuất cho một số khía cạnh của cấu hình của bạn để có hiệu suất tốt hơn.

Cũng xem xét điều chỉnh giá trị thời gian chờ của bạn cả trong MySQL và PHP.

Làm thế nào lớn (kích thước tệp) là tệp bạn đang nhập và bạn có thể nhập tệp bằng cách sử dụng máy khách dòng lệnh mysql thay vì PHPMyAdmin?


Cảm ơn, tôi đã đặt max_allowed_packet thành 16M, sau đó tìm thấy câu hỏi này và nâng nó lên 32M với suy nghĩ chắc chắn là đủ nhưng sau đó đã thấy câu trả lời của bạn và 128M chắc chắn hoạt động. Tôi đang tập hợp rằng toàn bộ câu lệnh SQL bên trong tệp * .sql được coi là chỉ một gói?
Elijah Lynn

8

Nếu bạn đang sử dụng MAMP trên OS X, bạn sẽ cần thay đổi max_allowed_packetgiá trị trong mẫu cho MySQL.

  1. Bạn có thể tìm thấy nó tại: Tệp> Chỉnh sửa mẫu> MySQL my.cnf

  2. Sau đó, chỉ cần tìm kiếm max_allowed_packet, thay đổi giá trị và lưu.


6

Tôi đã giải quyết vấn đề của mình với tệp /etc/mysql/my.cnf ngắn này:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
xác nhận điều này cũng hoạt động với MySQL v5.6.12 trên WAMP: trên Windows, thêm các dòng "Wait_timeout" và "max_allowed_packet" ở trên vào phần [mysqld] của: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

Cảm ơn @dan đã giải quyết vấn đề cũ của tôi haha, tôi chưa bao giờ thêm các cài đặt đó trong phần[mysqld]
shivgre

Điều này hoạt động cho MySQL v5.7. my-default.ini không được tạo theo mặc định nên bạn cần tạo nó.
Rodolfo Velasco

5

Lý do khác điều này có thể xảy ra là hết bộ nhớ. Kiểm tra / var / log / message và đảm bảo rằng my.cnf của bạn không được thiết lập để khiến mysqld phân bổ nhiều bộ nhớ hơn so với máy của bạn.

Quá trình mysqld của bạn thực sự có thể bị giết bởi kernel và sau đó được khởi động lại bởi quy trình "safe_mysqld" mà bạn không nhận ra.

Sử dụng hàng đầu và xem phân bổ bộ nhớ trong khi nó đang chạy để xem khoảng không của bạn là gì.

tạo một bản sao lưu của my.cnf trước khi thay đổi nó.


Đây là những gì đã gây ra vấn đề của tôi. Tôi đã thêm một tệp hoán đổi 1GB và nó đã sửa nó hoàn toàn.
Pikamander2

5

Tôi đã gặp lỗi này và các lỗi liên quan khác, khi tôi nhập tệp SQL 16 GB. Đối với tôi, chỉnh sửa my.ini và thiết lập các mục sau (dựa trên một số bài đăng khác nhau) trong phần [mysqld]:

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Nếu bạn đang chạy trong Windows, hãy truy cập bảng điều khiển, dịch vụ và xem chi tiết về MySQL và bạn sẽ thấy my.ini ở đâu. Sau đó, sau khi bạn chỉnh sửa và lưu my.ini, hãy khởi động lại dịch vụ mysql (hoặc khởi động lại máy tính).

Nếu bạn đang sử dụng HeidiSQL, bạn cũng có thể đặt một số hoặc tất cả những thứ này bằng cách sử dụng.


2

Tôi đã cập nhật "max_allowed_packet" lên 1024M, nhưng nó vẫn không hoạt động. Hóa ra kịch bản triển khai của tôi đã chạy:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

Hãy chắc chắn chỉ định rõ ràng một số lớn hơn từ dòng lệnh nếu bạn không theo cách này.


2

Nếu dữ liệu của bạn bao gồm BLOBdữ liệu:

Lưu ý rằng việc nhập dữ liệu từ dòng lệnh dường như làm nghẹt dữ liệu BLOB, dẫn đến lỗi 'Máy chủ MySQL đã biến mất'.

Để tránh điều này, hãy tạo lại mysqldump nhưng với --hex-blobcờ:

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

sẽ ghi ra tệp dữ liệu với các giá trị hex chứ không phải nhị phân giữa các văn bản khác.

PhpMyAdmin cũng có tùy chọn "Kết xuất các cột nhị phân trong ký hiệu thập lục phân (ví dụ:" abc "trở thành 0x616263)" hoạt động độc đáo.

Lưu ý rằng có một lỗi tồn tại lâu dài (kể từ tháng 12 năm 2015) có nghĩa là GEOMcác cột không được chuyển đổi: Sao lưu bảng có cột GEOMETRY bằng mysqldump? vì vậy, sử dụng một chương trình như PhpMyAdmin dường như là cách giải quyết duy nhất (tùy chọn được ghi chú ở trên không chuyển đổi chính xác các cột GEOM).


1

Nếu phải mất một thời gian dài để thất bại, sau đó phóng to wait_timeoutbiến.

Nếu nó thất bại ngay lập tức, phóng to max_allowed_packetbiến; Nó vẫn không hoạt động, đảm bảo lệnh là SQL hợp lệ. Của tôi đã có trích dẫn không được giải thích mà làm hỏng mọi thứ lên.

Ngoài ra, nếu khả thi, hãy xem xét việc giới hạn số lần chèn của một lệnh SQL duy nhất, giả sử, 1000. Bạn có thể tạo một tập lệnh tạo nhiều câu lệnh trong một câu lệnh bằng cách giới thiệu lại phần INSERT ... mỗi lần chèn.


1

tôi đã gặp một lỗi tương tự .. để giải quyết vấn đề này chỉ cần mở tệp my.ini..trong dòng 36 không thay đổi giá trị kích thước gói tối đa được phép tức là. max_allowed_packet = 20M


1

Đảm bảo quy trình mysqld không khởi động lại vì các trình quản lý dịch vụ như systemd.

Tôi gặp vấn đề này trong mơ hồ với centos 7. Chỉnh sửa cấu hình không giúp được gì. Hóa ra đó là systemd đã giết dịch vụ mysqld mỗi khi nó chiếm quá nhiều bộ nhớ.


0

Tôi đã gặp lỗi tương tự ngày hôm nay khi sao chép cơ sở dữ liệu (máy chủ MySQL đã biến mất ...), nhưng khi tôi cố gắng khởi động lại mysql.server thì tôi gặp lỗi

ERROR! The server quit without updating PID ...

Đây là cách tôi giải quyết: Tôi đã mở Ứng dụng / Tiện ích / và chạy Activity Monitor

 quit mysqld

sau đó đã có thể giải quyết vấn đề lỗi với

mysql.server restart

0

Tôi đang thực hiện một số tính toán lớn liên quan đến kết nối mysql để duy trì thời gian dài và với dữ liệu nặng. tôi đã phải đối mặt với vấn đề "Mysql go Away". Vì vậy, tôi đã cố gắng tối ưu hóa các truy vấn nhưng điều đó không giúp tôi sau đó tôi đã tăng giới hạn biến mysql được đặt thành giá trị thấp hơn theo mặc định.

Wait_timeout max_allowed_packet

Theo giới hạn những gì phù hợp với bạn, nó phải là Số bất kỳ * 1024 (byte). bạn có thể đăng nhập vào terminal bằng lệnh ' mysql -u username - p ' và có thể kiểm tra và thay đổi các giới hạn biến này.


0

Đối với lưu trữ chia sẻ GoDaddy

Trên các tài khoản lưu trữ được chia sẻ của GoDaddy, thật khó để điều chỉnh các tệp PHP.ini, v.v. Tuy nhiên, có một cách khác và nó chỉ hoạt động hoàn hảo với tôi. (Tôi chỉ tải lên thành công file văn bản một 3.8Mb sql, chứa 3100 dòng và 145 cols. Sử dụng lệnh IMPORT trong phpMyAdmin, tôi đã nhận được sự sợ hãi máy chủ MySQL đã đi xa lỗi, và không có thêm thông tin.)

Tôi thấy rằng Matt Butcher đã có câu trả lời đúng. Giống như Matt, tôi đã thử tất cả các loại thủ thuật, từ xuất cơ sở dữ liệu MySQL thành các phần nhỏ, cho đến viết các tập lệnh phá vỡ các bản nhập lớn thành các phần nhỏ hơn. Nhưng đây là những gì đã làm việc:

(1) CPANEL ---> PHIM (nhóm) ---> BACKUP

(2a) Trong tiêu đề "Sao lưu một phần" ...
(2b) Trong "Tải xuống bản sao lưu cơ sở dữ liệu MySQL"
(2c) Chọn cơ sở dữ liệu của bạn và tải xuống bản sao lưu (bước này tùy chọn, nhưng khôn ngoan)

(3a) Trực tiếp ở bên phải của 2b, trong tiêu đề "Khôi phục sao lưu cơ sở dữ liệu MySQL"
(3b) Chọn tệp nhập .Query từ ổ đĩa cục bộ của bạn
(3c) Hạnh phúc thật sự sẽ là của bạn (trong thời gian ngắn ....) 5 giây

Tôi đã có thể sử dụng phương pháp này để nhập một bảng duy nhất. Không có gì khác trong cơ sở dữ liệu của tôi bị ảnh hưởng - nhưng đó là những gì (2) ở trên nhằm bảo vệ chống lại.

Ghi chú:
a. Nếu bạn không chắc chắn cách tạo tệp nhập .Query, hãy sử dụng phpMyAdmin để xuất bảng và sửa đổi cấu trúc tệp đó.

NGUỒN: Điều Matt Butcher 2010


Được rồi, vì vậy một downvote ngay lập tức, nhưng không có bình luận tại sao. Có phải thông tin này không làm việc cho ai đó? Nếu vậy, xin vui lòng chia sẻ - nó làm việc cho tôi, đó là lý do tại sao tôi thêm câu trả lời này. Các câu trả lời khác ở trên không hiệu quả với tôi, nhưng giải pháp này đã làm được. Vậy tại sao downvote? Nếu bạn đang sử dụng GoDaddy và điều này không phù hợp với bạn, tôi muốn biết để tôi có thể hỗ trợ. Tuy nhiên, nếu bạn không sử dụng lưu trữ chia sẻ GoDaddy, tại sao bạn lại hạ thấp câu trả lời này chỉ vì nó không áp dụng cho bạn ?
cssyphus

0

Nếu tăng max_allowed_packetkhông giúp được gì.

Tôi đã gặp lỗi tương tự như bạn khi nhập .sqltệp vào cơ sở dữ liệu của mình qua Sequel Pro.

Lỗi vẫn còn sau khi nâng cấp max_allowed_packetlên 512Mvì vậy tôi đã chạy nhập trong dòng lệnh thay vì:

mysql --verbose -u root -p DatabaseName < MySQL.sql

Nó đã đưa ra lỗi sau:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

Tôi tìm thấy một vài câu hỏi StackOverflow hữu ích:

Trong trường hợp của tôi, .sqltập tin của tôi là một chút tham nhũng hoặc một cái gì đó. Kết xuất MySQL mà chúng tôi nhận được có hai tệp zip cần được nối với nhau và sau đó được giải nén. Tôi nghĩ rằng việc giải nén đã bị gián đoạn ban đầu, để lại tệp có một số ký tự và mã hóa kỳ lạ. Nhận một kết xuất MySQL mới và giải nén nó hoạt động đúng với tôi.

Chỉ muốn thêm điều này ở đây trong trường hợp những người khác thấy rằng việc tăng max_allowed_packetbiến không giúp ích được gì.



0

Tôi có cùng một vấn đề với

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

Trong tệp \ xampp \ mysql \ bin \ my.ini của phpmyadmin, chúng tôi chỉ nhận được

[mysqldump]
max_allowed_packet=110M

vốn chỉ dành cho mysqldump -u root -p dbname. Tôi đã giải quyết vấn đề của mình bằng cách thay thế mã trên bằng

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
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.