ไม่สามารถทำมิเรอร์ฐานข้อมูล SQL Server 2012


11

เมื่อพยายามทำมิร์เรอร์ฐานข้อมูลโดยใช้คำสั่งต่อไปนี้

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ

ฉันได้รับข้อผิดพลาดดังต่อไปนี้

ข่าวสารเกี่ยวกับ 1475, ระดับ 16, สถานะ 105,
ฐานข้อมูลบรรทัดที่ 1 "test0916aj8CJ" อาจมีการเปลี่ยนแปลงบันทึกจำนวนมากที่ยังไม่ได้ทำการสำรองข้อมูล ทำการสำรองข้อมูลบันทึกบนฐานข้อมูลหลักหรือฐานข้อมูลหลัก จากนั้นเรียกคืนการสำรองข้อมูลนี้ในฐานข้อมูลมิเรอร์เพื่อเปิดใช้งานการทำมิเรอร์ฐานข้อมูลหรือในฐานข้อมูลทุติยภูมิทุกครั้งเพื่อให้คุณสามารถเข้าร่วมกลุ่มความพร้อมใช้งานได้

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

ฉันได้ลองสิ่งต่อไปนี้ ...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = Ntest-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO

แต่วิธีการข้างต้นไม่ได้ผลเช่นกัน

ขอบคุณ


สองสามสิ่ง ... คุณไม่ได้ทำมิเรอร์ด้วยคำสั่งนั้น แต่เพิ่มฐานข้อมูลไปยังกลุ่มความพร้อมใช้งาน ซึ่งทำให้ฉันถามเกี่ยวกับวิธีการตั้งค่า AG ของคุณโหมดการกู้คืนฐานข้อมูลของคุณอยู่ในนั้นและทำไมในการแก้ไขปัญหาบันทึกคุณกำลังทำการสำรองข้อมูล COPY_ONLY ซึ่งทำให้บันทึกไม่เสียหายซึ่งไม่ใช่ข้อผิดพลาดที่ระบุไว้ ? ดูเหมือนว่าฉันจะหายไปไม่กี่ก้าวหรือสับสนมากเกี่ยวกับสิ่งที่คุณพยายามทำ
Steve Mangiameli

คำตอบ:


15

มันง่ายที่จะทำซ้ำข้อผิดพลาดที่คุณได้รับ

  • สร้างฐานข้อมูลในโหมดการกู้คืนเต็มในระดับประถมศึกษา
  • สร้างฐานข้อมูลในโหมดการกู้คืนเต็มในรอง
  • เรียกใช้ GUI และพยายามกำหนดค่าการมิเรอร์ระหว่างประถมและมัธยม

ด้านล่างเป็นข้อผิดพลาดที่คุณจะได้รับ:

ฐานข้อมูล "test_mirroring_kin" อาจมีการเปลี่ยนแปลงบันทึกจำนวนมากที่ยังไม่ได้ทำการสำรองข้อมูล ทำการสำรองข้อมูลบันทึกบนฐานข้อมูลหลักหรือฐานข้อมูลหลัก จากนั้นเรียกคืนการสำรองข้อมูลนี้ในฐานข้อมูลมิเรอร์เพื่อเปิดใช้งานการทำมิเรอร์ฐานข้อมูลหรือในฐานข้อมูลทุติยภูมิทุกครั้งเพื่อให้คุณสามารถเข้าร่วมกลุ่มความพร้อมใช้งานได้ (Microsoft SQL Server ข้อผิดพลาด: 1475)

ป้อนคำอธิบายรูปภาพที่นี่

ให้เข้าใจว่าข้อผิดพลาดนั้นคืออะไร:

คุณกำหนดค่าฐานข้อมูลของคุณในโหมดการกู้คืนแบบเต็มและคิดว่าฐานข้อมูลนั้นอยู่ในโหมดการกู้คืนแบบเต็ม

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

คุณสามารถตรวจสอบได้อย่างง่ายดายโดยใช้dbcc dbinfo-> dbi_dbbackupLSNมีค่า0:0:0(0x00000000:00000000:0000)หรือใช้สคริปต์ของ Paul Randal

dbcc traceon (3604)
go
dbcc dbinfo('test_mirroring_kin') with tableresults
go
dbcc traceoff (3604)

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข:แม้แต่การสำรองข้อมูลเต็มรูปแบบครั้งแรกด้วยCOPY_ONLYตัวเลือกก็ไม่ได้สร้างห่วงโซ่การสำรองข้อมูลเช่นกัน

backup database test_mirroring_kin
to disk = 'D:\test_mirroring_kin_FULL.bak'
with init, stats=10, COPY_ONLY

dbcc dbinfo-> dbi_dbbackupLSNยังคงมีค่า0:0:0(0x00000000:00000000:0000)เป็น ซึ่งหมายความว่าฐานข้อมูลยังอยู่ในโหมดการกู้คืนแบบหลอกง่าย

คุณต้องทำอย่างไรเพื่อแก้ไขข้อผิดพลาดด้านบน

คุณต้องทำการสำรองข้อมูลทั้งหมด + สำรองข้อมูลบันทึกการทำรายการหนึ่งรายการบนหลักแล้วคืนค่าในฐานข้อมูลรองwith norecoveryจากนั้นเข้าร่วมฐานข้อมูลในกลุ่ม AG หรือการทำมิเรอร์

ในฐานะที่เป็นข้อความด้านข้างและเพื่อความสมบูรณ์สำหรับการบอกสคริปต์ของคุณbackup to NULให้อ่านโพสต์บล็อกนี้โดย Gail Shaw


5

ทำไมTO DISK = N’NUL’?

ฉันไม่เข้าใจว่าทำไมคุณถึงใช้TO DISK = N’NUL’:

BACKUP
DATABASE [test0916aj8CJ] TO DISK = NNUL

หากคุณทำเช่นนั้นการสำรองข้อมูลจะถูกบันทึกลงในNUL, (เช่น. = ไม่มีที่ไหนเลย / ไม่มีอะไร) และไม่สามารถใช้ได้เนื่องจากไม่มีไฟล์อยู่

แม้ว่าNULจะสามารถใช้เป็นปลายทางสำหรับการสำรองข้อมูล LOG แต่ก็ไม่ควรใช้อย่างใดอย่างหนึ่งโดยเฉพาะอย่างยิ่งบนเซิร์ฟเวอร์ Prod เนื่องจากบันทึกจะหายไปและการสำรองข้อมูลจะเสียหาย (~ คล้ายกับSHRINKFILE)

สำรองข้อมูล LOG

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

ดังนั้นคุณต้องสำรองข้อมูลล็อกธุรกรรมบนฐานข้อมูลหลัก:

BACKUP LOG [test0916aj8CJ] TO  DISK = N'....bak' 
WITH  COPY_ONLY, FORMAT, INIT,  NAME = N'test0916aj8CJ-Transaction Log  Backup', STATS = 10

COPY_ONLYตัวเลือกที่จะต้องใช้ ทำให้แน่ใจว่าบันทึกจะไม่ถูกตัดทอนเมื่อสิ้นสุดการสำรองข้อมูล LOG

เชนสำรอง DB หลัก

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

เนื่องจากCOPY_ONLYตัวเลือกไม่ได้ทำลายห่วงโซ่การสำรองจึงไม่สร้างห่วงโซ่การสำรอง COPY_ONLYตัวเลือกที่ไม่สามารถนำมาใช้สำหรับการสำรองฐานข้อมูล

สำรองตามลำดับ:

  • การสำรองฐานข้อมูลแบบเต็มโดยไม่มีCOPY_ONLYตัวเลือก
  • การสำรองข้อมูลส่วนต่างที่ไม่จำเป็น
  • 1 การสำรองข้อมูลเข้าสู่ระบบด้วยCOPY_ONLYตัวเลือก
  • การสำรองข้อมูล LOG อื่น (หรือมากกว่า) หากจำเป็น ...

กู้คืนฐานข้อมูลรอง

ดังนั้นการสำรองฐานข้อมูลจะต้องกู้คืน (+ ดิฟเฟอเรนเชียล) ที่สอง

จะต้องถูกกู้คืนด้วยNORECOVERYตัวเลือกเนื่องจากคุณต้องการกู้คืนการสำรองข้อมูล LOG เมื่อการสำรองข้อมูลแบบเต็มได้รับการกู้คืนแล้ว

ขั้นสุดท้ายคุณจะคืนค่าข้อมูลสำรองของ LOG คุณยังคงต้องใช้NORECOVERYตัวเลือกนี้เนื่องจากมิเรอร์จะทำการกู้คืนการทำธุรกรรมครั้งเดียว

  • กู้คืนการสำรองข้อมูลทั้งหมดด้วยNORECOVERYตัวเลือก
  • กู้คืนการสำรองข้อมูล DIFF ด้วยNORECOVERYตัวเลือก
  • เรียกคืนการสำรองข้อมูล LOG ทั้งหมดตามลำดับNORECOVERYตัวเลือก

มารวมเข้าด้วยกัน (ปรับให้เข้ากับ env ของคุณ)

  • ในการเรียกใช้เซิร์ฟเวอร์หลัก:

    USE master
    Go
    BACKUP DATABASE [test0916aj8CJ] TO DISK = N'....bak'
    WITH FORMAT, INIT, NAME = N'test0916aj8CJ-Full Database Backup', STATS = 10
    GO
    BACKUP LOG [test0916aj8CJ] TO DISK = N'....bak' 
    WITH COPY_ONLY, FORMAT, INIT, NAME = N'test0916aj8CJ-Transaction Log Backup', STATS = 10
    GO
    
  • ในการเรียกใช้เซิร์ฟเวอร์รอง:

    USE master
    Go
    RESTORE DATABASE [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
    GO
    RESTORE LOG [test0916aj8CJ] FROM DISK = N'....bak' 
    WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
    
  • จากนั้นคุณสามารถดำเนินการเพิ่มฐานข้อมูลรองใหม่ลงในกลุ่มความพร้อมใช้งานได้ ...

การกระทำที่เป็นตัวเลือก

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