none
SQL Server 2014 RESTORE が終了しない。DBがRESTORING状態となる。 RRS feed

  • 質問

  • お世話になっております。mihasato25と申します。

    VB.net作成した業務システムの更新処理でリカバリ対応の為、以下の機能を実装しています。

    ①更新処理前にDBの完全バックアップファイル作成

    ②異常終了時対応の為、①作成バックアップファイルよりDBを復元

    使用DBですが、昨年度 SQL Server 2008 R2 Standard から SQL Server 2014 Standard へ移行しました。

    DB移行後、②がタイムアウトエラーとなり、DBは「復元しています」の状態となります。

    以下、①②のコードです。

    '①コード
        Public Sub BACKUP()
            Try
                'DB接続
                Cnn = New SqlConnection(gCnnStringMaster)
                Cnn.Open()
    
                sSQL = "BACKUP DATABASE testdb TO DISK = 'D:\Backup\testdb.bak' WITH NOFORMAT,INIT,"
                sSQL &= "NAME = N'testdb-TODAYDB-完全-" & Now.ToString & "',SKIP,STATS = 10"
    
                Cmd.Connection = Cnn
                Cmd.CommandType = CommandType.Text
    
                Cmd.CommandText = sSQL
                Cmd.ExecuteNonQuery()
                Cmd.Dispose()
    
                Cnn.Close()
            Catch ex As Exception
                Call endErr(mPrgNm, ex.Source, CStr(Err.Number), ex.ToString)
            End Try
        End Sub
    
    '②コード
        Public Sub RESTORE()
            Try
                '### DB接続 ###
                Cnn = New SqlConnection(gCnnStringMaster)
                Cnn.Open()
    
                '### DB接続セッション取得及びチェック ###
                sSQL = "SELECT spid,hostname,program_name,sysprocesses.status FROM master..sysprocesses,master..sysdatabases " & _
                    "WHERE master..sysprocesses.dbid = master..sysdatabases.dbid AND name = 'testdb';"
    
                dt.Reset()
                Adp.SelectCommand = New SqlCommand(sSQL, Cnn)
                Adp.Fill(dt)
                Adp.Dispose()
    
                If dt.Rows.Count > 0 Then
                    MessageBox.Show("DBが使用中です。)
                    Throw New ApplicationException("★警告:DBが使用中です。")
                    Exit Try
                End If
    
                '### データーベースリストア ###
                ''実行用の設定
                sSQL = "RESTORE DATABASE testdb FROM DISK = 'D:\Backup\testdb.bak' "
                sSQL &= "WITH REPLACE,RECOVERY,STATS = 20"
    
                Cmd.Connection = Cnn
                Cmd.CommandType = CommandType.Text
                Cmd.CommandTimeout = 180
    
                Cmd.CommandText = sSQL
                Cmd.ExecuteNonQuery()
                Cmd.Dispose()
            Catch ex As Exception
                Call endErr(mPrgNm, ex.Source, CStr(Err.Number), ex.ToString)
            Finally
                Adp.Dispose()
                Cmd.Dispose()
                Cnn.Close()
            End Try
        End Sub

    状況をまとめると以下のとおりです。

    ・DBの操作は、クライアントPCよりリモート接続し実行しています。

    ・①は正常終了し、バックアップファイルは上書き作成されている。

    ・②はタイムアウトエラーとなり、DBは「復元しています」のままである。

    ・SQL Server Management Studioより、①作成バックアップファイルから復元した場合、復元中のまま終了しない。

    ・SQL Server 2008 R2の時は、上記現象は発生しなかった。

    DBの稼働サーバー情報は以下のとおりです。

    Hyper-Vサーバ上に仮想サーバとして稼働。

    OS Windows Server 2012 R2 DataCenter

    DB SQL Server 2014 Standard

    該当DBは①とは別に、SQL Server エージェントで以下の定期バックアップを実施

    日次 データベース完全バックアップ、週次 データバース完全バックアップ&トランザクションログバックアップ

    原因不明で困っております。よろしくお願いします。


    2016年2月25日 3:09

すべての返信

  • > Cmd.CommandTimeout = 180

    これが短すぎるだけじゃないでしょうか。
    ManagementStudioからやってみてどのぐらいの時間がかかるか試すといいかなと思います。

    2016年2月25日 4:36
  • 返信、ありがとうございます。

    SSMSからの実行は何度かやっています。

    終了するまで待った事はありませんが、5分経過しても実行中のままの為、強制終了させています。

    その後、何度か復元(WITH RECOVERY)を行うと、正常に終了します。

    SQL Server 2008 の頃は、一分もかからずに復元できた事が、現在、出来ない状況です。

    2016年2月25日 5:42
  • > 終了するまで待った事はありませんが、5分経過しても実行中のままの為、強制終了させています。

    1,2時間は待ってみませんか?
    SSMSではタイムアウトにならないんですよね?そこでもタイムアウトになるようなら、なんかおかしいと思います。

    > その後、何度か復元(WITH RECOVERY)を行うと、正常に終了します。

    ということなので、時間かければできるような気がします。

    > SQL Server 2008 の頃は、一分もかからずに復元できた事が、現在、出来ない状況です。

    昔より時間かかるようになっている印象はあります。

    2016年2月26日 1:26
  • > 終了するまで待った事はありませんが、5分経過しても実行中のままの為、強制終了させています。

    1,2時間は待ってみませんか?
    SSMSではタイムアウトにならないんですよね?そこでもタイムアウトになるようなら、なんかおかしいと思います。

    > その後、何度か復元(WITH RECOVERY)を行うと、正常に終了します。

    ということなので、時間かければできるような気がします。

    > SQL Server 2008 の頃は、一分もかからずに復元できた事が、現在、出来ない状況です。

    昔より時間かかるようになっている印象はあります。

    引き続きの返信、ありがとうございます。

    復元完了にどれくらいかかるか検証する必要はあると思っていました。

    しかしながら、復元の目的が異常終了した処理を再度行う為で、かつ処理スケジュール上、

    早急に対応する必要があります。

    目的の更新処理(大量データを使用した更新です。)では、異常終了した場合、DBのロールバック手続きを行っています。

    復元時にロールバックが終了していなくて時間がかかっている?とも考えています。

    まずは、次回復元を行うケースが発生した場合、SSMSにて復元を行い、可能な限り終了するまで待ってみます。


    2016年2月26日 7:45
  • 少し検索してみました。検索しただけの情報ですので、参考程度にお考え下さい。

    SQL SERVER Database in RESTORING State for Long Time
    http://swarupsql.blogspot.jp/2015/08/sql-server-database-in-restoring-state.html

    上記によると、最新のLogファイルのリストアが完了していないのが原因のようです。
    この対策がはっきりとわからなかったのですが、Logファイルを先にリストアすると良いのかもしれません。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年2月26日 8:50
  • 少し検索してみました。検索しただけの情報ですので、参考程度にお考え下さい。

    SQL SERVER Database in RESTORING State for Long Time
    http://swarupsql.blogspot.jp/2015/08/sql-server-database-in-restoring-state.html

    上記によると、最新のLogファイルのリストアが完了していないのが原因のようです。
    この対策がはっきりとわからなかったのですが、Logファイルを先にリストアすると良いのかもしれません。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    参考情報、ありがとうございました。

    バックアップファイル作成時にLogファイルのバックアップファイル作成も追加し、

    復元手順をLogファイルのリストア→DBファイルのリストアに変更してみます。

    結果については、後程こちらにアップいたします。

    2016年2月29日 0:52