2010-09-03 38 views
6

Tôi đang cố khôi phục cơ sở dữ liệu trong máy chủ sql 2005 phiên bản express của mình. Tôi biết rằng để khôi phục lại cơ sở dữ liệu tôi cần phải làm cho nó cho người dùng duy nhất. Tôi cho lệnh này để làm cho nó để người dùng duy nhấtkhông thể khôi phục cơ sở dữ liệu trong máy chủ sql (single_user)

USE [master] 
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

Lệnh này thực hiện đúng và tôi thậm chí có thể nhìn thấy một hình ảnh nhỏ trong đối tượng nhà thám hiểm trên cơ sở dữ liệu này cho thấy rằng điều này bây giờ là người dùng duy nhất.

Bây giờ tôi đang cố gắng khôi phục cơ sở dữ liệu, bằng cách làm theo các bước sau -> nhấp chuột phải vào cơ sở dữ liệu và nhiệm vụ và sau đó khôi phục cơ sở dữ liệu. Tôi đang chọn đường dẫn nơi tệp sao lưu được đặt và nhấp vào khôi phục.

Nhưng tôi vẫn gặp phải lỗi đó "Không thể truy cập độc quyền vì cơ sở dữ liệu đang được sử dụng (microsoft.sqlserver.smo). Tôi thiếu gì cả. Tôi đã googled nó và tất cả các trang web đều đề xuất rằng cơ sở dữ liệu cần ở chế độ người dùng đơn lẻ và không có gì khác

tôi không thử Cắt ra và gắn các phương pháp cơ sở dữ liệu tôi chưa bao giờ làm điều đó trước và muốn biết nếu đó là an toàn để làm

chỉnh sửa:... nhờ Cả hai đều đề xuất cho tôi câu trả lời giống nhau vì vậy tôi đang đánh dấu một câu trả lời là đã chọn.

Tôi thậm chí đã chọn ove rwrite cơ sở dữ liệu hiện có từ các tùy chọn.

Trả lời

4

Trước tiên, tốt nhất là sao lưu và khôi phục thay vì tháo và đính kèm. Thứ hai, rất có thể là phiên bạn đang sử dụng để đặt cơ sở dữ liệu là SINGLE_USER là phiên bản vẫn còn khi bạn cố gắng chạy khôi phục (vì bạn đang sử dụng GUI, nó sẽ tự kết nối với chính nó). phiên để không thể truy cập).

Thực hiện khôi phục dưới dạng lệnh văn bản hoặc chuyển cửa sổ truy vấn để sử dụng cơ sở dữ liệu khác trước, chẳng hạn như chính. Hoặc bạn có thể đóng cửa sổ truy vấn để nó không còn được kết nối nữa.

Bạn luôn có thể kiểm tra ai đã kết nối với select * from master.dbo.sysprocesses.

Cập nhật

Giả sử cơ sở dữ liệu bạn muốn khôi phục đã tồn tại, và nếu bạn có một tập tin sao lưu duy nhất trên đĩa (mà không có nhiều bản sao lưu trong nó) và không có nhu cầu để khôi phục lại các file log sau khi khôi phục bản sao lưu đầy đủ, sau đó khôi phục lại thông qua kịch bản là siêu, siêu dễ dàng:

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak'; 

Học cú pháp này sẽ làm cho cuộc sống của bạn dễ dàng hơn vì sau đó khi bạn thiết SINGLE_USER bạn đã có trong phiên duy nhất được kết nối. Thêm vào đó, tôi thấy rằng việc gõ lệnh khôi phục nhanh hơn việc sử dụng GUI, và tôi thích điều khiển tôi có trên mọi thứ. Sự lặp lại của điều này cuối cùng làm cho nó trong đầu bạn và bạn không phải tìm kiếm cú pháp nữa.

Thậm chí không khó khôi phục các tệp nhật ký. Chỉ cần một điều đơn giản cần nhớ, WITH NORECOVERY:

RESTORE DATABASE DBName FROM DISK = 'C:\path\DBNameBackup.bak' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup1.log' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup2.log' WITH NORECOVERY; 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackup3.log' WITH NORECOVERY; 
... 4 5 6 7 and so on 
RESTORE LOG DBName FROM DISK = 'C:\path\DBNameBackupX.log' WITH RECOVERY; 

Có ... bạn đã khôi phục tệp nhật ký của mình, rất dễ dàng. Bạn thậm chí có thể khôi phục đến một điểm chính xác trong thời gian sử dụng WITH STOPAT!Ngoài ra, nếu bạn quên và vô tình gửi câu lệnh khôi phục nhật ký cuối cùng WITH NORECOVERY thì bạn chỉ cần phát hành RESTORE DATABASE DBName WITH RECOVERY; để thực hiện các bước cuối cùng để làm cho cơ sở dữ liệu có thể sử dụng được (quay lại giao dịch không được cam kết, v.v.).

1
  • Chuyển đến mục "Tùy chọn" ngay bên dưới "Chung" ở danh sách bên tay trái.
  • Đảm bảo rằng "Ghi đè cơ sở dữ liệu hiện tại" được chọn ("Tùy chọn khôi phục").

Chúc may mắn.

2

Bạn có thể sử dụng lệnh này để giết tất cả các quá trình sử dụng cơ sở dữ liệu và sau đó cố gắng khôi phục lại nó một lần nữa:

declare @sql as varchar(20), @spid as int 
select @spid = min(spid) from master..sysprocesses where dbid = db_id('<database_name>') 
and spid != @@spid  

while (@spid is not null) 
begin 
    print 'Killing process ' + cast(@spid as varchar) + ' ...' 
    set @sql = 'kill ' + cast(@spid as varchar) 
    exec (@sql) 

    select 
     @spid = min(spid) 
    from 
     master..sysprocesses 
    where 
     dbid = db_id('<database_name>') 
     and spid != @@spid 
end 

print 'Process completed...' 
Các vấn đề liên quan