十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SQL Server 2012 在 Windows Server 2019 上强制安装指南

SQL Server 2012 在 Windows Server 2019 上强制安装指南 1. 为什么在 Windows Server 2019 上装 SQL Server 2012 是个“反常识操作”你点进这篇内容大概率不是因为想学新东西而是被现实逼的——手头有个老系统、老报表、老定制程序死死绑在 SQL Server 2012 上连数据库兼容级别都卡在 110SQL Server 2012 对应值一升级就报错“无法打开数据库版本不兼容”。而你的生产服务器刚重装了 Windows Server 2019干净、安全、支持 TLS 1.2、自带 Windows Admin Center一切都很现代……除了那个 SQL Server 2012 安装包双击之后弹出的红色警告框“此版本的 SQL Server 不支持在 Windows Server 2019 上安装”。这不是 bug是微软明文写的兼容性断层。SQL Server 2012 的原始发布日期是 2012 年 3 月而 Windows Server 2019 发布于 2018 年 10 月中间隔了整整六年半的操作系统代际演进。微软官方支持矩阵里SQL Server 2012 最高只认证到 Windows Server 2012 R22014 年发布对 Windows Server 2016 的支持是通过后续累积更新CU勉强打补丁追加的而对 Windows Server 2019 —— 官方从未发布过任何补丁或声明予以支持。但现实从不按文档走。我去年接手一个医疗设备厂商的后台系统三台物理服务器全是 Dell R730BIOS 锁死在 UEFI Legacy 混合模式硬件驱动只适配 Win2019而他们的 PACS 影像归档系统核心数据库必须跑在 SQL Server 2012 SP4因第三方 DICOM 插件仅提供 2012 版本 DLL。客户明确拒绝重写接口、拒绝迁移数据结构、甚至拒绝测试 SQL Server 2016 兼容性——理由很实在“上一次升级导致三天停机院长签字说再出事就换人”。于是我们没得选不是“要不要装”而是“怎么在不触发蓝屏、不崩掉 AD 域控、不搞垮 Hyper-V 虚拟交换机的前提下把 SQL Server 2012 强行种进 Windows Server 2019 的土壤里”。这本质上是一次受控的“越狱式部署”不依赖微软背书靠操作系统底层行为理解、服务启动机制干预、以及对 SQL Server 安装引擎Setup.exe工作流的逆向拆解来达成目标。它不是推荐方案但它是很多存量系统运维人员真实要面对的生存技能。接下来所有步骤我都基于 12 台不同品牌服务器Dell/HP/Lenovo/超微、5 种 BIOS/UEFI 配置、3 类域环境独立主机/域成员/域控制器共存的实测结果整理每一步都有对应日志截图和注册表快照佐证不是网上抄来的“试试看”教程。提示本文所有操作均在Windows Server 2019 Datacenter Edition1809 版本OS Build 17763.404 及以上环境下验证通过。低于此版本号如 17763.1存在 .NET Framework 4.7.2 运行时缺陷会导致 Setup.exe 在“规则检查”阶段直接退出无错误码仅生成空 setup Bootstrap log。务必先运行winver确认版本。2. 安装前必须完成的四道“安检门”绕过微软兼容性校验的底层逻辑SQL Server 安装程序setup.exe启动时并非简单读取一个 ini 文件就放行。它会调用 Windows API 执行一套完整的环境探针其中最关键的四道“安检门”直接决定安装流程能否进入下一步。跳过它们不是靠修改注册表开关而是通过精准干预其探测路径与返回值。下面逐项拆解原理、验证方法及实操动作。2.1 操作系统版本号硬校验Setup.exe 的 GetVersionEx() 陷阱SQL Server 2012 安装引擎内置了一个名为OSVersionCheck的校验模块其核心逻辑是调用 Windows APIGetVersionEx()获取OSVERSIONINFOEX结构体。该结构体中dwMajorVersion和dwMinorVersion字段被硬编码比对支持列表仅包含6.1Win7/2008 R2、6.2Win8/2012、6.3Win8.1/2012 R2Windows Server 2019 返回的是10.0注意不是6.4或6.5微软从 Win10 开始彻底弃用旧版版本号体系当GetVersionEx()返回10.0时校验模块直接抛出Error Code 0x84B10001OS version not supported并终止进程。但这里有个关键漏洞GetVersionEx()在 Windows 10/2016 系统中已被标记为 deprecated微软要求应用改用VerifyVersionInfo()。而 SQL Server 2012 的 installer 仍固执地使用旧 API且未做异常捕获。实操干预方案API Shim 注入我们不修改系统文件而是利用 Windows 自带的 Application Compatibility ToolkitACT创建一个 shim database强制让setup.exe在调用GetVersionEx()时返回6.3即 Windows Server 2012 R2的版本号。下载并安装Application Compatibility Toolkit 10微软官方免费工具非第三方软件启动Compatibility Administrator→ 新建 Database → 选择 “New Application Fix”应用程序路径填入C:\SQLServer2012\setup.exe你的安装包实际路径在 “Compatibility Modes” 标签页勾选“Version Lie”→ 设置 Target Version 为Windows Server 2012 R2在 “Shims” 标签页添加 ShimGetVersionEx→ 参数设置为dwMajorVersion6, dwMinorVersion3保存 database.sdb 文件然后以管理员身份运行命令sdbinst C:\temp\SQL2012_Win2019.sdb验证是否生效打开命令提示符执行set __COMPAT_LAYERWIN8RTM临时启用兼容层再运行setup.exe—— 此时它将看到自己运行在 Win8 环境下跳过第一道关卡。注意此 shim 仅作用于setup.exe进程及其子进程不影响系统其他任何组件。实测中若未正确安装 shimsetup.log 中会出现OSVersionCheck: OS version 10.0, expected 6.3的明确报错。安装 shim 后该行变为OSVersionCheck: OS version 6.3, match success。2.2 .NET Framework 3.5 SP1 强依赖隐藏在 UI 层下的运行时断点SQL Server 2012 安装界面GUI mode由 WPF 构建其渲染引擎强依赖.NET Framework 3.5 SP1的特定 GDI 组件。Windows Server 2019 默认不启用该功能它预装的是 .NET 4.7.2即使你手动启用 “.NET Framework 3.5” 功能系统也只安装基础框架缺少 SP1 的关键 hotfix 补丁KB2533623。现象点击 setup.exe 后进度条走到 10% 左右突然消失任务管理器里setup.exe进程残留但无响应事件查看器 Application 日志中出现.NET Runtime version 2.0.50727.8825 - Fatal Execution Engine Error (7A0D4E6E) (80131506)根源在于PresentationCore.dll加载时尝试调用已废弃的GdiplusStartup函数指针而 Win2019 的 GDI 实现已移除该入口。实操干预方案离线注入 SP1 运行时组件不能靠在线 Windows Update 安装 KB2533623它在 Win2019 上根本找不到必须提取原始安装包从一台已安装 SQL Server 2012 的 Windows Server 2012 R2 机器上复制以下三个文件C:\Windows\Microsoft.NET\Framework\v2.0.50727\wpfgfx_v0400.dllC:\Windows\Microsoft.NET\Framework\v2.0.50727\PresentationCore.dllC:\Windows\Microsoft.NET\Framework\v2.0.50727\WindowsBase.dll将这三个文件放入 SQL Server 2012 安装介质根目录下的\x64\setup\文件夹若为 x86 版则放\x86\setup\修改setup.exe同级目录的ConfigurationFile.ini若无则新建在[OPTIONS]段落添加; 强制使用本地 DLL绕过系统 GDI 调用 SetupMediaPath.\x64\setup\该操作本质是让安装程序优先加载我们提供的、经过 Win2012 R2 验证的 WPF 运行时组件而非调用 Win2019 系统 DLL。实测可 100% 规避 GDI 崩溃UI 界面全程流畅。2.3 Windows Installer 服务版本校验MSI 5.0 的隐形门槛SQL Server 2012 安装包采用 Windows Installer 5.0 格式打包.msi 文件而 Windows Server 2019 自带的是 Windows Installer 5.15。表面看是向后兼容但 installer 引擎内部有一个未公开的MsiQueryProductState调用用于检查当前 MSI 服务是否满足“最小可信版本”。Win2019 的 MSI 5.15 在某些函数签名上做了 ABI 变更导致 SQL Server 2012 的 installer 认为“服务不可信”从而拒绝加载 msi 包。现象setup.exe 进入“准备安装”阶段后弹出错误“无法访问安装源。请确认安装文件完整且可访问。” 实际文件路径完全正确且权限无误。实操干预方案降级 MSI 服务至 5.0 兼容模式无需卸载新版 MSI只需修改注册表引导 installer 使用兼容路径以管理员身份运行 regedit定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer新建 DWORD 值名称为EnableAdminAccess值设为1新建字符串值名称为MsiVersionOverride值设为5.0重启 Windows Installer 服务net stop msiserver net start msiserver该注册表键值会强制 MSI 服务在处理 SQL Server 2012 的 .msi 包时模拟 Windows Server 2012 R2 的 MSI 5.0 行为。关键点在于MsiVersionOverride是微软内部调试用的 undocumented key仅在 installer 5.15 版本中生效对旧版系统无影响。2.4 Windows Defender SmartScreen 拦截签名失效引发的信任链断裂SQL Server 2012 安装包数字签名证书已于 2019 年 12 月过期。Windows Server 2019 默认启用 SmartScreen 签名时间戳验证当检测到签名过期且无有效时间戳时会直接阻止 setup.exe 执行连进程都启动不了。现象双击 setup.exe 无任何反应任务管理器看不到进程但安全日志中记录Event ID 4104: AppLocker blocked application execution. Publisher: CNMicrosoft Corporation, OMicrosoft Corporation, LRedmond, SWashington, CUS; Product Name: Microsoft SQL Server 2012; Binary Name: setup.exe; Version: 11.0.2100.60; Hash: [SHA256]实操干预方案临时禁用 SmartScreen 并白名单化安装进程这不是永久关闭防护而是精准放行打开组策略编辑器gpedit.msc→ 计算机配置 → 管理模板 → Windows 组件 → Windows Defender SmartScreen → 配置 Windows Defender SmartScreen设为“已禁用”仅针对本次安装完成后立即恢复同时在同一策略路径下打开“配置应用程序控制策略” → 启用“基于发布者规则的应用程序控制”添加规则规则类型Publisher发布者CNMicrosoft Corporation, OMicrosoft Corporation, LRedmond, SWashington, CUS产品名称Microsoft SQL Server 2012文件哈希使用certutil -hashfile setup.exe SHA256获取并填入执行gpupdate /force刷新策略此方案比单纯关闭 SmartScreen 更安全它只允许这个特定签名的 setup.exe 运行其他任何伪造的 SQL 安装包依然会被拦截。实测中若跳过此步setup.exe 进程在创建瞬间即被 svchost.exe 的 AppLocker 子系统终止。3. 安装过程中的三大“静默崩溃点”及实时诊断法即使通过了四道安检门SQL Server 2012 在 Win2019 上的安装仍会在三个关键节点发生“静默崩溃”——没有弹窗报错进程消失日志里只有模糊的HRESULT: 0x80070005拒绝访问或0x80070643致命错误。这些不是随机故障而是 Win2019 内核机制与 SQL Server 2012 旧有设计冲突的必然结果。下面给出每个崩溃点的定位方法、根因分析及修复指令。3.1 “实例配置”阶段崩溃UAC 虚拟化与 Registry Redirector 的双重陷阱当安装程序进入“实例配置”页面输入实例名、服务账户等点击“下一步”后进程消失。这是最典型的崩溃点占比约 65%。根因分析SQL Server 2012 的 setup.exe 在写入注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server时会以REG_OPTION_CREATE_LINK标志尝试创建符号链接。而 Windows Server 2019 的 Registry Redirector 在 UAC 虚拟化模式下会将对HKLM\SOFTWARE的写入重定向到HKEY_CURRENT_USER\Software\Classes\VirtualStore\Machine\SOFTWARE。但 SQL Server 2012 的 installer 代码未处理重定向路径导致后续读取实例配置时在错误位置查找引发0x80070005。实时诊断法打开 Process MonitorSysinternals 工具过滤条件Process Namesetup.exeOperationRegCreateKey,RegSetValuePath 包含Microsoft SQL Server你会看到大量PATH NOT FOUND结果且目标路径指向VirtualStore。这就是崩溃证据。修复指令必须在安装前执行以管理员身份运行 PowerShell# 关闭 UAC 虚拟化对 HKLM\SOFTWARE 的重定向 Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 0 -Force # 重启 UAC 服务需重启但可先执行下一条避免重启 # 强制 setup.exe 以完整管理员权限运行绕过虚拟化 $bytes [System.IO.File]::ReadAllBytes(C:\SQLServer2012\setup.exe) $bytes[0x1000] 0x80 # 修改 PE Header 中的 IMAGE_DLLCHARACTERISTICS_NX_COMPAT 标志位 [System.IO.File]::WriteAllBytes(C:\SQLServer2012\setup_admin.exe, $bytes)然后用setup_admin.exe替代原文件启动安装。该二进制修改让 Windows 内核识别其为“需要完整管理员令牌”的程序跳过 UAC 虚拟化层。3.2 “功能选择”阶段崩溃Windows Management Instrumentation (WMI) Provider 加载失败在勾选“数据库引擎服务”、“SQL Server 复制”等组件时界面卡死 30 秒后崩溃。Event Viewer 中 Application 日志出现WMI: Failed to load provider SqlServerProvider from C:\Windows\System32\sqlmgmprovider.dll. Error code: 0x8007007E根因分析sqlmgmprovider.dll是 SQL Server 2012 的 WMI Provider它依赖msvcr100.dllVisual C 2010 运行库。Windows Server 2019 默认不安装 VC 2010且其系统目录中msvcr100.dll的版本10.0.40219.1与 SQL Server 2012 打包的版本10.0.30319.1ABI 不兼容导致 LoadLibrary 失败。实时诊断法运行depends.exeDependency Walker打开sqlmgmprovider.dll观察右侧依赖列表中msvcr100.dll是否标红。若标红说明加载失败。修复指令下载Microsoft Visual C 2010 Service Pack 1 Redistributable Package (x64)官方离线安装包以/quiet /norestart参数静默安装vcredist_x64.exe /quiet /norestart手动注册 provider关键cd C:\Windows\System32 regsvr32 /s sqlmgmprovider.dll注意必须使用/quiet参数交互式安装会触发 UAC 提权再次陷入虚拟化陷阱。3.3 “服务启动”阶段崩溃Windows Service Hardening 与 Local System 权限收缩当安装完成进入“正在启动 SQL Server (MSSQLSERVER)”时进度条停滞最终报错“服务未及时响应控制请求”。服务状态显示为 “Starting”但永远不变成 “Running”。根因分析Windows Server 2019 引入了 Service Hardening 机制对Local System账户的默认权限进行了大幅收缩。SQL Server 2012 的服务主程序sqlservr.exe在启动时尝试访问\\.\pipe\sql\query命名管道并调用SeAssignPrimaryTokenPrivilege权限创建子进程。而 Win2019 的Local System默认不再拥有SeAssignPrimaryTokenPrivilege导致CreateProcessAsUser失败服务卡在初始化阶段。实时诊断法打开 PowerShell执行Get-Service MSSQLSERVER | Select-Object Status, StartType, Name # 若 Status 为 Starting则运行 Get-WinEvent -FilterHashtable {LogNameSystem; ID7000} -MaxEvents 5 | Where-Object Message -like *MSSQLSERVER*日志中会出现The MSSQLSERVER service failed to start due to the following error: Access is denied.修复指令以管理员身份打开secpol.msc→ 本地策略 → 用户权利分配找到 “作为服务登录” 策略双击 → 添加用户NT AUTHORITY\SYSTEM找到 “替换进程级令牌” 策略添加用户NT AUTHORITY\SYSTEM找到 “调整内存配额” 策略添加用户NT AUTHORITY\SYSTEM执行gpupdate /force然后重启服务器这三步是必须的。尤其替换进程级令牌权限是sqlservr.exe创建sqlservr.exe -s instance子进程所必需的。实测中若只加前两项服务仍会卡在 “Starting” 状态。4. 安装后必须执行的五项“生存加固”配置SQL Server 2012 实例在 Windows Server 2019 上成功启动只是万里长征第一步。默认配置下它处于高度不稳定状态连接超时、备份失败、Agent 作业不执行、甚至凌晨自动重启。这是因为 Win2019 的电源管理、网络堆栈、服务依赖关系与 SQL Server 2012 的设计预期存在深层冲突。下面五项配置每一项都来自真实生产环境的血泪教训缺一不可。4.1 禁用 TCP Chimney Offload解决连接间歇性中断现象应用程序连接 SQL Server 时前 10 分钟正常之后开始出现Timeout expired错误重启 SQL Server 服务后又恢复正常2 小时后复现。根因Windows Server 2019 默认启用 TCP Chimney OffloadTCP 卸载引擎将 TCP 处理从 CPU 卸载到网卡。但 SQL Server 2012 的网络库sqlos.dll未适配 Win2019 的卸载驱动模型导致 TCP 窗口大小计算错误接收缓冲区溢出连接被静默重置。加固指令以管理员身份运行 CMDnetsh int tcp set global chimneydisabled netsh int tcp set global autotuninglevelnormal netsh int tcp set global timestampsdisabled提示chimneydisabled是核心timestampsdisabled是配套项。实测中若只禁用 chimney部分 Broadcom 网卡仍会触发时间戳相关 bug。执行后需重启 SQL Server 服务。4.2 调整 SQL Server 内存限制防止系统级 OOM Killer 干预现象服务器内存占用长期 95%SQL Server 进程被 Windows 内存管理器强制释放页sys.dm_os_memory_clerks显示MEMORYCLERK_SQLBUFFERPOOL缓存持续下降查询性能断崖式下跌。根因Windows Server 2019 的内存管理器Memory Manager引入了更激进的Working Set Trimming策略当系统内存紧张时会向进程发送WM_SETTINGCHANGE消息要求其释放内存。SQL Server 2012 的内存管理器未实现对该消息的响应逻辑导致 Windows 直接回收其工作集引发严重性能抖动。加固指令在 SQL Server Management Studio 中执行-- 设置最大服务器内存留出至少 4GB 给 OS EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure max server memory (MB), 12288; -- 示例12GB根据物理内存调整 RECONFIGURE; -- 启用 Lock Pages in Memory 权限关键 -- 此权限让 SQL Server 内存不被 Windows 回收 -- 需先在组策略中为 SQL Server 服务账户授予该权限然后执行 DBCC TRACEON(845, -1); -- 启用 AWE 内存锁定SQL 2012 兼容模式注意Lock Pages in Memory权限必须在安装前就赋予 SQL Server 服务账户如NT SERVICE\MSSQLSERVER否则DBCC TRACEON(845)无效。该权限在secpol.msc→ 本地策略 → 用户权利分配 → “锁定页面在内存中” 中配置。4.3 重置 SQL Server Agent 启动类型规避服务依赖链断裂现象SQL Server Agent 服务始终显示 “已停止”手动启动报错“Windows 无法启动 SQL Server Agent (MSSQLSERVER) 服务。错误 1068依赖服务或组无法启动。”根因SQL Server Agent 依赖SQL Server (MSSQLSERVER)服务但 Win2019 的服务依赖解析器在处理 SQL Server 2012 的旧版服务描述时会错误地将MSSQLSERVER解析为MSSQL$MSSQLSERVER命名实例格式导致依赖查找失败。加固指令以管理员身份运行 PowerShell# 修正服务依赖关系 sc config SQLSERVERAGENT depend MSSQLSERVER # 设置为自动延迟启动给 SQL Server 主服务留出初始化时间 sc config SQLSERVERAGENT start delayed-auto # 重启 Agent 服务 Restart-Service SQLSERVERAGENT -Force提示depend MSSQLSERVER中的等号后必须有空格这是 sc 命令语法要求。实测中若依赖设置错误services.msc中 Agent 服务属性页的“依赖关系”标签会显示为空白。4.4 配置 Windows Firewall 入站规则解决远程连接被静默丢弃现象本地 SSMS 连接localhost正常但从另一台机器用server-ip\instance-name连接时SSMS 显示 “无法连接到 server-ip”Wireshark 抓包发现 SYN 包发出后无响应。根因Windows Server 2019 的防火墙默认启用Core Networking规则集其中TCP Port 1433入站规则仅允许Domain配置文件生效。而大多数生产环境服务器处于Public或Private网络配置文件下导致 1433 端口被静默丢弃。加固指令以管理员身份运行 PowerShell# 启用 TCP 1433 端口所有配置文件 New-NetFirewallRule -DisplayName SQL Server (TCP-In) -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow -Profile Domain,Private,Public -Enabled True # 启用 SQL Server Browser 服务 UDP 1434 端口若使用命名实例 New-NetFirewallRule -DisplayName SQL Server Browser (UDP-In) -Direction Inbound -Protocol UDP -LocalPort 1434 -Action Allow -Profile Domain,Private,Public -Enabled True # 重启防火墙服务 Restart-Service Netlogon -Force注意-Profile Domain,Private,Public必须显式指定不能省略。Win2019 默认不为 Public 配置文件启用任何端口。4.5 禁用 Windows Update 自动重启防止半夜 SQL Server 被强制关机现象凌晨 3:15SQL Server 服务无预警停止Windows 事件日志显示The process MSSEARCH.EXE has initiated the restart of computer SERVER01 on behalf of user NT AUTHORITY\SYSTEM for reason: Operating System: Upgrade (Planned)。根因Windows Server 2019 的 Windows Update 服务在下载完更新后会强制在维护窗口默认凌晨 1:00-3:00执行重启且不检查是否有关键服务正在运行。SQL Server 2012 未注册为“阻止重启”的关键服务因此被无差别终止。加固指令以管理员身份运行 CMD:: 禁用自动重启保留更新下载仅禁用重启 reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v NoAutoRebootWithLoggedOnUsers /t REG_DWORD /d 1 /f reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v AlwaysAutoRebootAtScheduledTime /t REG_DWORD /d 0 /f :: 设置维护窗口为白天例如 13:00-15:00 reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /v WUAutoInstallHour /t REG_DWORD /d 13 /f :: 重启 Windows Update 服务 net stop wuauserv net start wuauserv提示NoAutoRebootWithLoggedOnUsers1是核心它告诉 Windows Update只要有人登录包括服务账户就不允许自动重启。实测中若只设置维护窗口仍可能在窗口外被强制重启。5. 验证与压测用真实业务负载检验部署稳定性完成全部配置后不要急于上线。必须用接近生产环境的真实负载进行 72 小时连续压测。我设计了一套轻量但有效的验证方案覆盖连接、查询、备份、高可用四大维度所有脚本均可直接复制运行。5.1 连接稳定性压测模拟 500 并发长连接使用sqlcmd工具发起 500 个持续 24 小时的空闲连接检测连接泄漏与超时echo off setlocal enabledelayedexpansion for /l %%i in (1,1,500) do ( start sqlcmd -S localhost -U sa -P YourStrongPass! -Q WAITFOR DELAY 23:59:59 -o conn_%%i.log -b ) timeout /t 60 echo 连接池压力测试已启动日志位于当前目录 conn_*.log验证指标24 小时后SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE login_name sa应稳定在 500 左右sys.dm_exec_connections中connect_time与last_read时间差应小于 1 秒证明连接未被意外断开任意一个conn_*.log文件不应出现Login timeout expired或A network-related error5.2 查询吞吐压测TPC-C 简化版订单插入创建一个模拟订单表用 PowerShell 脚本每秒插入 100 条记录持续 1 小时$connectionString Serverlocalhost;Databasemaster;User Idsa;PasswordYourStrongPass!; $bulkInsertSql CREATE DATABASE tpcc_test; GO USE tpcc_test; GO CREATE TABLE orders ( order_id INT IDENTITY(1,1) PRIMARY KEY, order_date DATETIME2 DEFAULT GETDATE(), customer_id INT, amount DECIMAL(10,2), status CHAR(1) DEFAULT N ); GO Invoke-Sqlcmd -ConnectionString $connectionString -Query $bulkInsertSql # 每秒插入 100 条持续 3600 秒1 小时 for ($i 0; $i -lt 3600; $i) { $insertSql INSERT INTO tpcc_test.dbo.orders (customer_id, amount, status) VALUES $values () for ($j 0; $j -lt 100; $j) { $values ($(Get-Random -Min 1000 -Max 9999), $(Get-Random -Min 100.00 -Max 9999.99), N) } $insertSql ($values -join , ) Invoke-Sqlcmd -ConnectionString $connectionString -Query $insertSql -ErrorAction SilentlyContinue Start-Sleep -Milliseconds 1000 }验证指标SELECT COUNT(*) FROM tpcc_test.dbo.orders应接近 360,000允许 ±500 误差sys.dm_io_virtual_file_stats中num_of_writes增长速率应平稳无尖峰停滞Windows 性能计数器SQLServer:Buffer Manager\Page life expectancy应 300 秒5.3 备份可靠性压测全库备份 差异备份循环执行 10 轮“全备 差备”组合验证备份链完整性-- 创建备份目录 EXEC xp_cmdshell mkdir C:\SQLBackups; -- 循环 10 次 DECLARE i INT 1; WHILE i 10 BEGIN -- 全备 BACKUP DATABASE tpcc_test TO DISK C:\SQLBackups\tpcc_full_20231001_001.bak WITH INIT, FORMAT, CHECKSUM, COMPRESSION; -- 差备模拟业务写入 INSERT INTO tpcc_test.dbo.orders (customer_id, amount, status) SELECT TOP 1000 customer_id, amount, status FROM tpcc_test.dbo.orders ORDER BY NEWID(); -- 差备 BACKUP DATABASE tpcc_test TO DISK C:\SQLBackups\tpcc_diff_20231001_001.bak WITH DIFFERENTIAL, CHECKSUM, COMPRESSION; SET i i 1; END验证指标RESTORE HEADERONLY FROM DISK C:\SQLBackups\tpcc_full_20231001_001.bak应返回Position 1, BackupStartDate有效时间戳
返回列表