การออฟเซ็ตเวลาเริ่มต้นของกำหนดการงานของบริษัทตัวแทนการเซิร์ฟเวอร์ SQL ระหว่างอินสแตนซ์

ฉันมีงานตัวแทนที่ตั้งค่าให้เรียกใช้การสำรองข้อมูลบันทึกทุกสองชั่วโมงตั้งแต่เวลา 02:00 น. ถึง 23:59 น. (เว้นหน้าต่างไว้สำหรับเรียกใช้การสำรองข้อมูลแบบเต็มหรือการสำรองข้อมูลส่วนต่าง) งานที่คล้ายกันถูกตั้งค่าในทุก ๆ 50 อินสแตนซ์ของฉัน ฉันอาจเพิ่มอินสแตนซ์หลายร้อยรายการเมื่อเวลาผ่านไป (เราโฮสต์เซิร์ฟเวอร์ SQL สำหรับลูกค้าของเราบางราย) พวกเขาสำรองข้อมูลทั้งหมดไปยังโวลุ่มดิสก์ SAN เดียวกัน สิ่งนี้ทำให้เกิดปัญหาเวลาแฝงและส่งผลกระทบต่อประสิทธิภาพการทำงาน

ฉันต้องการชดเชยเวลารันงานในแต่ละอินสแตนซ์ 5 นาที เพื่อให้อินสแตนซ์นั้นรันงานเวลา 2:00, 4:00 น. ฯลฯ อินสแตนซ์ที่สองจะรันเวลา 2:05, 4:05 น. ฯลฯ ตัวอย่างที่สามจะรันที่ 2:10, 4:10 เป็นต้น เป็นต้น หากฉันชดเชยเวลาเริ่มต้นสำหรับงานในแต่ละอินสแตนซ์ (2:00 เช่น หนึ่ง, 2:05 เช่น สอง, 2:10 เช่น สาม เป็นต้น) ฉันสามารถคาดหวังได้อย่างสมเหตุสมผลหรือไม่ว่าฉันจะได้รับผลลัพธ์ที่ต้องการ ไม่มีอินสแตนซ์ทั้งหมดรันงานพร้อมกันใช่ไหม


person Mark Freeman    schedule 28.08.2013    source แหล่งที่มา


คำตอบ (2)


หากนี่เป็นบทสนทนาเดียวกันกับที่เราเพิ่งสนทนากันบน Twitter: เมื่อคุณบอกให้ SQL Server Agent ทำงานทุกๆ n นาทีหรือทุกๆ n ชั่วโมง การทำงานครั้งถัดไปจะขึ้นอยู่กับเวลา เริ่มต้น ไม่ใช่ เสร็จสิ้น เวลา ดังนั้น หากคุณตั้งค่างานบนอินสแตนซ์ 1 ให้รันเวลา 2:00 น. และรันทุก 2 ชั่วโมง การเรียกใช้ครั้งที่ 2 จะทำงานในเวลา 4:00 น. ไม่ว่าการรันครั้งแรกจะใช้เวลา 1 นาที, 12 นาที, 45 นาที หรือไม่ก็ตาม

มีข้อแม้บางประการ:

  • อาจมีความล่าช้าเล็กน้อยเนื่องจากการซิงโครไนซ์ตัวแทนภายใน แต่ฉันไม่เคยเห็นสิ่งนี้เกิดขึ้นเกินสองสามวินาที
  • หากการรันครั้งแรกเวลา 2:00 น. ใช้เวลามากกว่า 2 ชั่วโมง (แต่น้อยกว่า 4 ชั่วโมง) ครั้งต่อไปที่การรันงานจะเป็น 6:00 น. (การรัน 4:00 น. ถูกข้ามไป ไม่ทำงานเวลา 4:10 หรือ 4:20 น. เพื่อ "ตามทัน")

มีข้อเสนอแนะอีกประการหนึ่งให้เพิ่ม WAITFOR เพื่อชดเชยเวลาเริ่มต้น (และเราควรละทิ้ง WAITFOR แบบสุ่ม เพราะนั่นอาจไม่ใช่สิ่งที่คุณต้องการ - สุ่ม ‹> ไม่ซ้ำกัน) หากคุณต้องการฮาร์ดโค้ดการหน่วงเวลาที่แตกต่างกันในแต่ละอินสแตนซ์ (1 นาที 2 นาที ฯลฯ) การทำแบบนั้นโดยใช้กำหนดการจะตรงไปตรงมามากกว่าการเพิ่มขั้นตอนในงานทั้งหมดของคุณ IMHO

person Aaron Bertrand    schedule 28.08.2013
comment
นั่นเป็นเหตุผลที่ฉันใส่ URL ลงในหน้านี้ในทวีตของฉัน โดยทั่วไปงานจะเสร็จสิ้นภายในไม่กี่นาที (ฐานข้อมูลทั้งหมดมีขนาดไม่เกิน 10 GB) การเปลี่ยนแปลงไม่กี่วินาทีไม่ทำให้ฉันกังวล ฉันแค่ไม่ต้องการให้มีการสำรองข้อมูลบันทึก 50 รายการทั้งหมดที่พยายามเขียนไปยังการแชร์ปลายทางเดียวกันในเวลาเดียวกัน ดูเหมือนคุณจะให้สิ่งนั้นมา ขอบคุณ! ฉันกำลังมองหาการรับประกันว่าหากฉันตั้งค่าการชดเชยเวลาเริ่มต้นตอนนี้ ฉันจะได้รับผลลัพธ์ที่คาดหวังเริ่มตั้งแต่เวลา 02.00 น. คืนนี้ - person Mark Freeman; 28.08.2013
comment
@Mark ขออภัยฉันไม่ได้คลิกลิงก์ - person Aaron Bertrand; 28.08.2013

บางทีคุณอาจตั้งค่าฐานข้อมูลส่วนกลางที่จัดการ "กำหนดการ" และให้งานเพิ่ม/อัปเดตแถวเมื่อทำงาน วิธีนี้ทำให้แต่ละเซิร์ฟเวอร์ต่อมาสามารถเริ่มงานที่ "สำรวจ" เมื่อสามารถเริ่มได้ วิธีนี้จะทำให้เวลาแฝงในงานจะทำให้งานอื่นๆ รอ ดังนั้นคุณไม่มีความเหลื่อมล้ำในการกำหนดเวลาเมื่อเซิร์ฟเวอร์ตัวใดตัวหนึ่งถูกละทิ้ง

ด้วยความหวาดระแวงเล็กน้อย ฉันจะเพิ่มสถานการณ์ catchall ที่บอกว่าหลังจากรอ "x" นาทีแล้วให้ดำเนินการต่อไป เพื่อให้ความล่าช้าไม่ต่อเนื่องไกลพอที่จะทำให้งานไม่ทำงาน

person Shawn E    schedule 28.08.2013
comment
ซับซ้อนมาก ฉันไม่ต้องการตั้งค่าเซิร์ฟเวอร์ที่เชื่อมโยงในทุกอินสแตนซ์เพื่อให้สามารถสื่อสารกับฐานข้อมูลกลางและเขียนโค้ดจำนวนมากหากเพียงเปลี่ยนเวลาเริ่มต้นในตารางงานจะช่วยแก้ไขปัญหาได้ มันจะไม่ใช่เรื่องใหญ่อะไรถ้ามีสองสามอันจบลงด้วยการทับซ้อนกัน แต่การชนทั้งหมดพร้อมกันนั้นเป็นปัญหาอย่างแน่นอน - person Mark Freeman; 28.08.2013