友人Hのタラレバ話

手広く浅く色々やっています

SQL Server 2019のDBが「復旧しています」から帰ってこない

 システムの開発環境でSQL Server2019を使用していて、テストのためにDBをバックアップからレストアしようとしたら、使用しているユーザーがいて排他ロックかけれなくてレストアが失敗してしまった。

 失敗自体は問題ないので、ログインしているユーザーに処理を止めてもらって再度レストアしようとすると当該のDBの横に「復旧しています」の文字が出てロックされてしまい操作できなくなってしまった。

 調べてみるとどうやらSSMS(SQL Server Management Studio)はGUIで行った操作に基づいてT-SQL文を生成して実行する仕組みのようだが、意図しないエラーや例外にブチ当たってしまうとGUI操作ではニッチもサッチも行かなくなってしまうようだ。

 今回のケースではレストア前にDBの状態を管理するテーブルのキーを復旧中状態に設定して、排他ロックをかけて復旧作業に入ろうとした時に排他ロックをかけれなくて処理がABENDしてしまったようだ。

 DBの中身自体は何も変更されていないのでDBの状態を復旧中から正常状態に戻すだけで良いので下記のWEBサイトを参考にT-SQLを実行したところ、DBの状態が正常に戻り再度レストア作業を行うことができた。

SQL Server データベースを復元しています (Restoring...) 状態から元に戻す方法 - SQL Server&T-SQLに関するコラム - SQL Server 入門

実際に実行したT-SQLは上記のサイトのと全く同じく、下記の通り。

USE [master];
GO

RESTORE DATABASE [復旧中のデータベース名] WITH RECOVERY;

SSMSが大部分の処理をGUI経由でT-SQLを生成してSQL Serverのサービスに投げてるっぽい気がするので、しっかりT-SQLを勉強すればSSMS上でできる操作は大体できるようになるんだなと言うことがわかったのでまたT-SQLも勉強しないといけないなと思う次第でした。

SQL ServerはSSMSがあるが、Oracleは基本コマンドラインインターフェースのSQL*Plus経由で処理しないといけないのでとっつきにくさを感じていたけれども慣れればどちらもGUIよりもCLIの方がやりたいことをサッとできるようになっていいのかもしれない。

JTCのなんちゃって情シスは社内調整やなんだとシステム以外の業務も多くて肝心の技術や知識がなかなか身につかないことが悩ましい。