خانه/ وبلاگ/ Database is in Recovery Pending
عیب‌یابی پایگاه‌داده

رفع خطای Database is in Recovery Pending در SQL Server

عیب‌یابی ۲۹ مرداد ۱۴۰۴ ۹ دقیقه مطالعه

وقتی در Object Explorer کنار نام یک پایگاه‌داده عبارت (Recovery Pending) را می‌بینی، یعنی SQL Server هنوز فرآیند بازیابی (Recovery) آن را شروع نکرده — معمولاً چون در تلاش قبلی برای انجام این کار با مشکلی مواجه شده (مثلاً کمبود فضای دیسک، فایل گم‌شده، یا خاموش‌شدن ناگهانی سرور). خبر خوب: برخلاف حالت Suspect، حالت Recovery Pending معمولاً به این معنی نیست که داده خراب شده — فقط SQL Server منتظر شرایط لازم برای شروع Recovery است.

قبل از هر کاری، اگر پشتیبان (Backup) معتبر و به‌روزی داری، آن را در جایی امن نگه دار. اکثر روش‌های زیر خطر از‌دست‌رفتن داده ندارند، اما همیشه احتیاط بیشتر بهتر است.

مهم‌ترین علت‌های Recovery Pending

  • کمبود فضای دیسک — رایج‌ترین علت. SQL Server برای Redo/Undo تراکنش‌ها به فضای خالی در دیسک (برای رشد فایل Log) نیاز دارد.
  • گم‌شدن یا خراب‌شدن فایل Data (.mdf) یا Log (.ldf) — مثلاً بعد از جابه‌جایی دستی فایل‌ها یا خرابی دیسک.
  • خاموش‌شدن ناگهانی سرور در وسط یک عملیات سنگین (مثل Shrink یا یک تراکنش بزرگ).
  • محدودیت دسترسی (Permission) سرویس SQL Server به پوشه‌ی فایل‌ها.

مرحله ۱ — بررسی فضای خالی دیسک

اول از همه مطمئن شو درایوی که فایل‌های Data و Log رویش قرار دارند، فضای خالی کافی دارد. اگر دیسک پر است، فضای خالی کن (حذف فایل‌های غیرضروری، انتقال بکاپ‌های قدیمی) و دوباره تلاش کن.

مرحله ۲ — بررسی جزئیات دقیق در Error Log

مسیر SSMS → Management → SQL Server Logs را باز کن و دنبال خطوطی بگرد که نام پایگاه‌داده‌ی موردنظر را دارند؛ معمولاً دلیل دقیق (مثل «Insufficient disk space» یا مسیر فایل گم‌شده) همان‌جا ذکر می‌شود.

SQL Server Logs
2025-08-20 10:14:02 spid19s Starting up database 'ShopDB'.
2025-08-20 10:14:03 spid19s Error: 9002, Severity: 17, State: 4
2025-08-20 10:14:03 spid19s The transaction log for database 'ShopDB' is full due to 'ACTIVE_TRANSACTION'.

مرحله ۳ — تلاش برای وصل‌شدن و بررسی وضعیت با T-SQL

sql
SELECT name, state_desc
FROM sys.databases
WHERE name = N'ShopDB';

اگر state_desc برابر RECOVERY_PENDING بود، ادامه‌ی مراحل زیر را دنبال کن.

مرحله ۴ — رفع مشکل فضای دیسک و ری‌استارت سرویس

بعد از آزادکردن فضای دیسک، سرویس SQL Server را ری‌استارت کن. در بسیاری از موارد، SQL Server به‌طور خودکار فرآیند Recovery را از سر می‌گیرد و پایگاه‌داده به حالت ONLINE برمی‌گردد.

مرحله ۵ — اگر همچنان گیر است: تلاش برای آنلاین‌کردن دستی

sql
ALTER DATABASE ShopDB SET ONLINE;

اگر این دستور هم خطا داد و فایل Data یا Log واقعاً از بین رفته یا خراب شده، تنها راه مطمئن، Restore از یک نسخه‌ی پشتیبان معتبر است — به راهنمای رفع خطاهای رایج هنگام Restore کردن Database مراجعه کن.

در محیط Production هیچ‌وقت مستقیم سراغ دستورهای اضطراری مثل EMERGENCY MODE یا REPAIR_ALLOW_DATA_LOSS نرو مگر اینکه Backup معتبر نداشته باشی و همه‌ی راه‌های دیگر را امتحان کرده باشی؛ این دستورها می‌توانند داده از دست بدهند.

جمع‌بندی

  • Recovery Pending معمولاً یعنی SQL Server هنوز نتوانسته Recovery را شروع کند، نه لزوماً خرابی داده.
  • رایج‌ترین علت، کمبود فضای دیسک است — اول همین را بررسی کن.
  • Error Log جزئیات دقیق علت را نشان می‌دهد.
  • در بدترین حالت، Restore از Backup تنها راه امن است.

برای جلوگیری از این مشکل در آینده، درس تراکنش‌ها را ببین و مطمئن شو استراتژی Backup منظمی داری.

می‌خوای مفاهیم پایگاه‌داده را کامل یاد بگیری؟

دوره‌ی رایگان SQLFarsi را همین حالا شروع کن.

شروع یادگیری