คุณปฏิบัติตามแนวทางใดบ้างเพื่อหลีกเลี่ยงการอัพเดทข้อมูลที่ไม่ถูกต้องในฐานข้อมูลขนาดใหญ่


20

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

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


11
การสำรองข้อมูลไม่เพียง แต่สำหรับเมื่อคุณทำการปรับใช้ ฉันหมายถึงการสูญเสียข้อมูลของคุณเป็นเพียงความผิดพลาดของดิสก์และสิ่งเหล่านี้คาดเดาไม่ได้และสามารถเกิดขึ้นได้ทั้งวันนี้และวันพรุ่งนี้ (อาร์เรย์การโจมตีไม่ใช่คำตอบ แต่ก็ผิดพลาดด้วยเช่นกัน)
Pieter B

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

1
ฉันเห็นด้วยกับ @DocBrown ที่นี่ การหลีกเลี่ยงความเสียหายของข้อมูลและการสำรองข้อมูลใช้เวลานานเกินไปเป็นคำถามสองข้อที่แยกจากกัน
Robbie Dee

1
เมื่อคุณยอมรับอย่างรวดเร็วคุณจะไม่ได้รับการป้อนข้อมูลมากนัก
paparazzo

1
คุณหมายถึง "ปัญหาเชิงตรรกะในการปรับใช้รหัส"?
paparazzo

คำตอบ:


25

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

หากคุณสามารถทำการเปลี่ยนแปลงกับระเบียนทั้งหมดมากกว่าระเบียนที่เฉพาะเจาะจงได้

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

ถ้าคุณสามารถแทรกมันจะดีกว่า

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

หากคุณสามารถหลีกเลี่ยงการลบได้ก็จะดีกว่า

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

มีนโยบายการอัพเดทที่สอดคล้องกัน

หากคุณต้องการอัปเดตระเบียนหนึ่งในหลาย ๆ สิ่งสามารถเกิดขึ้นได้:

  1. บันทึกของคุณไม่มีอยู่
  2. บันทึกของคุณมีอยู่ แต่มีการเปลี่ยนแปลงแล้ว
  3. บันทึกของคุณมีอยู่และต้องการการเปลี่ยนแปลง

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

การสำรองข้อมูล

สิ่งนี้ไม่ได้หมายความว่าคุณจะทำการสำรองข้อมูลก่อนที่จะทำการอัพเดทใด ๆ ในสภาพแวดล้อมการผลิต! แม้ว่าจะมีการสำรองข้อมูลฉันคิดว่ามันเป็นความล้มเหลวที่จะต้องใช้การสำรองข้อมูล การสูญเสียข้อมูลไม่สามารถทำได้แม้ในสถานการณ์ที่เลวร้ายที่สุด

ข้อสรุป

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

โชคดี!


ฉันเห็นด้วยกับทุกสิ่งที่คุณพูด แต่ฉันอยากรู้เกี่ยวกับความคิดของคุณในการทำธุรกรรมเมื่อมี 10 รายการที่ต้องเปลี่ยนจาก 10k และแทรก / ปรับปรุงบันทึกทั้งหมดจะไม่ทำงาน?
ฉันมาที่ Winter Hats

จากนั้นคุณเพียงแค่อัปเดต 10 รายการ ฉันว่าถ้าคุณทำได้ก็ทำได้ ฉันไม่ได้บอกว่าจะทำแม้จะทำลายฐานข้อมูลการผลิตของลูกค้าของคุณ โปรดทำตามคำแนะนำของฉันด้วยเกลือเม็ด
Neil

12

ณ จุดนี้คุณควรใช้ระบบฐานข้อมูลเกรดเชิงพาณิชย์ที่รองรับสแนปชอต (Oracles เรียกว่าFlashback ) ซึ่งเป็นสิ่งที่พวกเขาต้องการ

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


ฉันไม่ได้กำลังบอกว่าต้องการลบข้อมูลสำรอง การสำรองข้อมูลตามกำหนดเวลาจะอยู่ที่นั่นเสมอ คำถามคือมากขึ้นเกี่ยวกับการสำรองข้อมูลแบบเฉพาะกิจซึ่งไม่เป็นปัญหาคือระบบขนาดเล็ก
Pritam Barhate

เพื่ออธิบายเพิ่มเติมต่อไปแนวความคิดนี้มาจาก NoSQL DB เป็นแพลตฟอร์มบริการ ที่จริงแล้วอ่านเอกสารของ Firestore เมื่อมันโผล่ขึ้นมา หากคุณต้องการสำรองข้อมูลที่สอดคล้องกับเหตุผลภายนอกดูเหมือนว่ามีราคาแพงมาก ดังนั้นฉันจึงสงสัยว่าทีมผลิตภัณฑ์ที่ประสบความสำเร็จทำงานกับระบบดังกล่าวได้อย่างไรและพวกเขามั่นใจได้อย่างไรว่าข้อมูลเชิงตรรกะไม่เกิดความเสียหาย
Pritam Barhate

@PritamBarhate: คุณไม่ต้องการ "การสำรองข้อมูลเพิ่มเติม" เนื่องจากการอัปเดต ในฐานข้อมูลการผลิตที่ผู้คนทำงานกับข้อมูลนั้นการสำรองข้อมูลต้องทำอย่างน้อยทุกวันโดยมีหรือไม่มีการอัพเดท คืนค่าเป็นปัญหาของคุณคุณต้องการหลีกเลี่ยงการกู้คืนที่ไม่จำเป็นภายใต้สถานการณ์ทั้งหมด
Doc Brown

3
การจำลองแบบด้วย failover อัตโนมัติซ้ำซ้อนไม่ขึ้นกลยุทธ์การสำรองข้อมูลสำหรับฐานข้อมูลกว่าใช้ RAID สำหรับดิสก์
Blrfl

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

3

นี่คือพื้นที่ขนาดใหญ่ - ดังนั้นคาดว่าคำถามนี้จะปิดในค่อนข้างสั้น แต่ปิดหัวของฉัน (เป็น DBA เดิมในฐานข้อมูล yuge):

มาร์ท / พื้นที่เก็บข้อมูล

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

รหัสแหล่งที่มา

สำหรับทุกสิ่งที่สามารถเปลี่ยนแปลงได้ให้มีซอร์สโค้ดซึ่งเกี่ยวข้องกับวิธีการอัปเดตข้อมูล จำนวนของสิ่งเหล่านี้คุณแตกต่างจาก DB ถึง DB แต่คุณอาจมีหนึ่งสำหรับผู้ใช้แต่ละบทบาทฟีดข้อมูลโมดูลรหัส ฯลฯ

สร้าง / อัปเดตวันที่

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

ETL

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

การสำรองข้อมูล

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

การกู้คืนเวลา

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

การตรวจสอบบัญชี

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

ประวัติศาสตร์

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

การตรวจสอบข้อมูล

ตรวจสอบให้แน่ใจว่ามีการดำเนินการตรวจสอบความถูกต้องเบื้องต้นกับข้อมูลก่อนที่จะถูกจัดเก็บ - ตรวจสอบชนิดข้อมูลพื้นฐานที่มากกว่าและเหนือกว่า

ความสมบูรณ์ของการอ้างอิง

Referential integrity ไม่ใช่ bullet เงิน แต่สามารถช่วยให้มั่นใจว่าข้อมูลมีโครงสร้างที่ดี



2

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

นี่ช่วยให้ทุกคนมีความรู้สึกที่ดีว่าการยิงครั้งเดียวจะประสบความสำเร็จ เราไม่สามารถรับประกันได้ 100% เพราะข้อมูลจะได้รับการอัปเดตตั้งแต่วันที่ทดลองใช้ แต่เราเพิ่มความมั่นใจและปัจจัยความสำเร็จ สิ่งนี้ยังช่วยให้ทราบถึงปัญหาที่แท้จริงที่จะเกิดขึ้นเนื่องจากเราใช้สำเนาการผลิต ตอนนี้หากมีสาเหตุบางประการที่ทำให้การอัปเดตล้มเหลวเราสามารถไปที่การรันย้อนกลับก่อนเสมอหากต้องการ แต่เราควรจะพบและแก้ไขปัญหาใด ๆ ที่เกิดจากการรันแบบแห้ง

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

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