設定 Microsoft SQL Server 的代理程式

Microsoft SQL Server 的 Workload Manager 會使用 Google Cloud的 Compute Workloads Agent,偵測及收集中繼資料,以便評估 SQL Server 設定。

本文說明如何在執行 SQL Server 的 Compute Engine 執行個體上,安裝、設定及驗證 Compute Workloads 代理程式。

安裝代理程式的必要條件

安裝 Agent for Compute Workloads 前,請務必確認已符合下列必要條件,並建立 SQL Server 工作負載評估

為服務帳戶授予身分與存取權管理角色

Google Cloud的 Compute Workloads 代理程式會使用附加至 VM 的 Identity and Access Management (IAM) 服務帳戶,藉此驗證 Google Cloud 並取得存取 Google Cloud 資源的權限。如要收集 Workload Manager 驗證指標,請使用含有下列 IAM 角色的新服務帳戶:

如要為服務帳戶新增必要角色,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「IAM」頁面。

    前往「身分與存取權管理」頁面

  2. 選取 Google Cloud 專案。

  3. 找出您想新增角色的服務帳戶。

    • 如果服務帳戶不在主體清單中,表示尚未獲派任何角色。按一下「Add」,然後輸入服務帳戶的電子郵件地址。
    • 如果服務帳戶已在使用者清單中,表示已獲指派角色。找到要編輯的服務帳戶,然後按一下「編輯」按鈕。
  4. 從可用角色清單中選取必要角色:

    • Compute Engine > Compute 檢視器
    • Secret Manager > Secret Manager 密鑰存取者
  5. 按一下 [Add] (新增) 或 [Save] (儲存),即可將角色套用到服務帳戶。

啟用 Google Cloud API 存取權

Compute Engine 建議您設定 VM 執行個體,允許所有 Cloud API 的所有存取權範圍,並僅使用執行個體服務帳戶的 IAM 權限來控管資源存取權。 Google Cloud 詳情請參閱「建立使用使用者管理服務帳戶的 VM」。

如果您限制 Cloud API 存取權,Compute Workloads 代理程式就需要在主機 VM 執行個體上設定下列最低 Cloud API 存取權範圍:

https://www.googleapis.com/auth/cloud-platform

詳情請參閱「範圍最佳做法」。

如果您要在沒有外部 IP 位址的 VM 執行個體上執行 SQL Server 應用程式,就必須在 VM 的子網路上啟用私人 Google 存取權,讓 Compute Workloads 的 Agent 可以存取 Google API 和服務。如要瞭解如何在子網路中啟用私人 Google 存取權,請參閱「設定私人 Google 存取權」。

SQL Server 的必要權限

使用下列指令碼,將必要權限指派給在代理程式中設定的使用者帳戶。

    USE [master]
    GO 
GRANT VIEW SERVER STATE TO [user_name] GRANT VIEW ANY DEFINITION TO [user_name]
-- Adds db_datareader role to the user EXEC sp_MSForEachDB ' USE ? IF NOT EXISTS(SELECT * FROM sys.database_principals WHERE name = ''user_name'') BEGIN CREATE USER [user_name] FOR LOGIN [user_name] END EXEC sp_addrolemember ''db_datareader'', ''user_name'' '

安裝代理程式

如要安裝最新版的 Compute Workloads 代理程式,請完成下列步驟:

Windows

在 Windows 上,您可以使用 GooGet 套件管理指令 googet 安裝 Compute Workloads 代理程式。套件管理指令會完成下列工作:

  • 下載最新版的運算工作負載代理。
  • 建立名為 google-cloud-workload-agent 的 Windows 服務,以及每分鐘執行一次的排程工作,以便檢查服務是否仍在執行,並視需要重新啟動服務。

如要在 VM 上安裝代理程式,請按照下列步驟操作:

  1. 使用 RDP 連線至 Windows VM 執行個體。
  2. 以管理員身分在 PowerShell 中執行下列指令:
    googet addrepo google-cloud-workload-agent  https://packages.cloud.google.com/yuck/repos/google-cloud-workload-agent-windows-x86_64
    googet install google-cloud-workload-agent
    
  3. 查看 %ProgramFiles%\Google\google-cloud-workload-agent\conf 底下的設定檔,並使用設定屬性中的詳細資料更新設定檔。
  4. 重新啟動代理程式,讓這項變更生效。

Linux

在 Linux 上,您可以使用標準作業系統套件管理指令安裝 Compute Workloads 專用代理程式:

  • 在 RHEL 上使用 yum 指令
  • 在 SLES 上,使用 zypper 指令
  • 在 Debian 上使用 apt 指令

套件管理指令會完成下列工作:

  • 下載最新版的運算工作負載代理。
  • 將代理程式設為 Linux systemd 服務,並命名為 google-cloud-workload-agent
  • 啟用並啟動服務 google-cloud-workload-agent

如要在 VM 上安裝代理程式,請按照下列步驟操作:

  1. 建立與主機 VM 的 SSH 連線。
  2. 在終端機中,執行適用於您作業系統的指令來安裝代理程式:

RHEL

sudo tee /etc/yum.repos.d/google-cloud-workload-agent.repo << EOM
[google-cloud-workload-agent]
name=Google Cloud Agent for Compute Workloads
baseurl=https://packages.cloud.google.com/yum/repos/google-cloud-workload-agent-\$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM
sudo yum install google-cloud-workload-agent

SLES

sudo zypper addrepo --refresh https://packages.cloud.google.com/yum/repos/google-cloud-workload-agent-\$basearch  google-cloud-workload-agent
sudo zypper install google-cloud-workload-agent

Debian

echo 'deb https://packages.cloud.google.com/apt google-cloud-workload-agent-x86-64-apt main' | sudo tee -a /etc/apt/sources.list.d/google-cloud-workload-agent.list \
sudo apt-get update \
sudo apt-get install google-cloud-workload-agent
  1. 查看 \etc\google-cloud-workload-agent 底下的設定檔,並使用設定屬性中的詳細資料更新設定檔。
  2. 重新啟動代理程式,讓這項變更生效。

設定屬性

下表說明代理程式設定檔的屬性。

屬性
log_level

String

如要設定代理程式的記錄層級,請新增記錄層級。可用的記錄層級如下:
  • DEBUG
  • INFO
  • WARNING
  • ERROR
預設值為 INFO。除非 Cloud Customer Care 指示您變更記錄層級,否則請勿擅自變更。
log_to_cloud

Boolean

如要將代理程式記錄重新導向至 Cloud Logging,請指定 true。預設值為 true

common_discovery.collection_frequency

Duration

常見探索服務的收集頻率 (以秒為單位)。
預設值為 10800s

agent_properties.log_usage_metrics

Boolean

如要啟用代理程式健康指標記錄功能,請將值設為 true。預設值為 false

sqlserver_configuration.enabled

Boolean

如要在代理程式中啟用 SQL Server 指標收集功能,請將值設為 true。預設值為 false

sqlserver_configuration.collection_configuration.collect_guest_os_metrics

Boolean

如要啟用 OS 指標收集功能,請將值設為 true。預設值為 true
除非 Cloud Customer Care 團隊另有指示,否則請勿將 sqlserver_configuration.collection_configuration.collect_guest_os_metrics 設為 false

sqlserver_configuration.collection_configuration.collect_sql_metrics

Boolean

如要啟用 SQL Server 指標收集功能,請指定 true。預設值為 true
除非 Cloud Customer Care 團隊另有指示,否則請勿將 sqlserver_configuration.collection_configuration.collect_sql_metrics 設為 false

sqlserver_configuration.collection_configuration.collection_frequency

Duration

運算工作負載代理的指標收集頻率 (以秒為單位)。預設值為 3600s。您可以更新收集頻率。不過,建議您保留預設值。

sqlserver_configuration.credential_configurations[].connection_parameters[].host

String

SQL Server 主機名稱。

sqlserver_configuration.credential_configurations[].connection_parameters[].username

String

指定用來查詢 SQL Server 執行個體的使用者帳戶。 如要設定帳戶權限,請查看 權限指令碼中所需的權限,並根據內部政策授予這些權限。

注意:如果您使用的是 Windows 驗證,請務必使用以下格式指定使用者名稱: domain-name\\user-name

sqlserver_configuration.credential_configurations[].connection_parameters[].secret.project_id

String

儲存機密的專案 ID。如果祕密和主機 VM 執行個體位於同一個 Google Cloud 專案中,請將其設為空字串 ("")。

sqlserver_configuration.credential_configurations[].connection_parameters[].secret.secret_name

String

如要安全地提供資料庫使用者帳戶的密碼,以便代理程式用於查詢 SQL Server,請在 Secret Manager 中指定包含資料庫使用者帳戶安全性憑證的機密金鑰名稱。

注意:密鑰和主機 VM 執行個體必須位於同一個 Google Cloud 專案中。

sqlserver_configuration.credential_configurations[].connection_parameters[].port

Int

指定 SQL Server 執行個體接受查詢的通訊埠。

sqlserver_configuration.credential_configurations[].remote_win.connection_parameters.host

String

遠端 Windows VM 的 IP 位址或 FQDN

sqlserver_configuration.credential_configurations[].remote_win.connection_parameters.username

String

指定用於遠端連線至 Windows VM 的使用者帳戶。

sqlserver_configuration.credential_configurations[].remote_win.connection_parameters.secret.secret_name

String

如要安全地提供密碼給 Windows 使用者帳戶,以便代理程式用於遠端連線至 VM,請在 Secret Manager 中指定密鑰的名稱,該密鑰包含資料庫使用者帳戶的安全性憑證。

注意:密鑰和主機 VM 執行個體必須位於同一個 Google Cloud 專案中。

sqlserver_configuration.credential_configurations[].local_collection

Boolean

指定 true 表示代理程式正在進行本機資料收集。預設值為 true

sqlserver_configuration.credential_configurations[].remote_linux.connection_parameters.host

String

遠端 Linux VM 的 IP 位址或 FQDN。

sqlserver_configuration.credential_configurations[].remote_linux.connection_parameters.username

String

指定用於遠端連線至 Linux VM 的使用者帳戶。

sqlserver_configuration.credential_configurations[].remote_linux.connection_parameter.port

Int

指定遠端 Linux VM 的 SSH 通訊埠號碼。

sqlserver_configuration.credential_configurations[].remote_linux.linux_ssh_private_key_path

String

指定 SSH 私密金鑰檔案的路徑。

sqlserver_configuration.credential_configurations[].vm_properties.instance_name

String

指定 Compute Engine VM 執行個體的名稱。

注意:選用屬性,適用於本機收集。

sqlserver_configuration.credential_configurations[].vm_properties.instance_id

String

指定 Compute Engine VM 執行個體的 ID。

注意:可選用,適用於本機收集。

sqlserver_configuration.collection_timeout

Duration

指標收集逾時時間 (以秒為單位)。預設值為 `10s`。

sqlserver_configuration.max_retries

Int

發生失敗收集時的重試次數上限。預設值為 `3`。

sqlserver_configuration.retry_frequency

Duration

指定收集作業失敗時,代理程式應重試的頻率。預設值為 `3600s`。

sqlserver_configuration.remote_collection

Boolean

指定 true 表示代理程式正在進行遠端資料收集。預設值為 false

以下範例顯示 Agent for Compute Workloads 的設定檔:

本機收集

{
"log_level": "INFO",
"common_discovery": {
    "collection_frequency": "10800s"
},
"sqlserver_configuration": {
    "enabled": true,
    "collection_configuration": {
        "collect_guest_os_metrics": true,
        "collect_sql_metrics": true,
        "collection_frequency": "60s"
    },
    "credential_configurations": [
        {
            "connection_parameters": [
                {
                    "host": ".",
                    "username": "db_user_name",
                    "secret": {
                        "project_id": "",
                        "secret_name": "idb_pwd_secret_name"
                    },
                    "port": 1433
                }
            ],
            "local_collection": true
        }
    ],
    "collection_timeout": "60s",
    "max_retries": 5,
    "retry_frequency": "3600s"
}
}

遠端收集

{
"log_level": "INFO",
"common_discovery": {
    "collection_frequency": "10800s"
},
"sqlserver_configuration": {
    "enabled": true,
    "collection_configuration": {
        "collect_guest_os_metrics": true,
        "collect_sql_metrics": true,
        "collection_frequency": "60s"
    },
    "credential_configurations": [
        {
            "connection_parameters": [
                {
                    "host": "sql_server_instance",
                    "username": "db_user_name",
                    "secret": {
                        "project_id": "",
                        "secret_name": "db_pwd_secret_name"
                    },
                    "port": 1433
                }
            ],
            "remote_win": {
                "connection_parameters": {
                    "host": "sql_server_instance",
                    "username": "user_name",
                    "secret": {
                        "project_id": "",
                        "secret_name": "pwd_secret_name"
                    }
                }
            },
            "vm_properties": {
                "instance_name": "db01",
                "instance_id": "9999999999999999999"
            }
        },
        {
            "connection_parameters": [
                {
                    "host": "sql_server_instance",
                    "username": "db_user_name",
                    "secret": {
                        "project_id": "",
                        "secret_name": "db_pwd_secret_name"
                    },
                    "port": 1433
                }
            ],
            "remote_linux": {
                "connection_parameters": {
                    "host": "sql_server_instance",
                    "username": "user_name",
                    "secret": {
                        "project_id": "",
                        "secret_name": "pwd_secret_name"
                    },
                    "port": 22
                },
                "linux_ssh_private_key_path": "path of the private key"
            },
            "vm_properties": {
                "instance_name": "db02",
                "instance_id": "9999999999999999999"
            }
        }
    ],
    "collection_timeout": "10s",
    "max_retries": 3,
    "retry_frequency": "3600s",
    "remote_collection": true
}
}

驗證代理程式安裝

Windows

  1. 使用 RDP 連線至 Windows VM 執行個體。
  2. 以管理員身分在 PowerShell 中執行下列指令:

    $(Get-Service -Name 'google-cloud-workload-agent' -ErrorAction Ignore).Status

    如果代理程式正在執行,狀態會顯示 Running

Linux

  1. 建立與主機 VM 執行個體的 SSH 連線。
  2. 請執行下列指令:

    systemctl status google-cloud-workload-agent

    如果代理程式運作正常,輸出內容就會包含 active (running)。例如:

    google-cloud-workload-agent.service - Google Cloud Agent for Compute Workloads
    Loaded: loaded (/usr/lib/systemd/system/google-cloud-workload-agent.service; enabled; vendor preset: disabled)
    Active: active (running) since Sun 2023-12-31 18:59:12 UTC; 10s ago
    Main PID: 14412 (google_cloud_sq)
      Tasks: 7
    Memory: 12.9M (max: 1.0G limit: 1.0G available: 1011.0M)
    CGroup: /system.slice/google-cloud-workload-agent.service
            └─ 14412 /usr/bin/google_cloud_sql_server_agent --action=run
    

檢查代理程式版本

如要查看代理程式版本,請完成下列步驟:

Windows

  1. 使用 RDP 連線至主機。
  2. 以管理員身分在 PowerShell 中執行下列指令:
    googet installed google-cloud-workload-agent

RHEL

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    yum info google-cloud-workload-agent

SUSE

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    zypper info google-cloud-workload-agent

Debian

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    dpkg -s google-cloud-workload-agent | grep version

重新啟動代理程式

如果 Compute Workloads 代理程式停止運作,或您更新了其設定,請重新啟動代理程式。

請選取作業系統,然後按照步驟操作:

Windows

  1. 使用 RDP 連線至主機。
  2. 以管理員身分在 PowerShell 中執行下列指令:
    Restart-Service -Name 'google-cloud-workload-agent' -Force

Linux

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo systemctl restart google-cloud-workload-agent

更新代理程式

為確保您使用的是最新版的代理程式,請定期檢查更新並更新代理程式。

檢查更新

請選取作業系統,然後按照步驟操作:

Windows

  1. 使用 RDP 連線至主機。
  2. 以管理員身分在 PowerShell 中執行下列指令:
    googet latest google-cloud-workload-agent

RHEL

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo yum check-update google-cloud-workload-agent

SLES

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo zypper list-updates -r google-cloud-workload-agent

Debian

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo apt list google-cloud-workload-agent

安裝更新

請選取作業系統,然後按照步驟操作:

Windows

  1. 使用 RDP 連線至主機。
  2. 以管理員身分在 PowerShell 中執行下列指令:
    googet install google-cloud-workload-agent

RHEL

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo yum --nogpgcheck update google-cloud-workload-agent

SLES

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo zypper --no-gpg-checks update google-cloud-workload-agent

Debian

  1. 使用 SSH 連線至主機。
  2. 請執行下列指令:
    sudo apt-get install google-cloud-workload-agent

在 Cloud Logging 中查看代理程式記錄

根據預設,Compute Workloads 代理程式的記錄會從 VM 執行個體重新導向至 Cloud Logging

如要在「記錄」中查看代理程式的記錄,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Logs Explorer」頁面。

    前往「Logs Explorer」(記錄檔探索工具)

  2. 前往「Query」窗格。

  3. 從「Resources」下拉式選單中選取「Global」,然後按一下「Apply」

  4. 在查詢編輯器中輸入 google-cloud-workload-agent

  5. 點選「執行查詢」

    您應該會看到在所有 VM 執行個體上執行的代理程式執行個體產生的記錄檔。如要篩選特定機器的記錄,請使用介面提供的篩選器。

在 Cloud Logging 中停用代理程式的記錄

如要停用預設的代理程式記錄重新導向至 Cloud Logging 功能,請按照下列步驟操作:

  1. 與主機 VM 執行個體建立 RDP 或 SSH 連線。

  2. 開啟代理程設定檔:

    Windows

    %ProgramFiles%\Google\google-cloud-workload-agent\conf\configuration.json

    Linux

    /etc/google-cloud-workload-agent/configuration.json

  3. 針對屬性 log_to_cloud,將值更新為 false

  4. 儲存設定檔。

  5. 重新啟動代理程式,讓這項變更生效。

疑難排解

下列各節將說明使用 Compute Workloads 的 Agent 時常見的問題、原因和解決方法。

驗證權限不足

問題:如果您限制主機 VM 執行個體的存取權範圍,Compute Workloads 代理程式記錄可能會顯示 IAM 權限不足的錯誤。

  googleapi: Error 403: Request had insufficient authentication scopes.
  Details:
  [
    {
      "@type": "type.googleapis.com/google.rpc.ErrorInfo",
      "domain": "googleapis.com",
      "metadata": {
        "method": "google.cloud.workloadmanager.datawarehouse.v1.DataCollectService.WriteInsight",
        "service": "workloadmanager.googleapis.com"
      },
      "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT"
    }
  ]

More details: Reason: insufficientPermissions, Message: Insufficient Permission

原因:Compute Workloads 代理程式需要在主機 VM 執行個體上具備最低 Cloud API 存取權範圍。

解決方法:如要解決這個問題,請啟用必要的存取範圍

無法載入設定檔

問題:如果設定檔包含無效值,您會看到下列錯誤。

"Failed to load configuration","pid":3524,"error":"proto: (line 19:42): unknown
field "{field_name}"

解決方法:如要解決這個問題,請使用設定屬性中的詳細資料更新設定檔

無法初始化資料收集

問題:如果在安裝代理程式後未更新設定檔,您會看到以下錯誤:

"Failed to initialize guest collection","pid":2112,"error":"invalid value for "user_name" "secret_name"

解決方法:如要解決這個問題,請使用設定屬性初始化憑證設定

後續步驟