SQLServer教程FG049-SQLServer日常运维实战
目录大纲
内容简介
本文档基于SQLServer官方文档的日常运维相关内容,结合生产环境实际情况,详细讲解SQLServer日常运维的任务、工具和流程等内容。风哥教程参考SQLServer官方文档Database Maintenance、Monitoring等相关章节。
Part01-基础概念与理论知识
1.1 日常运维概念
日常运维概念:
- 日常运维是指对数据库系统进行日常的监控、维护和管理工作
- 日常运维的目标是确保数据库系统的稳定运行,预防和解决问题
- 日常运维包括日常检查、日常维护、日常监控等内容
- 日常运维应遵循一定的流程和规范
更多视频教程www.fgedu.net.cn
1.2 日常运维内容
日常运维内容:
- 日常检查:检查数据库状态、服务状态、空间使用情况等
- 日常维护:备份、索引重建、统计信息更新、数据库完整性检查等
- 日常监控:监控性能指标、错误日志、连接数等
- 问题处理:及时处理发现的问题和异常
- 文档更新:记录运维过程和结果,更新相关文档
学习交流加群风哥微信: itpux-com
1.3 日常运维流程
日常运维流程:
- 计划:制定日常运维计划,明确任务和时间
- 执行:按照计划执行日常运维任务
- 监控:监控系统状态,及时发现问题
- 处理:处理发现的问题和异常
- 记录:记录运维过程和结果
- 总结:总结运维经验,优化运维流程
学习交流加群风哥QQ113257174
Part02-生产环境规划与建议
2.1 日常运维规划
日常运维规划:
- 任务规划:根据数据库重要性和业务需求,制定日常运维任务
- 时间规划:合理安排运维时间,避免影响业务
- 人员规划:明确运维人员职责,确保任务落实
- 工具规划:选择合适的运维工具,提高运维效率
- 流程规划:制定详细的运维流程,确保操作规范
风哥提示:日常运维规划应根据业务需求和数据库特点制定,确保运维工作的有效性和针对性
2.2 日常运维工具
日常运维工具:
- SQL Server Management Studio (SSMS):管理数据库、执行查询、查看系统状态
- SQL Server Agent:自动化运维任务
- SQL Server Profiler:跟踪SQL语句执行、分析性能问题
- 性能监视器 (PerfMon):监控系统性能指标
- Dynamic Management Views (DMVs):查看系统状态和性能信息
- PowerShell:自动化运维脚本
- 第三方监控工具:如SolarWinds、Quest等
更多学习教程公众号风哥教程itpux_com
2.3 日常运维监控
日常运维监控:
- 性能监控:监控CPU、内存、磁盘I/O、网络等性能指标
- 数据库监控:监控数据库状态、连接数、锁等待等
- 日志监控:监控错误日志、事务日志、备份日志等
- 告警机制:设置合理的告警阈值,及时通知异常
- 监控频率:根据业务重要性设置监控频率
from SQLServer视频:www.itpux.com
Part03-生产环境项目实施方案
3.1 日常运维任务
日常运维任务:
— 检查数据库状态
SELECT name, state_desc, recovery_model_desc FROM sys.databases;
— 检查SQLServer服务状态
EXEC xp_servicecontrol ‘querystate’, ‘MSSQLSERVER’;
— 检查磁盘空间
EXEC xp_fixeddrives;
— 检查备份状态
SELECT TOP 10
database_name,
type,
backup_start_date,
backup_finish_date,
backup_size / 1024 / 1024 AS backup_size_mb,
physical_device_name
FROM msdb.dbo.backupset
ORDER BY backup_finish_date DESC;
— 检查错误日志
EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, ‘DESC’;
— 2. 每周运维任务
— 数据库完整性检查
DBCC CHECKDB(‘fgedudb’) WITH NO_INFOMSGS;
— 更新统计信息
UPDATE STATISTICS fgedu.sales WITH FULLSCAN;
— 重建索引
ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80);
— 检查索引碎片
SELECT * FROM sys.dm_db_index_physical_stats(DB_ID(‘fgedudb’), NULL, NULL, NULL, ‘DETAILED’);
— 3. 每月运维任务
— 检查数据库文件大小
SELECT
name,
physical_name,
size * 8 / 1024 AS size_mb,
max_size * 8 / 1024 AS max_size_mb
FROM sys.database_files;
— 检查SQLServer版本和补丁
SELECT @@VERSION;
— 检查数据库用户和权限
SELECT name, type_desc FROM sys.database_principals WHERE type_desc IN (‘SQL_USER’, ‘WINDOWS_USER’);
— 检查作业状态
SELECT
name,
enabled,
last_run_date,
last_run_time,
last_run_outcome
FROM msdb.dbo.sysjobs;
执行结果:
——— ———— ——————–
master ONLINE SIMPLE
tempdb ONLINE SIMPLE
model ONLINE FULL
msdb ONLINE SIMPLE
fgedudb ONLINE FULL
Current Service State:
Service is running.
Drive C: 10240 MB free
Drive D: 51200 MB free
database_name type backup_start_date backup_finish_date backup_size_mb physical_device_name
————- —- ———————– ———————– ————– ————————
fgedudb D 2025-04-08 02:00:00.000 2025-04-08 02:05:00.000 1024.00 \\fgedu-prod-01\Backup\fgedudb.bak
fgedudb I 2025-04-08 08:00:00.000 2025-04-08 08:02:00.000 512.00 \\fgedu-prod-01\Backup\fgedudb_diff.bak
fgedudb L 2025-04-08 10:00:00.000 2025-04-08 10:00:30.000 64.00 \\fgedu-prod-01\Backup\fgedudb_log.trn
LogDate ProcessInfo Text
———————– ———– ————————
2025-04-08 10:00:00.000 spid51 Starting up database ‘fgedudb’.
2025-04-08 10:01:00.000 spid52 CHECKDB for database ‘fgedudb’ finished without errors.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Commands completed successfully.
Commands completed successfully.
database_id object_id index_id partition_number index_type_desc alloc_unit_type_desc index_depth index_level avg_fragmentation_in_percent fragment_count avg_fragment_size_in_pages
———– ———– ———– —————- —————— ——————– ———– ———– —————————- ————– ————————–
5 123456 1 1 CLUSTERED INDEX IN_ROW_DATA 3 0 15.23 123 45.67
name physical_name size_mb max_size_mb
——— ——————————— ——- ———–
fgedudb D:\SQLServer\Data\fgedudb.mdf 10240 -1
fgedudb_log D:\SQLServer\Log\fgedudb_log.ldf 1024 -1
Microsoft SQL Server 2022 (RTM) – 16.0.1000.6 (X64)
Oct 8 2022 05:58:25
Copyright (C) 2022 Microsoft Corporation
Enterprise Edition (64-bit) on Windows Server 2022 Standard 10.0
name type_desc
——— ————
sa SQL_USER
fgedu SQL_USER
fgedu01 SQL_USER
name enabled last_run_date last_run_time last_run_outcome
——————– ——- ————- ————- —————-
Backup Job 1 20250408 020500 1
Integrity Check Job 1 20250407 030000 1
Index Rebuild Job 1 20250407 040000 1
3.2 日常运维脚本
日常运维脚本:
— 创建每日检查脚本
cat > /sqlserver/scripts/daily_check.sh << 'EOF' #!/bin/bash # daily_check.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 检查SQLServer服务状态 echo "检查SQLServer服务状态..." systemctl status mssql-server # 检查磁盘空间 echo "检查磁盘空间..." df -h # 检查数据库状态 echo "检查数据库状态..." sqlcmd -S localhost -U sa -P Password123! -Q "SELECT name, state_desc FROM sys.databases;" # 检查备份状态 echo "检查备份状态..." sqlcmd -S localhost -U sa -P Password123! -Q "SELECT TOP 5 database_name, type, backup_finish_date FROM msdb.dbo.backupset ORDER BY backup_finish_date DESC;" # 检查错误日志 echo "检查错误日志..." sqlcmd -S localhost -U sa -P Password123! -Q "EXEC xp_readerrorlog 0, 1, NULL, NULL, NULL, NULL, 'DESC';" EOF chmod +x /sqlserver/scripts/daily_check.sh -- 2. 每周维护脚本 -- 创建每周维护脚本 cat > /sqlserver/scripts/weekly_maintenance.sh << 'EOF' #!/bin/bash # weekly_maintenance.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn # 数据库完整性检查 echo "数据库完整性检查..." sqlcmd -S localhost -U sa -P Password123! -Q "DBCC CHECKDB('fgedudb') WITH NO_INFOMSGS;" # 更新统计信息 echo "更新统计信息..." sqlcmd -S localhost -U sa -P Password123! -Q "UPDATE STATISTICS fgedu.sales WITH FULLSCAN;" # 重建索引 echo "重建索引..." sqlcmd -S localhost -U sa -P Password123! -Q "ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80);" # 检查索引碎片 echo "检查索引碎片..." sqlcmd -S localhost -U sa -P Password123! -Q "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('fgedudb'), NULL, NULL, NULL, 'DETAILED') JOIN sys.indexes ON sys.dm_db_index_physical_stats.object_id = sys.indexes.object_id AND sys.dm_db_index_physical_stats.index_id = sys.indexes.index_id WHERE avg_fragmentation_in_percent > 10;”
EOF
chmod +x /sqlserver/scripts/weekly_maintenance.sh
— 3. 监控脚本
— 创建监控脚本
cat > /sqlserver/scripts/monitor.sh << 'EOF'
#!/bin/bash
# monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 监控CPU使用率
echo "CPU使用率: $(top -b -n 1 | grep 'Cpu(s)' | awk '{print $2 + $4}')%"
# 监控内存使用率
echo "内存使用率: $(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2}')"
# 监控磁盘使用率
echo "磁盘使用率: $(df -h | grep /dev/sda1 | awk '{print $5}')"
# 监控数据库连接数
echo "数据库连接数: $(sqlcmd -S localhost -U sa -P Password123! -Q "SELECT COUNT(*) FROM sys.dm_exec_sessions;" -h -1)"
# 监控慢查询
echo "慢查询:"
sqlcmd -S localhost -U sa -P Password123! -Q "SELECT TOP 5 total_worker_time/1000 as total_time_ms, execution_count, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) as sql_text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st ORDER BY total_worker_time DESC;"
EOF
chmod +x /sqlserver/scripts/monitor.sh
-- 4. SQL Server Agent作业
-- 创建每日备份作业
EXEC dbo.sp_add_job @job_name = N'DailyBackup';
EXEC dbo.sp_add_jobstep
@job_name = N'DailyBackup',
@step_name = N'Full Backup',
@subsystem = N'TSQL',
@command = N'BACKUP DATABASE fgedudb TO DISK = ''\\fgedu-prod-01\Backup\fgedudb_'' + CONVERT(VARCHAR(8), GETDATE(), 112) + ''.bak'' WITH INIT, COMPRESSION;',
@database_name = N'master';
EXEC dbo.sp_add_schedule
@schedule_name = N'DailyAt2AM',
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 020000;
EXEC dbo.sp_attach_schedule
@job_name = N'DailyBackup',
@schedule_name = N'DailyAt2AM';
EXEC dbo.sp_add_jobserver
@job_name = N'DailyBackup';
-- 创建每周维护作业
EXEC dbo.sp_add_job @job_name = N'WeeklyMaintenance';
EXEC dbo.sp_add_jobstep
@job_name = N'WeeklyMaintenance',
@step_name = N'CheckDB',
@subsystem = N'TSQL',
@command = N'DBCC CHECKDB(''fgedudb'') WITH NO_INFOMSGS;',
@database_name = N'master';
EXEC dbo.sp_add_jobstep
@job_name = N'WeeklyMaintenance',
@step_name = N'UpdateStats',
@subsystem = N'TSQL',
@command = N'UPDATE STATISTICS fgedu.sales WITH FULLSCAN;',
@database_name = N'fgedudb';
EXEC dbo.sp_add_jobstep
@job_name = N'WeeklyMaintenance',
@step_name = N'RebuildIndexes',
@subsystem = N'TSQL',
@command = N'ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80);',
@database_name = N'fgedudb';
EXEC dbo.sp_add_schedule
@schedule_name = N'WeeklyAt3AM',
@freq_type = 8,
@freq_interval = 1,
@active_start_time = 030000;
EXEC dbo.sp_attach_schedule
@job_name = N'WeeklyMaintenance',
@schedule_name = N'WeeklyAt3AM';
EXEC dbo.sp_add_jobserver
@job_name = N'WeeklyMaintenance';
执行结果:
– /sqlserver/scripts/daily_check.sh
– /sqlserver/scripts/weekly_maintenance.sh
– /sqlserver/scripts/monitor.sh
SQL Server Agent作业创建成功:
– DailyBackup
– WeeklyMaintenance
执行每日检查脚本:
检查SQLServer服务状态…
Active: active (running)
检查磁盘空间…
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 30G 40% /
/dev/sdb1 200G 50G 150G 25% /sqlserver
检查数据库状态…
name state_desc
——— ————
master ONLINE
tempdb ONLINE
model ONLINE
msdb ONLINE
fgedudb ONLINE
检查备份状态…
database_name type backup_finish_date
————- —- ———————–
fgedudb D 2025-04-08 02:05:00.000
fgedudb I 2025-04-08 08:02:00.000
fgedudb L 2025-04-08 10:00:30.000
检查错误日志…
LogDate ProcessInfo Text
———————– ———– ————————
2025-04-08 10:00:00.000 spid51 Starting up database ‘fgedudb’.
2025-04-08 10:01:00.000 spid52 CHECKDB for database ‘fgedudb’ finished without errors.
执行每周维护脚本:
数据库完整性检查…
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
更新统计信息…
Commands completed successfully.
重建索引…
Commands completed successfully.
检查索引碎片…
table_name index_name avg_fragmentation_in_percent
———- —————————— —————————-
sales IX_sales_sale_date 5.23
执行监控脚本:
CPU使用率: 15.6%
内存使用率: 60.25%
磁盘使用率: 40%
数据库连接数: 10
慢查询:
total_time_ms execution_count sql_text
————- ————— —————————————-
543210 10000 SELECT * FROM fgedu.sales WHERE sale_date > ‘2025-01-01’
3.3 日常运维报告
日常运维报告:
— 创建每日运维报告脚本
cat > /sqlserver/scripts/daily_report.sh << 'EOF' #!/bin/bash # daily_report.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn REPORT_DATE=$(date +"%Y-%m-%d") REPORT_FILE="/sqlserver/reports/daily_${REPORT_DATE}.txt" echo "SQLServer日常运维报告 - ${REPORT_DATE}" > $REPORT_FILE
echo “=======================================” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 服务状态
echo “1. 服务状态” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
systemctl status mssql-server | grep -A 3 “Active:” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 磁盘空间
echo “2. 磁盘空间” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
df -h >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 数据库状态
echo “3. 数据库状态” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT name, state_desc, recovery_model_desc FROM sys.databases;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 备份状态
echo “4. 备份状态” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT TOP 5 database_name, type, backup_start_date, backup_finish_date, backup_size / 1024 / 1024 AS backup_size_mb FROM msdb.dbo.backupset ORDER BY backup_finish_date DESC;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 错误日志
echo “5. 错误日志” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “EXEC xp_readerrorlog 0, 1, ‘Error’, NULL, NULL, NULL, ‘DESC’;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 连接数
echo “6. 连接数” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT COUNT(*) AS current_connections FROM sys.dm_exec_sessions;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “报告生成完成: $REPORT_FILE” >> $REPORT_FILE
EOF
chmod +x /sqlserver/scripts/daily_report.sh
— 2. 每周运维报告
— 创建每周运维报告脚本
cat > /sqlserver/scripts/weekly_report.sh << 'EOF'
#!/bin/bash
# weekly_report.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
REPORT_DATE=$(date +"%Y-%m-%d")
REPORT_FILE="/sqlserver/reports/weekly_${REPORT_DATE}.txt"
echo "SQLServer每周运维报告 - ${REPORT_DATE}" > $REPORT_FILE
echo “=======================================” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 数据库完整性检查
echo “1. 数据库完整性检查” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “DBCC CHECKDB(‘fgedudb’) WITH NO_INFOMSGS;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 索引碎片
echo “2. 索引碎片” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “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(‘fgedudb’), NULL, NULL, NULL, ‘DETAILED’) JOIN sys.indexes ON sys.dm_db_index_physical_stats.object_id = sys.indexes.object_id AND sys.dm_db_index_physical_stats.index_id = sys.indexes.index_id WHERE avg_fragmentation_in_percent > 10;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 慢查询
echo “3. 慢查询” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT TOP 10 total_worker_time/1000 as total_time_ms, execution_count, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END – qs.statement_start_offset)/2)+1) as sql_text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st ORDER BY total_worker_time DESC;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 作业状态
echo “4. 作业状态” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT name, enabled, last_run_date, last_run_time, last_run_outcome FROM msdb.dbo.sysjobs;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “报告生成完成: $REPORT_FILE” >> $REPORT_FILE
EOF
chmod +x /sqlserver/scripts/weekly_report.sh
— 3. 月度运维报告
— 创建月度运维报告脚本
cat > /sqlserver/scripts/monthly_report.sh << 'EOF'
#!/bin/bash
# monthly_report.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
REPORT_DATE=$(date +"%Y-%m")
REPORT_FILE="/sqlserver/reports/monthly_${REPORT_DATE}.txt"
echo "SQLServer月度运维报告 - ${REPORT_DATE}" > $REPORT_FILE
echo “=======================================” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# SQLServer版本
echo “1. SQLServer版本” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT @@VERSION;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 数据库文件大小
echo “2. 数据库文件大小” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT name, physical_name, size * 8 / 1024 AS size_mb, max_size * 8 / 1024 AS max_size_mb FROM sys.database_files;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 数据库用户
echo “3. 数据库用户” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT name, type_desc FROM sys.database_principals WHERE type_desc IN (‘SQL_USER’, ‘WINDOWS_USER’);” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 备份统计
echo “4. 备份统计” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT database_name, type, COUNT(*) as backup_count, MIN(backup_start_date) as first_backup, MAX(backup_finish_date) as last_backup FROM msdb.dbo.backupset WHERE backup_start_date >= DATEADD(month, -1, GETDATE()) GROUP BY database_name, type;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
# 性能统计
echo “5. 性能统计” >> $REPORT_FILE
echo “—————————————” >> $REPORT_FILE
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT TOP 10 wait_type, wait_time_ms, signal_wait_time_ms FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC;” >> $REPORT_FILE
echo “” >> $REPORT_FILE
echo “报告生成完成: $REPORT_FILE” >> $REPORT_FILE
EOF
chmod +x /sqlserver/scripts/monthly_report.sh
执行结果:
– /sqlserver/scripts/daily_report.sh
– /sqlserver/scripts/weekly_report.sh
– /sqlserver/scripts/monthly_report.sh
每日运维报告生成:
SQLServer日常运维报告 – 2025-04-08
=======================================
1. 服务状态
—————————————
Active: active (running)
2. 磁盘空间
—————————————
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 30G 40% /
/dev/sdb1 200G 50G 150G 25% /sqlserver
3. 数据库状态
—————————————
name state_desc recovery_model_desc
——— ———— ——————–
master ONLINE SIMPLE
tempdb ONLINE SIMPLE
model ONLINE FULL
msdb ONLINE SIMPLE
fgedudb ONLINE FULL
4. 备份状态
—————————————
database_name type backup_start_date backup_finish_date backup_size_mb
————- —- ———————– ———————– ————–
fgedudb D 2025-04-08 02:00:00.000 2025-04-08 02:05:00.000 1024.00
fgedudb I 2025-04-08 08:00:00.000 2025-04-08 08:02:00.000 512.00
fgedudb L 2025-04-08 10:00:00.000 2025-04-08 10:00:30.000 64.00
5. 错误日志
—————————————
(0 rows affected)
6. 连接数
—————————————
current_connections
——————-
10
报告生成完成: /sqlserver/reports/daily_2025-04-08.txt
每周运维报告生成:
SQLServer每周运维报告 – 2025-04-08
=======================================
1. 数据库完整性检查
—————————————
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
2. 索引碎片
—————————————
(0 rows affected)
3. 慢查询
—————————————
total_time_ms execution_count sql_text
————- ————— —————————————-
543210 10000 SELECT * FROM fgedu.sales WHERE sale_date > ‘2025-01-01’
4. 作业状态
—————————————
name enabled last_run_date last_run_time last_run_outcome
——————– ——- ————- ————- —————-
Backup Job 1 20250408 020500 1
Integrity Check Job 1 20250407 030000 1
Index Rebuild Job 1 20250407 040000 1
报告生成完成: /sqlserver/reports/weekly_2025-04-08.txt
月度运维报告生成:
SQLServer月度运维报告 – 2025-04
=======================================
1. SQLServer版本
—————————————
Microsoft SQL Server 2022 (RTM) – 16.0.1000.6 (X64)
Oct 8 2022 05:58:25
Copyright (C) 2022 Microsoft Corporation
Enterprise Edition (64-bit) on Windows Server 2022 Standard 10.0
2. 数据库文件大小
—————————————
name physical_name size_mb max_size_mb
——— ——————————— ——- ———–
fgedudb D:\SQLServer\Data\fgedudb.mdf 10240 -1
fgedudb_log D:\SQLServer\Log\fgedudb_log.ldf 1024 -1
3. 数据库用户
—————————————
name type_desc
——— ————
sa SQL_USER
fgedu SQL_USER
fgedu01 SQL_USER
4. 备份统计
—————————————
database_name type backup_count first_backup last_backup
————- —- ———— ———————– ———————–
fgedudb D 4 2025-04-01 02:00:00.000 2025-04-08 02:05:00.000
fgedudb I 28 2025-04-01 08:00:00.000 2025-04-08 08:02:00.000
fgedudb L 168 2025-04-01 00:15:00.000 2025-04-08 10:00:30.000
5. 性能统计
—————————————
wait_type wait_time_ms signal_wait_time_ms
———- ———— ——————
PAGEIOLATCH_SH 123456 1234
CXPACKET 98765 987
LCK_M_X 45678 456
报告生成完成: /sqlserver/reports/monthly_2025-04.txt
Part04-生产案例与实战讲解
4.1 日常检查案例
日常检查实战:
— 步骤1:执行每日检查脚本
bash /sqlserver/scripts/daily_check.sh
— 步骤2:检查服务状态
systemctl status mssql-server
— 步骤3:检查磁盘空间
df -h
— 步骤4:检查数据库状态
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT name, state_desc FROM sys.databases;”
— 步骤5:检查备份状态
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT TOP 5 database_name, type, backup_finish_date FROM msdb.dbo.backupset ORDER BY backup_finish_date DESC;”
— 步骤6:检查错误日志
sqlcmd -S localhost -U sa -P Password123! -Q “EXEC xp_readerrorlog 0, 1, ‘Error’, NULL, NULL, NULL, ‘DESC’;”
— 步骤7:检查连接数
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT COUNT(*) AS current_connections FROM sys.dm_exec_sessions;”
— 步骤8:生成每日报告
bash /sqlserver/scripts/daily_report.sh
执行结果:
检查SQLServer服务状态…
Active: active (running)
检查磁盘空间…
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 30G 40% /
/dev/sdb1 200G 50G 150G 25% /sqlserver
检查数据库状态…
name state_desc
——— ————
master ONLINE
tempdb ONLINE
model ONLINE
msdb ONLINE
fgedudb ONLINE
检查备份状态…
database_name type backup_finish_date
————- —- ———————–
fgedudb D 2025-04-08 02:05:00.000
fgedudb I 2025-04-08 08:02:00.000
fgedudb L 2025-04-08 10:00:30.000
检查错误日志…
(0 rows affected)
检查连接数…
current_connections
——————-
10
生成每日报告:
报告生成完成: /sqlserver/reports/daily_2025-04-08.txt
4.2 日常维护案例
日常维护实战:
— 步骤1:执行每周维护脚本
bash /sqlserver/scripts/weekly_maintenance.sh
— 步骤2:数据库完整性检查
sqlcmd -S localhost -U sa -P Password123! -Q “DBCC CHECKDB(‘fgedudb’) WITH NO_INFOMSGS;”
— 步骤3:更新统计信息
sqlcmd -S localhost -U sa -P Password123! -Q “UPDATE STATISTICS fgedu.sales WITH FULLSCAN;”
— 步骤4:重建索引
sqlcmd -S localhost -U sa -P Password123! -Q “ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80);”
— 步骤5:检查索引碎片
sqlcmd -S localhost -U sa -P Password123! -Q “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(‘fgedudb’), NULL, NULL, NULL, ‘DETAILED’) JOIN sys.indexes ON sys.dm_db_index_physical_stats.object_id = sys.indexes.object_id AND sys.dm_db_index_physical_stats.index_id = sys.indexes.index_id WHERE avg_fragmentation_in_percent > 10;”
— 步骤6:生成每周报告
bash /sqlserver/scripts/weekly_report.sh
执行结果:
数据库完整性检查…
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
更新统计信息…
Commands completed successfully.
重建索引…
Commands completed successfully.
检查索引碎片…
(0 rows affected)
生成每周报告:
报告生成完成: /sqlserver/reports/weekly_2025-04-08.txt
4.3 日常监控案例
日常监控实战:
— 步骤1:执行监控脚本
bash /sqlserver/scripts/monitor.sh
— 步骤2:监控CPU使用率
top -b -n 1 | grep ‘Cpu(s)’
— 步骤3:监控内存使用率
free -m
— 步骤4:监控磁盘使用率
df -h
— 步骤5:监控数据库连接数
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT COUNT(*) AS current_connections FROM sys.dm_exec_sessions;”
— 步骤6:监控慢查询
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT TOP 5 total_worker_time/1000 as total_time_ms, execution_count, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END – qs.statement_start_offset)/2)+1) as sql_text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st ORDER BY total_worker_time DESC;”
— 步骤7:监控等待统计信息
sqlcmd -S localhost -U sa -P Password123! -Q “SELECT TOP 10 wait_type, wait_time_ms, signal_wait_time_ms FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC;”
— 步骤8:设置告警
— 创建告警作业
EXEC dbo.sp_add_job @job_name = N’AlertJob’;
EXEC dbo.sp_add_jobstep
@job_name = N’AlertJob’,
@step_name = N’CheckDiskSpace’,
@subsystem = N’TSQL’,
@command = N’IF EXISTS (SELECT 1 FROM sys.dm_os_volume_stats(DB_ID(), 1) WHERE available_bytes < 1073741824) BEGIN RAISERROR(''磁盘空间不足'', 16, 1); END;',
@database_name = N'master';
EXEC dbo.sp_add_schedule
@schedule_name = N'EveryHour',
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 60,
@active_start_time = 000000;
EXEC dbo.sp_attach_schedule
@job_name = N'AlertJob',
@schedule_name = N'EveryHour';
EXEC dbo.sp_add_jobserver
@job_name = N'AlertJob';
执行结果:
CPU使用率: 15.6%
内存使用率: 60.25%
磁盘使用率: 40%
数据库连接数: 10
慢查询:
total_time_ms execution_count sql_text
————- ————— —————————————-
543210 10000 SELECT * FROM fgedu.sales WHERE sale_date > ‘2025-01-01’
监控CPU使用率:
Cpu(s): 15.6%us, 3.4%sy, 0.0%ni, 80.0%id, 1.0%wa, 0.0%hi, 0.0%si, 0.0%st
监控内存使用率:
total used free shared buff/cache available
Mem: 16384 9876 6508 0 1234 6508
Swap: 2048 0 2048
监控磁盘使用率:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 30G 40% /
/dev/sdb1 200G 50G 150G 25% /sqlserver
监控数据库连接数:
current_connections
——————-
10
监控慢查询:
total_time_ms execution_count sql_text
————- ————— —————————————-
543210 10000 SELECT * FROM fgedu.sales WHERE sale_date > ‘2025-01-01’
监控等待统计信息:
wait_type wait_time_ms signal_wait_time_ms
———- ———— ——————
PAGEIOLATCH_SH 123456 1234
CXPACKET 98765 987
LCK_M_X 45678 456
告警作业创建成功:
– AlertJob
Part05-风哥经验总结与分享
5.1 日常运维最佳实践
日常运维最佳实践:
- 制定计划:制定详细的日常运维计划,明确任务和时间
- 自动化:尽可能实现运维任务的自动化,提高效率
- 监控体系:建立完善的监控体系,及时发现问题
- 定期维护:定期进行数据库维护,如索引重建、统计信息更新
- 备份策略:制定合理的备份策略,确保数据安全
- 文档化:详细记录运维过程和结果,更新相关文档
- 持续学习:不断学习新的运维技术和方法
- 团队协作:充分发挥团队的力量,共同完成运维任务
更多视频教程www.fgedu.net.cn
5.2 日常运维常见问题
常见问题:
- 备份失败:检查备份路径权限、磁盘空间、备份设备状态
- 索引碎片:定期重建索引,保持索引碎片在合理范围内
- 统计信息过期:定期更新统计信息,确保查询优化器生成最佳执行计划
- 磁盘空间不足:监控磁盘空间使用情况,及时清理无用数据
- 性能下降:分析慢查询,优化查询语句,调整参数
- 连接数过多:监控连接数,优化应用程序连接管理
- 错误日志增长过快:定期清理错误日志,设置合理的日志保留期
学习交流加群风哥微信: itpux-com
5.3 日常运维自动化
日常运维自动化:
- SQL Server Agent:使用SQL Server Agent创建作业,自动化运维任务
- PowerShell:使用PowerShell脚本自动化运维任务
- Shell脚本:使用Shell脚本自动化运维任务
- 监控工具:使用监控工具实现自动化监控和告警
- 配置管理:使用配置管理工具,如Ansible、Chef等,自动化配置管理
- 容器化:使用容器化技术,如Docker,简化部署和管理
- 云服务:使用云服务,如Azure SQL Managed Instance,减少运维工作量
学习交流加群风哥QQ113257174
风哥提示:日常运维是数据库稳定运行的关键,应建立完善的运维体系,确保数据库系统的可靠性和性能。
更多学习教程公众号风哥教程itpux_com
from SQLServer视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
