SQL Server: ฐานข้อมูลค้างอยู่ในสถานะ“ กู้คืน”


564

ฉันสำรองฐานข้อมูล:

BACKUP DATABASE MyDatabase
TO DISK = 'MyDatabase.bak'
WITH INIT --overwrite existing

จากนั้นพยายามคืนค่า:

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE --force restore over specified database

และตอนนี้ฐานข้อมูลติดอยู่ในสถานะการกู้คืน

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

RESTORE DATABASE MyDatabase
WITH RECOVERY 

ยกเว้นว่าแน่นอนล้มเหลว:

Msg 4333, Level 16, State 1, Line 1
The database cannot be recovered because the log was not restored.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

และสิ่งที่คุณต้องการในสถานการณ์ที่ร้ายแรงคือการกู้คืนที่ใช้ไม่ได้


การสำรองข้อมูลประกอบด้วยทั้งข้อมูลและไฟล์บันทึก:

RESTORE FILELISTONLY 
FROM DISK = 'MyDatabase.bak'

Logical Name    PhysicalName
=============   ===============
MyDatabase    C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase.mdf
MyDatabase_log  C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\MyDatabase_log.LDF

3
ฉันมีปัญหาเดียวกันที่แน่นอนและการแก้ปัญหาทั้งหมดล้มเหลว น่าสนใจฉันเข้าสู่เซิร์ฟเวอร์ SQL โดยตรงและออกDROP DATABASE dbคำสั่งผ่าน SSMS และทำงานได้ (ก่อนหน้านี้ฉันใช้ SSMS จากเครื่องอื่นเพื่อออกคำสั่ง) ฉันคาดเดาโซลูชันอื่น ๆ ก็จะใช้ได้เช่นกัน
Salman

คำตอบ:


437

คุณต้องใช้WITH RECOVERYตัวเลือกพร้อมกับRESTOREคำสั่งฐานข้อมูลเพื่อให้ฐานข้อมูลออนไลน์เป็นส่วนหนึ่งของกระบวนการกู้คืน

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

คำสั่งของคุณควรมีลักษณะเช่นนี้

RESTORE DATABASE MyDatabase
   FROM DISK = 'MyDatabase.bak'
   WITH REPLACE,RECOVERY

คุณอาจมีความสำเร็จมากขึ้นโดยใช้ตัวช่วยสร้างการคืนค่าฐานข้อมูลใน SQL Server Management Studio วิธีนี้คุณสามารถเลือกตำแหน่งไฟล์เฉพาะตัวเลือกเขียนทับและตัวเลือก WITH Recovery


3
ฉันไม่เคยใช้คำสั่งการกู้คืนเมื่อทำสิ่งที่เขาทำ ด้วยการแทนที่ควรจะพอเพียง
Sam

8
ใช่ฉันใช้ NORECOVERY แต่กระบวนการกู้คืนหยุดทำงาน ใช้กับการกู้คืนแทนที่ไม่แขวนกระบวนการอีกต่อไป
จูเนียร์Mayhé

นี่เป็นการแก้ไขปัญหาของฉัน เรามีความล้มเหลวของ SAN ในระหว่างการกู้คืนและนี่เป็นวิธีที่รวดเร็วและสะอาด
ผู้ใช้ที่ลงทะเบียน

วันนี้ฉันมีปัญหาคล้ายกันกับฐานข้อมูล SQL Server 2005 ในกรณีของฉันฉันต้องเพิ่ม 'เริ่มต้นใหม่' ในส่วนคำสั่ง WITH เพื่อแก้ไขปัญหา มันทำให้ฉันมีข้อผิดพลาดระบุว่าการดำเนินการก่อนหน้านี้ไม่ประสบความสำเร็จ
XpiritO

3
@FistOfFury หากการดำเนินการกู้คืนก่อนหน้านี้บนฐานข้อมูลเดียวกันอยู่ในสถานะระงับ / หลับโหมดใช่แล้ว เพียงแค่หยุด / ยกเลิกการกู้คืนในกระบวนการควรมีผลเหมือนกัน
John Sansom

692

ฉันมีสถานการณ์นี้การกู้คืนฐานข้อมูลไปยังอินสแตนซ์ SQL Server 2005 Standard Edition โดยใช้ Symantec Backup Exec 11d หลังจากงานกู้คืนเสร็จสมบูรณ์ฐานข้อมูลยังคงอยู่ในสถานะ "กู้คืน" ฉันไม่มีปัญหาเนื้อที่ดิสก์ - ฐานข้อมูลไม่ได้มาจากสถานะ "การกู้คืน"

ฉันรันเคียวรีต่อไปนี้กับอินสแตนซ์ SQL Server และพบว่าฐานข้อมูลสามารถใช้งานได้ทันที:

RESTORE DATABASE <database name> WITH RECOVERY

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

11
+1 กับ gotcha เมื่อฉันรันสิ่งนี้ฉันได้รับข้อความแสดงข้อผิดพลาดที่แจ้งว่าฐานข้อมูลได้รับการกู้คืนอย่างสมบูรณ์แล้ว แต่มันก็ยังแสดงให้เห็นว่าอยู่ในสถานะ "ในการกู้คืน" ดังนั้นฉันคลิกขวาใน Management Studio กด Refresh และมันก็กลับมาเป็นปกติ
dario_ramos

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

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

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

102

นี่คือวิธีที่คุณทำ:

  1. หยุดบริการ (MSSQLSERVER);
  2. เปลี่ยนชื่อหรือลบไฟล์ฐานข้อมูลและไฟล์บันทึก (C: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ Data ... ) หรือที่ใดก็ตามที่คุณมีไฟล์;
  3. เริ่มบริการ (MSSQLSERVER);
  4. ลบฐานข้อมูลที่มีปัญหา
  5. กู้คืนฐานข้อมูลอีกครั้ง

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

8
ทำไมไม่เพียงวางฐานข้อมูล ด้วยวิธีนี้คุณไม่ต้องหยุดบริการ
ErikE

8
@ErikE สำหรับฉันเซิร์ฟเวอร์ SQL กล่าวว่าไม่สามารถวางฐานข้อมูลในระหว่างการคืนค่าแม้ว่าจะไม่ได้คืนค่าจริง ๆ ...
Erik Philips

@ErikPhilips ในกรณีที่ฉันคิดว่าหนึ่งกลับไปหยุดบริการ ฉันสงสัยว่าสิ่งนั้นจะเกิดขึ้นทุกครั้งหรือเฉพาะในบางกรณีของปัญหาการกู้คืนที่ติดอยู่
ErikE

5
ในกรณีของฉันมันก็เพียงพอแล้วที่จะปล่อยฐานข้อมูลที่ค้างอยู่ในสถานะ "การกู้คืน ... " ด้วยคำสั่ง SQL drop database <dbname>ในหน้าต่างแบบสอบถาม จากนั้นฉันคลิกขวาที่ฐานข้อมูลและเลือกรีเฟรชซึ่งลบรายการใน Management Studio หลังจากนั้นฉันทำการกู้คืนใหม่ซึ่งทำงานได้ดี ( โปรดทราบว่าการนำออฟไลน์ไม่ทำงานการเริ่มบริการ SQL ใหม่ไม่ทำงานการรีบูตเซิร์ฟเวอร์ก็ไม่ทำงานเช่นกัน)
Matt

84

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

RESTORE DATABASE <database name> WITH RECOVERY

ข้อความฐานข้อมูล:

RESTORE DATABASE ประมวลผล 0 หน้าสำเร็จใน 18.530 วินาที (0.000 MB / วินาที)

ฐานข้อมูลสามารถใช้งานได้อีกครั้งหลังจากผ่านไป 18 วินาที


6
มีประโยชน์อย่างยิ่งเมื่อคุณกู้คืนฐานข้อมูลแล้ว แต่
ลืมตัว

2
นี่คือทั้งหมดที่ฉันต้องการเพื่อให้มันออกจากสถานะ "การกู้คืน" หลังจากกู้คืนการสำรองข้อมูลของฐานข้อมูลนี้ไปยังชื่อฐานข้อมูลอื่น ขอบคุณมัด
ฌอน

81

ฉันมีปัญหาคล้ายกันกับการกู้คืนโดยใช้ SQL Management Studio ฉันพยายามคืนค่าสำเนาสำรองของฐานข้อมูลเป็นชื่อใหม่ด้วยชื่ออื่น ตอนแรกมันล้มเหลวและหลังจากแก้ไขชื่อไฟล์ของฐานข้อมูลใหม่มันก็ประสบความสำเร็จ - ในกรณีใด ๆ ปัญหาที่ฉันอธิบายเกิดขึ้นอีกครั้งแม้ว่าฉันจะได้รับสิทธินี้ตั้งแต่ครั้งแรก ดังนั้นหลังจากการกู้คืนฐานข้อมูลดั้งเดิมจะยังคงอยู่ด้วย (การกู้คืน ... ) ถัดจากชื่อ เมื่อพิจารณาจากคำตอบของฟอรัมด้านบน (Bhusan) ฉันลองใช้ตัวแก้ไขคิวรีด้านข้างต่อไปนี้:

RESTORE DATABASE "[NAME_OF_DATABASE_STUCK_IN_RESTORING_STATE]"

ซึ่งแก้ไขปัญหา ตอนแรกฉันมีปัญหาเพราะชื่อฐานข้อมูลที่มีอักขระพิเศษ ฉันแก้ไขสิ่งนี้ได้โดยการเพิ่มเครื่องหมายคำพูดคู่ล้อมรอบ - การเสนอราคาเดียวไม่สามารถให้ข้อผิดพลาด

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


2
ทำงานได้อย่างสมบูรณ์แบบ - โดยไม่จำเป็นต้องฉีกมันซ้ำแล้วซ้ำอีก 3 Dbs จาก 80+ Gb ใช้เวลาสักครู่! ขอบคุณ!
Christer

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

1
ฉันได้รับปัญหานี้เมื่อกู้คืนไฟล์ที่คัดลอกเท่านั้นสำรองของฐานข้อมูลไปยังฐานข้อมูลใหม่ ฐานข้อมูลดั้งเดิมแสดงข้อผิดพลาด โซลูชันนี้ใช้งานได้และคำตอบที่ฉันได้รับคือ"กู้คืนฐานข้อมูลสำเร็จแล้วประมวลผล 0 หน้าใน 0.263 วินาที (0.000 MB / วินาที)" ดังนั้นดูเหมือนว่า SQL Server จะสับสนเกี่ยวกับสถานะของฐานข้อมูล
R. Schreurs

1
ทำงานให้ฉันได้ แต่เมื่อฉันลบเครื่องหมายคำพูดคู่ - ฉันเพิ่งได้ [MY_DB_NAME] เป็นพารามิเตอร์
StackOverflowUser

34

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

ฉันได้พบวิธีแก้ปัญหา :)

Drop database *dbname*

29

ด้วยตัวเลือกการกู้คืนจะใช้ตามค่าเริ่มต้นเมื่อดำเนินการคำสั่ง RESTORE DATABASE / RESTORE LOG หากคุณติดอยู่ในกระบวนการ "กู้คืน" คุณสามารถนำฐานข้อมูลกลับสู่สถานะออนไลน์ได้โดยดำเนินการ:

RESTORE DATABASE YourDB WITH RECOVERY
GO

หากมีความจำเป็นสำหรับการเรียกคืนไฟล์หลายไฟล์คำสั่ง CLI ต้องการ WITH NORECOVERY และ WITH RECOVERY ตามลำดับ - เฉพาะไฟล์สุดท้ายในคำสั่งที่ควรมี WITH RECOVERY เพื่อนำกลับฐานข้อมูลออนไลน์:

RESTORE DATABASE YourDB FROM DISK = 'Z:\YourDB.bak'
WITH NORECOVERY
GO
RESTORE LOG YourDB FROM DISK = 'Z:\YourDB.trn'
WITH RECOVERY
GO

คุณสามารถใช้ตัวช่วยสร้าง Studio จัดการเซิร์ฟเวอร์ SQL ได้เช่นกัน:

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

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


23

นี่อาจจะค่อนข้างชัดเจน แต่ตอนนี้ฉันสะดุด:

หากคุณทำการสำรองข้อมูลหางบันทึกปัญหานี้อาจเกิดจากการตรวจสอบตัวเลือกนี้ในตัวช่วยสร้างการคืนค่า SSMS - "ปล่อยให้ฐานข้อมูลต้นทางอยู่ในสถานะการกู้คืน (ด้วย NORECOVERY)"

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


7
หากคุณอยู่ในสถานะนี้ทางออกที่ดีที่สุดของคุณคือ: 1. คลิกขวาที่ฐานข้อมูลไปที่ Tasks-> Restore-> Transaction Logs 2. ค้นหาไฟล์สำรองที่ใช้สำหรับ Tail Log back up 3. กู้คืน การสำรองข้อมูลการคืนค่าควรสำเร็จและทำให้ฐานข้อมูลกลับสู่สถานะออนไลน์
Ryan Gross

16

ฉันคิดว่าทำไม

หากไคลเอ็นต์ที่ออกRESTORE DATABASEคำสั่งยกเลิกการเชื่อมต่อระหว่างการกู้คืนการกู้คืนจะติดอยู่

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


10
คำสั่ง SQL ทั้งหมดต้องการให้ไคลเอ็นต์ยังคงเชื่อมต่อตลอดเวลา
mrdenny

2
@ mrdenny: ฉันจะสันนิษฐานว่าการเปลี่ยนแปลงจะยกเลิกเมื่อลูกค้ายกเลิกการเชื่อมต่อ
เอียนบอยด์

ฉันมีปัญหาเดียวกันกับที่ใช้คำสั่งนี้กับไดรเวอร์ PHP PDO จาก microsoft อย่างไรก็ตามเมื่อทำงานกับ microsoft sql server studio studio มันใช้งานได้ดี ฉันสงสัยว่าจะทำให้แอปพลิเคชัน PHP ของฉันเชื่อมต่อตลอดเวลาได้อย่างไร
channa

เกิดขึ้นที่นี่ด้วยฐานข้อมูลติดอยู่ในการคืนค่า / ผู้ใช้คนเดียวหลังจากการเชื่อมต่อที่เป็นไปได้ ฆ่า SPID อื่น ๆ ทั้งหมดจากเซสชันใหม่ แต่ยังคงติดอยู่ ก็สามารถวางฐานข้อมูลเป็นทางออกได้
crokusek

10

อันนี้ใช้ได้ผล:

http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/8dd1b91d-3e14-4486-abe6-e3a550bfe457

ฉันมีสถานการณ์ที่ฐานข้อมูลของฉันแสดงสถานะการกู้คืนและฉันไม่สามารถเรียกใช้แบบสอบถามใด ๆ และไม่สามารถเชื่อมต่อกับซอฟต์แวร์ของเราได้

สิ่งที่ฉันได้รับจากสถานการณ์นี้คือ:

  1. หยุดบริการ SQL ที่เกี่ยวข้องทั้งหมดจากบริการ windows

  2. ฉันเปิดโฟลเดอร์ DATA ที่มีไฟล์ Ldf และ Mdf อยู่ในไดเรกทอรี SQL โดยปกติแล้วจะเป็น: "C: \ Program Files *********** \ MSSQL \ DATA

  3. จากนั้นฉันก็คัดลอกทั้งไฟล์ Ldf และ Mdf ของฐานข้อมูล: [db name] .mdf และ [db name] _log.ldf

ฉันคัดลอกไฟล์เหล่านี้ทั้งสองไปยังโฟลเดอร์อื่น

  1. จากนั้นฉันเริ่มบริการ SQL ที่เกี่ยวข้องทั้งหมด (ในขั้นตอนที่ 1) อีกครั้งจากบริการ windows

  2. เริ่มสตูดิโอการจัดการ MS SQL ของฉันด้วยการเข้าสู่ระบบปกติ

  3. คลิกขวาที่ฐานข้อมูลผู้ร้ายและกดปุ่ม DELETE (เพื่อลบฐานข้อมูลเลย)

  4. ไฟล์ LDF และ MDF ทั้งหมดที่เกี่ยวข้องกับฐานข้อมูลนี้ได้หายไปจากโฟลเดอร์ DATA (กล่าวถึงในขั้นตอนที่ 2)

  5. สร้างฐานข้อมูลใหม่ด้วยชื่อเดียวกัน (ชื่อเดียวกับที่ฉันลบในขั้นตอนที่ 6 - ฐานข้อมูลผู้ร้าย)

  6. จากนั้น [ชื่อฐานข้อมูล] -> คลิกขวา -> งาน -> ออฟไลน์

  7. ฉันคัดลอกทั้งไฟล์ (จากขั้นตอนที่ 3) กลับไปที่โฟลเดอร์ DATA (ขั้นตอนที่ 2)

  8. [ชื่อฐานข้อมูล] -> คลิกขวา -> งาน -> นำออนไลน์


มันก็ใช้ได้กับฉันเช่นกัน ในขั้นตอนที่ 10 ฉันเลือกที่จะเขียนทับไฟล์ที่มีอยู่
Divi perdomo

8

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

RESTORE DATABASE [My.DB.Name] WITH RECOVERY

5

ในกรณีของฉันมันก็เพียงพอแล้วที่จะปล่อยฐานข้อมูลที่ค้างอยู่ในสถานะ"การกู้คืน ... "ด้วยคำสั่ง SQL

 drop database <dbname> 

ในหน้าต่างแบบสอบถาม

จากนั้นฉันคลิกขวาที่ฐานข้อมูลและเลือกรีเฟรชซึ่งลบรายการใน Management Studio หลังจากนั้นฉันทำการกู้คืนใหม่ซึ่งทำงานได้ดี (โปรดทราบว่าการนำออฟไลน์ไม่ทำงานการเริ่มต้นบริการ SQL ไม่ทำงานการรีบูตเซิร์ฟเวอร์ก็ไม่ทำงานเช่นกัน)


3

ฉันมีปัญหานี้เมื่อฉันยังได้รับข้อผิดพลาด TCP ในบันทึกเหตุการณ์ ...

วางฐานข้อมูลด้วย sql หรือคลิกขวาในตัวจัดการ "ลบ" และเรียกคืนอีกครั้ง

ฉันได้เริ่มทำสิ่งนี้ตามค่าเริ่มต้น สคริปต์การปล่อย DB สร้างใหม่และคืนค่า


3

โดยค่าเริ่มต้นทุกคนRESTORE DATABASEมาพร้อมกับการRECOVERYตั้งค่า ตัวเลือก 'NORECOVERY' โดยทั่วไปจะบอก SQL Server ว่าฐานข้อมูลกำลังรอไฟล์กู้คืนเพิ่มเติม (อาจเป็นไฟล์DIFFและLOGไฟล์และอาจรวมถึงไฟล์สำรองหางบันทึกหากเป็นไปได้) ตัวเลือก 'กู้คืน' เสร็จสิ้นธุรกรรมทั้งหมดและให้ฐานข้อมูลพร้อมที่จะทำธุรกรรม

ดังนั้น:

  1. หากฐานข้อมูลของคุณตั้งค่าด้วยแบบจำลองการกู้คืนSIMPLEคุณสามารถทำการกู้คืนแบบเต็มด้วยNORECOVERYตัวเลือกเมื่อคุณมีการสำรองข้อมูลDIFF ไม่อนุญาตให้มีการสำรองข้อมูลLOGในฐานข้อมูลแบบจำลองการกู้คืนSIMPLE
  2. มิฉะนั้นถ้าฐานข้อมูลของคุณจะถูกตั้งค่ากับเต็มหรือBULK เข้าสู่ระบบรูปแบบการกู้คืนคุณสามารถดำเนินการเต็มรูปแบบเรียกคืนตามด้วยNORECOVERYตัวเลือกแล้วทำการDIFFตามมาด้วยNORECOVERYและที่สุดท้ายที่ดำเนินการเข้าสู่ระบบเรียกคืนด้วยRECOVERYตัวเลือก

โปรดจำไว้ว่าสุดท้ายคืน QUERY ต้องมีRECOVERY OPTION อาจเป็นวิธีที่ชัดเจนหรือไม่ ใน therms ของ T-SQL สถานการณ์:

1

 USE [master]
    GO
    RESTORE DATABASE Database_name 
    FROM DISK = N'\\path_of_backup_file.bak WITH FILE = 1, [REPLACE],NOUNLOAD, 
    RECOVERY -- This option could be omitted.
    GO

ด้วยตัวเลือก REPLACE จะต้องใช้ด้วยความระมัดระวังเนื่องจากอาจทำให้ข้อมูลสูญหายได้

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

   USE [master]
    GO
    RESTORE DATABASE Database_name
      FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
       NOUNLOAD,NORECOVERY
    GO
    RESTORE DATABASE Database_name
      FROM DISK =N'\\path_of_**diff**backup_file.bak' WITH FILE = 1, 
     NOUNLOAD, RECOVERY
    GO

 2. USE [master]
    GO
   -- Perform a Tail-Log backup, if possible. 
   BACKUP LOG Database_name
   GO
   -- Restoring a FULL backup
   RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_backup_file.bak' WITH FILE = 1, 
     NOUNLOAD,NORECOVERY
  GO 
  -- Restore the last DIFF backup
  RESTORE DATABASE Database_name
    FROM DISK = N'\\path_of_DIFF_backup_file.bak' WITH FILE = 1,
     NORECOVERY,NOUNLOAD
  GO
  -- Restore a Log backup
  RESTORE LOG Database_name
    FROM DISK = N'path_of_LOG_backup_file.trn' WITH FILE = 2,
    RECOVERY, NOUNLOAD
  GO

แน่นอนคุณสามารถทำการกู้คืนด้วยตัวเลือกSTATS = 10ที่บอกให้ SQL Server รายงานทุก ๆ 10% ให้เสร็จสิ้น

หากคุณต้องการคุณสามารถสังเกตกระบวนการหรือคืนค่าในแบบสอบถามแบบเรียลไทม์ ดังต่อไปนี้:

USE[master]
GO
SELECT session_id AS SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time 
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a 
        WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')
GO

หวังว่าความช่วยเหลือนี้


2

อาจมีปัญหาในการลบฐานข้อมูลที่ติดอยู่หากเปิดใช้งานสแน็ปช็อต สำหรับฉันแล้วสิ่งนี้ได้ผล:

  1. ครั้งแรกที่ฉันทำตามขั้นตอนTipu Delacablu (อ่านไม่กี่กระทู้)
  2. รันคำสั่ง: ปล่อยฐานข้อมูล [ฐานข้อมูลของคุณ] ซึ่งจะทำให้คุณมีข้อผิดพลาดบอกชื่อของฐานข้อมูลภาพรวม
  3. เรียกใช้คำสั่ง: ปล่อยฐานข้อมูล [ฐานข้อมูล snapshot] แล้วเรียกใช้คำสั่งในขั้นตอนที่ 2 อีกครั้ง


1

ฉันมีกรณีMyDbName (กำลังคืนค่า ... )เนื่องจากข้อ จำกัด สิทธิ์การใช้งาน SQL Express

ในล็อกไฟล์ฉันพบสิ่งนี้:

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

ดังนั้นหากคุณพยายามกู้คืนฐานข้อมูลที่ใหญ่กว่าคุณต้องเปลี่ยนเซิร์ฟเวอร์ SQL Express เป็น Developer editionเช่น


มันเป็นฐานข้อมูล TFS และลูกค้า TFS ได้บอกฉันแล้ว: ฐานข้อมูลเต็ม
cskwg

1

พบปัญหาที่คล้ายกันในขณะที่กู้คืนฐานข้อมูลโดยใช้สตูดิโอการจัดการเซิร์ฟเวอร์ SQL และติดอยู่ในโหมดการกู้คืน หลังจากติดตามปัญหาไปหลายชั่วโมงแล้วแบบสอบถามต่อไปนี้ใช้ได้กับฉัน แบบสอบถามต่อไปนี้คืนค่าฐานข้อมูลจากการสำรองข้อมูลที่มีอยู่สู่สถานะก่อนหน้า ฉันเชื่อว่าการจับเป็นไฟล์. mdf และ. log ในไดเรกทอรีเดียวกัน

RESTORE DATABASE aqua_lc_availability
FROM DISK = 'path to .bak file'
WITH RECOVERY

0
  1. ให้ตรวจสอบและเรียกใช้บริการตัวแทนของ SQL ก่อน
  2. ใช้ T-SQL ต่อไปนี้:

    เลือกชื่อไฟล์จาก master.sys.sysaltfiles WHERE dbid = DB_ID ('db_name');

  3. การใช้ T-SQL อย่างต่อเนื่อง:

    เรียกคืนฐานข้อมูลจาก DISK = 'DB_path' ด้วย RESTART, REPLACE;

หวังว่าจะช่วยได้!


0

ตัวเลือกทั้งหมดที่ใช้ RECOVERY ไม่ทำงานสำหรับฉัน

สิ่งที่ทำคือทำการคืนค่าทั้งหมดจาก Management Studio

USE [master]
RESTORE DATABASE Sales_SSD
FROM  DISK = N'D:\databaseBackups02\Daily_Sales_20150309_0941.bak' 
WITH  FILE = 1,  
MOVE N'Sales_Data' TO N'C:\Data\SSD\Sales.mdf',  
MOVE N'Sales_Log' TO N'C:\Data\SSD\Sales_1.ldf',  
NOUNLOAD,  REPLACE,  STATS = 5

0

ฉันมีปัญหาเดียวกัน ... แม้ว่าฉันจะไม่ทราบว่าทำไมฐานข้อมูลของฉันประสบปัญหานี้เนื่องจากไดรฟ์ของฉันไม่เต็ม ... มันเหมือนว่ามันจะเสียหายหรือบางสิ่งบางอย่าง ฉันลองทั้งหมดข้างต้นไม่มีพวกเขาทำงานอย่างเต็มที่ฉันคิดว่าข้อเสนอแนะโดยเฉพาะอย่างยิ่งที่จะหยุดการบริการและการลบไฟล์ mdf และ ldf จะทำงาน ... แต่มันก็ยังคงแข็งค่าเมื่อคืนค่า?

ฉันสิ้นสุดการแก้ไขปัญหานี้โดยการลบไฟล์ตามที่กล่าวไว้ แต่แทนที่จะพยายามกู้คืนฐานข้อมูลอีกครั้งฉันก็คัดลอกไฟล์สด. mdf และ. ldf และแนบไฟล์เหล่านี้โดยใช้ตัวช่วยสร้าง Front End Attachment โล่งอกมันใช้งานได้ !!

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


0

สิ่งที่แก้ไขให้ฉันคือ

  1. หยุดอินสแตนซ์
  2. สร้างการสำรองข้อมูลของไฟล์. pdf และ. ldf ในโฟลเดอร์ data
  3. รีสตาร์ทอินสแตนซ์
  4. ลบฐานข้อมูลที่ติดอยู่คืนค่า
  5. วางไฟล์. mdf and.ldf ลงในโฟลเดอร์ data
  6. แนบอินสแตนซ์กับไฟล์. pdf และ. ldf

0
RESTORE DATABASE {DatabaseName}
   FROM DISK = '{databasename}.bak'
   WITH REPLACE, RECOVERY

โปรดชี้ให้เห็นข้อมูลเชิงลึกเพิ่มเติมที่คำตอบนี้ให้เมื่อเปรียบเทียบกับคำตอบที่เก่ากว่าตอบรับและยอมรับสูง สิ่งนี้จะช่วยหลีกเลี่ยงความรู้สึกว่าเพิ่งลอกเลียนแบบโดยหวังว่าจะได้รับชื่อเสียง นอกจากนี้คำตอบแบบรหัสเท่านั้น (ซึ่งเป็นความแตกต่างหลักที่มองเห็นได้) จะไม่ได้รับการชื่นชมที่นี่เพราะพวกเขาให้ความรู้สึกที่ผิดที่ StackOverflow เป็นบริการเขียนโค้ดฟรี
Yunnosch

ฉันแก้ไขการจัดรูปแบบเพียงเพื่อให้ความคล้ายคลึงกับคำตอบเก่าชัดเจนขึ้น แต่คุณสามารถเรียนรู้การทำที่นี่stackoverflow.com/editing-helpในกรณีที่คุณพยายามหาคำตอบที่อ่านได้ง่ายขึ้นในอนาคต
Yunnosch

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