กำลังดับ - การค้นหาเสร็จสิ้นหรือไม่


9

มีวิธีการตรวจสอบและดูว่าแบบสอบถามเสร็จหรือไม่ ฉันใช้คำสั่งอัปเดตที่รันมานาน 3 ครั้ง (+/- 25 ชั่วโมงต่อครั้ง) เมื่อฉันออกจากบ้านเพื่อไปพักผ่อนในสัปดาห์ที่แล้ว น่าเสียดายที่บางช่วงสัปดาห์ที่ไฟฟ้าดับและเครื่องที่ใช้ MYSQL ก็ปิดตัวลง มีวิธีในการตรวจสอบและดูว่าแบบสอบถาม 3 รายการ (หรือทั้งสามรายการ) ใดที่เสร็จสมบูรณ์หรือไม่

ฉันรู้ว่าฉันสามารถตรวจสอบเพื่อดูว่าข้อมูลได้รับการปรับปรุงหรือไม่ แต่คาดว่าจะต้องมี NULL ด้วยการดำเนินการที่ถูกต้องและครบถ้วนและมีข้อมูล 48 ล้านแถวเพื่ออ่าน ความคิดใด ๆ

mysql 

6
บันทึก ... หากคุณบันทึกสิ่งต่าง ๆ ถ้าคุณไม่อยากแนะนำให้เริ่ม
เบ็น

1
@Ben - สายเกินไปที่จะแนะนำ UPS และการทำธุรกรรมด้วยฉันคิดว่า

1
หากคุณกำลังใช้ InnoDB คุณสามารถทำรหัสของคุณในการทำธุรกรรม dev.mysql.com/doc/refman/5.0/en/commit.html

1
หากคุณเปิดใช้งานการบันทึกแบบสอบถามที่ช้าแล้วแบบสอบถามที่ช้าอาจจะสิ้นสุดลงในบันทึกแบบสอบถามที่ช้า

3
และในกรณีที่มันไม่สมบูรณ์อย่างถูกต้องคุณมีการสำรองข้อมูลหรือไม่

คำตอบ:


9

หากคุณกำลังใช้งานด้วยการเปิดใช้งานบันทึกไบนารีคุณสามารถตรวจสอบความน่าเชื่อถือสูงได้

ก่อนอื่นเพื่อดูว่ามีการเปิดใช้งานบันทึกไบนารีหรือไม่ให้เรียกใช้:

SHOW BINARY LOGS;

หากเปิดใช้งานอยู่คุณควรได้ผลลัพธ์ดังนี้:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

มิฉะนั้นคุณจะได้รับข้อความแสดงข้อผิดพลาด

ตอนนี้ถ้าเปิดใช้งานบันทึกไบนารีแล้วการส่งมอบที่สำเร็จจะถูกเขียนไปยังบันทึกไบนารีด้วย ฉันพูดว่า "ส่งมอบ" แต่ความจริงก็คือการดำเนินการที่ประสบความสำเร็จแม้ในตารางที่ไม่มีธุรกรรมเช่น MyISAM จะถูกเขียนที่นั่น แต่ความจริงแล้วเพื่อให้มั่นใจในผลลัพธ์ของการค้นหาของคุณฉันหวังว่าคุณจะใช้เครื่องมือการทำธุรกรรมเช่น InnoDB มิฉะนั้นคุณจะไม่แน่ใจในสิ่งใด

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

ตอนนี้คุณต้องตามหาบันทึกเลขฐานสองที่เกี่ยวข้องและค้นหาข้อความค้นหาที่นั่น หากคุณพบข้อความค้นหา - ดีมาก! ถ้าไม่ - มันอาจจะไม่มี ฉันจะอธิบายในไม่ช้า

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

ตอนนี้ใช้mysqlbinlogยูทิลิตี้ดำเนินการจากบรรทัดคำสั่งดังนี้:

mysqlbinlog mysql-bin.000245

แทนที่ชื่อไฟล์ด้วยชื่อที่คุณสงสัยว่ามีแบบสอบถาม

สิ่งนี้จะแสดงผลการสืบค้นทั้งหมดในไฟล์บันทึกไบนารีนี้ไปยังเอาต์พุตมาตรฐาน บน Unix ใช้grepเพื่อค้นหาข้อความค้นหาของคุณ:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

บน Windows โชคดี เปิดด้วย notepad ++ หรืออะไรก็ได้แล้วค้นหาด้วยตนเอง

มีแบบสอบถามหรือไม่ เยี่ยมมาก - คุณรู้ว่ามันได้รับการมุ่งมั่น

แบบสอบถามไม่ได้อยู่ที่นั่นหรือ จำเป็นต้องตรวจสอบsync_binlogพารามิเตอร์ มันเป็น1 ? จากนั้นเคียวรีไม่ได้อยู่ในบันทึกไบนารี่ ==> เคียวรีไม่ยอมรับ แต่ถ้าsync_binlogไม่ใช่1อาจยังมีโอกาสที่แบบสอบถามได้ถูกคอมมิต แต่ยังไม่ได้อยู่ในบันทึกไบนารีเนื่องจากความผิดพลาดอาจเกิดขึ้นหลังจากcommitและก่อนที่จะมีการล้างข้อมูลบันทึกไบนารีไปยังดิสก์ จากนั้นคุณต้องเปลี่ยนกลับเป็นวิธีอื่น

สิ่งเหล่านั้น: (และหวังว่าคุณจะใช้ InnoDB อีกครั้ง): ค้นหาแถวเดียวที่สามารถระบุผลลัพธ์ของแบบสอบถามได้ ด้วย InnoDB คุณจะได้รับ "ทั้งหมดหรือเปล่า" หากคุณสามารถมั่นใจได้ว่าแถวเดียวได้รับผลกระทบจากแบบสอบถาม - คุณสามารถมั่นใจได้ว่าแบบสอบถามได้เสร็จสิ้นแล้ว

แก้ไข:แน่นอนถ้าเปิดใช้งานบันทึกช้าคุณสามารถคาดหวังว่าแบบสอบถามแบบยาวดังกล่าวจะถูกบันทึกไว้ที่นั่นหลังจากเสร็จสิ้นเช่นกัน ...

โชคดี!


2
ฉันหวังว่าคุณจะติดอยู่
jcolebrand

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