sql >> データベース >  >> RDS >> Sqlserver

SQL Serverシステムデータベース–システムデータベースの復元

    SQL Serverシステムデータベースシリーズのこれまでの記事では、SQLServerインストールの一部として提供されるすべてのSQLServerシステムデータベースの目的を学び、それらに実装する必要のあるベストプラクティスを理解しました。また、TempdbおよびMSDBデータベースについても詳しく理解しました。システムデータベースのバックアップと復元はユーザーデータベースとは少し異なるため、この記事では、システムデータベースのバックアップとバックアップからのシステムデータベースの復元の方法について詳しく説明します。

    バックアップSQLデータベース

    バックアップという用語 データベース内のデータを、データをさらに復元または回復するために使用できるバックアップファイルとしてコピーすることを指します。

    完全バックアップ データベースの1つには、データファイルとログファイルにまたがるデータコピーが含まれ、データベースとして復元するか、災害や壊滅的な障害が発生した場合にポイントインタイム復元を実行します。 したがって、システムとユーザーデータベースの定期的なフルバックアップが重要です。

    フルバックアップとは別に、SQL Serverは、差分バックアップ、トランザクションログバックアップ、ファイルバックアップなど、他のいくつかのバックアップオプションをサポートしていますが、この記事の範囲外であるため、これらに焦点を当てることはしません。

    フルデータベースバックアップは、定期的に、または特定の構成変更後に実行するようにスケジュールする必要があります。 SQL Serverはさまざまなファイル拡張子でデータベースの完全バックアップを受け入れることができますが、分類と保守を容易にするために、そのバックアップを*.bakファイルとして保存することをお勧めします。

    データベースのバックアップ構文には多くのオプションがありますが、ここでは、データベースの完全バックアップを作成するために必要な基本的なコマンドのみに焦点を当てます。完全な構文は、MSDNの記事に記載されています。

    BACKUP DATABASE構文(最小)

    BACKUP DATABASE <Database_name> 
    TO DISK = <File_Path>
    GO
    

    ユーザーデータベースのバックアップ

    AdventureWorksの完全バックアップを作成するには データベースの場合は、データベース名を置き換えるだけです。 およびファイルパス 上記のBACKUPDATABASEコマンドで、次のコマンドを実行します。

    BACKUP DATABASE [AdventureWorks] 
    TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak'
    GO
    

    バックアップシステムデータベース

    上記のBACKUPDATABASEコマンドを使用すると、master、msdb、modelなどのシステムデータベースの完全バックアップを作成できます。

    BACKUP DATABASE master 
    TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak'
    GO
    BACKUP DATABASE model 
    TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak'
    GO
    BACKUP DATABASE msdb 
    TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak'
    GO
    

    上記のフォルダパスに移動すると、ユーザーデータベースとシステムデータベースの両方に対して完全データベースバックアップが正常に作成されていることがわかります。

    tempdbデータベースをバックアップすることは可能ですか?

    同じBACKUPDATABASE構文を使用して、tempdbシステムデータベースの完全バックアップを作成してみましょう。

    BACKUP DATABASE tempdb 
    TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\tempdb_Full.bak'
    GO
    

    過去の記事で説明したように、 tempdb バックアップが対象となる唯一のデータベースです 服用できません 。 tempdbデータベースは、SQLServerサービスが開始されるたびに新しく作成されます。したがって、tempdbに問題がある場合は、SQLServerサービスを再起動すると問題の解決に役立ちます。

    データベースの復元

    フルバックアップ(* .bak)からデータベースを復元すると、完全なデータを含むデータベースが復元されるか、データベースが特定の時点に「ロールバック」されます。 RESTOREコマンドを使用して、ファイル、ファイルグループ、またはトランザクションログを復元することもできますが、現在の記事の範囲ではありません。

    データベースの完全バックアップを復元するには 、以下の構文を使用できます。注:BACKUPコマンドと同様に、RESTOREコマンドには多くのオプションがありますが、基本的なものだけを取り上げます。これらのオプションの詳細については、MSDN専用の記事を参照してください。

    RESTOREDATABASE構文

    RESTORE DATABASE <Database_Name> 
    FROM  DISK = <File Path>
    WITH  REPLACE
    GO
    

    ユーザーデータベースの復元

    AdventureWorksを復元するには 以前に取得したフルバックアップのデータベースの場合、データベース名の代わりにRESTOREDATABASEコマンドを使用できます。 およびファイルパス 以下に示すように:

    RESTORE DATABASE [AdventureWorks] 
    FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\AdventureWorks_Full.bak' 
    WITH REPLACE
    GO
    

    モデルデータベースの復元

    RESTOREDATABASEコマンドを使用してモデルシステムデータベースを復元してみましょう。

    RESTORE DATABASE model 
    FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\model_Full.bak' 
    WITH REPLACE
    GO
    

    モデルデータベースのバックアップは、デフォルトのRESTOREDATABASEコマンドを使用して正常に復元できます。

    マスターデータベースの復元

    それでは、RESTOREDATABASEコマンドを使用してシステムマスターデータベースを復元してみましょう。

    RESTORE DATABASE master 
    FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\master_Full.bak' 
    WITH  REPLACE
    GO
    

    マスターデータベースを復元するには、SQLServerインスタンスをシングルユーザーモードで実行する必要があるというエラーがスローされました。エラーメッセージが示すように、SQL Serverインスタンスをシングルユーザーモードで起動してから、マスターデータベースを復元してみる必要があります。

    SQL Serverインスタンスをシングルユーザーモードで起動するには、次のいずれかの方法を適用できます。

    • コマンドプロンプト
    • SQLServer構成マネージャーのSQLServer起動パラメーター。

    コマンドプロンプトアプローチ

    コマンドプロンプトを使用してシングルユーザーモードでSQLServerインスタンスを起動するには、管理者として実行を指定してコマンドプロンプトを開きます。 以下に示すオプション:

    完了したら、次のコマンドを入力します:

    NET STOP <SQL_Server_Service_Name>

    SQL_Server_Service_Name SQLServer構成マネージャーまたはservices.mscから取得できます。

    SQLServer構成マネージャー

    Services.msc

    SQL Serverサービスがデフォルトのインスタンスであるため、 MSSQLSERVERという名前を使用できます。 上で強調したように。入力すると、依存するすべてのサービスを停止するための確認を求められます。 Y と入力して、SQLServerエージェントサービスを停止することもできます。 はいの場合 。

    SQL Serverサービスが停止すると、シングルユーザーモードで開始できます。 / mで以下のコマンドを実行します SQLServerサービスをシングルユーザーモードで開始することを意味します。

    NET START MSSQLSERVER /m

    実行すると、マスターデータベースの復元を試みることができます。前と同じようにRESTOREBACKUPコマンドを実行します。

    SQL Serverインスタンスをシングルユーザーモードで起動することにより、マスターシステムデータベースを最後の既知のフルデータベースバックアップから問題なく正常に復元できます。したがって、マスターデータベースを復元するには、SQLServerインスタンスをシングルユーザーモードにする必要があることを学びました。

    シングルユーザーモードのSQLServerインスタンスでは、1人のユーザーのみが接続でき、復元アクティビティが完了したら、SQL Serverインスタンスを停止し、図のように/mオプションなしでSQLServerインスタンスを起動して、マルチユーザーモードに戻す必要があります。以下:

    NET STOP MSSQLSERVER
    NET START MSSQLSERVER

    通常モードまたはマルチユーザーモードで起動すると、すべてのユーザーがSQLServerインスタンスに接続してアクティビティを実行できます。また、マスターデータベースが完全バックアップが実行された時点まで復元され、その後に行われた構成変更を再度実行する必要があることを確認できます。

    SQL Serverインスタンスがシングルユーザーモードの場合の注意事項:

    • SQL Serverインスタンスがシングルユーザーモードの場合、1つのユーザーセッションのみがそれに接続できます。したがって、SQLServerエージェントサービスと他のすべてのSQLServer関連サービスが停止されていることを確認してください。 状態。そうしないと、これらの接続が最初に確立される可能性があり、その場合、SQLServerに接続してデータベースを復元することはできません。
    • シングルユーザーモードでSSMSを介して接続している間は、オブジェクトエクスプローラーを切断し、クエリウィンドウを介してのみ接続します。オブジェクトエクスプローラーから接続が確立されると、単一の接続が確立されます。したがって、クエリウィンドウから接続することはできません。以下のスクリーンショットを参照してください。オブジェクトエクスプローラーを介して接続せずに、[新しいクエリ]ウィンドウのみを接続する方法を示しています。

    ConfigurationManagerのSQLServer起動パラメーター

    コマンドプロンプトの代わりにGUIに慣れている人は、以下のアプローチを適用できます。

    1)。 SQLServer構成マネージャーを開きます MSSQLManager13.mscと入力します コマンドプロンプトに移動します。ここで、13はSQL Server 2016を指しているため、他のバージョンのSQLServerに対応する正しい番号を使用してください。

    • SQL Server 2012 SQLServerManager11.msc
    • SQL Server 2014 SQLServerManager12.msc
    • SQL Server 2016 SQLServerManager13.msc
    • SQL Server 2017 SQLServerManager14.msc
    • SQL Server 2019 SQLServerManager15.msc

    2)。 SQLServerサービスを展開します

    3)。 SQL Server(MSSQLSERVER)として識別されるSQLServerサービスを右クリックします。 >プロパティ

    4)。 起動パラメータを選択します メニュータブ。

    5)。 -mをクリックします 起動パラメータを指定 フィールドをクリックし、[追加]をクリックします シングルユーザーモードでSQLServerサービスを開始します。

    6)。 [OK]をクリックします SQL Serverサービスを再起動して、シングルユーザーモードでSQLServerサービスを開始します。

    マスターデータベースの復元後にSQLServerインスタンスをシングルユーザーモードからマルチユーザーモードまたは通常モードに変更するには、既存のパラメーターから-mパラメーターをクリックするだけです。 s 、[削除]をクリックして、SQLServerサービスを再起動します。

    MSDBデータベースの復元

    それでは、デフォルトのRESTOREDATABASEコマンドを使用してmsdbシステムデータベースのバックアップを復元してみましょう。

    RESTORE DATABASE msdb 
    FROM  DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\msdb_Full.bak' 
    WITH  REPLACE
    GO
    

    この試行により、データベースが使用されているために排他的アクセスを取得できませんでしたというエラーが発生します。 。このエラーメッセージは、他のプロセスが msdbを使用していることを示しています 。したがって、msdbデータベースを正しく復元するには、以下のいずれかのアプローチを適用する必要があります。

    • msdb に接続してアクセスする人を避けるために、前に行ったようにシングルユーザーモードでSQLServerインスタンスまたはサービスを開始します。 データベース。
    • またはmsdbを持参してください データベースをシングルユーザーモードに設定します。ユーザーはデータベースに接続しません。

    マスターシステムデータベースの復元中にSQLServerインスタンスまたはサービスをシングルユーザーモードに切り替える方法を知っているので、msdbデータベースをシングルユーザーモードに変更してmsdbデータベースのバックアップを復元することにより、2番目のオプションを試します。

    次のコマンドを実行します:

    USE [master]
    GO
    ALTER DATABASE [msdb] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
    GO
    

    重要 :上記のコマンドの実行は、次の場合に失敗する可能性があります:

    • SQLServerエージェントサービスが稼働しています。障害を修正するには、SQLServerエージェントサービスを停止して再試行してください。
    • すべてのユーザーセッションがmsdbデータベースに接続されています。以下のクエリを使用して、msdbまたは別のデータベースへのアクティブな接続を見つけることができます。
    use master
    GO
    select spid
    from sys.sysprocesses
    where dbid = db_id('msdb')
    

    このクエリで結果が得られた場合は、一部のユーザーセッションがmsdbデータベースに接続されていることを示しています。この場合、KILLコマンドを使用してこれらのセッションを強制終了し、 spidを置き換える必要があります。 上記のクエリ実行から取得:

    KILL <spid>

    msdbに接続されているセッションがない場合 データベースを使用すると、msdbデータベースをシングルユーザーモードにすることができます。データベースがシングルユーザーモードの場合は常に、msdbデータベースで以下に強調表示されているようにデータベースの近くに表示される(シングルユーザー)単語を確認できます。

    msdbを復元してみましょう 現在、RESTORE DATABASEコマンドを使用しているデータベース:

    msdbデータベースをシングルユーザーモードにすると、 msdbを復元できました。 msdbの最後の既知の正常な完全バックアップからデータベースが正常に実行されました データベース。データベースをバックアップから復元すると、デフォルトでマルチユーザーモードになります。何らかの理由でデータベースがまだシングルユーザーモードである場合は、次のコマンドを実行してデータベースをマルチユーザーモードに戻すことができます。

    USE [master]
    GO
    ALTER DATABASE [msdb] SET MULTI_USER
    GO
    

    システムデータベースの再構築

    理想的な生産 環境では、ユーザーによる偶発的なミス、データベースの破損、または障害復旧の場合にデータを失うことなくシステムデータベースを復元するには、システムデータベースの完全バックアップを用意することが重要です。

    最悪のシナリオでは、SQL Serverサービスを開始できない場合は、最初に既知の完全バックアップからシステムデータベースを復元する必要があります。使用可能な完全バックアップがなく、SQL Serverサービスを開始できなかった場合は、次のようになります。最後のオプションは1つだけです。つまり、システムデータベースを再構築します。注 :システムデータベースを再構築すると、すべてのシステムデータベースに保存されているすべてのサーバーレベルの構成がクリアされ、ログイン、SQL Serverエージェントの構成、以前の記事で確認したシステムデータベースに保存されているその他の重要な詳細など、すべてのサーバー/インスタンスレベルの構成が失われる可能性があります。

    システムデータベースを再構築する方法を簡単に見てみましょう(前述のように、このプロセスは、システムデータベースの完全バックアップがない場合にSQL Serverインスタンスを戻すための最後の手段として実行する必要があります)。

    システムデータベースを再構築するには、SQLServerインスタンスがインストールされているサーバーにマウントまたはコピーされたSQLServerインストールメディアが必要です。完了したら、次の手順に従う必要があります。

    1. コマンドプロンプトで、SQL Serverセットアップファイル(setup.exe)が配置されているパスに移動します。

      C:\ Program Files \ Microsoft SQL Server \ 130 \ Setup Bootstrap \ SQLServer2016
    2. 以下のコマンドを実行し、すべてのパラメーターを有効な値に置き換えます。値ACTION=REBUILDDATABASE そのコマンドの実行後にすべてのシステムデータベースが再構築されることを示します。
    Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName /SQLSYSADMINACCOUNTS=accounts [ /SAPWD= StrongPassword ] [ /SQLCOLLATION=CollationName]

    変更するパラメータは次のとおりです。

    • InstanceName –SQLServerのインスタンス名。この場合はRRJ
    • アカウント – sysadminアカウント名、この場合は sa
    • StrongPassword saの強力なパスワード sysadminアカウント。
    • Collat​​ionName –変更する必要がある場合は、SQLServerデータベースの照合名。

    結論

    ユーザーデータベースとシステムデータベースをバックアップおよび復元する方法を学び、マスターおよびmsdbシステムデータベースなどのシステムデータベースを復元するために必要な追加の手段を理解しました。システムデータベースの完全バックアップが欠落している場合は、SQL Serverインストールメディアからシステムデータベースを再構築する方法も学習し、システムデータベースの再構築中に発生する構成関連のデータ損失を理解しました。要約すると、ユーザーデータベースに加えてシステムデータベースのフルバックアップをスケジュールすることの重要性を間接的に理解しました。

    お時間をいただきありがとうございます。またすぐにまた興味深い記事をお届けします。


    1. PostgresSQLのインストールに失敗しました:データベースクラスターの初期化に失敗しましたMAC os

    2. アプリケーションが起動するたびにリソースIDが変更されますか

    3. 4すぐに使えるSQLデータ変換方法とユースケース

    4. ここでは列は許可されていませんINSERTステートメントのエラー