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

SQLCMDを使用してSQLデータベースのメンテナンスタスクを自動化する方法

    この記事では、SSMS(SQL Server Management Studio)を使用せずにコマンドプロンプトから直接T-SQLコマンドを実行できるSQLCMDユーティリティを使用してSQLデータベースのメンテナンスタスクを自動化する方法について説明します。

    通常、データベースタスクを自動化するには、これらのタスクを実行するジョブをスケジュールするためにSSMS(SQL Server Management Studio)が必要ですが、この記事では、別のアプローチを使用して、待望のSSMSを使用せずにデータベースタスクを自動化します。

    SQLCMDユーティリティは、コマンドラインから必要なSQLスクリプトをすぐに実行できるため、データベース開発者やDBAにとってリアルタイムの節約になります。また、SQLCMDユーティリティを使用してデータベースのメンテナンスタスクを自動化することもできます。

    SQLデータベースタスクの自動化の基本

    SQLCMDユーティリティを使用してSQLデータベースのメンテナンスタスクを自動化するためのいくつかの基本的な概念を見ていきましょう。

    データベース保守タスクとは何ですか?

    データベース保守タスクは、その名前が示すように、データベースの管理または保守を支援して、データベースの円滑な運用を保証するタスクです。

    たとえば、データベースのバックアップを毎日作成することは、データベースが確実にバックアップされるようにするデータベースのメンテナンスタスクです。これにより、データベースが破損したり不安定になったりした場合に、データベースを失うことなく正常に復元できます。任意のデータ。

    データベース保守タスクを実行するのは誰ですか?

    通常、データベース管理者など、データベースシステムのメンテナンスを担当する専門家がデータベースのメンテナンスタスクを実行しますが、これは特定の状況下で変更される場合があります。

    データベース保守タスクはどのように実行されますか?

    データベースのメンテナンスタスクは通常、データベース管理者が手動で実行することもあれば、自動的に実行するようにスケジュールすることもできます。

    データベース保守タスクの自動化とはどういう意味ですか?

    データベース保守タスクを自動化するということは、手動の介入なしに自動的に実行されるようにデータベース保守タスクをスケジュールすることを意味します。

    データベース保守タスクの自動化の利点は何ですか?

    データベース保守タスクを自動化すると、時間と労力が節約され、プロセスが標準化され、定期的に実行しやすくなります。また、自動化されたジョブの失敗に対してタイムリーなアラートを構成すると、問題の原因を特定するプロセスをスピードアップできます。タスクは失敗します。

    データベースのメンテナンスタスクを自動化するにはどうすればよいですか?

    SQLCMDユーティリティーの高度な使用法の1つは、データベース保守タスクの自動化です。この記事では、SSMS(SQL Server Management Studio)を使用せずにデータベースのメンテナンスタスクを自動化します。

    Windowsタスクスケジューラ

    Windowsタスクスケジューラを利用して、SSMS(SQL Server Management Studio)を必要としないデータベースメンテナンスタスクを自動化します。

    前提条件

    この記事は、SQLCMDユーティリティの基本的な知識とともに、T-SQLステートメントを実行することによって実行されるデータベースメンテナンスタスクの基本的な知識があることを前提としています。

    高度な使用に進む前に、SQLCMDを使用してコマンドラインからT-SQLステートメントを実行するための基本の記事を参照して、SQLCMDの基本をしっかりと理解してください。

    SQLデータベースのメンテナンスタスクを実行する方法については、SQLCMDを使用したSQLデータベースのメンテナンスタスクの実行の記事も参照してください。

    この記事では、サンプルの大学データベースが作成されていることも前提としています。

    別の記事「SQLCMDを使用してコマンドラインからT-SQLステートメントを実行するための基本」を確認してサンプルデータベースを作成するか、次のT-SQLコードを使用して大学と呼ばれるサンプルデータベースをセットアップしてください:

    -- (1) Create University sample database
    CREATE DATABASE University;
    GO
    
    USE University
    
    -- (2) Create Course table
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Course') 
    DROP TABLE dbo.Course 
    
    CREATE TABLE [dbo].[Course] (
        [CourseId] INT           IDENTITY (1, 1) NOT NULL,
        [Name]     VARCHAR (30)  NOT NULL,
        [Detail]   VARCHAR (200) NULL,
        CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED ([CourseId] ASC)
    );
    
    -- (3) Create Student table
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME='Student') 
    DROP TABLE dbo.Student 
    
    CREATE TABLE [dbo].[Student] (
        [StudentId] INT           IDENTITY (1, 1) NOT NULL,
        [Name]      VARCHAR (30)  NULL,
        [Course]    VARCHAR (30)  NULL,
        [Marks]     INT           NULL,
        [ExamDate]  DATETIME2 (7) NULL,
        CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC)
    );
    
    -- (4) Populate Course table
    SET IDENTITY_INSERT [dbo].[Course] ON
    INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (1, N'DevOps for Databases', N'This is about DevOps for Databases')
    INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (2, N'Power BI Fundamentals', N'This is about Power BI Fundamentals')
    INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (3, N'T-SQL Programming', N'About T-SQL Programming')
    INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (4, N'Tabular Data Modeling', N'This is about Tabular Data Modeling')
    INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (5, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals')
    SET IDENTITY_INSERT [dbo].[Course] OFF
    
    -- (5) Populate Student table
    SET IDENTITY_INSERT [dbo].[Student] ON
    INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (1, N'Asif', N'Database Management System', 80, N'2016-01-01 00:00:00')
    INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (2, N'Peter', N'Database Management System', 85, N'2016-01-01 00:00:00')
    INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (3, N'Sam', N'Database Management System', 85, N'2016-01-01 00:00:00')
    INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (4, N'Adil', N'Database Management System', 85, N'2016-01-01 00:00:00')
    INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (5, N'Naveed', N'Database Management System', 90, N'2016-01-01 00:00:00')
    SET IDENTITY_INSERT [dbo].[Student] OFF
    GO
    

    大学データベースのバックアップタスクの自動化

    データベースのバックアップを自動化する必要があるシナリオを見てみましょう。

    要件:大学データベースのバックアップを自動化する

    DBAは、時間を節約し、最新のバックアップの混乱を避け、プロセス全体をスピードアップするために、バックアップの日付と時刻を表示するデータベースバックアップを自動化するように依頼されました。

    これらのビジネス要件を満たすには、データベースのバックアップを作成するSQLCMDスクリプトをWindowsタスクスケジューラで実行する必要があります。

    データベースのバックアップとスクリプト用のフォルダの作成

    まず、デモという名前のフォルダを作成します ドライブ上C 次に、デモで次のサブフォルダを作成します フォルダ:

    1. バックアップ
    2. スクリプト

    ドライブCはデモ目的でのみ使用していることに注意してください。リアルタイムのシナリオでは、バックアップドライブを使用してください。

    SQLデータベースバックアップスクリプトの作成

    SQLデータベースのバックアップスクリプトを作成し、 01-Backup-University-sql-script.sqlとして保存します。 C:\ Demo \ Scripts これには、次のようなバックアップ日時に関する情報も含まれています。

    -- Creating University database backup with date and time 
    DECLARE @Backup NVARCHAR(400)
    SET @Backup=CONCAT('C:\Demo\Backups\University-',(FORMAT(GETDATE(),'yyyy-MM-dd-hh-mm-ss-tt')),'.bak')
    BACKUP DATABASE [University] TO  DISK = @Backup
    WITH NOFORMAT, NOINIT,  NAME = N'University-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    GO
    

    SQLスクリプトをスクリプトフォルダに保存する

    SQLバックアップスクリプトをC:\ Demo \ Scriptsに保存します フォルダ。

    SQLCMDバックアップスクリプトの作成

    SQLCMDを使用したSQLスクリプトを参照するデータベースバックアップスクリプトは、次のように作成されます。

    Sqlcmd –S . –i c:\Demo\Scripts\01-Bakup-University-sql-script.sql

    「。」 (ドット)は、ここではデフォルトの名前のないSQLインスタンスであり、。\などの名前の付いたSQLインスタンスに置き換えることができます。

    SQLCMDバックアップスクリプトの実行テスト

    コマンドラインから上記のSQLCMDスクリプトを実行して、バックアップスクリプトをテストします。

    スクリプトは正常に実行されたので、準備は完了です。

    バックアップに移動します フォルダを作成し、テスト実行の結果として作成されたバックアップを削除します。

    SQLCMDスクリプトを参照するためのバッチファイルの作成

    02-Run-Sqlcmd-Backup-script.batという名前のバッチファイルを作成します メモ帳を使用して、.batとして保存します:

    @Echo off
    sqlcmd -E -S . -i c:\Demo\Scripts\01-Bakup-University-sql-script.sql
    

    SQLCMDスクリプトに若干の変更があることに注意してください :-Eが追加されました 、実際には デフォルトの認証オプションであり、Microsoftのドキュメントに従って指定する必要はありません。

    これは次のように示されています:

    Windowsタスクスケジューラでデータベースバックアップタスクをスケジュールする

    Windowsサーチで「タスクスケジューラ」と入力してWindowsタスクスケジューラを開き、[タスクスケジューラ]をクリックします。 :

    Windowsタスクスケジューラを開いたら、基本タスクの作成…をクリックします。 右側のオプションから、「大学データベースのバックアップタスク」と入力します。 名前で 入力ボックスをクリックし、[次へ]をクリックします :

    次に、デフォルト設定(毎日)のままにして、タスクの頻度を設定します。

    このタスクがアクティブになる毎日の時間を設定します(2分から3分に加えて現在の時間を設定して、タスクが機能していることを即座に確認することをお勧めします):

    また、プログラムの開始を選択する必要があります このタスクで何を実行するかを尋ねられたとき:

    次に、SQLCMDを呼び出してUniversityデータベースのバックアップを作成するバッチファイルをポイントし、[次へ]をクリックします。 :

    完了をクリックします プロセスを完了します。

    ジョブの設定を完了するために、ジョブスケジュールで設定された内容により多くの時間を費やした可能性があります。つまり、タスクが実行されているかどうかを確認するには、翌日待つ必要があります。

    一日中待つのではなく、2〜3分で実行されるようにするには、現在の時刻の2〜3分前にタスクを再スケジュールする必要がある回避策があります。

    タスクが自動的に実行されるのを待ち、指定された時間が経過したら、デモで作成したバックアップフォルダを確認してください。 ドライブCのフォルダ:

    おめでとうございます。データベースのメンテナンスタスクは、SQLCMDスクリプトを実行するバッチファイルを呼び出してバックアップファイルを作成するWindowsタスクスケジューラを使用して正常に自動化されました。

    ウォークスルーを終了し、それ以上実行することに興味がなくなったら、デモ目的で作成された自動タスクを削除してください。

    やるべきこと

    この記事を読んだ後、SQLCMDユーティリティやWindowsタスクスケジューラを使用してデータベースをバックアップするなど、データベースのメンテナンスタスクを自動化する準備ができたので、次のことを試してスキルをさらに向上させることができます。

    1. サンプルデータベースのバックアップを設定して自動化してみてくださいSQLBookShop 記事「ユーティリティプロシージャも呼び出すメインストアドプロシージャの単体テストの簡素化」で説明されています。
    2. WindowsタスクスケジューラでSQLCMDユーティリティを使用して、複数のデータベースを作成し、それらのバックアップを自動化してみてください。
    3. 2つのバッチファイルを作成して、バックアップとデータベースの復元プロセスを自動化してみてください。1つはバックアップ用で、もう1つはSQLCMDスクリプトを参照してデータベースを復元し、Windowsタスクスケジューラでジョブを毎日実行するようにスケジュールします。

    便利なツール:

    dbForge Studio for SQL Server – SQL Serverの管理、管理、開発、データレポート、および分析のための強力なIDE。


    1. SQL Serverのストアドプロシージャの列情報を返す:sp_sproc_columns

    2. PHPとMySQLでタイムゾーンを設定する

    3. データベースで継承を効果的にモデル化するにはどうすればよいですか?

    4. T-SQLのバグ、落とし穴、およびベストプラクティス–ピボットとピボット解除