احتمالا تاکنون هنگام Restore نمودن یک پایگاه داده
با خطای زیر مواجه شده اید.
Msg 3101, Level 16, State 1, Line 1
Exclusive access could not be obtained because the database is in use.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
البته مشکل فوق زمانی پیش خواهد آمد که پایگاه داده توسط شخص یا برنامه ای در
حال استفاده باشد و تا زمانی که این اتصالات وجود داشته باشند امکان
Restore نمودن پایگاه داده وجود ندارد.
معمولا در این هنگام با Restart نمودن سرور برنامه
SQL Server مشکل خاتمه می یابد و پس از آن به راحتی می
توان پایگاده داده را Restore نمود. اما این عمل گاهی به
سادگی امکان پذیر نیست و یا مشکلات دیگری را در پی خواهد داشت.
Restart نمودن سرور برنامه SQL
Server باعث می شود که برای مدتی (در حین راه اندازی مجدد سرور) تمام پایگاه
های داده موجود در این سرور از کار بیفتند و بدیهی می باشد که این مسئله می تواند
مشکلاتی را برای سایر پایگاه های داده به وجود آورد. و ضمنا با توجه به تعداد
پایگاه های داده و سایر عوامل، عمل راه اندازی مجدد سرور می تواند زمانبر باشد.
راه حل:
با استفاده از اسکریپت زیر می توان تمام اتصالات زنده ی موجود به یک پایگاه داده خاص را
از بین برد.
Use Master
Go
Declare @dbname sysname
Set @dbname = 'databaseName'
Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname) and spid > @spid
End
در اسکریپت بالا باید به جای databaseName نام پایگاه داده ی مورد نظر خود را
وارد نمایید.
اکنون بلافاصله می توانید با استفاده از اسکریپت زیر و یا برنامه
SQL Server Management Studio پایگاه داده خود را
Restore نمایید.
USE Master
GO
RESTORE DATABASE [databaseName]
FROM DISK = N'physical disk path to the backup file.bak' --example
path: c:\program files\microsoft sql server\mssql\backup\databaseName.bak
WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10
GO
منبع:
ralphwhitbeck