SQL Server Sandbox


9

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

ฉันไม่รู้จริงๆว่าอะไรจะเป็นวิธีที่ดีที่สุดในการทำสิ่งนี้ดังนั้นฉันหวังว่าพวกคุณบางคนจะสามารถให้ความคิด / คำแนะนำที่ดีได้ ขอบคุณ

เพื่อความชัดเจนเราเป็นหลักต้องการที่จะทำเช่นนี้กับฐานข้อมูลของเรา: http://try.discourse.org/t/this-site-is-a-sandbox-it-is-reset-every-day/57 ความแตกต่างเพียงอย่างเดียวคือเราไม่ต้องการสร้างผู้ใช้ของเราใหม่ทุกวัน

รุ่น: SQL Server 2008
Edition: ผู้พัฒนาและองค์กร

คำตอบ:


8

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

บนเซิร์ฟเวอร์ 1:

BACKUP DATABASE db TO DISK = '\\someshare\file.bak' 
  WITH COPY_ONLY, INIT, COMPRESSION;

บนเซิร์ฟเวอร์ 2:

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY;

คุณอาจจำเป็นต้องเพิ่มMOVEคำสั่งด้วยหากรูปแบบดิสก์ระหว่างเซิร์ฟเวอร์นั้นแตกต่างกัน (หรือถ้าคุณวางสำเนาไว้บนเซิร์ฟเวอร์เดียวกัน)

RESTORE DATABASE db_dev FROM DISK = '\\someshare\file.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'data_file_name' TO 'D:\somepath\somefile.mdf',
  MOVE 'log_file_name'  TO 'E:\somepath\somefile.ldf';

หากคุณกำลังกู้คืนบนเซิร์ฟเวอร์เดียวกันคุณไม่ควรมีปัญหาใด ๆ กับผู้ใช้ หากคุณกู้คืนไปยังเซิร์ฟเวอร์อื่นผู้ใช้ของคุณจะมีอยู่ แต่การเข้าสู่ระบบในระดับเซิร์ฟเวอร์อาจไม่ มีสคริปต์ในการแก้ไขปัญหาและคุณลักษณะใหม่ใน SQL Server 2012 ( ฐานข้อมูลที่มีอยู่ ) ซึ่งช่วยขจัดปัญหาโดยสิ้นเชิง


เรามี dev / prod แต่ dev เป็นเซิร์ฟเวอร์เดียวที่จะเกิดขึ้น Prod สำหรับกระบวนการที่พร้อมใช้งานเท่านั้น
Kittoes0124

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

5

เนื่องจากคุณมีอินสแตนซ์กับเครื่องยนต์ Enterprise Edition ผมจะใช้ภาพรวมฐานข้อมูล

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

โปรดทราบว่าหากนักพัฒนากำลังวางแผนที่จะโหลดข้อมูลขนาดใหญ่ (ดูเหมือนว่าพวกเขาจะไม่ได้?) สิ่งนี้อาจไม่เหมาะสม


ทำไมมันไม่เหมาะสมหากพวกเขากำลังโหลดข้อมูลขนาดใหญ่? เราอาจโหลดว่า .... 8 ล้านแถวจาก 100 คอลัมน์ทุก ๆ คราว (แม้ว่าพวกเขา "ไม่ควร") แต่เราไม่ต้องการป้องกันพวกเขาจากการทำเช่นนั้น สิ่งที่เราสนใจจริงๆก็คือทุกอย่างจะได้รับการอบในตอนท้ายของวัน
Kittoes0124

2
@Kittoes เนื่องจากสแน็ปช็อตจะต้องได้รับการดูแลเมื่อมีการเปลี่ยนแปลงข้อมูลต้นฉบับ มันจำเป็นต้องดึงหน้าเว็บที่มีอยู่จากแหล่งที่มาหากแหล่งที่มามีการเปลี่ยนแปลงเพื่อที่จะรักษามุมมอง "ก่อน" มันไม่ทำอย่างนั้นจนกว่าข้อมูลต้นฉบับจะเปลี่ยนแปลง (สแน็ปช็อตจะใช้ไฟล์แบบเบาบางที่ว่างเปล่ายกเว้นเดลตา) การบำรุงรักษานี้อาจมีราคาแพงมาก ดูว่าภาพรวมฐานข้อมูลทำงานอย่างไร
Aaron Bertrand

@AaronBertrand Ok ดังนั้นหากฐานข้อมูลเติบโตถึง 8GB ในระหว่างวันเมื่อสแนปชอตได้รับการกู้คืนข้อมูลใหม่ทั้งหมดจะถูกลบ แต่ฐานข้อมูลจะยังคงมีขนาด 8GB หรือไม่ หรือฉันเข้าใจผิด?
Kittoes0124

@Kittoes สแน็ปช็อตเป็นแบบอ่านอย่างเดียวดังนั้นคุณจะสามารถโหลดข้อมูลใหม่ลงในฐานข้อมูลต้นทางเท่านั้น หากคุณเพิ่ม 8GB ในระหว่างวันภาพรวมจะไม่ปรากฏให้เห็น เมื่อคุณย้อนกลับ / ปล่อยสแน็ปช็อตฐานข้อมูลต้นทางจะยังคงมีข้อมูลอยู่ที่ 8GB และจะมีการปรับขนาดให้เหมาะสม หากคุณถ่ายภาพสแนปชอตอีกครั้งข้อมูลใหม่จะปรากฏให้เห็น หากคุณลบ 8GB ในระหว่างวันมันจะถูกเพิ่มในสแนปชอต
แอรอน

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

0

ให้ฉันเพิ่มไม่กี่เซ็นต์ของฉันเพื่อดูว่ามันช่วยให้คุณ:

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

สิ่งที่ฉันได้ดำเนินการเป็นกระบวนการคืนค่าคืนเพื่อให้บรรลุนี้ ด้านล่างเป็นวิธีการทำงาน:

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

ตาราง: nightly_restore (OriginalDB, RestoreDB, การสำรองข้อมูล, enabled_YN, ผลลัพธ์, PASS_FAIL)

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

หากมีฐานข้อมูลเพิ่มเติมที่จะถูกเพิ่มในอนาคตคุณจะต้องแทรกฐานข้อมูลในตารางและตั้งค่า enabled_YN bit เป็น Y (เปิดใช้งาน)

วิธีนี้กระบวนการจะมีความยืดหยุ่นและจัดการได้มากขึ้น

หากคุณต้องการ SQL ที่ฉันเขียน (ฉันแน่ใจว่าคุณจะสามารถเขียนมัน :-)) เพียงแค่ ping ฉันหรือเพิ่มความคิดเห็นและฉันจะแบ่งปัน

HTH

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