Availability-Groups

多個基本可用性組和性能 - SQL Server

  • July 4, 2018

我正在將我公司的一些 SQL Server 機器遷移到新的 SQL 2016 設置。我們目前在 SQL 2012 上使用數據庫鏡像。我正在遷移的實例之一目前有大約 60 個數據庫,儘管偶爾會出現問題,但鏡像對我們來說工作得很好。由於各種原因,此實例正在執行 SQL 標準版。由於不推薦使用鏡像,因此我熱衷於嘗試基本可用性組。

但是,我在將一個只有 20 個數據庫的實驗室放在一起時遇到了真正的性能問題。在初始設置期間,簡單地創建一個新的可用性組將耗盡可用性組的 472 個執行緒限制(最大執行緒數 - 40)。在主伺服器上,我會看到如下內容:

time   active_workers idle_workers worker_limit worker_start_success 
--------------------- ------------ ------------ --------------------
12:01  473            0            472          true
12:02  473            0            472          false
... multiple rows elided
12:05  472            451          472          false
12:06  22             16           472          true

只需嘗試查看其中一個可用性組的儀表板,就會將 CPU 鎖定幾分鐘。這不是一個超級強大的虛擬機,但 VMWare 告訴我它已為其分配了 3014 MHz。

這也沒有在數據庫端檢測任何數據庫操作或 I/O。

我是否缺少性能注意事項?在這一點上,我覺得基本可用性組不適用於我的情況,但我想確保我沒有忽略某些東西。我非常依賴這些文章/部落格文章:

最後,這是我用來自動創建可用性組的 PowerShell 腳本。我可能在這裡做一些不正確的事情:

Backup-SqlDatabase -Database $DatabaseName -BackupFile $DatabaseBackupFile -ServerInstance "vm-sqllab1"  
Backup-SqlDatabase -Database $DatabaseName -BackupFile $LogBackupFile -ServerInstance "vm-sqllab1" -BackupAction 'Log'  

Restore-SqlDatabase -Database $DatabaseName -BackupFile $DatabaseBackupFile -ServerInstance "vm-sqllab2" -NoRecovery  
Restore-SqlDatabase -Database $DatabaseName -BackupFile $LogBackupFile -ServerInstance "vm-sqllab2" -RestoreAction 'Log' -NORECOVERY

$PrimaryReplica = New-SqlAvailabilityReplica -Name "vm-sqllab1" -EndpointUrl "TCP://vm-sqllab1.domain:5022" -FailoverMode "Manual" -AvailabilityMode "AsynchronousCommit" -AsTemplate -Version 13
$SecondaryReplica = New-SqlAvailabilityReplica -Name "vm-sqllab2" -EndpointUrl "TCP://vm-sqllab2.domain:5022" -FailoverMode "Manual" -AvailabilityMode "AsynchronousCommit" -AsTemplate -Version 13

$AgName = "vm-ag-" + $DatabaseName
New-SqlAvailabilityGroup -Path "SQLSERVER:\SQL\vm-sqllab1\Default\" -Name $AgName -AvailabilityReplica ($PrimaryReplica, $SecondaryReplica)  -BasicAvailabilityGroup -Database @($DatabaseName)
Join-SqlAvailabilityGroup -Path SQLSERVER:\SQL\vm-sqllab2\Default -Name $AgName
Add-SqlAvailabilityDatabase -Path SQLSERVER:\SQL\vm-sqllab2\Default\AvailabilityGroups\$AgName -Database $DatabaseName

這有兩個部分。首先,確保您安裝了 CU1。值得注意的是,它包含一個修復

第二部分是使用 T-SQL 代替 PowerShell。當我這樣做時,可用性組的創建速度要快得多,而且我沒有看到我在上面抱怨的任何 CPU/執行緒問題。這是我用來創建具有直接播種的可用性組的程式碼。我從這篇部落格文章中改編了它:

在初級:

CREATE AVAILABILITY GROUP [vm-ag-TestDb21] 
WITH (BASIC,
DB_FAILOVER = OFF,
DTC_SUPPORT = NONE)  
FOR DATABASE [TestDb21]
REPLICA ON 
N'vm-sqllab1' WITH (ENDPOINT_URL = N'TCP://vm-sqllab1.domain:5022',  
   FAILOVER_MODE = MANUAL,  
   AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
   BACKUP_PRIORITY = 50,   
   SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),   
   SEEDING_MODE = AUTOMATIC),   
N'vm-sqllab2' WITH (ENDPOINT_URL = N'TCP://vm-sqllab2.domain:5022',   
   FAILOVER_MODE = MANUAL,   
   AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,   
   BACKUP_PRIORITY = 50,   
   SECONDARY_ROLE(ALLOW_CONNECTIONS = NO),   
   SEEDING_MODE = AUTOMATIC)   

GO  

在復製品上:

ALTER AVAILABILITY GROUP [vm-ag-TestDb21] JOIN
GO
ALTER AVAILABILITY GROUP [vm-ag-TestDb21] GRANT CREATE ANY DATABASE
GO

引用自:https://dba.stackexchange.com/questions/148388