خانه/ وبلاگ/ 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 منظمی داری.

سوالات متداول درباره‌ی این موضوع

Recovery Pending یعنی چه و چه فرقی با Suspect دارد؟

در Recovery Pending، SQL Server نتوانسته فرآیند Recovery را شروع کند (مثلاً فایل در دسترس نیست یا فضای دیسک کم است)؛ در Suspect، Recovery شروع شده ولی شکست خورده است.

اولین بررسی‌ها چیست؟

Error Log سرور، فضای خالی دیسک، وجود فایل‌های mdf/ldf در مسیر درست و دسترسی حساب سرویس SQL Server به آن‌ها.

آیا داده از بین می‌رود؟

اگر مانع (مثلاً دسترسی یا فضای دیسک) رفع شود معمولاً خیر. قبل از هر اقدام تعمیری، از فایل‌های mdf و ldf یک کپی بگیر.

مصطفی موسویسازنده و نویسنده‌ی SQLFarsi. اگر اشتباهی در مقاله دیدی یا پیشنهادی داری، از طریق mousavi.dev خبر بده.

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

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

شروع یادگیری