ฉันพยายามนำเข้าไฟล์ sql ขนาดใหญ่ผ่าน phpMyAdmin ... แต่มันก็ยังแสดงข้อผิดพลาด
'เซิร์ฟเวอร์ MySql หายไปแล้ว'
จะทำอย่างไร?
max_allowed_packet
คุณสามารถพยายามที่จะเป็นสองเท่า ค่อนข้างหยาบ แต่ถ้าใช้งานได้คุณจะพบว่ามีค่า
ฉันพยายามนำเข้าไฟล์ sql ขนาดใหญ่ผ่าน phpMyAdmin ... แต่มันก็ยังแสดงข้อผิดพลาด
'เซิร์ฟเวอร์ MySql หายไปแล้ว'
จะทำอย่างไร?
max_allowed_packet
คุณสามารถพยายามที่จะเป็นสองเท่า ค่อนข้างหยาบ แต่ถ้าใช้งานได้คุณจะพบว่ามีค่า
คำตอบ:
ตามที่ระบุไว้ที่นี่ :
สองสาเหตุที่พบบ่อยที่สุด (และการแก้ไข) สำหรับเซิร์ฟเวอร์ MySQL ได้หายไป (ข้อผิดพลาด 2006) คือ:
เซิร์ฟเวอร์หมดเวลาและปิดการเชื่อมต่อ วิธีแก้ไข:
ตรวจสอบว่าตัวแปร wait_timeout ในไฟล์กำหนดค่า my.cnf ของ mysqld ของคุณใหญ่พอ ใน Debian:
sudo nano /etc/mysql/my.cnf
ชุดwait_timeout = 600
วินาที (คุณสามารถปรับแต่ง / ลดค่านี้เมื่อเกิดข้อผิดพลาด 2006 จะหายไป)sudo /etc/init.d/mysql restart
แล้ว ฉันไม่ได้ตรวจสอบ แต่ค่าเริ่มต้นสำหรับ wait_timeout อาจอยู่ที่ประมาณ 28800 วินาที (8 ชั่วโมง)เซิร์ฟเวอร์หลุดแพ็คเก็ตที่ไม่ถูกต้องหรือใหญ่เกินไป หาก mysqld ได้รับแพ็คเก็ตที่มีขนาดใหญ่เกินไปหรือไม่ถูกต้องจะถือว่ามีบางอย่างผิดพลาดกับไคลเอ็นต์และปิดการเชื่อมต่อ คุณสามารถเพิ่มขีด จำกัด ขนาดแพ็คเก็ตสูงสุดโดยการเพิ่มค่าของ max_allowed_packet ในไฟล์ my.cnf ใน Debian:
sudo nano /etc/mysql/my.cnf
ชุดmax_allowed_packet = 64M
(คุณสามารถปรับแต่ง / ลดค่านี้เมื่อเกิดข้อผิดพลาด 2006 จะหายไป)sudo /etc/init.d/mysql restart
แล้ว
แก้ไข:
ขอให้สังเกตว่าไฟล์ตัวเลือก MySQL ไม่มีคำสั่งของพวกเขาแล้วเป็นความคิดเห็น (เช่นใน php.ini เป็นต้น) ดังนั้นคุณจะต้องพิมพ์การเปลี่ยนแปลงใด ๆ / ปรับแต่งในmy.cnf
หรือmy.ini
และวางไว้ในmysql/data
ไดเรกทอรีหรือในใด ๆ ของเส้นทางอื่น ๆ ภายใต้กลุ่มที่เหมาะสมของตัวเลือกเช่น[client]
, [myslqd]
ฯลฯ ตัวอย่างเช่น:
[mysqld]
wait_timeout = 600
max_allowed_packet = 64M
จากนั้นรีสตาร์ทเซิร์ฟเวอร์ เพื่อรับค่าของพวกเขาพิมพ์ในไคลเอนต์ mysql:
> select @@wait_timeout;
> select @@max_allowed_packet;
SHOW VARIABLES
แบบสอบถาม MySQL) และไฟล์ที่ฉันนำเข้ามีระเบียนที่มีขนาดใหญ่มาก ฉันเปิดไฟล์my.ini (ฉันใช้ Windows) และตั้งค่าเป็น: max_allowed_packet = 64M
เริ่ม MySQL ใหม่และรันการนำเข้าอีกครั้ง
wait_timeout
แถวไม่ได้
สำหรับฉันวิธีนี้ไม่ได้ผลดังนั้นฉันจึงดำเนินการ
SET GLOBAL max_allowed_packet=1073741824;
ในไคลเอนต์ SQL ของฉัน
หากไม่สามารถเปลี่ยนแปลงสิ่งนี้ได้ด้วยบริการ MYSql คุณควรหยุดให้บริการและเปลี่ยนตัวแปรในไฟล์ "my.ini"
ตัวอย่างเช่น:
max_allowed_packet=20M
php.ini
ไฟล์ (ตามคำแนะนำของ @GBD ในคำตอบ) และไฟล์ MySQL config my.ini
เพื่อให้มันทำงานได้
SHOW variables LIKE 'max_allowed_packet'
max_allowed_packet
ไคลเอนต์หนึ่งแล้วนำเข้า.sql
ไฟล์ขนาดใหญ่ในเซสชั่นอื่นจะทำงานได้ดี
หากคุณกำลังทำงานกับ XAMPP คุณสามารถแก้ไขปัญหาเซิร์ฟเวอร์ MySQL ได้หายไปจากการเปลี่ยนแปลงดังต่อไปนี้
เปิดไฟล์ my.ini ของคุณที่ตั้ง my.ini คือ (D: \ xampp \ mysql \ bin \ my.ini)
เปลี่ยนค่าตัวแปรต่อไปนี้
max_allowed_packet = 64M
innodb_lock_wait_timeout = 500
หากคุณใช้งานด้วยค่าเริ่มต้นคุณจะมีพื้นที่มากมายสำหรับปรับแต่งค่า mysql ของคุณ
ขั้นตอนแรกที่ฉันแนะนำคือเพิ่ม max_allowed_packet เป็น 128M
จากนั้นดาวน์โหลดสคริปต์ MySQL Tuning Primerและเรียกใช้ มันจะให้คำแนะนำกับหลายแง่มุมของการกำหนดค่าของคุณเพื่อประสิทธิภาพที่ดี
ดูการปรับค่าการหมดเวลาของคุณทั้งใน MySQL และ PHP
ไฟล์ที่คุณนำเข้ามีขนาดใหญ่เท่าใดและคุณสามารถนำเข้าไฟล์โดยใช้ไคลเอนต์บรรทัดคำสั่ง mysql แทน PHPMyAdmin
หากคุณใช้ MAMP บน OS X คุณจะต้องเปลี่ยนmax_allowed_packet
ค่าในเทมเพลตสำหรับ MySQL
คุณสามารถค้นหาได้ที่: ไฟล์> แก้ไขเทมเพลต> MySQL my.cnf
จากนั้นเพียงแค่ค้นหาmax_allowed_packet
เปลี่ยนค่าและบันทึก
ฉันแก้ไขปัญหาด้วยไฟล์ /etc/mysql/my.cnf สั้น ๆ นี้:
[mysqld]
wait_timeout = 600
max_allowed_packet = 100M
[mysqld]
เหตุผลอื่นที่สามารถเกิดขึ้นได้คือหน่วยความจำไม่เพียงพอ ตรวจสอบ / var / log / messages และตรวจสอบให้แน่ใจว่า my.cnf ของคุณไม่ได้ตั้งค่าเพื่อให้ mysqld จัดสรรหน่วยความจำมากกว่าที่เครื่องของคุณมี
กระบวนการ mysqld ของคุณสามารถถูกฆ่าได้โดยเคอร์เนลและเริ่มต้นใหม่โดยกระบวนการ "safe_mysqld" โดยที่คุณไม่รู้ตัว
ใช้ด้านบนและดูการจัดสรรหน่วยความจำในขณะที่ทำงานเพื่อดูว่าส่วนหัวของคุณคืออะไร
ทำสำเนาสำรองของ my.cnf ก่อนที่จะเปลี่ยน
ฉันมีข้อผิดพลาดนี้และสิ่งที่เกี่ยวข้องอื่น ๆ เมื่อฉันนำเข้าไฟล์ 16 GB SQL สำหรับฉันการแก้ไข my.ini และการตั้งค่าต่อไปนี้ (ขึ้นอยู่กับการโพสต์ต่างๆ) ในส่วน [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
หากคุณใช้ Windows ให้ไปที่แผงควบคุมบริการและดูรายละเอียดของ MySQL และคุณจะเห็นว่า my.ini อยู่ที่ไหน จากนั้นหลังจากที่คุณแก้ไขและบันทึก my.ini ให้เริ่มบริการ mysql ใหม่ (หรือรีสตาร์ทคอมพิวเตอร์)
หากคุณใช้ HeidiSQL คุณสามารถตั้งค่าบางส่วนหรือทั้งหมดได้โดยใช้
ฉันอัปเดต "max_allowed_packet" เป็น 1024M แต่มันยังไม่ทำงาน ปรากฎว่าสคริปต์การปรับใช้ของฉันทำงานอยู่:
mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql
ตรวจสอบให้แน่ใจว่าได้ระบุหมายเลขที่ใหญ่กว่าจากบรรทัดคำสั่งอย่างชัดเจนหากคุณไม่ได้รับสิ่งนี้
หากข้อมูลของคุณมีBLOB
ข้อมูล:
โปรดทราบว่าการนำเข้าข้อมูลจากบรรทัดคำสั่งดูเหมือนจะทำให้หายใจไม่ออกในข้อมูล BLOB ส่งผลให้เกิดข้อผิดพลาด 'เซิร์ฟเวอร์ MySQL หายไปแล้ว'
เพื่อหลีกเลี่ยงปัญหานี้ให้สร้าง mysqldump ขึ้นใหม่ แต่ใช้--hex-blob
แฟล็ก:
http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob
ซึ่งจะเขียนไฟล์ข้อมูลที่มีค่าฐานสิบหกมากกว่าไบนารีในข้อความอื่น ๆ
PhpMyAdmin ยังมีตัวเลือก "คอลัมน์ไบนารีการถ่ายโอนข้อมูลในรูปแบบเลขฐานสิบหก (เช่น" abc "กลายเป็น 0x616263)" ซึ่งทำงานได้ดี
โปรดทราบว่ามีข้อผิดพลาดที่ยาวนาน (ณ เดือนธันวาคม 2558) ซึ่งหมายความว่าGEOM
คอลัมน์จะไม่ถูกแปลง:
สำรองข้อมูลตารางด้วยคอลัมน์ GEOMETRY โดยใช้ mysqldump หรือไม่
ดังนั้นการใช้โปรแกรมอย่าง PhpMyAdmin จึงเป็นวิธีแก้ปัญหาเพียงอย่างเดียว (ตัวเลือกที่กล่าวถึงข้างต้นไม่สามารถแปลงคอลัมน์ GEOM ได้อย่างถูกต้อง)
หากใช้เวลานานในการล้มเหลวให้ขยายwait_timeout
ตัวแปร
ถ้ามันล้มเหลวทันทีขยายmax_allowed_packet
ตัวแปร; มันยังคงไม่ทำงานตรวจสอบให้แน่ใจว่าคำสั่งนั้นเป็น SQL ที่ถูกต้อง ฉันมีคำพูดที่ไม่หลีกเลี่ยงซึ่งทำให้ทุกอย่างสับสน
นอกจากนี้หากเป็นไปได้ให้พิจารณา จำกัด จำนวนการแทรกของคำสั่ง SQL หนึ่งคำสั่งถึง 1,000 คุณสามารถสร้างสคริปต์ที่สร้างหลายคำสั่งจากคำสั่งเดียวโดยการแทรกคำสั่ง INSERT ... อีกครั้งทุกส่วนแทรก
ฉันได้รับข้อผิดพลาดที่คล้ายกัน .. เพื่อแก้ปัญหานี้เพียงแค่เปิดไฟล์ my.ini .. ที่บรรทัดที่ 36 เปลี่ยนค่าของขนาดแพ็คเก็ตสูงสุดที่อนุญาตเช่น max_allowed_packet = 20M
ตรวจสอบให้แน่ใจว่ากระบวนการ mysqld ไม่รีสตาร์ทเนื่องจากผู้จัดการบริการเช่น systemd
ฉันมีปัญหาในคนจรจัดที่มี centos 7 การปรับแต่งการตั้งค่าไม่ได้ช่วย ปรากฎว่ามันเป็น systemd ซึ่งฆ่าบริการ mysqld ทุกครั้งเมื่อใช้หน่วยความจำมากเกินไป
ฉันมีข้อผิดพลาดที่คล้ายกันในวันนี้เมื่อทำซ้ำฐานข้อมูล (เซิร์ฟเวอร์ MySQL หายไป ... ) แต่เมื่อฉันพยายามรีสตาร์ท mysql.server รีสตาร์ทฉันมีข้อผิดพลาด
ERROR! The server quit without updating PID ...
นี่คือวิธีที่ฉันแก้ไข: ฉันเปิดแอพพลิเคชั่น / ยูทิลิตี้ / และเรียกใช้การตรวจสอบกิจกรรม
quit mysqld
จากนั้นก็สามารถที่จะแก้ปัญหาข้อผิดพลาดด้วย
mysql.server restart
ฉันกำลังทำการคำนวณขนาดใหญ่ซึ่งเกี่ยวข้องกับการเชื่อมต่อ mysql เพื่ออยู่นานและมีข้อมูลจำนวนมาก ฉันหันหน้าไปทางนี้ "ปัญหา Mysql หายไป" ดังนั้นฉันจึงพยายามปรับการค้นหาให้เหมาะสม แต่นั่นไม่ได้ช่วยฉันฉันจึงเพิ่มตัวแปร mysql ซึ่งกำหนดเป็นค่าที่ต่ำกว่าเป็นค่าเริ่มต้น
wait_timeout max_allowed_packet
เพื่อ จำกัด สิ่งที่เหมาะสมกับคุณควรเป็น Any Number * 1024 (Bytes) คุณสามารถเข้าสู่ระบบเทอร์มินัลโดยใช้คำสั่ง' mysql -u ชื่อผู้ใช้ - p ' และสามารถตรวจสอบและเปลี่ยนแปลงข้อ จำกัด ของตัวแปรเหล่านี้
ใน GoDaddy ที่ใช้ร่วมกันพื้นที่บัญชีมันเป็นเรื่องยากที่จะปรับแต่งไฟล์ PHP.ini ฯลฯ อย่างไรก็ตามมีวิธีอื่นและมันก็ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน (ฉันเพิ่งอัปโหลดไฟล์ข้อความ 3.8Mb .sql ที่ประสบความสำเร็จมี 3100 แถวและ 145 cols การใช้คำสั่งนำเข้าใน phpMyAdmin ฉันได้รับเซิร์ฟเวอร์ MySQL ที่น่ากลัวได้หายไปและไม่มีข้อมูลเพิ่มเติม)
ฉันพบว่า Matt Butcher มีคำตอบที่ถูก เช่นเดียวกับ Matt ฉันได้ลองใช้เทคนิคทุกประเภทตั้งแต่การส่งออกฐานข้อมูล MySQL เป็นชิ้นขนาดเล็กไปจนถึงการเขียนสคริปต์ที่ทำลายการนำเข้าขนาดใหญ่เป็นชิ้นเล็ก ๆ แต่นี่คือสิ่งที่ทำงาน:
(1) CPANEL ---> ไฟล์ (กลุ่ม) ---> BACKUP
(2a) ภายใต้หัวข้อ "การสำรองข้อมูลบางส่วน" ...
(2b) ภายใต้ "ดาวน์โหลดการสำรองฐานข้อมูล MySQL"
(2c) เลือกฐานข้อมูลของคุณและดาวน์โหลดการสำรองข้อมูล (ขั้นตอนนี้ไม่จำเป็น แต่ฉลาด)
(3a) ตรงไปทางขวาของ 2b ภายใต้หัวข้อ "เรียกคืนการสำรองฐานข้อมูล MySQL"
(3b) เลือกไฟล์นำเข้า. SQL จากไดรฟ์ในเครื่องของคุณ
(3c) ความสุขที่แท้จริงจะเป็นของคุณ (ในไม่ช้า .... ) 5 วินาที
ฉันสามารถใช้วิธีนี้เพื่อนำเข้าตารางเดียว ไม่มีสิ่งใดในฐานข้อมูลของฉันที่ได้รับผลกระทบ - แต่นั่นคือขั้นตอน (2) ด้านบนที่มีจุดประสงค์เพื่อป้องกัน
หมายเหตุ:
หากคุณไม่แน่ใจเกี่ยวกับวิธีสร้างไฟล์นำเข้า. SQL ให้ใช้ phpMyAdmin เพื่อส่งออกตารางและแก้ไขโครงสร้างไฟล์นั้น
แหล่งที่มา: บทความ Matt Butcher 2010
max_allowed_packet
ไม่ได้ช่วยฉันได้รับข้อผิดพลาดเดียวกับคุณเมื่อนำเข้า .sql
ไฟล์ไปยังฐานข้อมูลของฉันผ่านทาง Sequel Pro
ข้อผิดพลาดยังคงอยู่หลังจากที่เพิ่มmax_allowed_packet
ไปยัง512M
ดังนั้นฉันจึงรันการนำเข้าในบรรทัดคำสั่งแทนด้วย:
mysql --verbose -u root -p DatabaseName < MySQL.sql
มันทำให้เกิดข้อผิดพลาดดังต่อไปนี้:
ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled
ฉันพบคำถาม StackOverflow ที่เป็นประโยชน์สองข้อ:
ในกรณีของฉันของฉัน .sql
ไฟล์เสียหายเล็กน้อยหรือบางอย่าง การถ่ายโอนข้อมูล MySQL ที่เราได้รับมาในไฟล์ zip สองไฟล์ที่ต้องต่อกันเข้าด้วยกันแล้วคลายซิป ฉันคิดว่าการขยายไฟล์ถูกขัดจังหวะในขั้นต้นโดยปล่อยให้ไฟล์มีตัวอักขระและการเข้ารหัสแปลก รับการถ่ายโอนข้อมูล MySQL สดและการขยายไฟล์มันทำงานได้อย่างถูกต้องสำหรับฉัน
ต้องการเพิ่มที่นี่ในกรณีที่คนอื่นพบว่าการเพิ่มmax_allowed_packet
ตัวแปรไม่ได้ช่วย
การแก้ปัญหาเกี่ยวกับขนาดแพ็คเก็ตหรือการหมดเวลาไม่มีความแตกต่างสำหรับฉัน ฉันจำเป็นต้องปิดการใช้งาน ssl
mysql -u -p -hmyhost.com --disable-ssl db < file.sql
https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html
ฉันมีปัญหาเดียวกันกับ
$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);
ใน \ xampp \ mysql \ bin \ my.ini ไฟล์ของ phpmyadmin เราได้รับเท่านั้น
[mysqldump]
max_allowed_packet=110M
ซึ่งใช้สำหรับ mysqldump -u root -p dbname ฉันแก้ไขปัญหาด้วยการแทนที่โค้ดด้านบนด้วย
max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M