SQL Server 健康,由 AI 审查 —— 面向生产环境 DBA 的收集、仪表板和复制/粘贴脚本集合
## 这是什么
我是 Peter Whyte —— 生产环境 SQL Server DBA,运行着 [sqldba.blog](https://sqldba.blog)。这是我实际使用的工具包,它的核心理念是:**收集 DBA 在服务器上要查看的所有信息,然后让 AI 与你一起进行审查。**
核心工作流程分为三步。健康检查收集会对实例运行 39 个诊断脚本,并将每个结果保存为 CSV。规则审查将这些 CSV 转化为确定性的“严重 / 警告 / 信息”发现结果。然后,AI 评估会读取整个集合,执行固定阈值无法做到的事情 —— 将各 CSV 中的发现关联起来找出根本原因,并编写一份带优先级的报告,针对每个问题提供证据和修复方案。它就像你的第二位审查员,阅读了每一项输出,不知疲倦,能敏锐发现你在凌晨 2 点容易漏掉的盲点。
在其底层包含了生产环境 DBA 需要的所有其他内容,且均可独立使用:
- **170 多个 SQL 脚本**,你可以直接打开并复制粘贴到 SSMS 中 —— 无需参数,没有魔法变量,无需安装
- **PowerShell 包装器**,可从终端运行相同的脚本并导出 CSV
- **一个本地 Web UI**,用于查看、验证和诊断收集结果 —— 健康记分卡、安全下钻、磁盘容量、AI 报告、实时事件分类
- **操作手册、变更单和迁移工具包**,用于在有充足时间时妥善完成计划内工作
每一个脚本都源于真实的场景:一次故障事件、一个迁移窗口、一次客户交接,或需要快速安全完成的例行检查。默认在 localhost 上运行,当你传入指定实例名时则会对其运行,或者通过多服务器脚本对一系列服务器列表运行。
默认情况下,所有操作都是只读的。每个脚本都有一个标头,注明了所需的权限及其操作范围。没有任何东西会向外部发送数据,也没有任何东西依赖框架 —— 并且在你亲自运行评估步骤之前,不会向任何 AI 发送任何内容。
## 从这里开始
克隆代码仓库并运行安装脚本。这里假设你已安装了本地 SQL Server,无需任何参数:
```
git clone https://github.com/peterwhyte-lgtm/dba-tools
cd dba-tools
.\Initialize-Environment.ps1
```
这会检查 PowerShell 版本,如果缺少 SqlServer 模块则进行安装,创建输出目录,并验证连接。无论成功还是失败,它都会明确告诉你下一步该怎么做。
如果要将目标改为远程或命名实例,请传入 `-ServerInstance`:
```
.\Initialize-Environment.ps1 -ServerInstance PROD01\SQL2025
```
一旦安装验证通过,该服务器信息就会保存在当前会话中,每个脚本都会自动获取它,无需在每次运行时添加 `-ServerInstance` 参数。
## 健康检查 —— 收集、审查、AI 评估
旗舰级工作流程。只需三条命令,就能让你对服务器的了解从“一无所知”变成一份带优先级的书面评估报告:
```
.\powershell\reporting\Invoke-HealthCheckCollection.ps1 -ServerInstance PROD01\SQL2025 # 1. collect
.\powershell\reporting\Review-HealthCheckOutput.ps1 # 2. rules review
.\powershell\reporting\Invoke-AiAssessment.ps1 # 3. AI assessment
```
Review-HealthCheckOutput — CRITICAL / WARNING / INFO findings across the instance
**第一步**一次性收集 39 个脚本的执行结果 —— 备份、等待、阻塞、内存、磁盘、安全攻击面、Agent 作业、完整性检查等等 —— 并将它们存入一个按时间戳命名、包含所有 CSV 文件的文件夹中。
**第二步**应用固定规则:缺失或过期的备份、未处于在线状态的数据库、陈旧的 DBCC CHECKDB、可疑页、启用了 sa 账户、基于百分比的自动增长、未配置最大服务器内存、高于阈值的 I/O 延迟、事务日志压力、高 VLF 计数、维护作业失败。
**第三步**是整个收集过程的核心。AI 会读取每一个 CSV,并关联规则无法覆盖的内容:缺失索引的发现结果恰好与高 CPU 查询对应;自动增长历史解释了 VLF 计数偏高的原因;某个弱权限登录名同时也是 sysadmin。最终输出是一份书面报告 —— 包含整体结论、带有证据和各自修复方案的优先级问题列表、安全态势、重点监控对象 —— 并被保存到 `output-files\assessments\`。
运行 AI 步骤有两种方式,两者均由相同的准则驱动:
- **在你的编辑器中使用 Claude Code** —— 打开代码仓库,登录,然后请求进行健康评估。无需处理密钥。
- **API 脚本** —— `Invoke-AiAssessment.ps1`,支持脚本化和定时调度。适用于在家使用个人密钥或在工作中使用企业密钥/网关;仓库中不存储任何与账户相关的信息。`-DryRun` 会将确切的提示词写入文件而不调用任何 API,以便企业安全审查能够逐字节查看将要发送的确切内容。
这两种方式的设置方法(包括企业数据审查相关的问题)请参见:[docs/ai-assessment.md](docs/ai-assessment.md)
如果是用于客户交接或所有权审查,我们还提供了一个不带评分且不依赖 AI 的 markdown 报告:
```
.\powershell\reporting\Invoke-AssessmentReport.ps1 -ServerInstance PROD01\SQL2025 -AssessedBy "Peter Whyte"
```
## Web UI —— 查看、验证、诊断
这是一个本地浏览器仪表板,用于在收集输出后进行查看和签字确认。一个收集操作即可为所有页面提供数据:
```
.\web-ui\Start-WebUi.ps1
# 在 http://localhost:8787 打开
```
VS Code terminal (bottom) running Start-WebUi.ps1, browser UI (top) — browse scripts by category, search, and run against any instance
- **健康检查** —— 带有严重程度和类别过滤器的记分卡,以及与上次收集相比的发现差异:什么是新出现的,什么已解决
- **安全** —— 攻击面与访问风险的关键指标,支持三级下钻,从数值统计到 CSV 行数据,再到补救用的 T-SQL
- **磁盘** —— 通过两种视角查看容量:按使用率百分比从最差开始排序显示所有数据库,以及按绝对大小排在前面的数据库
- **AI 评估** —— 在浏览器中阅读报告,或从面板运行新的评估
- **分类** —— 实时事件驾驶舱:在故障排查期间运行诊断脚本并直接查看内嵌结果
- **脚本** —— 整个代码仓库的浏览/参考库
仅在 `localhost:8787` 上运行。服务器端没有外部依赖项 —— Chart.js 从 CDN 加载以呈现图表视图。该 UI 是可选的:上述的每一个工作流程都可以完全在终端中运行。多服务器集群仪表板已在开发规划中。
## SQL 脚本 —— 打开、复制、粘贴、运行
浏览 `sql/` 目录并直接将其复制到 SSMS 中。无需参数,没有魔法变量,也不用安装。每个脚本返回单一结果集。
Open any script from sql/ — paste into SSMS — run
| 类别 | 你能获得的内容 |
|----------|-------------|
| [`sql/performance/`](sql/performance/) | 等待统计、阻塞链、活动请求、长耗时查询、缺失索引、死锁、计划缓存、堆表、未使用的索引 |
| [`sql/monitoring/`](sql/monitoring/) | 实例配置评分、数据库健康、TempDB、内存、MAXDOP、SQL Agent 作业、磁盘、VLF 计数、自动增长历史 |
| [`sql/backups/`](sql/backups/) | 各数据库的覆盖情况、历史记录、备份年龄、加密状态、还原持续时间估算 |
| [`sql/security/`](sql/security/) | sysadmin 成员、登录名审计、孤立用户、弱登录名、链接服务器安全性、数据库权限 |
| [`sql/migration/`](sql/migration/) | 风险评估、兼容性审计、已弃用的功能、登录清单、DDL 生成器 |
| [`sql/high-availability/`](sql/high-availability/) | AG 副本健康状态、同步状态、延迟、只读辅助副本使用情况 |
| [`sql/maintenance/`](sql/maintenance/) | 生成备份作业、索引维护作业、清理 DDL、维护作业状态 |
附带描述的完整列表请见:[docs/script-catalog.md](docs/script-catalog.md)
## PowerShell —— 从终端运行,保存为 CSV
相同的脚本,可以在任意目录下通过名称直接调用。没有路径限制,除了 SqlServer 模块外没有任何模块依赖。
```
# 通过名称运行任意脚本 — 模糊匹配。结果始终保存为 CSV 到 output-files/。
.\run.ps1 Get-WaitStatistics
.\run.ps1 Get-BlockingChains -ServerInstance PROD01\SQL2025
.\run.ps1 Get-BackupCoverage -OutputFormat Csv # CSV only, no terminal output
# 为会话设置一次服务器 — 每个脚本都会自动获取
.\tools\local-sql\Set-SqlConnection.ps1 -ServerInstance PROD01\SQL2025
.\run.ps1 Get-WaitStatistics
```
.\run.ps1 — resolves any script by name, outputs to terminal or CSV
## 运维操作手册
`docs/ops/` 涵盖了所有的计划内工作 —— 即在维护窗口前后需要做对的事情,而不是你当下正在紧急诊断的内容。
**变更单** —— 适用于版本升级、服务器迁移和 AG 故障转移的、符合 CAB(变更顾问委员会)标准的审批文档。包含执行前后检查和回滚标准。
**执行清单** —— 针对 AG 集群迁移、独立服务器更换、DR(灾难恢复)故障转移和 SQL 版本升级的分步指南。专为执行人员编写,而非审查人员。
**操作手册** —— 涵盖独立迁移、AG 集群迁移、操作系统升级、版本更改以及版本升级的完整指南。明确说明了在什么情况下、按什么顺序执行什么操作,并针对意外情况设置了决策点。
**变更模板** —— 用于 TDE、CDC、镜像、AG 配置、统计信息维护、DBCC 模式和补丁更新的 SQL。复制模板,填入变量,执行前仔细核对。
### 迁移工具包
在迁移窗口开启前,针对源服务器运行以下命令:
```
# 迁移前风险扫描 — 跨 compat、features、logins、config 的 HIGH/MEDIUM/INFO 发现
.\powershell\migration\Invoke-PreMigrationAssessment.ps1 -ServerInstance PROD01\SQL2025
# 捕获 baseline metrics 以进行前后比较
.\powershell\migration\Export-MigrationBaseline.ps1 -ServerInstance PROD01\SQL2025 -Label pre
```
涵盖范围:兼容性差异、正在使用中的已弃用功能、特定版本专有功能、链接服务器依赖、AG 成员身份、带有迁移风险的登录清单、迁移后验证检查列表。
## 环境要求
| | 最低要求 | 推荐配置 |
|-|---------|-------------|
| SQL Server | 2016 (13.x) | 2019+ |
| PowerShell | 5.1 | 7+(运行并行的多服务器脚本必需) |
| SQL 执行 | PATH 中的 `sqlcmd.exe` | SqlServer 模块 (`Invoke-Sqlcmd`) |
| 权限 | `VIEW SERVER STATE`, `VIEW ANY DATABASE` | 同左 |
```
Install-Module -Name SqlServer -Scope CurrentUser -Force
```
此外,AI 评估步骤还需要 Claude Code(已登录)或 `ANTHROPIC_API_KEY` —— 请参阅 [docs/ai-assessment.md](docs/ai-assessment.md)。其他所有操作完全在本地运行。
## 贡献
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。这是 Peter 的个人工具包 —— 欢迎大家贡献,但范围和发展方向由他最终决定。提交的脚本必须是只读的、返回单一结果集,并包含标准的标头信息。
sqldba.blog —— 每一个脚本都有一篇结合真实应用场景的配套文章
由 Peter Whyte 构建并维护 · MIT