7

SQL Server 2005ExpressEditionでデータベースを復元しようとしています。データベースを復元するには、シングルユーザーにする必要があることを知っています。私はこのコマンドをシングルユーザーに提供しています

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

このコマンドは正しく実行され、このデータベースのオブジェクトエクスプローラーに小さな画像が表示され、これがシングルユーザーになったことを示しています。

現在、次の手順に従ってデータベースを復元しようとしています->データベースとタスクを右クリックして、データベースを復元します。バックアップファイルが配置されているパスを選択し、復元をクリックしています。

しかし、「データベースが使用されているため、排他的アクセスを取得できませんでした(microsoft.sqlserver.smo)。何かが足りません。グーグルで検索しましたが、ほとんどすべてのサイトで、データベースはシングルユーザーである必要があると示唆されています。モードと他には何もありません。

データベースメソッドのデタッチとアタッチを試しませんでした。私はこれまでこれを行ったことがなく、それが安全かどうかを知りたいと思います。

編集:答えてくれてありがとう。どちらも私に同じ答えを提案したので、私は1つの答えを選択済みとしてマークしています。

オプションから既存のデータベースを上書きすることも選択しました。

4

3 に答える 3

4

まず、切り離して接続するのではなく、バックアップして復元することをお勧めします。

次に、データベースの設定に使用しているセッションはSINGLE_USER、復元を実行しようとしたときにデータベースが残っているセッションである可能性があります(GUIを使用しているため、独自のセッションで接続しているため、データベースを実行できません。アクセスを取得)。

テキストコマンドとして復元を実行するか、クエリウィンドウを切り替えて、マスターなどの別のデータベースを最初に使用します。または、クエリウィンドウを閉じて、接続されないようにすることもできます。

誰がに接続しているかをいつでも確認できますselect * from master.dbo.sysprocesses

アップデート

復元するデータベースがすでに存在し、ディスク上に単一のバックアップファイルがあり(複数のバックアップが含まれていない)、完全バックアップの復元後にログファイルを復元する必要がない場合、スクリプトによる復元は次のようになります。超、超簡単:

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

この構文を学ぶと、SINGLE_USERを設定すると、接続されている唯一のセッションにすでに参加しているため、作業が楽になります。さらに、復元コマンドを入力する方がGUIを使用するよりも高速であり、自分が持っているコントロールが気に入っています。これを繰り返すと、最終的には頭の中で固まり、構文を調べる必要がなくなります。

ログファイルを復元することはそれほど難しくありません。覚えておくべき簡単なことの1つ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;

そこで...ログファイルを非常に簡単に復元できました。WITH STOPAT!を使用して、正確な時点に復元することもできます。また、最後のログ復元ステートメントを忘れて誤って送信した場合は、データベースを使用可能にするための最終手順(コミットされていないトランザクションのロールバックなど)を実行するためにWITH NORECOVERY発行するだけです。RESTORE DATABASE DBName WITH RECOVERY;

于 2010-09-03T21:03:01.737 に答える
3

このスクリプトを使用して、データベースを使用しているすべてのプロセスを強制終了してから、再度復元を試みることができます。

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...'
于 2012-06-17T03:57:17.773 に答える
1
  • 左側のリストの「一般」のすぐ下にある「オプション」項目に移動します。
  • [既存のデータベースを上書きする] がオンになっていることを確認します ([復元オプション] セクション)。

幸運を。

于 2010-09-03T21:08:36.903 に答える