SQL Server 2005 saya tidak mengembalikan cadangan karena koneksi aktif. Bagaimana saya bisa memaksanya?
SQL Server 2005 saya tidak mengembalikan cadangan karena koneksi aktif. Bagaimana saya bisa memaksanya?
Jawaban:
Ketika Anda mengklik kanan pada database dan klik Tasks
lalu klik Detach Database
, itu memunculkan dialog dengan koneksi aktif.
Dengan mengklik tautan di bawah "Pesan" Anda dapat mematikan koneksi yang aktif.
Anda kemudian dapat mematikan koneksi tersebut tanpa melepaskan basis data.
Informasi lebih lanjut di sini .
Antarmuka telah berubah untuk SQL Server Management studio 2008, berikut adalah langkah-langkahnya (via: Tim Leung )
Anda ingin mengatur db ke mode satu pengguna, lakukan pengembalian, lalu atur kembali ke multiuser:
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
Referensi: Pinal Dave ( http://blog.SQLAuthority.com )
Referensi resmi: https://msdn.microsoft.com/en-us/library/ms345598.aspx
ROLLBACK IMMEDIATE
atau ROLLBACK AFTER 60
. Satu-satunya cara untuk menyimpan data itu adalah dengan melakukan backup lain setelah rollback. Tetapi Anda sedang memulihkan dari cadangan yang berbeda. Jadi, apa gunanya menunggu? Apakah saya melewatkan sesuatu?
Kode ini berfungsi untuk saya, itu membunuh semua koneksi yang ada dari database. Yang harus Anda lakukan adalah mengubah baris Set @dbname = 'databaseName' sehingga memiliki nama database Anda.
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
setelah ini saya bisa mengembalikannya
Coba ini:
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
Restart server SQL akan memutuskan pengguna. Cara termudah yang saya temukan - bagus juga jika Anda ingin menjadikan server offline.
Tetapi untuk beberapa alasan yang sangat aneh, opsi 'Ambil Offline' tidak dapat diandalkan dan dapat membuat hang atau membingungkan konsol manajemen. Mulai ulang lalu ambil karya offline
Terkadang ini adalah opsi - jika misalnya Anda telah menghentikan server web yang merupakan sumber koneksi.
Saya mengalami masalah ini saat mengotomatiskan proses pemulihan di SQL Server 2008. Pendekatan saya (berhasil) adalah campuran dari dua jawaban yang diberikan.
Pertama, saya menjalankan semua koneksi dari basis data tersebut, dan membunuh mereka.
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
Kemudian, saya mengatur basis data ke mode single_user
ALTER DATABASE dbName SET SINGLE_USER
Lalu, saya menjalankan pemulihan ...
RESTORE DATABASE and whatnot
Bunuh koneksi lagi
(same query as above)
Dan atur database kembali ke multi_user.
ALTER DATABASE dbName SET MULTI_USER
Dengan cara ini, saya memastikan bahwa tidak ada koneksi yang menahan database sebelum mengatur ke mode tunggal, karena yang pertama akan membeku jika ada.
Tidak ada yang berfungsi untuk saya, tidak bisa menghapus atau memutuskan pengguna saat ini. Juga tidak dapat melihat koneksi aktif ke DB. Restart SQL Server (Klik kanan dan pilih Restart) memungkinkan saya untuk melakukannya.
Untuk menambah saran yang sudah diberikan, jika Anda memiliki aplikasi web yang berjalan melalui IIS yang menggunakan DB, Anda mungkin juga harus menghentikan (tidak mendaur ulang) kumpulan aplikasi untuk aplikasi saat Anda memulihkan, kemudian memulai kembali. Menghentikan kumpulan aplikasi mematikan koneksi http aktif dan tidak mengizinkan lagi, yang sebaliknya dapat memicu proses yang terhubung ke dan dengan demikian mengunci basis data. Ini adalah masalah yang diketahui misalnya dengan Sistem Manajemen Konten Umbraco saat memulihkan basis datanya
Tidak satu pun di atas bekerja untuk saya. Basis data saya tidak menunjukkan koneksi aktif menggunakan Activity Monitor atau sp_who. Saya akhirnya harus:
Bukan solusi yang paling elegan tetapi berfungsi dan tidak perlu me-restart SQL Server (bukan pilihan bagi saya, karena server DB meng-host banyak database lain)
Saya lebih suka melakukan ini,
ubah database yang ditetapkan offline dengan rollback segera
dan kemudian pulihkan database Anda. setelah itu,
mengubah database yang ditetapkan online dengan rollback segera