问题描述
我发现了一个 amazing script online 可以让我们每个人在迁移之前确定我们需要多少 Azure 果汁:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force
$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"
cls
Write-Output "Collecting counters..."
Write-Output "Press Ctrl+C to exit."
$counters = @("\Processor(_Total)\% Processor Time","\Logicaldisk(_Total)\disk Reads/sec","\Logicaldisk(_Total)\disk Writes/sec","\sqlServer:Databases(_Total)\Log Bytes Flushed/sec")
Get-Counter -Counter $counters -SampleInterval 1 -MaxSamples 3600 |
Export-Counter -FileFormat csv -Path "C:\sql-perfmon-log.csv" -Force
问题是这个脚本针对的是整个服务器,而不是特定的数据库。
是否可以通过 PowerShell 或通过 PowerShell 运行 T-sql 查询并每秒检索这 4 个指标:
- 处理器 - % 处理器时间
- 逻辑磁盘 - 磁盘读取数/秒
- 逻辑磁盘 - 磁盘写入数/秒
- 数据库 - 刷新日志字节数/秒
目标是仅为 1 个数据库收集这 4 个指标。
解决方法
这些是系统范围的指标,无法将其范围缩小到单个数据库。
您可以使用 RML Utilities 捕获服务器上所有流量的 SQL 跟踪,并针对仅恢复目标数据库的实例重放它。
或者您可以采样连接到目标数据库的会话的资源利用率
select SYSDATETIME() sample_time,sum(cpu_time) cpu_time,sum(total_elapsed_time) total_elapsed_time,sum(reads) reads,sum(writes) writes
from sys.dm_exec_sessions
where database_id = db_id('AdventureWorks2017')
或者创建一个 XEvent 会话来在每次会话结束时记录这些数据:
CREATE EVENT SESSION [aw_logout] ON SERVER
ADD EVENT sqlserver.logout(
WHERE ([sqlserver].[database_name]=N'AdventureWorks2017'))
ADD TARGET package0.event_file(SET filename=N'aw_session_logout')