مقدمه
وقتی که بخواهید یک فایل Mdf را Attach کنید ممکن هست به مشکلاتی برخورد کنید من سعی کردم دو مورد از مشکلات را در زیر عنوان کنم:
1 – یک مشکلی که وجود دارد و برای خود من هم پیش آمده است حتما باید Sql Server Management را به صورت Run As Administrator اجرا کنید تا مشکل Attach کردن نداشته باشید برای رفع این مشکل باید مراحل زیر را انجام بدهید:
در عکس زیر فایل Mdf را بدون فایل Ldf Attach کردهایم یعنی فایل Ldf در کنار فایل Mdf وجود ندارد و در عکس زیر اگر دقت کرده باشید در کادر قرمز رنگ در ردیف دومNot Found را به ما نمایش داده است به خاطر اینکه فایل Ldf در کنار فایل Mdf وجود ندارد در این حالت باید فایل Ldf را Remove کنیم.
به عکس بالا دقت کنید باید بر روی Remove کلیک کنیم و بعد بر روی OK هم کلیک می کنیم و Error زیر را به ما نمایش می دهد.
و Error کامل در زیر هست:
باید چه عملی انجام بدهیم که فایل Ldf در کنار فایل Mdf وجود نداشته باشد اما به ما Error ندهد باید Sql Server Management را به صورت Run As Administrator اجرا بکنیم و مراحل بالا را تکرار بکنیم میبینیم که به ما Error نمیدهد و بدون هیچ مشکلی فایل Mdf Attach میشود.
با کوئری زیر هم میتوانید فایل Mdf را بدون فایل Ldf Attach کنید:
[sql]
Use Master
Go
CREATE DATABASE Nikamooz
ON PRIMARY (FILENAME = N’C:\Nikamooz\Nikamooz.MDF’)
FOR ATTACH_REBUILD_LOG
[/sql]
2- یک مشکل دیگر وجود دارد و آن این هست که باید به فایل Mdf سطح دسترسی بدهیم برای انجام این کار باید مراحل زیر را طی کنید:
اگر شما فایل Mdf را تغییر مسیر بدهید یعنی در یک Folder دیگری کپی کنید و بخواهید فایلMdf مربوطه را Attach کنید معمولا Attach نمیشود به خاطر این که سطح دسترسی لازم را ندارد.
اگر بخواهید مشکل فوق را برطرف کنید باید Sql Server Management را به صورتRun As Administrator اجرا کنید که در بالا به آن اشاره کردهام و در غیر اینصورت باید مراحل زیر را طی کنید:
حتما باید به صورت Sql Server Authentication لاگین کنید البته من با اکانت Sa لاگین کرده ام به شکل زیر توجه کنید:
در این مرحله باید سطح دسترسی را تعیین کنیم:
باید Services.Msc را اجرا کنید آسانترین راه ممکن برای اجرای Services.Msc این هست که در Keyboard خودتون باید کلید را با R فشار دهید تا پنجره RUN باز شود و درون کادر سفید رنگ باید Services.Msc را تایپ کنید تا پنجره Services.Msc باز شود مثل شکل زیر انجام دهید:
بعد بر روی OK کلیک کنید تا شکل زیر نمایان شود:
حتما باید در پنجره Services به جستجوی Sql Server بپردازید و در ادامه Sql Server باید نام Instance شما داخل پرانتز وجود داشته باشد اگر در شکل بالا دقت کرده باشید من یک Instance دارم به نام Sql2017 که داخل پرانتز هست که به صورت آبی رنگ انتخاب شده است و قبل از نام Instance Sql Server درج شده است باید نوع انتخاب شما در پنجره Services به همین صورت باشد.
بعد از اینکه Instance خود را در پنجره Services انتخاب کردید مثل عکس بالا باید بر روی آن راست کلیک کنید و Properties را انتخاب کنید مثل شکل زیر انجام بدهید:
بعد از اینکه بر روی Properties کلیک کردید عکس زیر نمایان می شود:
در عکس بالا باید تب Log On انتخاب شود که با شماره 1 مشخص کرده ام و در This Account که با شماره 2 مشخص کرده ام باید محتویات آن که در کادر قرمز رنگ در روبروی This Account وجود دارد باید Copy شود بعد بر روی OK کلیک کنید.
من فایل Mdf را در مسیر C:\Nikamooz کپی کرده ام به عکس زیر توجه کنید:
بر روی فایل Nikamooz.mdf کلیک راست موس را انتخاب کنید و بر روی Properties کلیک کنید مثل عکس زیر انجام بدهید:
بعد عکس زیر نمایان می شود:
باید مثل عکس زیر مراحل را طی کنید بر روی تب Security کلیک کنید که با شماره 1 مشخص کرده ام و بعد بر روی Edit کلیک کنید که با شماره 2 مشخص کردهام در قسمت Group or user names اصلا کاری نداشته باشید بر روی هر گزینه ای که بود مشکلی ندارد.
وقتی که بر روی Edit کلیک کردید عکس زیر نمایان می شود:
در عکس بالا بر روی Add کلیک کنید تا عکس زیر نمایان شود:
بعد بر روی OK کلیک کنید تا به پنجره قبلی برگردید عکس زیر مربوط به پنجره قبلی می باشد:
در عکس بالا در قسمت Group or user names اصلا کاری نداشته باشید و موردی را انتخاب نکنید و در قسمت Permissions For باید تیک روبروی Full Control را بزنید مثل عکس بالا انجام دهید و در قسمت Deny اصلا موردی را انتخاب نکنید و بر روی OK کلیک کنید.
شما می توانید به جای اینکه سطح دسترسی را به فایل بدهید می توانید به Folder بدهید و مراحل بالا را بر روی Folder انجام دهید یعنی به جای اینکه سطح دسترسی را بر روی فایل Nikamooz.mdf انجام دهید میتوانید سطح دسترسی را بر روی Folder Nikamooz انجام دهید اگر سطح دسترسی را بر روی Folder انجام بدهید هر فایل Mdf ای که بر روی این Folder کپی کنید دیگر نیاز نیست که برای هر فایل Mdf سطح دسترسی تعیین کنید خود به خود از Folder سطح دسترسی مربوطه را به ارث می برد.
حالا می توانید فایل خود را Attach کنید.
8 دیدگاه
حسین اندرخورا
بسیار مطلب مفیدی بود ، سپاس
مصطفی
با سلام
خواستم بدونم log برای detach وattach در sql نگهداری می شود
مسعود طاهری
در SQL Server Logs یک سری لاگ برای بخش هایی از این عملیات ثبت می شود. می توانید به آنها استناد کنید
موفق باشید
mamehdi
تشکر از مقاله خوبتون ولی اگر دیتابیس filestream داشته باشه نمیشه مسیر filestream را عوض کرد
مسعود طاهری
به این کد دقت کنید
USE Master
GO
CREATE DATABASE [Archive] ON
( FILENAME = N’D:\Data\archdat1.mdf’ ),
( FILENAME = N’D:\Data\archlog1.ldf’ ),
( FILENAME = N’D:\Data\filestream1′ )
FOR ATTACH
GO
احمد
با سلام
پس از حذف فایل LDF مجدد LDF جدیید ساخته میشه ؟
چطور میشه حجم LDF را پایین آورد؟
مسعود طاهری
سلام
پس از حذف فایل LDF مجدد LDF جدیید ساخته میشه
اگر در حالت Attach باشید و شرایط آن وجود داشته باشد (این حالت کلی داستان دارد) امکان Rebuild و ساخت مجدد Log File وجود دارد
چطور میشه حجم LDF را پایین آورد؟
استفاده از قابلیت ShrinkFile
این دستورات به شما فوری می تواند کمک کند
USE NikAmoozDB2017
GO
ALTER DATABASE NikAmoozDB2017 SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE(2,100)
CHECKPOINT
CHECKPOINT
CHECKPOINT
GO
حجم لاگ به 100 مگ می رسد
البته باید وضعیت لاگ را قبلش بررسی و تصمیم گیری کنید برای انتخاب راه مناسب
SELECT NAME,log_reuse_wait_desc FROM SYS.DATABASES
WHERE NAME=’NikAmoozDB2017′
GO
Mehdi
با سلام،
SQL Server هرگز یک دیتابیس را در حالت ناپایدار در اختیار ما قرار نمی دهد.
اگر Transaction باز وجود داشته باشد بدون داشتن لاگ فایل دیتابیس Attach نخواهد شد و دستور Attach_Rebuild_Log کار نخواهد کرد و با Error زیر مواجه خواهیم شد:
The log cannot be rebuilt because there were open transactions/users when the database was shutdown,
no checkpoint occurred to the database, or the database was read-only.
موفق باشید.