การสำรองหลายฐานข้อมูลไปยังจุดเดียวกันในเวลา


10

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

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

ดังนั้นฉันกำลังมองหากลไกการสำรองข้อมูลซึ่งจะตอบสนองความต้องการดังกล่าวด้านล่าง

  1. เริ่มการสำรองข้อมูล dbs ทั้งหมดในแต่ละครั้งและปล่อย db สำหรับการใช้งาน
  2. เนื่องจากฐานข้อมูลเชื่อมโยงกันฉันต้องการให้ความสอดคล้องของข้อมูลในไฟล์สำรอง ดังนั้นเนื่องจากข้อกำหนดความสอดคล้องของข้อมูลนี้ฉันไม่ต้องการให้การเปลี่ยนแปลงดำเนินไปกับไฟล์สำรองของฉัน

สิ่งที่ฉันต้องการคือ - สำรองข้อมูล dbs ทั้งหมดในเวลาที่กำหนด


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

1
คุณต้องการทำอะไรโดยการสำรองข้อมูลนี้ สามารถกู้คืนได้เต็มจนถึงจุดนี้ - หรืออย่างอื่น? กล่าวอีกนัยหนึ่ง ... หากคุณต้องกู้คืนจากการสำรองข้อมูลนี้สิ่งที่ควรคืนค่า --- การเปลี่ยนแปลง DDL ใด ๆ การเปลี่ยนแปลงข้อมูลหรืออะไร
seventyeightist

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

@DanielHutmacher ฉันกำลังมองหาการสำรองข้อมูลเต็มรูปแบบ
Praveen

คำตอบ:


13

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

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

ณ จุดนี้หากคุณจำเป็นต้องทำการกู้คืนจากนั้นคุณทำ a RESTORE STOPBEFOREMARKบนแต่ละฐานข้อมูลของคุณ สิ่งนี้จะคืนค่าฐานข้อมูลทั้งหมดไปยังจุดเดียวกัน (ขึ้นอยู่กับธุรกรรมของคุณ) หมายเหตุ: นอกจากนี้ยังมี STOPATMARK หากคุณต้องการรวมธุรกรรมนั้น

หากคุณต้องการตัวอย่างฉันมีหนึ่งในลิงค์ข้างบนพร้อมกับการอ่านเพิ่มเติมเล็กน้อย

ฉันรู้ว่านี่ไม่ได้ตอบคำถามของคุณอย่างแน่นอน แต่หวังว่ามันจะช่วยแก้ปัญหาของคุณได้


2
นี่คือวิธีที่ BizTalk จัดการการสำรองข้อมูล ณ จุดเวลาของหลายฐานข้อมูล ถ้ามันใช้งานได้กับ Microsoft BizTalk มันเป็นคุณสมบัติที่ผ่านการทดสอบมาอย่างดี
Max Vernon

เราใช้สำหรับฐานข้อมูล TFS ใน logshipping เราเปลี่ยนเป็น alwaysOn
Kin Shah

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

@ สองเทคนิคคุณทำได้โดยใช้วิธี OPs ล็อคทุกคนออกจากระบบตรวจสอบให้แน่ใจว่าไม่มีการเชื่อมต่อที่ใช้งานอยู่ (อาจทำเครื่องหมายฐานข้อมูลว่าอ่านอย่างเดียว / ถูก จำกัด ) จากนั้นทำการสำรองข้อมูลทั้งหมดของทุกฐานข้อมูล อย่างไรก็ตามเนื่องจาก OP ระบุว่ามันไม่ใช่วิธีที่ดีที่สุดในโลก
Kenneth Fisher

7

คำถามของคุณคล้ายกับคำถามที่ฉันตอบ - การสำรองและคืนค่าฐานข้อมูลเซิร์ฟเวอร์ SQL 10-20 สู่สถานะ ~ แบบซิงโครนัสหรือไม่

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

ให้ debunk ตำนานของคุณ ...

เริ่มการสำรองข้อมูล dbs ทั้งหมดในแต่ละครั้งและปล่อย db สำหรับการใช้งาน

จากmyths backup (ขอแนะนำให้คุณอ่าน myths สำรองทั้งหมด) :

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

เนื่องจากฐานข้อมูลเชื่อมโยงกันฉันต้องการให้ความสอดคล้องของข้อมูลในไฟล์สำรอง ดังนั้นเนื่องจากข้อกำหนดความสอดคล้องของข้อมูลนี้ฉันไม่ต้องการให้การเปลี่ยนแปลงดำเนินไปกับไฟล์สำรองของฉัน

ธุรกรรมที่ทำเครื่องหมายไว้จะช่วยให้คุณใช้การสำรองข้อมูล LOG ที่สอดคล้องกันและคุณจะสามารถกู้คืนได้โดยใช้ RESTORE ... WITH STOPBEFOREMARK = '<mark_name>'

โปรดจำไว้ว่าธุรกรรมที่ทำเครื่องหมายไว้สำหรับฐานข้อมูลทั้งหมดในอินสแตนซ์จะถูกบันทึกในdbo.logmarkhistoryตารางในMSDBฐานข้อมูลด้วย


-1
--]---- Begin Code ----[
--–declaring variables
DECLARE @dbname VARCHAR(100) -- database name
DECLARE @bupath VARCHAR(100) -- path for backup location
DECLARE @filename VARCHAR(100) -- filename used for backup files
DECLARE @datestamp VARCHAR(25) -- date used for backup file timestamp
-- specify database backup directory
SET @bupath = 'D:\DB Bkp\'
-- file date formatting
SELECT @datestamp = CONVERT(VARCHAR(20),GETDATE(),112) + REPLACE
(CONVERT(VARCHAR(20),GETDATE(),108),':','')
--specify databases to backup
DECLARE db_cursor CURSOR for
SELECT name
FROM master.dbo.sysdatabases
WHERE name not IN ('tempdb') -- excludes these databases, if excluding multiple databases, seprate them by a comma
--backup process
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
   SET @filename = @bupath + @dbname + '_' + @datestamp + '.bak'
   BACKUP DATABASE @dbname TO DISK = @filename WITH INIT,
   CHECKSUM; --init overwrites existing files with the same name, and checksum verifies the backup
       FETCH NEXT from db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor

สำหรับรายละเอียดเพิ่มเติม: https://blogs.technet.microsoft.com/letsdothis/2013/11


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