วิธีจับแบบสอบถามที่รันบนเซิร์ฟเวอร์ MySQL?


14

เรากำลังพยายามทำการดีบักประสิทธิภาพของเซิร์ฟเวอร์และฉันต้องการจับภาพรวมของการสืบค้นที่เรียกใช้บนเซิร์ฟเวอร์ MySQL ของเราในเวลาไม่กี่นาที

ฉันคุ้นเคยกับ MySQL SHOW FULL PROCESSLISTแต่ฉันต้องการที่จะเรียกใช้ผ่านทางบรรทัดคำสั่งเพื่อให้ฉันสามารถถ่ายโอนไปยังไฟล์และโพสต์กระบวนการ

มีวิธีที่จะส่งออกแบบสอบถามนี้ไปยังไฟล์และให้มันทำงานทุก ๆ วินาทีหรือไม่?

มีวิธีที่ดีกว่าในการจับการสืบค้นทั้งหมดที่กำลังทำงานอยู่หรือไม่?

โปรดทราบว่าฉันไม่สนใจเพียงแค่การสืบค้นที่ช้า (ฉันคุ้นเคยกับบันทึกการสืบค้นที่ช้า)


คุณใช้ระบบปฏิบัติการอะไร นี่เป็นเรื่องง่ายมากที่จะทำบน linux ดังนั้นฉันจึงเดาหน้าต่าง
Patrick

@ แพทริกดีใจที่ได้ยินมันเป็นเรื่องง่ายบน linux! หนีออกไป ...
hafichuk

1
ข้อความค้นหาส่วนใหญ่จะทำงานและเสร็จสิ้นภายในเวลาไม่ถึงวินาทีและจะไม่ปรากฏในรายการของคุณ
Joel Coel

ข้อความค้นหาที่มีความยาวเพิ่มเติมจะปรากฏขึ้นหลายครั้งในแต่ละลูป แต่แน่นอนว่าถ้าคุณต้องการคุณสามารถทำได้echo show full processlist | mysqlหรือดีกว่าSELECT info FROM information_schema.processlist WHERE Command="Query" AND User!="root"ในการวนซ้ำ เพิ่มสองสามบรรทัดแล้วคุณจะได้รับฟังก์ชันการค้นหาที่เหมือนกันมากกว่าinnotopหรือ pt-kill
theist

คำตอบ:


10

ฉันจะใช้บันทึกการสืบค้นที่ช้า มันจะจับการสืบค้นทั้งหมดไม่ใช่เฉพาะที่ช้าถ้าคุณตั้ง long_query_time = 0

นอกจากนี้ยังรวบรวมการสืบค้นทั้งหมดซึ่งไม่เป็นความจริงของเทคนิค TCP-sniffing ที่กล่าวถึงที่นี่ สิ่งเหล่านั้นจะไม่จับข้อความค้นหาที่ดำเนินการผ่านซ็อกเก็ต เหมือนกันสำหรับการดู SHOW PROCESSLIST; คุณจะพลาดการค้นหาที่รวดเร็ว

หากคุณต้องการรวบรวมแบบสอบถามผ่านรายการกระบวนการหรือผ่านการรับส่งข้อมูล TCP ฉันขอแนะนำให้ใช้ pt-query-digest ของ Percona Toolkit มันสามารถสำรวจรายการกระบวนการสำหรับคุณ (และทำให้เข้าใจได้จากผลลัพธ์ซึ่งยากมากที่จะทำถ้าคุณจับตัวอย่างกลุ่มของตัวเอง) และสามารถแปลโปรโตคอล TCP ของ MySQL ได้ดังนั้นคุณจึงสามารถจับ TCP ได้ ปริมาณข้อมูลและวิเคราะห์ แน่นอนว่ามันยังเป็นตัวรวบรวมคิวรี / ตัวรวบรวมคิวรี / นักข่าวที่ดีที่สุดที่คุณเคยเขียน แต่คุณไม่ได้พูดในสิ่งที่คุณต้องการจะทำกับเคียวรีหลังจากที่คุณจับมัน


13

วิธีที่แข็งแกร่งที่สุดคือการใช้ "บันทึกข้อความค้นหาทั่วไป" ซึ่งจะรวบรวมข้อความค้นหาทั้งหมด: http://dev.mysql.com/doc/refman/5.1/th/query-log.html

คุณไม่ได้ระบุรุ่นเซิร์ฟเวอร์ MySQL แต่ถ้าคุณมี 5.1.12 หรือใหม่กว่าคุณสามารถเปิดใช้งานและปิดการใช้งานด้วยตัวแปรโกลบอลผ่าน SQL ดูเอกสารประกอบสำหรับรายละเอียด


ขอบคุณ @Daniel เราได้เปิดใช้งานนี้แล้ว แต่ไม่มีข้อมูลบันทึกเวลาในบันทึก มีความคิดวิธีการบันทึกเวลาในนั้นไหม?
hafichuk

ขออภัยไม่มีอะไรนอกจากชี้คุณไปที่คู่มือ
Daniel Pittman

2
บันทึกแบบสอบถามช้าที่มี long_query_time = 0 เป็นตัวเลือกที่ดีกว่า มันจะยังคงจับคำค้นหาทั้งหมด
บารอนชวาร์ตซ์

+1 สำหรับบารอน: บันทึกข้อความค้นหาทั่วไปไม่รวมตัวชี้วัดประสิทธิภาพที่คุณต้องการ นอกจากนี้ยังมีสคริปต์ Perl ที่มาพร้อมกับเซิร์ฟเวอร์ MySQL สำหรับการวิเคราะห์บันทึกการสืบค้นที่ช้า (ซึ่งจะลบค่าตามตัวอักษรออกจากเพรดิเคต) แต่โปรดทราบว่า MySQL รุ่นเก่าจะไม่สนับสนุน long_query_time ที่น้อยกว่า 1 วินาที - ถ้าเป็นเช่นนั้นสำหรับคุณแล้วอัพเกรด - มีการปรับปรุงประสิทธิภาพจำนวนมากในเวอร์ชันล่าสุด
symcbean


4

แน่นอนว่า:

mysqladmin -u root -p -i 1 --verbose processlist > /tmp/pl.out

ไชโย


อ่า ... mysqladmin สมบูรณ์แบบขอบคุณ @ HTTP500
hafichuk

1
สิ่งนี้รันคำสั่ง processlist ทุก 1 วินาที ข้อความค้นหาที่รวดเร็วมากบางรายการอาจยังคงหลบหนีการจับ หากการโหลดประกอบด้วยคิวรีขนาดใหญ่ไม่กี่คิวเคอร์มันจะทำงานได้ถ้ามันประกอบด้วยคิวรีขนาดเล็กจำนวนมากมันอาจไม่ได้
LSerni

@Isemi ผู้ขอใช้ "ทุกวินาทีหรือมากกว่านั้น"
HTTP500

4

นี้อาจจะมีสถานที่สำหรับการMysql พร็อกซี่ มันเป็นพื้นช่วยให้คุณสามารถจับ (และจัดการ) แบบสอบถามที่ถูกส่ง การตั้งค่าพื้นฐานเพื่อดักจับนั้นง่ายมาก จากนั้นเพียงแค่เปลี่ยนการตั้งค่าไคลเอนต์ของคุณเพื่อชี้ไปที่พร็อกซีเพื่อให้คุณสามารถจับการร้องขอทั้งหมด


4

โปรแกรม Wireshark ที่ใช้เทอร์มินัลtsharkอาจช่วยได้:

tshark -T fields -R mysql.query -e mysql.query

sudo yum install wiresharkจะให้ tshark บน Amazon Linux และsudo apt-get install tsharkจะให้ tshark บน Ubuntu 14+


3

ฉันใช้โซลูชันของ 'Rui Pedro Bernardino ใช้งานได้ดียกเว้นฉันเปลี่ยนบางสิ่งในบรรทัดแรกตามรายละเอียดด้านล่าง ...

tcpdump -i any -s 0 -l -vvv -w - dst port 3306 | strings | perl -e 'while(<>) { chomp; next if /^[^ ]+[ ]*$/;
    if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER)/i) {
    if (defined $q) { print "$q\n"; }
    $q=$_;
  } else {
    $_ =~ s/^[ \t]+//; $q.=" $_";
  }
}'


0

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

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