ไคลเอนต์หมดเวลาในขณะที่แบบสอบถาม MySQL ยังคงทำงานอยู่?


9

เราประสบปัญหาที่แบบสอบถามแบบอ่านอย่างเดียวทำงานผ่าน MySQL workbench หมดเวลาจากมุมมอง UI ของผู้ใช้และยังคงทำงานบนเซิร์ฟเวอร์ (และเห็นได้ชัดว่าใช้ทรัพยากรมากขึ้นเรื่อย ๆ ) จนกว่าเราจะหยุดทำงาน

คำถาม

  • มีวิธีมาตรฐานในการจัดการกับปัญหาประเภทนี้ใน MySQL?
  • มีสาเหตุพื้นฐานที่เราต้องหลีกเลี่ยงหรือไม่?

คำตอบ:


11

คุณต้องดูว่าจะใช้ค่าเริ่มต้นใดในการหมดเวลา:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

โดยปกติฉันดูตัวแปรหมดเวลาหลายครั้ง นี่เป็นสิ่งจำเป็นอย่างยิ่งหากคุณใช้ MySQL จากระยะไกลจาก MySQL Workbench, ไคลเอนต์ mysql หรือแอป PHP บนเซิร์ฟเวอร์แอพที่ติดต่อกับ MySQL บนเซิร์ฟเวอร์ฐานข้อมูล

นี่คือความหมายของเอกสาร MySQL ที่กล่าวถึงการตั้งค่าเหล่านี้:

  • wait_timeout (ค่าเริ่มต้น 28800 [8 ชั่วโมง]): จำนวนวินาทีที่เซิร์ฟเวอร์รอกิจกรรมในการเชื่อมต่อแบบไม่โต้ตอบก่อนที่จะปิด การหมดเวลานี้ใช้เฉพาะกับการเชื่อมต่อไฟล์ซ็อกเก็ต TCP / IP และ Unix ไม่ใช่การเชื่อมต่อที่ทำโดยใช้ไพพ์ที่มีชื่อหรือหน่วยความจำที่แชร์ ในการเริ่มต้นเธรดค่าเซสชัน wait_timeout จะเริ่มต้นจากค่าส่วนกลาง wait_timeout หรือจากค่าโกลบอล interactive_timeout ขึ้นอยู่กับประเภทของลูกค้า (ตามที่กำหนดโดยตัวเลือกการเชื่อมต่อ CLIENT_INTERACTIVE เพื่อ mysql_real_connect () ดูเพิ่มเติมที่ interactive_timeout
  • interactive_timeout (ค่าเริ่มต้น 28800 [8 ชั่วโมง]): จำนวนวินาทีที่เซิร์ฟเวอร์รอกิจกรรมในการเชื่อมต่อแบบโต้ตอบก่อนที่จะปิด ไคลเอนต์แบบโต้ตอบถูกกำหนดเป็นไคลเอนต์ที่ใช้ตัวเลือก CLIENT_INTERACTIVE เพื่อ mysql_real_connect () ดูเพิ่มเติม wait_timeout
  • net_read_timeout (ค่าเริ่มต้น 30): จำนวนวินาทีที่รอข้อมูลเพิ่มเติมจากการเชื่อมต่อก่อนที่จะยกเลิกการอ่าน เมื่อเซิร์ฟเวอร์กำลังอ่านจากไคลเอ็นต์ net_read_timeout เป็นค่าการหมดเวลาที่ควบคุมเมื่อจะยกเลิก เมื่อเซิร์ฟเวอร์กำลังเขียนไปยังไคลเอ็นต์ net_write_timeout เป็นค่าการหมดเวลาที่ควบคุมเมื่อจะยกเลิก ดูเพิ่มเติม slave_net_timeout
  • net_write_timeout (ค่าเริ่มต้น 60): จำนวนวินาทีที่รอให้บล็อกถูกเขียนไปยังการเชื่อมต่อก่อนที่จะยกเลิกการเขียน ดูเพิ่มเติมที่ net_read_timeout

โปรดตรวจสอบให้แน่ใจว่าการหมดเวลาเหล่านี้ตั้งค่าไว้สูงพอที่จะรองรับข้อความค้นหาที่อาจทำงานเป็นเวลานานซึ่งอาจรวมถึง:

  • มวล UPDATEs
  • มวล DELETEs
  • ENABLE KEYS บน MyISAM ขนาดใหญ่

ในการจัดการกับคิวรีที่ทำงานต่อไปหลังจากที่คุณไม่ได้สัมผัสคุณจะต้องรันKILLกับ ID กระบวนการของเคียวรีที่รันนาน แม้ว่าจะมีคำสั่ง KILL คุณจะต้องรอคิวรีใด ๆ ที่อยู่ในระหว่างขั้นตอนที่ใช้ดิสก์มากหรือมี mutex ภายในอยู่ระหว่างดำเนินการ


มีวิธีมาตรฐานที่มีประสิทธิภาพในการรัน KILL กับกระบวนการที่รันมาเป็นเวลานานหรือจะทำผ่านงาน bash script / cron หรือไม่?
asthasr

จริง ๆ แล้วฉันเขียนโพสต์กลับในเดือนพฤษภาคม 2011 เกี่ยวกับวิธีการเปิดตัวสคริปต์โดยใช้ information_schema เพื่อฆ่าการเชื่อมต่อฐานข้อมูลจำนวนมาก: dba.stackexchange.com/a/2637/877
RolandoMySQLDBA

"โปรดตรวจสอบให้แน่ใจว่าการหมดเวลาเหล่านี้ถูกตั้งค่าไว้สูงพอที่จะรองรับการค้นหาที่อาจทำงานเป็นเวลานานมากซึ่งอาจรวมถึง: การอัปเดตจำนวนมาก ... " ตัวอย่าง: php + mysql ฉันต้องเลือกทุกระเบียนจากคอลัมน์ตาราง แถวแล้วทำบางสิ่ง ... จากนั้นอัปเดตระเบียนใหม่ด้วยค่าใหม่ วางกรณีที่สคริปต์นี้ต้องใช้เวลาประมาณ 5 นาที เลือกหนึ่งตัวที่จุดเริ่มต้นและอัปเดตหนึ่งรายการจนสุดดึงข้อมูลแถวและทำ ... ตรงกลาง คุณสามารถอธิบายสิ่งที่ต้องทำกับ wait_timeout กับสถานการณ์นี้ได้หรือไม่? จริงๆแล้วมันไม่ชัดเจนสำหรับฉัน ... สิ่งที่คุ้มค่าสำหรับการรอทรัพยากรจาก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.