SQL Server 2005'im etkin bağlantılar nedeniyle yedeklemeyi geri yüklemiyor. Nasıl zorlayabilirim?
SQL Server 2005'im etkin bağlantılar nedeniyle yedeklemeyi geri yüklemiyor. Nasıl zorlayabilirim?
Yanıtlar:
Bir veritabanını sağ tıklatıp Tasks
sonra da tıklattığınızda Detach Database
, etkin bağlantılarla bir iletişim kutusu görüntülenir.
"Mesajlar" altındaki köprüye tıklayarak etkin bağlantıları öldürebilirsiniz.
Ardından bu bağlantıları veritabanını ayırmadan öldürebilirsiniz.
Daha fazla bilgi burada .
SQL Server Management studio 2008 için arayüz değişti, işte adımlar (üzerinden: Tim Leung )
Db'nizi tek kullanıcı moduna ayarlamak, geri yüklemeyi yapmak, sonra tekrar çoklu kullanıcı olarak ayarlamak istiyorsunuz:
ALTER DATABASE YourDB
SET SINGLE_USER WITH
ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete
--Do Actual Restore
RESTORE DATABASE YourDB
FROM DISK = 'D:\BackUp\YourBaackUpFile.bak'
WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf',
MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf'
/*If there is no error in statement before database will be in multiuser
mode. If error occurs please execute following command it will convert
database in multi user.*/
ALTER DATABASE YourDB SET MULTI_USER
GO
Referans: Pinal Dave ( http://blog.SQLAuthority.com )
Resmi başvuru: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
ya ROLLBACK AFTER 60
. Bu verileri kaydetmenin tek yolu geri alma işleminden sonra başka bir yedekleme yapmaktır. Ancak farklı bir yedekten geri yüklüyorsunuz. Peki, beklemenin anlamı nedir? Bir şey mi kaçırıyorum?
Bu kod benim için çalıştı, bir veritabanının tüm mevcut bağlantılarını öldürür. Tek yapmanız gereken Set @dbname = 'databaseName' satırını değiştirmek, böylece veritabanı adınıza sahip olmak.
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
bundan sonra geri yükleyebildim
Bunu dene:
DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT
spid
FROM
master.dbo.sysprocesses
WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database
DECLARE @spid SMALLINT
DECLARE @SQLCommand VARCHAR(300)
OPEN UserCursor
FETCH NEXT FROM UserCursor INTO
@spid
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR)
EXECUTE(@SQLCommand)
FETCH NEXT FROM UserCursor INTO
@spid
END
CLOSE UserCursor
DEALLOCATE UserCursor
GO
SQL sunucusunu yeniden başlatmak kullanıcıların bağlantısını kesecektir. Bulduğum en kolay yol - sunucuyu çevrimdışına almak istiyorsanız da iyi.
Ancak çok garip bir nedenden dolayı 'Çevrimdışı Ol' seçeneği bunu güvenilir bir şekilde yapmaz ve yönetim konsolunu asabilir veya karıştırabilir. Yeniden başlatılıyor ve çevrimdışı çalışmalar yapıyor
Bazen bu bir seçenektir - örneğin, bağlantıların kaynağı olan bir web sunucusunu durdurduysanız.
SQL Server 2008'de bir geri yükleme işlemini otomatikleştirirken bu sorunla karşılaştım. (Başarılı) yaklaşımım, verilen yanıtların ikisinin bir karışımıydı.
İlk olarak, söz konusu veritabanının tüm bağlantılarını çalıştırıyorum ve onları öldürüyorum.
DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName'))
While @spid Is Not Null
Begin
Execute ('Kill ' + @spid)
Select @spid = top 1 spid from master.dbo.sysprocesses
where dbid = db_id('dbName')
End
Sonra veritabanını single_user moduna ayarladım
ALTER DATABASE dbName SET SINGLE_USER
Sonra geri yüklemeyi çalıştırıyorum ...
RESTORE DATABASE and whatnot
Bağlantıları tekrar öldür
(same query as above)
Ve veritabanını tekrar multi_user olarak ayarlayın.
ALTER DATABASE dbName SET MULTI_USER
Bu şekilde, tek moda ayarlamadan önce veritabanını tutan hiçbir bağlantı olmadığından eminim, çünkü eski varsa donacak.
Daha önce verilen tavsiyelere eklemek için, DB'yi kullanan IIS üzerinden çalışan bir web uygulamanız varsa, geri yükleme sırasında uygulama havuzunu durdurmanız (geri dönüştürmemeniz) ve yeniden başlatmanız da gerekebilir . Uygulama havuzunun durdurulması etkin http bağlantılarını öldürür ve artık izin vermez, aksi takdirde veritabanına bağlanan ve böylece veritabanını kilitleyen işlemlerin tetiklenmesine izin verebilir. Bu, örneğin veritabanını geri yüklerken Umbraco İçerik Yönetim Sistemi ile ilgili bilinen bir sorundur
Yukarıdakilerin hiçbiri benim için çalışmadı. Veritabanım, Etkinlik İzleyicisi'ni veya sp_who kullanan hiçbir etkin bağlantı göstermedi. Sonuçta:
En zarif çözüm değil ama işe yarıyor ve SQL Server'ı yeniden başlatmayı gerektirmiyor (DB sunucusu bir sürü diğer veritabanını barındırdığı için benim için bir seçenek değil)
Böyle yapmayı tercih ederim,
veritabanı geri alma anında çevrimdışı olarak değiştir
ve sonra veritabanınızı geri yükleyin. Daha sonra,
veritabanını geri almayla çevrimiçi olarak değiştirmeyi değiştir