รหัสข้อผิดพลาด: 2013. สูญเสียการเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ระหว่างการสืบค้น


252

ฉันได้รับรหัสข้อผิดพลาด: 2013 การเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ในระหว่างข้อผิดพลาดของแบบสอบถามเมื่อฉันพยายามเพิ่มดัชนีไปยังตารางโดยใช้ MySQL Workbench ฉันสังเกตเห็นด้วยว่าจะปรากฏขึ้นเมื่อใดก็ตามที่ฉันเรียกใช้แบบสอบถามยาว

มีการเพิ่มค่าการหมดเวลาหรือไม่

คำตอบ:


473

เวอร์ชั่นใหม่ของ MySQL WorkBench มีตัวเลือกในการเปลี่ยนการหมดเวลาที่เฉพาะเจาะจง

สำหรับฉันมันอยู่ภายใต้การแก้ไขการตั้งค่า→→แก้ไข SQL การเชื่อมต่อ DBMS อ่านหมดเวลา (ในไม่กี่วินาที): 600

เปลี่ยนค่าเป็น 6000

นอกจากนี้ยังไม่มีการทำเครื่องหมายแถวขีด จำกัด เช่นเดียวกับการวางขีด จำกัด ในทุกครั้งที่ฉันต้องการค้นหาชุดข้อมูลทั้งหมดที่น่าเบื่อ


2
เป็นไปได้ไหมที่จะเพิ่มขีด จำกัด นี้เกิน 99,999 วินาที? DBMS connection read time outฟิลด์ยอมรับเฉพาะถึง 5 ตัวเลขและการตั้งค่าข้อมูลเป็น 0 จะเทียบเท่ากับพารามิเตอร์เริ่มต้น (600 วินาที) (Windows 7 64-bit Ultimate, MySQL Workbench 5.2.47 CE)
Franck Dernoncourt

2
การติดตามstackoverflow.com/q/16877574/395857ปัญหานี้ได้รับการแก้ไขแล้ว ( bugs.mysql.com/bug.php?id=69395 )
Franck Dernoncourt

4
ยกเลิกการเลือกแถว จำกัด ในในการแก้ไขการตั้งค่า→การสืบค้น SQL
Jon

7
หลังจากเริ่มต้นใหม่จะแสดงข้อผิดพลาด 2013 อีกครั้งแม้จะหมดเวลาอ่านตั้งค่าเป็น 6,000 ดังนั้นนี่จึงไม่ใช่วิธีแก้ปัญหา
Davicus

4
อย่าลืมรีสตาร์ท Workbench AND เพื่อปิดหน้าต่างคิวรีที่เปิดอยู่ทั้งหมดก่อน!
pimbrouwers

32

เริ่มต้นเซิร์ฟเวอร์ DB กับ comandline ตัวเลือกnet_read_timeout/ wait_timeoutและมูลค่าที่เหมาะสม (เป็นวินาที) - --net_read_timeout=100ตัวอย่างเช่น:

สำหรับการอ้างอิงดูที่นี่และที่นี่


1
สิ่งนี้ถูกต้อง แต่คำตอบที่มีจำนวนครั้งมากที่สุดช่วยฉันได้จริงๆ
Sambit Tripathy

6
ฉันจะระบุพารามิเตอร์นี้ในบรรทัดคำสั่งได้อย่างไร เมื่อฉันพยายามเชื่อมต่อกับฐานข้อมูล: mysql -u root -p --net_read_timeout = 60 หรือเมื่อฉันพยายามเริ่มบริการ บริการ sudo mysql เริ่มต้นหรือไม่ ที่ทั้งสองแห่งเกิดข้อผิดพลาด: ตัวแปรที่ไม่รู้จัก 'net_read_timeout'
Vikas Goel

@VikasGoel มันเป็นพารามิเตอร์ฝั่งเซิร์ฟเวอร์ mysqldกล่าวคือ
Chloe

29

หากแบบสอบถามของคุณมีข้อมูลหยดปัญหานี้สามารถแก้ไขได้โดยใช้การmy.iniเปลี่ยนแปลงตามที่เสนอในคำตอบนี้ :

[mysqld]
max_allowed_packet=16M

โดยค่าเริ่มต้นนี้จะเป็น 1M (ค่าสูงสุดที่อนุญาตคือ 1024M) หากค่าที่ให้มาไม่ได้เป็นหลายเท่าของ 1024K จะถูกปัดเศษเป็นทวีคูณที่ใกล้เคียงที่สุดของ 1024K โดยอัตโนมัติ

ในขณะที่หัวข้ออ้างอิงเป็นเรื่องเกี่ยวกับข้อผิดพลาด MySQL 2006การตั้งค่าmax_allowed_packetจาก 1M เป็น 16M ไม่ได้แก้ไขข้อผิดพลาด 2013 ที่ปรากฏขึ้นสำหรับฉันเมื่อใช้แบบสอบถามยาว

สำหรับผู้ใช้ WAMP: คุณจะพบการตั้งค่าสถานะใน[wampmysqld]ส่วน


นี่เป็นปัญหาของฉันอย่างแน่นอน ฉันกำลังนำเข้าการสำรองฐานข้อมูลจากไฟล์และ MySQL Workbench รายงานข้อผิดพลาดปี 2556 นี้ตามด้วย "การทำงานล้มเหลวด้วย exitcode 1" ปรากฎว่าการสำรองข้อมูลมีคอลัมน์หยดขนาดใหญ่เกินขนาด max_allowed_packet ขนาดเริ่มต้นของ MySQL เป็น 4M การเพิ่มนี้คงที่ (MySQL 5.6 และ Workbench 6.2.3) ขอบคุณ!
zAlbee

นี่คือการแก้ไขสำหรับฉันด้วย แม้ว่าฉันจะตั้งเป็น 256M สำหรับเครื่อง Windows
smoore4

มี 16M รับข้อผิดพลาดนั้นด้วยไฟล์นำเข้าหลายครั้งเปลี่ยนเป็น 32M แล้วจึงใช้งานได้
hakre

15

เพิ่มสิ่งต่อไปนี้ลงในไฟล์ / etc / mysql / cnf:

innodb_buffer_pool_size = 64M

ตัวอย่าง:

key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
innodb_buffer_pool_size = 64M

6
คุณแน่ใจหรือว่าชื่อไฟล์/etc/mysql/cnfนั้นถูกต้อง? ไม่ควร/etc/my.cnfหรือ
Peter VARGA

12
SET @@local.net_read_timeout=360;

คำเตือน: สิ่งต่อไปนี้จะไม่ทำงานเมื่อคุณใช้งานในการเชื่อมต่อระยะไกล:

SET @@global.net_read_timeout=360;

360 คืออะไร มิลลิวินาทีวินาทีนาทีหรือไม่
MasterJoe2

10

มีสามสาเหตุที่เป็นไปได้สำหรับข้อความแสดงข้อผิดพลาดนี้

  1. โดยปกติจะระบุปัญหาการเชื่อมต่อเครือข่ายและคุณควรตรวจสอบสภาพเครือข่ายของคุณหากข้อผิดพลาดนี้เกิดขึ้นบ่อยครั้ง
  2. บางครั้งรูปแบบ“ ระหว่างการสืบค้น” เกิดขึ้นเมื่อมีการส่งแถวจำนวนหลายล้านแถวซึ่งเป็นส่วนหนึ่งของแบบสอบถามอย่างน้อยหนึ่งรายการ
  3. บ่อยครั้งที่มันสามารถเกิดขึ้นได้เมื่อไคลเอ็นต์พยายามเชื่อมต่อเริ่มต้นกับเซิร์ฟเวอร์

สำหรับรายละเอียดเพิ่มเติม อ่าน >>

สาเหตุที่ 2:

SET GLOBAL interactive_timeout=60;

จากค่าเริ่มต้นของ 30 วินาทีถึง 60 วินาทีหรือนานกว่านั้น

สาเหตุที่ 3:

SET GLOBAL connect_timeout=60;

2 ให้ข้อผิดพลาดนี้แก่ฉัน - รหัส: 1227 การเข้าถึงถูกปฏิเสธ; คุณต้องการ (อย่างน้อยหนึ่งใน) สิทธิพิเศษสำหรับการดำเนินการนี้
MasterJoe2

9

ขอบคุณมันใช้งานได้แล้ว แต่ด้วยการอัพเดท mysqldb การกำหนดค่าได้กลายเป็น:

max_allowed_packet

net_write_timeout

net_read_timeout

mysql doc


8

คุณควรตั้งค่าคุณสมบัติ 'interactive_timeout' และ 'wait_timeout' ในไฟล์กำหนดค่า mysql เป็นค่าที่คุณต้องการ


สิ่งนี้ช่วยฉันได้ 'interactive_timeout' ใน my.cnf ถูกตั้งค่าเป็น 100 นั่นคือสั้นเกินไป หลังจากที่ฉันเปลี่ยนเป็น 3600 s (หรือค่าใด ๆ ที่ใหญ่พอสำหรับคุณ), แก้ไขปัญหาแล้ว
CobraBJ

7

เพียงแค่ทำการอัพเกรด MySQL ที่จะสร้างใหม่เครื่องยนต์ InnoDB พร้อมกับการสร้างของตารางหลาย ๆ ที่จำเป็นสำหรับการทำงานที่เหมาะสมของ MySQL เช่นperformance_schema,information_schemaฯลฯ

ออกคำสั่งด้านล่างจากเปลือกของคุณ:

sudo mysql_upgrade -u root -p

ข้อผิดพลาดไม่ได้ปรากฏตัวจนกว่า MySQL Workbench 6.1.4 (และหลังจากนั้นไม่นาน) และเกิดขึ้นใน 6.1.6 เช่นกัน (แต่หลังจากใช้ไปเพียงไม่กี่ครั้ง) ดังนั้นฉันจึงไม่แน่ใจว่าการสร้างเซิร์ฟเวอร์หลายตัวใหม่เป็นวิธีแก้ไขสำหรับ ปัญหาที่เกิดขึ้นกับ GUI ตัวเดียวเมื่อไม่นานมานี้
Davicus

นี่เป็นการแก้ไขปัญหาของฉัน ฉันเพิ่งใช้ Ansible เพื่อติดตั้งฐานข้อมูลบนฐานข้อมูลที่มีอยู่และสิ่งต่างๆก็ยุ่งเหยิงไปหมด การรันคำสั่งนี้จะคืนค่าทุกอย่างให้เป็นระเบียบ
Jubz

4

ฉันรู้ว่ามันเก่า แต่ใช้ mac

1. Control-click your connection and choose Connection Properties.
2. Under Advanced tab, set the Socket Timeout (sec) to a larger value.


3

ลองใช้เพื่อยกเลิกการเลือก จำกัด แถวในแก้ไขการตั้งค่า→แบบสอบถาม SQL

เพราะคุณควรตั้งค่าคุณสมบัติ 'interactive_timeout' และ 'wait_timeout' ในไฟล์ config mysql ให้เป็นค่าที่คุณต้องการ


3

หากคุณประสบปัญหานี้ระหว่างการกู้คืนไฟล์ดัมพ์ขนาดใหญ่และสามารถแยกแยะปัญหาที่มีส่วนเกี่ยวข้องกับเครือข่าย (เช่นการเรียกใช้งานบน localhost) มากกว่าโซลูชันของฉันอาจมีประโยชน์

mysqldump ของฉันมี INSERT อย่างน้อยหนึ่งตัวที่ใหญ่เกินไปสำหรับการคำนวณ mysql คุณสามารถดูตัวแปรนี้ได้โดยพิมพ์ที่show variables like "net_buffer_length";mysql-cli ของคุณ คุณมีความเป็นไปได้สามประการ:

  • เพิ่ม net_buffer_length ข้างใน mysql -> นี่จะต้องรีสตาร์ทเซิร์ฟเวอร์
  • สร้างการถ่ายโอนข้อมูลด้วย --skip-extended-insertแทรกหนึ่งบรรทัด -> แม้ว่าการเหล่านี้จะดีกว่าการอ่านนี้ไม่เหมาะสำหรับการถ่ายโอนข้อมูลขนาดใหญ่> 1GB เนื่องจากมีแนวโน้มที่จะช้ามาก
  • สร้างการถ่ายโอนข้อมูลที่มีส่วนเสริมเพิ่มเติม (ซึ่งเป็นค่าเริ่มต้น) แต่ จำกัด net-buffer_length เช่น--net-buffer_length NR_OF_BYTESตำแหน่งที่ NR_OF_BYTES เล็กกว่าของ net_buffer_length ของเซิร์ฟเวอร์ -> ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดแม้ว่าจะไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์

ฉันใช้คำสั่ง mysqldump ต่อไปนี้: mysqldump --skip-comments --set-charset --default-character-set=utf8 --single-transaction --net-buffer_length 4096 DBX > dumpfile


2

ฉันได้รับปัญหาเดียวกันเมื่อโหลดไฟล์. csv แปลงไฟล์เป็น. sql

ใช้คำสั่งด้านล่างฉันจัดการเพื่อแก้ไขปัญหานี้

mysql -u <user> -p -D <DB name> < file.sql

หวังว่านี่จะช่วยได้


2

หากโซลูชันอื่นทั้งหมดที่นี่ล้มเหลว - ตรวจสอบ syslog ของคุณ (/ var / log / syslog หรือคล้ายกัน) เพื่อดูว่าเซิร์ฟเวอร์ของคุณมีหน่วยความจำไม่เพียงพอในระหว่างการค้นหาหรือไม่

พบปัญหานี้เมื่อ innodb_buffer_pool_size ถูกตั้งค่าใกล้กับหน่วยความจำฟิสิคัลมากเกินไปโดยไม่มีการกำหนดค่า swapfile MySQL แนะนำให้ตั้งค่าเซิร์ฟเวอร์เฉพาะฐานข้อมูล innodb_buffer_pool_size สูงสุด 80% ของหน่วยความจำกายภาพผมตั้งไว้ที่ประมาณ 90% เคอร์เนลกำลังฆ่ากระบวนการ mysql ย้าย innodb_buffer_pool_size กลับไปที่ประมาณ 80% และนั่นแก้ไขปัญหาได้


2

ในกรณีของฉันการตั้งค่าช่วงเวลาการหมดเวลาเชื่อมต่อเป็น 6,000 หรือสิ่งที่สูงกว่าไม่ทำงาน

ฉันเพิ่งทำสิ่งที่ workbench กล่าวว่าฉันสามารถทำได้

จำนวนเวลาสูงสุดที่เคียวรีสามารถใช้เพื่อส่งคืนข้อมูลจาก DBMS ชุดที่ 0 เพื่อข้ามการหมดเวลาการอ่าน

ในการตั้งค่า Mac -> ตัวแก้ไข SQL -> ไปที่เซสชัน MySQL -> ตั้งค่าช่วงเวลาการอ่านการเชื่อมต่อเป็น 0

และมันใช้งานได้😄


1

ฉันประสบปัญหาเดียวกันนี้ ฉันเชื่อว่ามันเกิดขึ้นเมื่อคุณมีกุญแจต่างประเทศในตารางที่ใหญ่กว่า (ซึ่งต้องใช้เวลา)

ฉันพยายามเรียกใช้คำสั่งสร้างตารางอีกครั้งโดยไม่มีการประกาศคีย์ต่างประเทศและพบว่าทำงานได้

จากนั้นหลังจากสร้างตารางฉันเพิ่มข้อ จำกัด foreign key โดยใช้ ALTER TABLE Query

หวังว่านี่จะช่วยใครซักคน


1

สิ่งนี้เกิดขึ้นกับฉันเพราะ innodb_buffer_pool_size ของฉันถูกตั้งค่าให้มีขนาดใหญ่กว่าขนาด RAM ที่มีอยู่บนเซิร์ฟเวอร์ สิ่งต่าง ๆ ได้รับการขัดจังหวะด้วยเหตุนี้และมันก็ออกข้อผิดพลาดนี้ การแก้ไขคือการอัพเดต my.cnf ด้วยการตั้งค่าที่ถูกต้องสำหรับ innodb_buffer_pool_size


1

ไปที่ Workbench Edit → Preferences → SQL Editor →การเชื่อมต่อ DBMS หมดเวลาอ่าน: สูงถึง 3000 ข้อผิดพลาดจะไม่เกิดขึ้นอีก


0

ไปที่:

แก้ไข -> การตั้งค่า -> ตัวแก้ไข SQL

ในนั้นคุณสามารถเห็นสามฟิลด์ในกลุ่ม "MySQL เซสชัน" ซึ่งตอนนี้คุณสามารถตั้งค่าช่วงเวลาการเชื่อมต่อใหม่ (เป็นวินาที)


0

ปรากฎว่ากฎไฟร์วอลล์ของเรากำลังบล็อกการเชื่อมต่อของฉันกับ MYSQL หลังจากนโยบายไฟร์วอลล์ถูกยกขึ้นเพื่อให้การเชื่อมต่อฉันสามารถนำเข้าสคีมาได้สำเร็จ


0

ฉันมีปัญหาเดียวกัน - แต่สำหรับฉันการแก้ปัญหาคือผู้ใช้ DB ที่มีสิทธิ์ที่เข้มงวดเกินไป ฉันต้องอนุญาตExecuteความสามารถบนmysqlโต๊ะ หลังจากที่อนุญาตให้ฉันไม่มีการเชื่อมต่อที่ลดลงอีกต่อไป



0

ฉันวิ่งเข้าไปในนี้ในขณะที่ใช้โปรแกรมที่เก็บไว้ซึ่งกำลังสร้างแถวจำนวนมากลงในตารางในฐานข้อมูล ฉันเห็นข้อผิดพลาดเกิดขึ้นหลังจากข้ามขอบเขต 30 วินาทีไปแล้ว

ฉันลองคำแนะนำทั้งหมดในคำตอบอื่น ๆ ฉันแน่ใจว่ามันช่วยได้บ้าง - สิ่งที่ทำให้ฉันทำงานได้จริง ๆ คือเปลี่ยนมาใช้ SequelPro จาก Workbench

ฉันเดาว่ามันเป็นการเชื่อมต่อฝั่งไคลเอ็นต์ที่ฉันไม่สามารถพบได้ใน Workbench บางทีนี่อาจช่วยคนอื่นด้วยเช่นกัน?


0

หากคุณกำลังใช้ SQL Work Bench คุณสามารถลองใช้การทำดัชนีโดยเพิ่มดัชนีลงในตารางของคุณเพื่อเพิ่มดัชนีคลิกที่สัญลักษณ์ประแจ (ประแจ) บนตารางควรเปิดการตั้งค่าสำหรับตารางด้านล่าง คลิกที่มุมมองดัชนีพิมพ์ชื่อดัชนีและกำหนดประเภทเป็นดัชนีในคอลัมน์ดัชนีเลือกคอลัมน์หลักในตารางของคุณ

ทำขั้นตอนเดียวกันสำหรับคีย์หลักอื่น ๆ ในตารางอื่น


0

ดูเหมือนว่าจะมีคำตอบที่ขาดหายไปสำหรับผู้ใช้ SSH เพื่อเชื่อมต่อกับฐานข้อมูล MySQL คุณต้องตรวจสอบสองที่ไม่ใช่ 1 ตามคำแนะนำอื่น ๆ :

Workbench Edit → Preferences →ตัวแก้ไข SQL → DBMS

ปรับแต่งแก้ไข→การกำหนดค่าตามความชอบ→ SSH →หมดเวลา

การหมดเวลา SSH เริ่มต้นของฉันถูกตั้งค่าไว้ต่ำมากและทำให้เกิดปัญหาการหมดเวลาของฉัน (แต่เห็นได้ชัดว่าไม่ใช่ทั้งหมด) หลังจากนั้นอย่าลืมรีสตาร์ท MySQL Workbench!

สุดท้ายอาจเป็นการดีที่คุณควรติดต่อผู้ดูแลฐานข้อมูลของคุณและขอให้พวกเขาเพิ่มคุณสมบัติ wait_timeout & interactive_timeout ใน mysql ด้วยตัวเองผ่าน my.conf + mysql เริ่มต้นใหม่หรือทำการตั้งค่าส่วนกลางหากการรีสตาร์ท mysql ไม่ใช่ตัวเลือก

หวังว่านี่จะช่วยได้!


0

สามสิ่งที่ต้องติดตามและตรวจสอบให้แน่ใจ:

  1. แบบสอบถามหลายรายการแสดงว่าการเชื่อมต่อขาดหรือไม่
  2. คุณใช้ set query ใน MySQL ได้อย่างไร?
  3. ลบ + อัปเดตแบบสอบถามพร้อมกันอย่างไร

คำตอบ:

  1. พยายามลบ definer เสมอเนื่องจาก MySQL สร้าง definer ของตัวเองและหากมีหลายตารางที่เกี่ยวข้องกับการอัพเดทพยายามที่จะสร้างการสืบค้นเดียวเพราะบางครั้งการสืบค้นหลายครั้งแสดงการเชื่อมต่อที่หายไป
  2. ตั้งค่าที่ด้านบนเสมอ แต่หลังจากลบถ้าเงื่อนไขไม่เกี่ยวข้องกับค่า SET
  3. ใช้ DELETE ครั้งแรกแล้วอัปเดตหากการดำเนินการทั้งคู่ของพวกเขาเกิดขึ้นบนแท็บเล็ตที่แตกต่างกัน

-1

ตรวจสอบเกี่ยวกับ

OOM on /var/log/messages ,
modify innodb_buffer_pool_size value ; when load data , use 50% of os mem ; 

หวังว่านี่จะช่วยได้


-1

ซึ่งมักจะหมายความว่าคุณมี "ความเข้ากันไม่ได้กับเซิร์ฟเวอร์ MySQL รุ่นปัจจุบัน" โปรดดู mysql_upgrade ฉันพบปัญหาเดียวกันนี้และต้องเรียกใช้:

mysql_upgrade - รหัสผ่านเอกสารระบุว่า "mysql_upgrade ควรดำเนินการทุกครั้งที่คุณอัพเกรด MySQL"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.