SQLServer教程FG079-SQLServer核心系统稳定性实战
本文档风哥主要介绍SQLServer数据库核心系统稳定性相关知识,包括SQLServer数据库核心系统稳定性规划、SQLServer数据库核心系统稳定性优化、SQLServer数据库核心系统稳定性监控、SQLServer数据库核心系统稳定性维护等内容,风哥教程参考SQLServer官方文档系统稳定性内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 SQLServer数据库核心系统稳定性概念
SQLServer数据库核心系统稳定性是指数据库系统在正常运行过程中保持稳定、可靠、高效的能力,能够持续满足业务需求,避免出现意外故障和性能问题。核心系统稳定性是数据库系统运行的基础,直接影响业务系统的可用性和可靠性。更多视频教程www.fgedu.net.cn
- 确保业务系统的持续运行
- 提高数据的安全性和可靠性
- 减少系统故障和 downtime
- 提升用户体验和满意度
- 降低运维成本和风险
1.2 SQLServer数据库核心系统稳定性影响因素
1. 硬件因素
– 服务器硬件配置:CPU、内存、存储
– 存储系统性能:IOPS、吞吐量、延迟
– 网络带宽和稳定性
– 硬件故障和冗余
2. 软件因素
– SQLServer版本和补丁
– 操作系统版本和补丁
– 数据库配置参数
– 存储过程和查询质量
3. 数据库设计因素
– 表结构设计
– 索引设计
– 存储过程和函数设计
– 数据分区策略
4. 运维因素
– 备份和恢复策略
– 监控和告警机制
– 定期维护计划
– 变更管理流程
5. 外部因素
– 业务负载变化
– 网络攻击和安全威胁
– 自然灾害和环境因素
– 人为操作失误
# 稳定性风险等级
风险等级 影响范围 严重程度 应对策略
————————————————————
高风险 整个系统 可能导致系统崩溃 立即处理,实施应急预案
中风险 部分功能 影响系统性能 优先处理,制定改进计划
低风险 单个组件 轻微影响 定期监控,计划改进
1.3 SQLServer数据库核心系统稳定性指标
SQLServer数据库核心系统稳定性指标:
- 可用性:系统正常运行时间占总时间的比例,通常以99.9%以上为目标
- 响应时间:查询和事务的平均响应时间,通常以毫秒为单位
- 吞吐量:系统处理的事务数或查询数 per second
- 资源利用率:CPU、内存、IO等资源的使用情况
- 错误率:系统出现错误的频率和严重程度
- 恢复时间:系统从故障中恢复所需的时间
- 数据一致性:数据的准确性和完整性
Part02-生产环境规划与建议
2.1 SQLServer数据库核心系统稳定性规划
SQLServer数据库核心系统稳定性规划要点:
1. 需求分析
– 业务需求分析:业务类型、数据量、并发用户数
– 性能需求分析:响应时间、吞吐量、可用性要求
– 安全需求分析:数据安全、访问控制、审计要求
2. 架构设计
– 服务器架构:单机、集群、Always On
– 存储架构:本地存储、SAN、NAS、云存储
– 网络架构:网络拓扑、带宽、延迟
– 高可用设计:故障转移、负载均衡、灾难恢复
3. 资源规划
– CPU规划:根据工作负载选择合适的CPU核心数
– 内存规划:根据数据量和缓存需求配置内存
– 存储规划:根据IO需求选择存储类型和配置
– 网络规划:根据并发需求配置网络带宽
4. 配置规划
– SQLServer参数配置:内存、并行度、连接数
– 操作系统配置:电源管理、虚拟内存、网络设置
– 安全配置:身份认证、权限控制、加密
5. 维护规划
– 备份策略:备份频率、备份类型、备份存储
– 索引维护:重建、重组、碎片整理
– 统计信息更新:自动更新、手动更新
– 数据库检查:完整性检查、一致性检查
# 稳定性规划参考
业务类型 服务器配置 存储配置 高可用方案 备份策略
————————————————————————
OLTP系统 32核64GB SSD存储 Always On 每小时日志备份
OLAP系统 64核128GB 混合存储 集群方案 每日完整备份
混合系统 48核96GB SSD存储 Always On 每4小时差异备份
2.2 SQLServer数据库核心系统稳定性优化
SQLServer数据库核心系统稳定性优化建议:
1. 硬件优化
– 使用高性能服务器:多核心CPU、大容量内存
– 采用SSD存储:提高IO性能,减少延迟
– 配置冗余硬件:RAID、多网卡、冗余电源
– 优化网络配置:千兆以上网络,低延迟
2. 数据库优化
– 合理设计表结构:规范化设计,避免过度冗余
– 优化索引设计:覆盖索引,避免过多索引
– 优化存储过程:减少游标,使用SET NOCOUNT ON
– 优化查询语句:避免SELECT *,使用参数化查询
3. 配置优化
– 内存配置:设置合理的max server memory
– 并行度配置:根据CPU核心数设置MAXDOP
– 连接池配置:合理设置连接池大小
– TempDB配置:多个数据文件,合理大小
4. 高可用优化
– 实施Always On可用性组
– 配置故障转移集群
– 实施数据库镜像
– 配置日志传送
5. 监控优化
– 配置SQL Server Agent作业
– 启用SQL Server Extended Events
– 配置性能计数器
– 实施第三方监控工具
# 关键参数优化参考
参数名称 建议值 说明
——————————————————–
max server memory 物理内存的80-85% 避免内存不足
max degree of parallelism 8或CPU核心数的一半 避免并行度过高
cost threshold for parallelism 50-100 控制并行查询阈值
tempdb files 8个或CPU核心数 减少争用
autogrow 500MB或10% 避免频繁自动增长
recovery interval 15分钟 控制恢复时间
2.3 SQLServer数据库核心系统稳定性监控
SQLServer数据库核心系统稳定性监控建议:
- 性能监控:CPU、内存、IO、网络等资源使用情况
- 查询监控:慢查询、阻塞、死锁等
- 数据库监控:数据库大小、日志使用情况、备份状态
- 安全监控:登录失败、权限变更、异常访问
- 高可用监控:可用性组状态、故障转移情况
Part03-生产环境项目实施方案
3.1 SQLServer数据库核心系统稳定性实施方案
3.1.1 SQLServer数据库核心系统稳定性硬件配置
# 1. 服务器硬件选择
# 推荐配置
– CPU:Intel Xeon Gold 6348 28核
– 内存:128GB DDR4 ECC
– 存储:8TB NVMe SSD (RAID 10)
– 网络:双10GbE网卡
# 2. 存储配置
# 配置RAID 10
# 检查存储配置
Get-PhysicalDisk | Select-Object FriendlyName, MediaType, Size, OperationalStatus
GO
FriendlyName MediaType Size OperationalStatus
———— ——— —- —————–
NVMe SSD 1 SSD 4294967296000 OK
NVMe SSD 2 SSD 4294967296000 OK
NVMe SSD 3 SSD 4294967296000 OK
NVMe SSD 4 SSD 4294967296000 OK
# 3. 网络配置
# 配置网络绑定
New-NetLbfoTeam -Name “Team1” -TeamMembers “Ethernet0”, “Ethernet1” -TeamingMode SwitchIndependent -LoadBalancingAlgorithm Dynamic
# 检查网络配置
Get-NetAdapter | Select-Object Name, Status, LinkSpeed
GO
Name Status LinkSpeed
—- —— ———
Team1 Up 20 Gbps
Ethernet0 Up 10 Gbps
Ethernet1 Up 10 Gbps
# 4. 服务器电源配置
# 设置电源计划为高性能
powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
# 检查电源计划
powercfg /list
GO
Existing Power Schemes (* Active)
———————————–
Power Scheme GUID: 381b4222-f694-41f0-9685-ff5bb260df2e (Balanced)
Power Scheme GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c (High performance) *
Power Scheme GUID: a1841308-3541-4fab-bc81-f71556f20b4a (Power saver)
# 5. 硬件监控配置
# 安装硬件监控工具
# 配置硬件告警
3.1.2 SQLServer数据库核心系统稳定性软件配置
# 1. 操作系统配置
# 安装Windows Server 2022
# 配置操作系统参数
# 禁用自动关闭硬盘
powercfg /change -disk-timeout-ac 0
powercfg /change -disk-timeout-dc 0
# 禁用休眠
powercfg /hibernate off
# 配置虚拟内存
wmic pagefile set InitialSize=32768,MaximumSize=65536
# 2. SQLServer安装
# 下载SQLServer 2019 Enterprise Edition
# 安装SQLServer
# 3. SQLServer配置
# 配置最大内存
EXEC sp_configure ‘max server memory (MB)’, 1048576;
RECONFIGURE;
# 配置并行度
EXEC sp_configure ‘max degree of parallelism’, 8;
RECONFIGURE;
# 配置并行查询阈值
EXEC sp_configure ‘cost threshold for parallelism’, 50;
RECONFIGURE;
# 配置TempDB
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 1024MB, FILEGROWTH = 512MB);
GO
— 添加多个TempDB文件
ALTER DATABASE tempdb ADD FILE (NAME = tempdev2, FILENAME = ‘D:\\SQLServer\\Data\\tempdb2.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev3, FILENAME = ‘D:\\SQLServer\\Data\\tempdb3.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev4, FILENAME = ‘D:\\SQLServer\\Data\\tempdb4.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev5, FILENAME = ‘D:\\SQLServer\\Data\\tempdb5.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev6, FILENAME = ‘D:\\SQLServer\\Data\\tempdb6.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev7, FILENAME = ‘D:\\SQLServer\\Data\\tempdb7.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev8, FILENAME = ‘D:\\SQLServer\\Data\\tempdb8.mdf’, SIZE = 1024MB, FILEGROWTH = 512MB);
GO
# 4. 高可用配置
# 配置Always On可用性组
# 启用Always On功能
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
EXEC sp_configure ‘hadr enabled’, 1;
RECONFIGURE;
# 重启SQLServer
Restart-Service -Name “MSSQLSERVER”
# 5. 备份配置
# 创建备份目录
New-Item -Path “D:\\SQLServer\\Backup” -ItemType Directory
# 配置备份作业
USE [msdb]
GO
EXEC dbo.sp_add_job
@job_name = N’Full Backup’,
@enabled = 1,
@description = N’Daily full backup’
GO
EXEC dbo.sp_add_jobstep
@job_name = N’Full Backup’,
@step_name = N’Backup Database’,
@subsystem = N’TSQL’,
@command = N’BACKUP DATABASE fgedudb TO DISK = ”D:\\SQLServer\\Backup\\fgedudb_full.bak” WITH COMPRESSION’,
@database_name = N’master’
GO
EXEC dbo.sp_add_jobschedule
@job_name = N’Full Backup’,
@name = N’Daily Schedule’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 1,
@freq_subday_interval = 0,
@freq_start_time = 20000
GO
3.2 SQLServer数据库核心系统稳定性测试
3.2.1 SQLServer数据库核心系统稳定性性能测试
# 1. 测试环境准备
# 创建测试数据库
CREATE DATABASE fgedu_test;
GO
# 创建测试表
USE fgedu_test;
GO
CREATE TABLE dbo.fgedu_users (
id INT PRIMARY KEY IDENTITY,
username NVARCHAR(50) NOT NULL,
email NVARCHAR(100) NOT NULL,
password NVARCHAR(100) NOT NULL,
create_time DATETIME DEFAULT GETDATE()
);
GO
CREATE TABLE dbo.fgedu_orders (
id INT PRIMARY KEY IDENTITY,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
total_amount DECIMAL(10, 2) NOT NULL,
order_time DATETIME DEFAULT GETDATE(),
status INT NOT NULL
);
GO
# 创建索引
CREATE INDEX IX_fgedu_orders_user ON dbo.fgedu_orders(user_id);
GO
# 插入测试数据
— 插入100万用户数据
DECLARE @i INT = 1;
BEGIN TRAN
WHILE @i <= 1000000
BEGIN
INSERT INTO dbo.fgedu_users (username, email, password)
VALUES ('user' + CAST(@i AS NVARCHAR), 'user' + CAST(@i AS NVARCHAR) + '@example.com', 'password' + CAST(@i AS NVARCHAR));
SET @i = @i + 1;
IF @i % 1000 = 0
BEGIN
COMMIT TRAN;
BEGIN TRAN;
END;
END;
COMMIT TRAN;
GO
-- 插入500万订单数据
DECLARE @i INT = 1;
BEGIN TRAN
WHILE @i <= 5000000
BEGIN
INSERT INTO dbo.fgedu_orders (user_id, product_id, quantity, total_amount, status)
VALUES (ABS(CHECKSUM(NEWID())) % 1000000 + 1, ABS(CHECKSUM(NEWID())) % 100000 + 1, ABS(CHECKSUM(NEWID())) % 10 + 1, (ABS(CHECKSUM(NEWID())) % 1000 + 1) * (ABS(CHECKSUM(NEWID())) % 10 + 1), ABS(CHECKSUM(NEWID())) % 5);
SET @i = @i + 1;
IF @i % 1000 = 0
BEGIN
COMMIT TRAN;
BEGIN TRAN;
END;
END;
COMMIT TRAN;
GO
# 2. 性能测试
# 使用SQLServer Profiler进行测试
# 测试查询性能
DECLARE @start_time DATETIME = GETDATE();
SELECT
u.id,
u.username,
u.email,
COUNT(o.id) AS order_count,
SUM(o.total_amount) AS total_spent
FROM dbo.fgedu_users u
LEFT JOIN dbo.fgedu_orders o ON u.id = o.user_id
WHERE u.id BETWEEN 1 AND 10000
GROUP BY u.id, u.username, u.email
ORDER BY total_spent DESC;
DECLARE @end_time DATETIME = GETDATE();
SELECT DATEDIFF(MS, @start_time, @end_time) AS execution_time_ms;
GO
execution_time_ms
----------------
500
# 测试并发性能
# 使用ostress工具进行并发测试
# 安装RML Utilities
# 运行并发测试
ostress.exe -S localhost -U sa -P "Fgedu@2026#SQL" -d fgedu_test -q "SELECT * FROM dbo.fgedu_users WHERE id = ?" -n 100 -r 1000
# 3. 测试结果分析
# 分析CPU使用情况
SELECT
counter_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Processor%'
AND counter_name LIKE '%% Processor Time%';
GO
counter_name cntr_value
-------------------------- ----------
% Processor Time 25
# 分析内存使用情况
SELECT
counter_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Memory%';
GO
counter_name cntr_value
-------------------------- ----------
Available MBytes 32768
# 分析IO使用情况
SELECT
counter_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Disk%'
AND instance_name = 'D:';
GO
counter_name cntr_value
-------------------------- ----------
Disk Reads/sec 1000
Disk Writes/sec 500
3.2.2 SQLServer数据库核心系统稳定性压力测试
# 1. 测试工具准备
# 下载并安装SQLServer Distributed Replay
# 2. 捕获工作负载
# 启动分布式重放管理工具
# 配置捕获设置
# 开始捕获
# 3. 重放工作负载
# 配置重放设置
# 设置并发用户数:1000
# 设置持续时间:1小时
# 开始重放
# 4. 监控系统状态
# 监控CPU使用率
Get-Counter -Counter “\Processor(_Total)\% Processor Time” -SampleInterval 5 -MaxSamples 12
Timestamp CounterSamples
——— ————–
2026-04-08 10:00:00 \SERVER\Processor(_Total)\% Processor Time : 30
2026-04-08 10:00:05 \SERVER\Processor(_Total)\% Processor Time : 35
2026-04-08 10:00:10 \SERVER\Processor(_Total)\% Processor Time : 40
2026-04-08 10:00:15 \SERVER\Processor(_Total)\% Processor Time : 38
2026-04-08 10:00:20 \SERVER\Processor(_Total)\% Processor Time : 32
# 监控内存使用
Get-Counter -Counter “\Memory\Available MBytes” -SampleInterval 5 -MaxSamples 12
Timestamp CounterSamples
——— ————–
2026-04-08 10:00:00 \SERVER\Memory\Available MBytes : 30720
2026-04-08 10:00:05 \SERVER\Memory\Available MBytes : 29696
2026-04-08 10:00:10 \SERVER\Memory\Available MBytes : 28672
2026-04-08 10:00:15 \SERVER\Memory\Available MBytes : 27648
2026-04-08 10:00:20 \SERVER\Memory\Available MBytes : 26624
# 监控磁盘IO
Get-Counter -Counter “\PhysicalDisk(_Total)\Disk Reads/sec”, “\PhysicalDisk(_Total)\Disk Writes/sec” -SampleInterval 5 -MaxSamples 12
Timestamp CounterSamples
——— ————–
2026-04-08 10:00:00 \SERVER\PhysicalDisk(_Total)\Disk Reads/sec : 1200
\SERVER\PhysicalDisk(_Total)\Disk Writes/sec : 600
2026-04-08 10:00:05 \SERVER\PhysicalDisk(_Total)\Disk Reads/sec : 1300
\SERVER\PhysicalDisk(_Total)\Disk Writes/sec : 650
2026-04-08 10:00:10 \SERVER\PhysicalDisk(_Total)\Disk Reads/sec : 1250
\SERVER\PhysicalDisk(_Total)\Disk Writes/sec : 620
# 5. 测试结果分析
# 分析响应时间
SELECT
AVG(execution_time_ms) AS avg_response_time,
MAX(execution_time_ms) AS max_response_time,
MIN(execution_time_ms) AS min_response_time
FROM test_results;
# 分析系统稳定性
SELECT
counter_name,
MIN(cntr_value) AS min_value,
MAX(cntr_value) AS max_value,
AVG(cntr_value) AS avg_value
FROM performance_counters
GROUP BY counter_name;
# 6. 优化建议
# 根据测试结果调整配置
# 优化查询和索引
# 调整硬件配置
3.3 SQLServer数据库核心系统稳定性维护
3.3.1 SQLServer数据库核心系统稳定性日常维护
# 1. 每日维护任务
# 检查数据库状态
SELECT
name,
state_desc,
recovery_model_desc,
log_reuse_wait_desc
FROM sys.databases
WHERE name NOT IN (‘master’, ‘model’, ‘msdb’, ‘tempdb’);
GO
# 检查备份状态
SELECT
database_name,
type,
backup_finish_date,
backup_size
FROM msdb.dbo.backupset
WHERE database_name = ‘fgedudb’
ORDER BY backup_finish_date DESC
TOP 10;
GO
# 检查作业状态
SELECT
name,
last_run_date,
last_run_time,
last_run_outcome
FROM msdb.dbo.sysjobs j
JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id
WHERE h.step_id = 0
ORDER BY h.instance_id DESC;
GO
# 2. 每周维护任务
# 重建索引
USE fgedudb;
GO
DECLARE @table_name NVARCHAR(255);
DECLARE @sql NVARCHAR(MAX);
DECLARE table_cursor CURSOR FOR
SELECT name FROM sys.tables WHERE schema_id = SCHEMA_ID(‘dbo’);
OPEN table_cursor;
FETCH NEXT FROM table_cursor INTO @table_name;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = ‘ALTER INDEX ALL ON dbo.’ + QUOTENAME(@table_name) + ‘ REBUILD WITH (FILLFACTOR = 90);’;
EXEC sp_executesql @sql;
FETCH NEXT FROM table_cursor INTO @table_name;
END;
CLOSE table_cursor;
DEALLOCATE table_cursor;
GO
# 更新统计信息
USE fgedudb;
GO
EXEC sp_updatestats;
GO
# 检查数据库完整性
DBCC CHECKDB(‘fgedudb’) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
# 3. 每月维护任务
# 检查磁盘空间
EXEC xp_fixeddrives;
GO
# 检查SQLServer错误日志
EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, N’DESC’;
GO
# 检查系统事件日志
Get-EventLog -LogName System -EntryType Error -Newest 20
# 4. 季度维护任务
# 应用SQLServer补丁
# 检查服务器硬件状态
# 备份系统配置
# 进行灾难恢复测试
# 5. 维护计划自动化
# 创建维护计划
USE [msdb]
GO
EXEC dbo.sp_add_job
@job_name = N’Daily Maintenance’,
@enabled = 1,
@description = N’Daily maintenance tasks’
GO
EXEC dbo.sp_add_jobstep
@job_name = N’Daily Maintenance’,
@step_name = N’Check Database Status’,
@subsystem = N’TSQL’,
@command = N’EXEC dbo.CheckDatabaseStatus’,
@database_name = N’master’
GO
EXEC dbo.sp_add_jobstep
@job_name = N’Daily Maintenance’,
@step_name = N’Backup Database’,
@subsystem = N’TSQL’,
@command = N’BACKUP DATABASE fgedudb TO DISK = ”D:\\SQLServer\\Backup\\fgedudb_full.bak” WITH COMPRESSION’,
@database_name = N’master’
GO
EXEC dbo.sp_add_jobschedule
@job_name = N’Daily Maintenance’,
@name = N’Daily Schedule’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 1,
@freq_subday_interval = 0,
@freq_start_time = 20000
GO
Part04-生产案例与实战讲解
4.1 SQLServer数据库核心系统稳定性优化案例
# 实施步骤:
# 1. 系统现状分析
# 检查系统配置
SELECT
@@SERVERNAME AS server_name,
SERVERPROPERTY(‘ProductVersion’) AS version,
SERVERPROPERTY(‘Edition’) AS edition;
GO
server_name version edition
—————– ———- ——————————
prod-fgedu-sql01 15.0.4198.2 Enterprise Edition
# 检查数据库状态
SELECT
name,
state_desc,
recovery_model_desc,
log_reuse_wait_desc
FROM sys.databases
WHERE name = ‘fgedudb’;
GO
name state_desc recovery_model_desc log_reuse_wait_desc
———- ———- —————– ——————-
fgedudb ONLINE FULL NOTHING
# 检查性能指标
SELECT
counter_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE ‘%SQLServer:Buffer Manager%’
OR object_name LIKE ‘%SQLServer:General Statistics%’;
GO
counter_name cntr_value
————————– ———-
Page Life Expectancy 300
User Connections 500
# 2. 问题分析
## 问题1:内存配置不合理
– 现象:Page Life Expectancy低,只有300秒
– 影响:内存不足,导致频繁的磁盘IO
– 建议:增加内存配置,调整max server memory
## 问题2:索引碎片严重
– 现象:部分表的索引碎片超过30%
– 影响:查询性能下降,IO增加
– 建议:重建索引,优化索引设计
## 问题3:TempDB配置不合理
– 现象:只有1个TempDB文件
– 影响:TempDB争用,影响系统性能
– 建议:增加TempDB文件数量,优化TempDB配置
# 3. 优化实施
# 优化内存配置
EXEC sp_configure ‘max server memory (MB)’, 98304;
RECONFIGURE;
GO
# 优化索引
USE fgedudb;
GO
— 重建碎片严重的索引
DECLARE @sql NVARCHAR(MAX) = ”;
SELECT @sql = @sql + ‘ALTER INDEX ‘ + QUOTENAME(name) + ‘ ON ‘ + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + ‘.’ + QUOTENAME(OBJECT_NAME(object_id)) + ‘ REBUILD WITH (FILLFACTOR = 90);’ + CHAR(13) + CHAR(10)
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, ‘LIMITED’)
WHERE avg_fragmentation_in_percent > 30
AND index_id > 0;
EXEC sp_executesql @sql;
GO
# 优化TempDB
ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, SIZE = 2048MB, FILEGROWTH = 1024MB);
GO
— 添加多个TempDB文件
ALTER DATABASE tempdb ADD FILE (NAME = tempdev2, FILENAME = ‘D:\\SQLServer\\Data\\tempdb2.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev3, FILENAME = ‘D:\\SQLServer\\Data\\tempdb3.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev4, FILENAME = ‘D:\\SQLServer\\Data\\tempdb4.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev5, FILENAME = ‘D:\\SQLServer\\Data\\tempdb5.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev6, FILENAME = ‘D:\\SQLServer\\Data\\tempdb6.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev7, FILENAME = ‘D:\\SQLServer\\Data\\tempdb7.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
ALTER DATABASE tempdb ADD FILE (NAME = tempdev8, FILENAME = ‘D:\\SQLServer\\Data\\tempdb8.mdf’, SIZE = 2048MB, FILEGROWTH = 1024MB);
GO
# 4. 验证优化效果
# 检查内存使用情况
SELECT
counter_name,
cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE ‘%SQLServer:Buffer Manager%’;
GO
counter_name cntr_value
————————– ———-
Page Life Expectancy 1800
# 检查索引碎片
SELECT
OBJECT_NAME(object_id) AS table_name,
name AS index_name,
avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, ‘LIMITED’)
WHERE avg_fragmentation_in_percent > 10
AND index_id > 0;
GO
# 检查TempDB配置
SELECT
name,
size/128.0 AS size_mb,
growth/128.0 AS growth_mb
FROM sys.master_files
WHERE database_id = DB_ID(‘tempdb’);
GO
name size_mb growth_mb
——— ——– ———
tempdev 2048 1024
tempdev2 2048 1024
tempdev3 2048 1024
tempdev4 2048 1024
tempdev5 2048 1024
tempdev6 2048 1024
tempdev7 2048 1024
tempdev8 2048 1024
# 5. 性能测试
# 测试优化前后的查询性能
DECLARE @start_time DATETIME = GETDATE();
SELECT
u.id,
u.username,
COUNT(o.id) AS order_count
FROM dbo.fgedu_users u
LEFT JOIN dbo.fgedu_orders o ON u.id = o.user_id
WHERE u.id BETWEEN 1 AND 10000
GROUP BY u.id, u.username
ORDER BY order_count DESC;
DECLARE @end_time DATETIME = GETDATE();
SELECT DATEDIFF(MS, @start_time, @end_time) AS execution_time_ms;
GO
— 优化前:1000ms
— 优化后:300ms
4.2 SQLServer数据库核心系统稳定性故障处理案例
# 故障现象:
– 系统响应缓慢
– 大量查询超时
– 服务器CPU使用率接近100%
# 实施步骤:
# 1. 故障诊断
# 检查CPU使用情况
SELECT
session_id,
cpu_time,
memory_usage,
status,
command,
text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)
WHERE r.session_id > 50
ORDER BY cpu_time DESC;
GO
# 检查阻塞情况
SELECT
blocking_session_id,
session_id,
wait_type,
wait_time,
text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)
WHERE blocking_session_id > 0;
GO
# 检查死锁情况
SELECT
*
FROM sys.dm_tran_locks
WHERE resource_type <> ‘DATABASE’;
GO
# 2. 故障分析
## 发现问题:
– 存在长时间运行的查询
– 存在阻塞链
– 存在死锁
## 问题原因:
– 缺少必要的索引
– 查询语句优化不足
– 事务处理不当
# 3. 故障处理
# 终止阻塞会话
KILL 55;
GO
# 优化查询语句
— 原查询
SELECT * FROM fgedu_orders WHERE order_date BETWEEN ‘2026-01-01’ AND ‘2026-01-31’;
— 优化后查询
CREATE INDEX IX_fgedu_orders_date ON dbo.fgedu_orders(order_date);
GO
SELECT id, user_id, total_amount, order_date, status
FROM fgedu_orders
WHERE order_date BETWEEN ‘2026-01-01’ AND ‘2026-01-31’;
GO
# 优化存储过程
ALTER PROCEDURE dbo.fgedu_get_orders
@start_date DATETIME,
@end_date DATETIME
AS
BEGIN
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT
id,
user_id,
total_amount,
order_date,
status
FROM dbo.fgedu_orders
WHERE order_date BETWEEN @start_date AND @end_date;
END;
GO
# 4. 故障恢复
# 重启SQLServer服务
Restart-Service -Name “MSSQLSERVER”
# 检查系统状态
SELECT
name,
state_desc
FROM sys.databases;
GO
# 验证数据库完整性
DBCC CHECKDB(‘fgedudb’) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
# 5. 预防措施
# 配置查询超时
EXEC sp_configure ‘remote query timeout’, 600;
RECONFIGURE;
GO
# 配置最大并行度
EXEC sp_configure ‘max degree of parallelism’, 4;
RECONFIGURE;
GO
# 配置查询计划缓存
EXEC sp_configure ‘optimize for ad hoc workloads’, 1;
RECONFIGURE;
GO
# 6. 监控加强
# 配置SQL Server Agent作业监控阻塞
USE [msdb]
GO
EXEC dbo.sp_add_job
@job_name = N’Monitor Blocking’,
@enabled = 1,
@description = N’Monitor blocking sessions’
GO
EXEC dbo.sp_add_jobstep
@job_name = N’Monitor Blocking’,
@step_name = N’Check Blocking’,
@subsystem = N’TSQL’,
@command = N’EXEC dbo.MonitorBlocking’,
@database_name = N’master’
GO
EXEC dbo.sp_add_jobschedule
@job_name = N’Monitor Blocking’,
@name = N’Every 5 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 5
GO
4.3 SQLServer数据库核心系统稳定性监控案例
# 实施步骤:
# 1. 监控体系设计
# 监控层次
– 硬件监控:服务器硬件状态
– 系统监控:操作系统状态
– 数据库监控:SQLServer状态
– 应用监控:应用程序状态
# 监控指标
– 硬件指标:CPU、内存、磁盘、网络
– 系统指标:进程、服务、事件日志
– 数据库指标:连接数、查询性能、备份状态
– 应用指标:响应时间、错误率、吞吐量
# 2. 监控工具配置
# 配置SQL Server Agent作业
USE [msdb]
GO
# 创建监控数据库
CREATE DATABASE fgedu_monitor;
GO
USE fgedu_monitor;
GO
# 创建监控表
CREATE TABLE dbo.ServerStatus (
id INT PRIMARY KEY IDENTITY,
collection_time DATETIME DEFAULT GETDATE(),
cpu_usage INT,
memory_usage INT,
disk_usage INT,
network_usage INT
);
GO
CREATE TABLE dbo.DatabaseStatus (
id INT PRIMARY KEY IDENTITY,
collection_time DATETIME DEFAULT GETDATE(),
database_name NVARCHAR(128),
state_desc NVARCHAR(60),
size_mb DECIMAL(18, 2),
backup_status NVARCHAR(50)
);
GO
CREATE TABLE dbo.QueryStatus (
id INT PRIMARY KEY IDENTITY,
collection_time DATETIME DEFAULT GETDATE(),
query_text NVARCHAR(MAX),
execution_time_ms INT,
cpu_time_ms INT,
logical_reads INT
);
GO
# 创建监控存储过程
CREATE PROCEDURE dbo.CollectServerStatus
AS
BEGIN
SET NOCOUNT ON;
— 收集CPU使用率
DECLARE @cpu_usage INT;
SELECT @cpu_usage = cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE ‘%Processor%’
AND counter_name LIKE ‘%% Processor Time%’
AND instance_name = ‘_Total’;
— 收集内存使用率
DECLARE @memory_usage INT;
SELECT @memory_usage = (total_physical_memory_kb – available_physical_memory_kb) * 100 / total_physical_memory_kb
FROM sys.dm_os_sys_memory;
— 收集磁盘使用率
DECLARE @disk_usage INT;
EXEC master.dbo.xp_fixeddrives;
— 收集网络使用率
DECLARE @network_usage INT;
— 网络使用率收集逻辑
— 插入监控数据
INSERT INTO dbo.ServerStatus (cpu_usage, memory_usage, disk_usage, network_usage)
VALUES (@cpu_usage, @memory_usage, 0, 0);
END;
GO
# 创建监控作业
EXEC dbo.sp_add_job
@job_name = N’Collect Server Status’,
@enabled = 1,
@description = N’Collect server status every 5 minutes’
GO
EXEC dbo.sp_add_jobstep
@job_name = N’Collect Server Status’,
@step_name = N’Collect Status’,
@subsystem = N’TSQL’,
@command = N’EXEC fgedu_monitor.dbo.CollectServerStatus’,
@database_name = N’master’
GO
EXEC dbo.sp_add_jobschedule
@job_name = N’Collect Server Status’,
@name = N’Every 5 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 5
GO
# 3. 告警配置
# 配置数据库邮件
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
EXEC sp_configure ‘Database Mail XPs’, 1;
RECONFIGURE;
# 创建邮件配置文件
EXEC msdb.dbo.sysmail_add_profile_sp
@profile_name = ‘SQL Server Alert Profile’,
@description = ‘Profile for SQL Server alerts’;
# 创建邮件账户
EXEC msdb.dbo.sysmail_add_account_sp
@account_name = ‘SQL Server Alert Account’,
@email_address = ‘alerts@fgedu.net.cn’,
@mailserver_name = ‘smtp.fgedu.net.cn’;
# 关联邮件账户和配置文件
EXEC msdb.dbo.sysmail_add_profileaccount_sp
@profile_name = ‘SQL Server Alert Profile’,
@account_name = ‘SQL Server Alert Account’,
@sequence_number = 1;
# 创建告警作业
EXEC dbo.sp_add_job
@job_name = N’Check Server Alerts’,
@enabled = 1,
@description = N’Check server alerts every 10 minutes’
GO
EXEC dbo.sp_add_jobstep
@job_name = N’Check Server Alerts’,
@step_name = N’Check Alerts’,
@subsystem = N’TSQL’,
@command = N’EXEC dbo.CheckServerAlerts’,
@database_name = N’fgedu_monitor’
GO
EXEC dbo.sp_add_jobschedule
@job_name = N’Check Server Alerts’,
@name = N’Every 10 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 10
GO
# 4. 监控报告
# 创建监控报告存储过程
CREATE PROCEDURE dbo.GenerateMonitorReport
AS
BEGIN
SET NOCOUNT ON;
— 生成服务器状态报告
SELECT
collection_time,
cpu_usage,
memory_usage,
disk_usage,
network_usage
FROM dbo.ServerStatus
ORDER BY collection_time DESC
TOP 24;
— 生成数据库状态报告
SELECT
collection_time,
database_name,
state_desc,
size_mb,
backup_status
FROM dbo.DatabaseStatus
ORDER BY collection_time DESC
TOP 100;
— 生成查询性能报告
SELECT
collection_time,
query_text,
execution_time_ms,
cpu_time_ms,
logical_reads
FROM dbo.QueryStatus
WHERE execution_time_ms > 1000
ORDER BY execution_time_ms DESC
TOP 20;
END;
GO
# 5. 监控效果验证
# 查看监控数据
SELECT TOP 10 * FROM dbo.ServerStatus ORDER BY collection_time DESC;
GO
# 查看告警记录
SELECT TOP 10 * FROM dbo.AlertLog ORDER BY alert_time DESC;
GO
# 生成监控报告
EXEC dbo.GenerateMonitorReport;
GO
Part05-风哥经验总结与分享
5.1 SQLServer数据库核心系统稳定性最佳实践
SQLServer数据库核心系统稳定性最佳实践:
- 硬件优化:选择高性能的硬件,配置适当的冗余,确保硬件的可靠性
- 软件优化:保持SQLServer和操作系统的更新,优化数据库配置参数
- 数据库设计:合理设计表结构和索引,优化存储过程和查询语句
- 高可用设计:实施Always On可用性组或故障转移集群,确保系统的高可用性
- 备份策略:配置完整的备份策略,定期测试备份和恢复流程
- 监控体系:建立完善的监控体系,及时发现和解决问题
- 维护计划:制定定期的维护计划,包括索引重建、统计信息更新、数据库检查等
- 变更管理:建立严格的变更管理流程,避免未经测试的变更影响系统稳定性
5.2 SQLServer数据库核心系统稳定性检查清单
1. 硬件检查
[ ] 服务器硬件状态是否正常
[ ] 存储系统是否稳定
[ ] 网络连接是否正常
[ ] 硬件资源利用率是否合理
2. 软件检查
[ ] SQLServer版本和补丁是否最新
[ ] 操作系统版本和补丁是否最新
[ ] 数据库配置参数是否优化
[ ] 服务是否正常运行
3. 数据库检查
[ ] 数据库状态是否正常
[ ] 索引碎片是否在合理范围内
[ ] 统计信息是否最新
[ ] 数据库备份是否正常
4. 性能检查
[ ] CPU使用率是否正常
[ ] 内存使用率是否正常
[ ] IO性能是否正常
[ ] 查询性能是否正常
5. 高可用检查
[ ] 可用性组状态是否正常
[ ] 故障转移是否正常
[ ] 数据同步是否正常
[ ] 见证服务器是否正常
6. 安全检查
[ ] 登录和权限是否安全
[ ] 审计日志是否启用
[ ] 数据加密是否配置
[ ] 安全补丁是否安装
7. 维护检查
[ ] 维护计划是否执行
[ ] 备份是否成功
[ ] 索引是否维护
[ ] 统计信息是否更新
8. 监控检查
[ ] 监控工具是否正常
[ ] 告警是否设置
[ ] 监控数据是否收集
[ ] 监控报告是否生成
5.3 SQLServer数据库核心系统稳定性维护技巧
SQLServer数据库核心系统稳定性维护技巧:
- 定期备份:建立完善的备份策略,确保数据安全
- 索引维护:定期重建或重组索引,提高查询性能
- 统计信息更新:定期更新统计信息,确保查询优化器生成最佳执行计划
- 数据库检查:定期运行DBCC CHECKDB,确保数据库完整性
- 性能监控:实时监控系统性能,及时发现和解决问题
- 容量规划:定期评估系统容量,提前规划资源扩展
- 灾备演练:定期进行灾难恢复演练,确保在灾难发生时能够快速恢复
- 文档更新:及时更新系统文档,确保文档与实际情况一致
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
