適用対象:SQL Server on Linux
特定の状況では、Linux のシングル ユーザー モードで SQL Server のインスタンスに master データベースを復元することが必要になる場合があります。 シナリオには、新しいインスタンスへの移行や不整合からの復旧が含まれます。
Note
SQL Server は、復元が完了した後に自動的にシャットダウンされます。 この動作は仕様です。
master データベースを復元するには、コマンド ラインの スタートアップ オプション -m を使用して、シングルユーザー モードで SQL Server を起動する必要があります。
Windows のシングル ユーザー モードで SQL Server インスタンスを起動する方法については、「SQL Server 用シングル ユーザー モード」を参照してください。
前提条件
SQL Server をシングル ユーザー モードで起動すると、ローカル Administrators グループのメンバーはすべて、固定サーバー ロール sysadmin のメンバーとして SQL Server に接続できるようになります。 詳細については、「システム管理者がロックアウトされた場合の SQL Server への接続」を参照してください。
SQL Server のインスタンスをシングル ユーザー モードで起動する場合:
- 1 人のユーザーのみがサーバーに接続できます。
-
CHECKPOINTプロセスは実行されません。 既定では、このプロセスは、起動時に自動的に実行されます。
SQL Server サービスを停止する
次のコマンドは、SQL Server インスタンスが現在実行中の場合に停止します。
systemctl stop mssql-server
現在のユーザーを mssql に変更する
mssqlユーザーの下で SQL Server on Linux が実行されるため、最初にこのユーザーに切り替える必要があります。 このコマンドを実行すると、rootパスワードの入力を求められます。su mssql
シングルユーザー モードで SQL Server を起動する
-mでSQLCMDオプションを使用すると、接続を特定のクライアント アプリケーションに限定できます (SQLCMDは次に示すように大文字にする必要があります)。/opt/mssql/bin/sqlservr -m"SQLCMD"前の例では、
-m"SQLCMD"を使用すると、接続が、sqlcmd クライアント プログラムとして識別される必要がある単一の接続に限定されます。 このオプションは、masterデータベースを復元するためにシングルユーザー モードで SQL Server を起動する場合に使用します。SQL Server の起動時に、いくつかのログ エントリが生成されます。 出力で次の行を探して、シングル ユーザー モードで実行されていることを確認できます。
[...] 2022-05-24 04:26:27.24 Server Command Line Startup Parameters: -m "SQLCMD" [...] 2022-05-24 04:26:28.20 spid8s Warning ****************** 2022-05-24 04:26:28.21 spid8s SQL Server started in single-user mode. This an informational message only. No user action is required.
SQL Server インスタンスに接続する
sqlcmd を使用して SQL Server インスタンスに接続します。 「 シングル ユーザー モードで SQL Server を起動 する」セクションで説明されている手順を完了すると、SQL Server が 対話型 モードで実行されていることがわかります。 したがって、次のように sqlcmd を起動するには、新しいターミナル セッションを開く必要があります。
/opt/mssql-tools/bin/sqlcmd -S <ServerName> -U sa -P <password>前の例では、
<ServerName>はリモートで接続している場合に SQL Server を実行しているホストの名前です。 SQL Server が実行されているホストで直接接続している場合は、このパラメーターをスキップするか、またはlocalhostを使用できます。<StringPassword>は SA アカウントのパスワードです。
master データベースを復元する
sqlcmd 内で次のコマンドを実行します。 sqlcmd では、実行するためにスクリプトの最後に
GOが想定されていることに注意してください。USE [master]; GO RESTORE DATABASE [master] FROM DISK = N'/var/opt/mssql/data/master.bak' WITH FILE = 1, MOVE N'master' TO N'/var/opt/mssql/data/master.mdf', MOVE N'mastlog' TO N'/var/opt/mssql/data/mastlog.ldf', NOUNLOAD, REPLACE, STATS = 5; GO前の例では、
masterデータベース バックアップ ファイルへのパスは/var/opt/mssql/data/master.bakです。 この値は、masterデータベース バックアップ ファイルへの正しいパスに置き換える必要があります。復元が成功すると、次の例のような出力が表示されます。
Processed 456 pages for database 'master', file 'master' on file 1. Processed 5 pages for database 'master', file 'mastlog' on file 1. The master database has been successfully restored. Shutting down SQL Server. SQL Server is terminating this process.
SQL Server サービスを再起動します
SQL Server を再起動するには、次のコマンドを実行します。
systemctl start mssql-server
注釈
master データベース バックアップを復元すると、バックアップの作成後にインスタンスに追加された既存のユーザー データベースは、master の復元後に表示されなくなります。 ファイルは引き続きストレージ レイヤーに存在する必要があるため、それらのデータベースをオンラインにするには、それらのユーザー データベース ファイルを手動で再アタッチする必要があります。 詳細については、「 Attach a Database」を参照してください。