コンテンツに移動
データベース

Linux 上で Cloud SQL と Powershell を連携させる

2022年12月14日
Google Cloud Japan Team

※この投稿は米国時間 2022 年 12 月 2 日に、Google Cloud blog に投稿されたものの抄訳です。

PowerShell はデータベース管理者が Microsoft SQL Server を管理するために使用することが多い強力なスクリプト ツールです。このブログでは、Cloud SQL for SQL Server インスタンス上で PowerShell を使用して、一般的なデータベースのタスクや管理を行う方法について説明します。また、dbatools.io にも注目し、これをクロスリージョン レプリカ外部レプリケーション、その他の重要な機能が有効になっているインスタンスにおいて使用する方法を説明します。

Google Cloud Tools for PowerShell を使用すると、gcloud CLI からさまざまなコマンドレットを実行できます(詳細についてはドキュメントをご覧ください)が、この投稿ではスタンドアロン仮想マシンから PowerShell を実行することについて重点的に説明します。現在、PowerShell は Windows と Linux の両方で使用できるため、Compute Engine の Linux 仮想マシン(VM)にインストールできます。

初期設定と使用開始

Cloud SQL インスタンスを管理するために SQL Server Management Studio を VM にインストールできるのと同じように、PowerShell を Compute Engine の VM にインストールできます。デベロッパーが Compute Engine で作成する Windows VM には PowerShell がデフォルトでインストールされており、設定は必要ありません。また、Compute Engine の Linux VM に PowerShell をインストールすることもできます。Compute Engine の Linux VM で dbatools.io とともに PowerShell 環境を設定するには、次の 7 つのステップが必要です。

  1. VM を作成する

  2. VM に接続する

  3. PowerShell をインストールする

  4. PowerShell を起動する

  5. PowerShell の設定を検証する

  6. dbatools.io をインストールする

  7. dbatools.io の設定を検証する

https://storage.googleapis.com/gweb-cloudblog-publish/images/1_machine_configuration.max-600x600.png

ステップ 1. VM を作成する

ステップ 2. VM に接続する

こちらの手順に従って Linux VM に接続します。

ステップ 3. PowerShell をインストールする

こちらのステップに従って、PowerShell をインストールします

ステップ 4. PowerShell を起動する

次のコマンドを使用して PowerShell を起動します

# PowerShell を起動する

pwsh

コマンド プロンプトには次のように表示されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2_step4.max-500x500.png

ステップ 5. PowerShell の設定を検証する

次のコマンドを実行することにより、PowerShell が動作していることを確認できます

https://storage.googleapis.com/gweb-cloudblog-publish/images/3_Step5.max-700x700.png

ステップ 5. dbatools.io をインストールする

次のコマンドを使用して dbatools.io をインストールします。詳細については、こちらのドキュメントをご覧ください

# 次のコマンドを実行する

Install-Module dbatools

ステップ 6. dbatools.io の設定を検証する

この投稿の例では、SQL Server 認証を使用して各データベースに接続します。そのために、PowerShell の認証情報を作成して、データベース サーバーに対して認証できるようにする必要があります。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/4_step6.max-700x700.png

ここでテスト用クエリを実行して、設定が予期したとおりに動作することを確認しましょう。Get-DbaDatabase コマンドレットを使用すると、SQL Server インスタンスに接続して、次のようにすべてのユーザー データベースを一覧表示できます。これにより、接続元と接続先の接続を検証できます。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/5_Step6.max-900x900.png

dbatools.io には、Cloud SQL インスタンスを管理するための多くのコマンドレットがデフォルトで含まれています。また、dbatools.io を使用して、Google のベスト プラクティスで推奨されている DBA タスクのいくつかを行うこともできます。次のセクションでは、TempDB に関連するシナリオを取り上げます。

  • TempDB ファイルの数を表示する。

  • インスタンスのサイズを変更した後に、TempDB にファイルをさらに追加したり、削除したりする。

TempDB の更新

TempDB には、パフォーマンスを最適化するためのいくつかのベスト プラクティスがあります。主な推奨事項の一つは、利用可能なコア数と同じ数の TempDB ファイル(最大 8 個)を用意することです。TempDB の構成は、PowerShell を使用して簡単に確認、管理できます。

TempDB ファイルの数を表示する

Cloud SQL インスタンス用の TempDB ファイルを確認するには、次の例に示されているように、Get-DbaDbFile コマンドレットを使用します。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/6_Tempdb.max-900x900.png

インスタンスのサイズを変更した後に、TempDB にファイルをさらに追加したり、削除したりする

追加のファイルが必要な場合(Cloud SQL インスタンスのサイズを変更した後など)、次に示すように Set-DbaTempDbConfig コマンドを使用してファイルを追加できます。TempDB で競合が生じた場合にも、TempDB ファイルを追加する必要があるかもしれません。

この例では、6 個の vCPU を使うようにインスタンスのサイズを変更したので、データファイルの数が合計で 6 個になるように、4 個の TempDB データファイルを追加する必要があります。このステップは、こちらで説明されているように、PowerShell 以外の方法で行うこともできます。
https://storage.googleapis.com/gweb-cloudblog-publish/images/7_tempdb1.max-800x800.png
読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/8_tempdb3.max-900x900.png

論理ファイル名がすでに使用されていることを警告する、上のようなメッセージが表示されることがあります。この警告は、PowerShell スクリプトがすでに存在するファイル名の使用を試みたときに発生します。この警告に対処するには、プライマリ ファイル(tempdev と templog)以外のすべての TempDB ファイルを削除します。

この例では、次のスクリプトを使用して、そのようなファイルを削除します。

読み込んでいます...

ファイルが削除された後、2 個のファイルが残ります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/9_tempdb4.max-900x900.png

そして、必要な数の TempDB ファイルを再び追加することができます。ファイルの追加が完了したら、変更を有効にするために Cloud SQL インスタンスを再起動する必要があります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/10_tempdb5.max-1000x1000.png

DB の待機に関する統計情報を確認する

パフォーマンスに問題がある場合や、Cloud SQL インスタンスが待機している理由を確認する必要がある場合、Get-DbaWaitStatistic コマンドレットを使用すると、待機に関する統計情報を 1 つのコマンドで確認できます。
読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/11_waitstats.max-900x900.png

レプリカ間でオブジェクトを同期する

Cloud SQL for SQL Server のリードレプリカを使用している場合や、Cloud SQL をトランザクション レプリケーションのためのパブリッシャーとして使用している場合、SQL エージェント ジョブをインスタンス間で同期するなど、引き続き実行すべきタスクがいくつかあります。この例では、Cloud SQL ドキュメントに記載のステップを使用してリードレプリカを作成します。最初の作成時には、プライマリとセカンダリでオブジェクトが同期されています。レプリカが設定された後に作成されたオブジェクトが確実に同期されるようにする必要があります。

SQL エージェント ジョブ

後でレプリカ インスタンスに同期するサンプルジョブをプライマリ インスタンス上で作成しましょう。

次に示すように、New-DbaAgentJob コマンドレットを使用できます
読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/12_sql_agent_jobs.max-700x700.png

New-DbaAgentJobStep を使用して、「test-step」という名前のジョブステップを作成します。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/13_SQl_agent_jobs.max-600x600.png

前のステップで作成した新しいジョブを Copy-DbaAgentJob によりレプリカに同期します。

読み込んでいます...

プライマリで作成したジョブがコピーされたはずです。必要であれば、Get-DbaAgentJob を使用して、レプリカのジョブを一覧表示することもできます。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/14_sql_agent_job3.max-500x500.png

プライマリで行った変更をセカンダリに同期したい場合は、–Force オプションを使用して同期できます。これを示すために、次の 2 つの変更をプライマリ インスタンスで行います。

  1. 「second-job」という名前の 2 つ目の SQL エージェント ジョブを作成する

  2. 「second-step」という名前の 2 つ目のジョブステップを、「test-job」という名前のジョブに追加する

次のステップで、確認を行ってから上の変更をセカンダリ サーバーに同期します。

新しいジョブ(「second-job」)を作成します

読み込んでいます...

プライマリで、「second-step」を「test-job」に追加します

読み込んでいます...

ここで、プライマリのジョブステップを確認します

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/15_sql_agent_job4.max-900x900.png

次に、プライマリに加えた変更を、–Force オプションを使用して、セカンダリ サーバーに同期します。次に示されているように、second-job が追加され、test-job が正常に更新されているはずです。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/16_sql_agent_job5.max-400x400.png

データのインポート

PowerShell を使用してデータ(CSV ファイルなど)をインポートすることもできます。自分の CSV ファイルを選択するか、docs.google.com/spreadsheets/ を使用してサンプルを作成します。ここでは、私が作成した小さなサンプルを使用します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/17_import_job1.max-600x600.png

cat を使用すると、次のようにファイルの内容を確認できます。

cat ./import/States.csv

id,name,capitol

1,washington,olympia

2,oregon,Salem

3,california,Sacramento

4,montana,Helena

5,idaho,Boise

次に示すように、Import-DbaCsv を使用してこのファイルを Cloud SQL インスタンスにインポートします。この操作は、BULK INSERT の代わりとして行うこともできます。
読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/18_import_job2.max-600x600.png

インポートしたテーブルを Get-DbaDbTable で一覧表示することもできます。

読み込んでいます...

5 行からなるテーブルが作成されたことを確認できます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/19_import_job3.max-600x600.png

また、インスタンス間でテーブルを転送することもできます。たとえば、データを複製している 2 つのデータベースがある場合、プライマリとパブリッシャー設定のレプリカとの間でオブジェクトを転送できます。この転送は、主キーを持たないテーブルなど、レプリケーションに対応していないオブジェクトを初めて同期するために行うこともできます。

この場合、Copy-DbaDbTableData を使用します

上の手順でインポートした「states」テーブルを、同期元から「newtest」という名前の同期先データベースにコピーします。

読み込んでいます...

テーブルが同期先にコピーされ、5 行が 141.02 ms でコピーされたことを確認できます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/20_import_job4.max-600x600.png

一般的な DBA タスクの実行

Cloud SQL for SQL Server インスタンスの正常性を保つために、DBA/DBE はいくつかのタスクを行う必要があります。その多くは、PowerShell を使用して実行できます。

使用されていないインデックスと、重複するインデックス

多くの場合、インデックスを設定することで Select のパフォーマンスは向上しますが、Insert と Update ではオーバーヘッドが発生します。そのため、使用されていないインデックスと重複するインデックスを見直すことをおすすめします。次の 2 つのコマンドレットを使用して、これらを見直すことができます。

Find-DbaDbDuplicateIndex

Find-DbaDbUnusedIndex

Cloud SQL 上の診断クエリ

SQL Server MVP の Glen Berry 氏が提供する、一般的な診断クエリのセットはこちらにあります。

Invoke-DbaDiagnosticQuery を使用すると、特定の診断クエリセットまたはすべての診断クエリを自動で実行し、結果を返すことができます。診断クエリの数が多く、返される情報も多いため、少し時間がかかります。特定の診断クエリに限定するか、対象を特定のデータベースに限定するのがよいかもしれません。

出力の例の一部を次に示します。

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/21_Diagnostic_query1.max-900x900.png

次に、クロス リージョン レプリカ可用性グループのステータスと DB バックアップのステータスを取得するために Cloud SQL 上で実行できる診断クエリの例を紹介します。次に示されているように、出力をテーブル形式にすると読みやすくなります。

診断クエリ実行の例: AG ステータス

読み込んでいます...

診断クエリ実行の例: データベースによる前回のバックアップ

https://storage.googleapis.com/gweb-cloudblog-publish/images/22_Diagnostic_query2.max-900x900.png

診断クエリ実行の例: データベースによる前回のバックアップ

読み込んでいます...

https://storage.googleapis.com/gweb-cloudblog-publish/images/23_Diagnostics_query3.max-900x900.png

このブログでは、Compute Engine の Linux VM で PowerShell を使用して Cloud SQL インスタンスを管理する方法について説明しました。一般的なシナリオのほんの一部を紹介しましたが、PowerShell と dbatools.io を使用するとさらに多くのことができます。詳細や利用できるコマンドの完全な一覧については、https://dbatools.io/commands/ をご覧ください。

- Cloud SQL データベース エンジニア Bryan Hamilton

投稿先