رفع خطای 902 SQL Server: راهنمای جامع مشکل مجوز فایلها و مسیر پایگاه داده
خطای 902 در SQL Server یکی از پیامهای خطای رایج است که اغلب به دلیل مشکلات دسترسی به فایلهای پایگاه داده یا فایلهای Log رخ میدهد. این خطا معمولاً نشاندهنده این است که SQL Server قادر به باز کردن فایلهای مورد نیاز برای شروع یا ادامه کار یک پایگاه داده خاص نیست. درک صحیح این خطا و روشهای رفع آن برای هر مدیر پایگاه داده (DBA) یا توسعهدهنده SQL Server حیاتی است، چرا که میتواند به توقف سرویسهای حیاتی و از دسترس خارج شدن دادهها منجر شود.
پیام خطا به وضوح به مشکلات مربوط به “اجازه سیستم عامل” (OS permission) یا “مسیر فایل” (path issue) اشاره دارد. این بدان معناست که یا حساب سرویس SQL Server دسترسیهای لازم برای خواندن یا نوشتن در محل فایلهای پایگاه داده را ندارد، یا اینکه مسیر مشخص شده برای فایلهای پایگاه داده (هم فایل داده .mdf و هم فایل لاگ .ldf) اشتباه است یا فایلها در آن مسیر وجود ندارند. این مشکل میتواند در سناریوهای مختلفی مانند راهاندازی SQL Server، پیوست کردن (attaching) یک پایگاه داده، بازیابی (restoring) یک پشتیبان، یا حتی در حین عملیات عادی پایگاه داده پس از تغییر مسیر فایلها، ظاهر شود. رفع این خطا نیازمند بررسی دقیق تنظیمات سیستم عامل، مجوزهای فایل و پیکربندی SQL Server است.
علل رایج خطای 902 SQL Server
خطای 902 SQL Server که نشاندهنده عدم امکان باز کردن فایلهای پایگاه داده یا لاگ است، میتواند از چندین عامل مختلف ناشی شود. درک این عوامل برای تشخیص و رفع مشکل ضروری است. در اینجا به بررسی دقیقتر علل اصلی این خطا میپردازیم:
یکی از شایعترین دلایل خطای 902، **مشکلات مربوط به مجوزهای سیستم عامل (NTFS Permissions)** است. حساب سرویس SQL Server (که میتواند Network Service, Local System, یا یک حساب کاربری دامنه/محلی مشخص باشد) برای دسترسی به فایلهای پایگاه داده (فایلهای .mdf) و فایلهای لاگ (فایلهای .ldf) نیاز به مجوزهای خواندن (Read) و نوشتن (Write) کامل دارد. اگر این مجوزها به درستی روی پوشههای حاوی این فایلها اعمال نشده باشند، SQL Server نمیتواند فایلها را باز کند و این خطا را برمیگرداند. این وضعیت اغلب پس از جابجایی فایلهای پایگاه داده به یک درایو یا پوشه جدید، تغییر حساب سرویس SQL Server، یا اعمال Group Policyهای جدید رخ میدهد.
دلیل دیگر میتواند **مسیر فایل نادرست یا عدم وجود فایلها در مسیر مشخص شده** باشد. در کاتالوگ SQL Server، مسیرهای فیزیکی فایلهای پایگاه داده ذخیره شدهاند. اگر این فایلها به صورت دستی به مکان دیگری منتقل شده باشند، بدون اینکه SQL Server از این تغییر مطلع شود، یا اگر در زمان ایجاد یا پیوست کردن پایگاه داده، مسیر اشتباهی مشخص شده باشد، SQL Server نمیتواند فایلها را در مکان مورد انتظار پیدا کند. این مسئله به ویژه هنگام پیوست کردن پایگاه دادههایی که فایلهای آنها قبلاً جابجا شدهاند، یا هنگام بازیابی پشتیبان به یک مکان جدید و عدم استفاده از گزینه WITH MOVE بسیار رایج است.
گاهی اوقات، **فایلهای پایگاه داده ممکن است توسط فرآیند دیگری قفل شده باشند**. این میتواند توسط نرمافزارهای آنتیویروس که در حال اسکن فایل هستند، نرمافزارهای پشتیبانگیری که در حال کپی کردن فایلها هستند، یا حتی یک فرآیند SQL Server دیگر که به طور ناخواسته به فایلها دسترسی پیدا کرده است، اتفاق بیفتد. قفل شدن فایل مانع از دسترسی SQL Server به آن میشود و خطای 902 را به دنبال دارد.
**کمبود فضای دیسک در درایوی که فایلهای پایگاه داده قرار دارند** نیز میتواند باعث این خطا شود. اگر دیسک پر باشد و SQL Server نتواند فضای لازم برای رشد فایلهای داده یا لاگ را تخصیص دهد یا حتی برای باز کردن فایلهای موجود به فضای کاری نیاز داشته باشد، ممکن است با خطای 902 مواجه شود. اگرچه این کمتر شایع است و معمولاً خطاهای مربوط به فضای دیسک پیامهای واضحتری دارند، اما در برخی شرایط خاص میتواند عامل این خطا باشد.
**فساد فایلهای پایگاه داده** میتواند یکی از دلایل این خطا باشد، اگرچه معمولاً خطاهای فساد فایل پیامهای خاص خود را دارند. اما در مواردی که فساد به حدی جدی است که فایلها حتی قابل باز شدن نیستند، ممکن است SQL Server خطای 902 را برگرداند. این وضعیت نادرتر است و نیاز به رویکردهای بازیابی پیچیدهتری دارد.
در نهایت، **فایلهای پایگاه داده ممکن است به صورت “فقط خواندنی” (Read-Only) علامتگذاری شده باشند**. اگر ویژگی فقط خواندنی روی فایلهای .mdf یا .ldf اعمال شده باشد، SQL Server نمیتواند اطلاعات را روی آنها بنویسد و این مانع از باز شدن کامل پایگاه داده میشود. این ویژگی میتواند به صورت دستی، یا توسط ابزارهای سیستم عامل یا Group Policy تنظیم شده باشد.
راهکارهای عملی برای رفع خطای 902 SQL Server
رفع خطای 902 SQL Server نیازمند یک رویکرد سیستماتیک برای بررسی و اصلاح تنظیمات است. در ادامه، مراحل عملی و گام به گام برای تشخیص و رفع این مشکل ارائه شده است:
1. بررسی و اصلاح مجوزهای NTFS
این رایجترین علت خطای 902 است. اطمینان حاصل کنید که حساب سرویس SQL Server دارای مجوزهای کافی (خواندن، نوشتن و تغییر) روی پوشههای حاوی فایلهای .mdf و .ldf است.
مراحل:
- ابتدا حساب سرویس SQL Server را شناسایی کنید. این کار را میتوانید از طریق SQL Server Configuration Manager یا از طریق Services در Control Panel انجام دهید. معمولاً نام آن به شکل `NT Service\MSSQL$INSTANCENAME` برای نامهای پیشفرض و `NT Service\MSSQLSERVER` برای نام پیشفرض است.
- به پوشهای که فایلهای پایگاه داده در آن قرار دارند (برای مثال: `C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA`) بروید.
- روی پوشه مورد نظر کلیک راست کرده و Properties را انتخاب کنید.
- به تب Security بروید.
- روی Edit کلیک کنید و سپس Add را انتخاب کنید.
- نام حساب سرویس SQL Server را وارد کرده و OK کنید.
- برای این حساب، مجوزهای Full control یا حداقل Modify, Read & execute, Read, Write را اعطا کنید.
- همین مراحل را برای پوشههای حاوی فایلهای لاگ (اگر در پوشه جداگانه ای هستند) تکرار کنید.
برای بررسی مجوزها از طریق خط فرمان، میتوانید از ابزار `icacls` استفاده کنید. به عنوان مثال، برای نمایش مجوزهای یک پوشه:
icacls "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA"
برای اعطای مجوز کامل به یک حساب سرویس (مثلاً `NT Service\MSSQLSERVER`):
icacls "C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA" /grant "NT Service\MSSQLSERVER":(F)
این دستور مجوز “Full control” (F) را به حساب سرویس SQL Server برای پوشه مشخص شده اعطا میکند. پس از اعمال تغییرات، سعی کنید پایگاه داده را دوباره راهاندازی کنید یا سرور SQL را ریستارت کنید.
2. بررسی و تایید مسیر فایلهای پایگاه داده
اطمینان حاصل کنید که مسیرهای مشخص شده برای فایلهای .mdf و .ldf صحیح هستند و فایلها واقعاً در آن مکانها وجود دارند.
مراحل:
- در SQL Server Management Studio (SSMS)، به شیء Explorer بروید و به پوشه Databases بروید.
- اگر پایگاه داده در حالت “Recovery Pending” یا “Suspect” است، نمیتوانید از طریق Properties آن را بررسی کنید. در این صورت، باید از طریق System Views به اطلاعات دسترسی پیدا کنید.
برای مشاهده مسیرهای فیزیکی فایلهای همه پایگاه دادهها، از کوئری زیر استفاده کنید:
SELECT name, physical_name AS CurrentLocation, state_desc
FROM sys.master_files
WHERE database_id = DB_ID('YourDatabaseName');
نام پایگاه داده خود را به جای ‘YourDatabaseName’ قرار دهید. اگر مسیر نشان داده شده در `CurrentLocation` با محل فیزیکی فایلها مطابقت ندارد، باید مسیر را اصلاح کنید.
اگر پایگاه دادهای را Attach یا Restore میکنید و خطای 902 رخ میدهد، مطمئن شوید که مسیرهای مشخص شده در دستور ATTACH یا RESTORE صحیح هستند. اگر فایلها را جابجا کردهاید، هنگام Attach کردن از گزینه FOR ATTACH WITH MOVE استفاده کنید:
CREATE DATABASE YourDatabaseName ON
(FILENAME = 'C:\NewPath\YourDatabaseName.mdf'),
(FILENAME = 'C:\NewPath\YourDatabaseName_log.ldf')
FOR ATTACH;
یا برای Restore:
RESTORE DATABASE YourDatabaseName
FROM DISK = 'C:\BackupPath\YourDatabaseName.bak'
WITH MOVE 'YourDatabaseName' TO 'C:\NewPath\YourDatabaseName.mdf',
MOVE 'YourDatabaseName_log' TO 'C:\NewPath\YourDatabaseName_log.ldf';
در دستور فوق، ‘YourDatabaseName’ و ‘YourDatabaseName_log’ نامهای منطقی فایلها هستند که معمولاً در خروجی دستور `RESTORE FILELISTONLY` قابل مشاهدهاند و باید با مقادیر واقعی موجود در فایل پشتیبان مطابقت داشته باشند. ‘C:\NewPath\’ مسیر جدیدی است که فایلها به آنجا منتقل میشوند.
3. تغییر مسیر فایلهای پایگاه داده موجود
اگر پایگاه داده موجود است اما قادر به باز شدن نیست و میدانید که مسیر فایلها اشتباه است، میتوانید از دستور ALTER DATABASE MODIFY FILE برای تغییر مسیر فایلها استفاده کنید. این عملیات نیاز دارد که پایگاه داده در حالت آفلاین (OFFLINE) باشد.
ALTER DATABASE YourDatabaseName SET OFFLINE;
GO
ALTER DATABASE YourDatabaseName MODIFY FILE (NAME = YourDatabaseLogicalFileName, FILENAME = 'C:\NewPath\YourDatabaseName.mdf');
GO
ALTER DATABASE YourDatabaseName MODIFY FILE (NAME = YourDatabaseLogLogicalFileName, FILENAME = 'C:\NewPath\YourDatabaseName_log.ldf');
GO
ALTER DATABASE YourDatabaseName SET ONLINE;
GO
در این دستورات، ‘YourDatabaseName’ نام پایگاه داده، ‘YourDatabaseLogicalFileName’ و ‘YourDatabaseLogLogicalFileName’ نامهای منطقی فایل داده و لاگ (که از `sys.master_files` یا `sys.database_files` قابل استخراج هستند) و ‘C:\NewPath\’ مسیر جدید فایلها هستند. بعد از اجرای این دستورات و اطمینان از قرار گرفتن فیزیکی فایلها در مسیر جدید، پایگاه داده را به حالت ONLINE بازگردانید.
4. بررسی قفل بودن فایلها و نرمافزارهای آنتیویروس
مطمئن شوید که هیچ فرآیند دیگری (مانند آنتیویروس، نرمافزار پشتیبانگیری) فایلهای .mdf یا .ldf را قفل نکرده باشد. برخی آنتیویروسها ممکن است فایلها را برای اسکن قفل کنند.
مراحل:
- آنتیویروس را به طور موقت غیرفعال کنید و دوباره سعی کنید پایگاه داده را راهاندازی کنید.
- اگر مشکل برطرف شد، پوشههای حاوی فایلهای SQL Server (DATA, LOG, BACKUP) را به لیست استثنائات (exclusions) آنتیویروس خود اضافه کنید تا از اسکن آنها جلوگیری شود.
- میتوانید از ابزارهایی مانند Process Explorer ویندوز برای شناسایی فرآیندهایی که فایلهای پایگاه داده را قفل کردهاند، استفاده کنید.
5. بررسی فضای دیسک
فضای خالی دیسک را در درایوهای حاوی فایلهای پایگاه داده و لاگ بررسی کنید. اگر فضای دیسک کم است، فضای بیشتری آزاد کنید یا فایلها را به درایوی با فضای کافی منتقل کنید. در صورت نیاز به جابجایی فایل، از روشهای توضیح داده شده در بخش 3 استفاده کنید.
6. بررسی ویژگی “فقط خواندنی” فایلها
مطمئن شوید که فایلهای .mdf و .ldf به صورت “فقط خواندنی” تنظیم نشدهاند.
مراحل:
- به پوشه حاوی فایلهای پایگاه داده بروید.
- روی فایل .mdf و .ldf کلیک راست کرده و Properties را انتخاب کنید.
- در تب General، مطمئن شوید که گزینه Read-only تیک نخورده باشد. اگر تیک خورده است، آن را بردارید و Apply کنید.
7. راهاندازی مجدد سرویس SQL Server
گاهی اوقات، یک راهاندازی مجدد ساده سرویس SQL Server میتواند قفلهای موقت فایل را آزاد کرده و به رفع مشکل کمک کند.
مراحل:
- SQL Server Configuration Manager را باز کنید.
- در قسمت SQL Server Services، روی سرویس SQL Server (MSSQLSERVER یا MSSQL$INSTANCENAME) کلیک راست کرده و Restart را انتخاب کنید.
با رعایت این مراحل به صورت گام به گام، میتوانید بسیاری از موارد خطای 902 SQL Server را تشخیص داده و رفع کنید. همواره اطمینان حاصل کنید که قبل از اعمال تغییرات بزرگ، پشتیبانگیریهای مناسبی از پایگاه دادههای خود تهیه کردهاید.