1. 首页 > SQLServer教程 > 正文

SQLServer教程FG050-SQLServer自动化运维实战

目录大纲

内容简介

本文档基于SQLServer官方文档的自动化运维相关内容,结合生产环境实际情况,详细讲解SQLServer自动化运维的工具、方法和实践等内容。风哥教程参考SQLServer官方文档Automation、Maintenance Plans等相关章节。

Part01-基础概念与理论知识

1.1 自动化运维概念

自动化运维概念:

  • 自动化运维是指使用工具和脚本自动执行运维任务的过程
  • 自动化运维的目标是提高运维效率,减少人工干预,降低人为错误
  • 自动化运维包括自动化监控、自动化维护、自动化部署等内容
  • 自动化运维应遵循一定的标准和规范

更多视频教程www.fgedu.net.cn

1.2 自动化运维优势

自动化运维优势:

  • 提高效率:自动执行重复性任务,节省时间和人力
  • 减少错误:减少人工干预,降低人为错误
  • 提高可靠性:确保运维任务的一致性和可靠性
  • 实时监控:及时发现和处理问题
  • 降低成本:减少人力成本,提高资源利用率
  • 可扩展性:易于扩展和管理大规模环境

学习交流加群风哥微信: itpux-com

1.3 自动化运维工具

自动化运维工具:

  • SQL Server Agent:SQLServer内置的作业调度工具
  • PowerShell:Windows系统的脚本语言,用于自动化管理
  • Python:通用脚本语言,用于自动化任务
  • Ansible:配置管理和自动化工具
  • Chef:配置管理和自动化工具
  • Puppet:配置管理和自动化工具
  • Jenkins:持续集成和持续部署工具
  • Grafana:监控和可视化工具
  • Prometheus:监控和告警工具

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 自动化运维规划

自动化运维规划:

  • 需求分析:分析运维需求,确定自动化范围
  • 工具选择:选择适合的自动化工具
  • 流程设计:设计自动化流程和脚本
  • 测试验证:测试自动化脚本和流程
  • 部署实施:部署自动化工具和脚本
  • 监控维护:监控自动化系统的运行状态

风哥提示:自动化运维规划应根据业务需求和技术环境制定,确保自动化系统的有效性和可靠性

2.2 自动化运维架构

自动化运维架构:

  • 分层架构:分为监控层、执行层、存储层等
  • 模块化设计:将自动化任务分为多个模块,便于管理和维护
  • 可扩展性:支持添加新的自动化任务和工具
  • 安全性:确保自动化系统的安全性
  • 可靠性:确保自动化系统的可靠性和稳定性

更多学习教程公众号风哥教程itpux_com

2.3 自动化运维最佳实践

自动化运维最佳实践:

  • 循序渐进:从简单任务开始,逐步扩展自动化范围
  • 标准化:制定标准的自动化流程和脚本
  • 文档化:详细记录自动化流程和脚本
  • 测试验证:在生产环境前进行充分测试
  • 监控告警:监控自动化系统的运行状态,及时发现问题
  • 持续改进:根据实际情况不断优化自动化流程和脚本

from SQLServer视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 自动化运维实施步骤

自动化运维实施步骤:

— 步骤1:需求分析
— 分析运维需求,确定自动化范围
— 识别重复性任务和关键任务

— 步骤2:工具选择
— 选择适合的自动化工具
— 评估工具的功能和兼容性

— 步骤3:环境准备
— 安装和配置自动化工具
— 建立自动化环境

— 步骤4:脚本开发
— 开发自动化脚本
— 测试脚本功能

— 步骤5:部署实施
— 部署自动化脚本和工具
— 配置调度和监控

— 步骤6:测试验证
— 在测试环境中测试自动化系统
— 验证自动化系统的功能和可靠性

— 步骤7:上线运行
— 在生产环境中部署自动化系统
— 监控系统运行状态

— 步骤8:持续改进
— 收集反馈和问题
— 优化自动化流程和脚本

执行结果:

需求分析完成:
– 自动化范围:备份、维护、监控
– 关键任务:每日备份、每周维护、实时监控

工具选择完成:
– SQL Server Agent:作业调度
– PowerShell:脚本开发
– Grafana+Prometheus:监控可视化

环境准备完成:
– 安装和配置SQL Server Agent
– 安装和配置PowerShell
– 安装和配置Grafana+Prometheus

脚本开发完成:
– 备份脚本:backup.ps1
– 维护脚本:maintenance.ps1
– 监控脚本:monitor.ps1

部署实施完成:
– 部署自动化脚本
– 配置SQL Server Agent作业
– 配置Grafana+Prometheus监控

测试验证完成:
– 测试环境测试通过
– 功能和可靠性验证通过

上线运行完成:
– 生产环境部署完成
– 监控系统运行正常

持续改进:
– 收集反馈和问题
– 优化自动化流程和脚本

3.2 自动化运维脚本

自动化运维脚本:

— 1. 自动化备份脚本
— 创建PowerShell备份脚本
cat > /sqlserver/scripts/backup.ps1 << 'EOF' #!/usr/bin/env pwsh # backup.ps1 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn param( [string]$DatabaseName = "fgedudb", [string]$BackupPath = "\\fgedu-prod-01\Backup", [string]$BackupType = "Full" ) $date = Get-Date -Format "yyyyMMdd" $time = Get-Date -Format "HHmmss" $backupFile = "$BackupPath\$DatabaseName`_$BackupType`_$date`_$time.bak" try { Write-Host "开始备份数据库 $DatabaseName..." $query = "BACKUP DATABASE [$DatabaseName] TO DISK = '$backupFile' WITH INIT, COMPRESSION" Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query Write-Host "备份完成: $backupFile" # 清理旧备份(保留7天) $oldBackups = Get-ChildItem -Path $BackupPath -Filter "$DatabaseName`_$BackupType`_*.bak" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} foreach ($backup in $oldBackups) { Write-Host "清理旧备份: $($backup.FullName)" Remove-Item -Path $backup.FullName -Force } } catch { Write-Host "备份失败: $($_.Exception.Message)" exit 1 } EOF -- 2. 自动化维护脚本 -- 创建PowerShell维护脚本 cat > /sqlserver/scripts/maintenance.ps1 << 'EOF' #!/usr/bin/env pwsh # maintenance.ps1 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn param( [string]$DatabaseName = "fgedudb" ) try { Write-Host "开始维护数据库 $DatabaseName..." # 数据库完整性检查 Write-Host "执行数据库完整性检查..." $query = "DBCC CHECKDB('$DatabaseName') WITH NO_INFOMSGS" Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query # 更新统计信息 Write-Host "更新统计信息..." $query = "UPDATE STATISTICS fgedu.sales WITH FULLSCAN" Invoke-Sqlcmd -ServerInstance "localhost" -Database $DatabaseName -Query $query # 重建索引 Write-Host "重建索引..." $query = "ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80)" Invoke-Sqlcmd -ServerInstance "localhost" -Database $DatabaseName -Query $query Write-Host "维护完成" } catch { Write-Host "维护失败: $($_.Exception.Message)" exit 1 } EOF -- 3. 自动化监控脚本 -- 创建PowerShell监控脚本 cat > /sqlserver/scripts/monitor.ps1 << 'EOF' #!/usr/bin/env pwsh # monitor.ps1 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn param( [string]$OutputFile = "/sqlserver/monitor/metrics.json" ) try { Write-Host "开始收集监控指标..." # 收集CPU使用率 $cpuUsage = (Get-WmiObject -Class win32_processor | Measure-Object -Property LoadPercentage -Average).Average # 收集内存使用率 $memory = Get-WmiObject -Class win32_operatingsystem $memoryUsage = ((($memory.TotalVisibleMemorySize - $memory.FreePhysicalMemory) / $memory.TotalVisibleMemorySize) * 100).ToString("0.00") # 收集磁盘使用率 $disk = Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='D:'" $diskUsage = ((($disk.Size - $disk.FreeSpace) / $disk.Size) * 100).ToString("0.00") # 收集数据库连接数 $query = "SELECT COUNT(*) AS connection_count FROM sys.dm_exec_sessions" $connectionCount = Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query | Select-Object -ExpandProperty connection_count # 收集慢查询 $query = "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" $slowQueries = Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query # 生成指标JSON $metrics = @{ timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" cpu_usage = $cpuUsage memory_usage = $memoryUsage disk_usage = $diskUsage connection_count = $connectionCount slow_queries = $slowQueries | ForEach-Object { @{ total_time_ms = $_.total_time_ms execution_count = $_.execution_count sql_text = $_.sql_text } } } # 输出到文件 $metrics | ConvertTo-Json -Depth 3 | Out-File -FilePath $OutputFile -Force Write-Host "监控指标收集完成: $OutputFile" } catch { Write-Host "监控失败: $($_.Exception.Message)" exit 1 } EOF -- 4. SQL Server Agent作业 -- 创建备份作业 EXEC dbo.sp_add_job @job_name = N'AutomatedBackup'; EXEC dbo.sp_add_jobstep @job_name = N'AutomatedBackup', @step_name = N'Full Backup', @subsystem = N'PowerShell', @command = N'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "D:\SQLServer\Scripts\backup.ps1" -DatabaseName "fgedudb" -BackupPath "\\fgedu-prod-01\Backup" -BackupType "Full"', @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'AutomatedBackup', @schedule_name = N'DailyAt2AM'; EXEC dbo.sp_add_jobserver @job_name = N'AutomatedBackup'; -- 创建维护作业 EXEC dbo.sp_add_job @job_name = N'AutomatedMaintenance'; EXEC dbo.sp_add_jobstep @job_name = N'AutomatedMaintenance', @step_name = N'Maintenance', @subsystem = N'PowerShell', @command = N'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "D:\SQLServer\Scripts\maintenance.ps1" -DatabaseName "fgedudb"', @database_name = N'master'; 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'AutomatedMaintenance', @schedule_name = N'WeeklyAt3AM'; EXEC dbo.sp_add_jobserver @job_name = N'AutomatedMaintenance'; -- 创建监控作业 EXEC dbo.sp_add_job @job_name = N'AutomatedMonitor'; EXEC dbo.sp_add_jobstep @job_name = N'AutomatedMonitor', @step_name = N'Monitor', @subsystem = N'PowerShell', @command = N'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "D:\SQLServer\Scripts\monitor.ps1" -OutputFile "D:\SQLServer\Monitor\metrics.json"', @database_name = N'master'; EXEC dbo.sp_add_schedule @schedule_name = N'Every15Minutes', @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @active_start_time = 000000; EXEC dbo.sp_attach_schedule @job_name = N'AutomatedMonitor', @schedule_name = N'Every15Minutes'; EXEC dbo.sp_add_jobserver @job_name = N'AutomatedMonitor';

执行结果:

脚本创建成功:
– /sqlserver/scripts/backup.ps1
– /sqlserver/scripts/maintenance.ps1
– /sqlserver/scripts/monitor.ps1

SQL Server Agent作业创建成功:
– AutomatedBackup
– AutomatedMaintenance
– AutomatedMonitor

执行备份脚本:
开始备份数据库 fgedudb…
备份完成: \\fgedu-prod-01\Backup\fgedudb_Full_20250408_100000.bak
清理旧备份: \\fgedu-prod-01\Backup\fgedudb_Full_20250401_100000.bak

执行维护脚本:
开始维护数据库 fgedudb…
执行数据库完整性检查…
更新统计信息…
重建索引…
维护完成

执行监控脚本:
开始收集监控指标…
监控指标收集完成: /sqlserver/monitor/metrics.json

监控指标JSON:
{
“timestamp”: “2025-04-08 10:00:00”,
“cpu_usage”: 15.6,
“memory_usage”: “60.25”,
“disk_usage”: “40.00”,
“connection_count”: 10,
“slow_queries”: [
{
“total_time_ms”: 543210,
“execution_count”: 10000,
“sql_text”: “SELECT * FROM fgedu.sales WHERE sale_date > ‘2025-01-01′”
}
]
}

3.3 自动化运维监控

自动化运维监控:

— 1. Grafana+Prometheus监控
— 安装和配置Prometheus
# 下载Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.40.0/prometheus-2.40.0.windows-amd64.zip

# 解压Prometheus
Expand-Archive -Path “prometheus-2.40.0.windows-amd64.zip” -DestinationPath “D:\Prometheus”

# 配置Prometheus
cat > D:\Prometheus\prometheus.yml << 'EOF' global: scrape_interval: 15s evaluation_interval: 15s alerting: alertmanagers: - static_configs: - targets: rule_files: scrape_configs: - job_name: 'sqlserver' static_configs: - targets: ['localhost:9187'] EOF # 启动Prometheus Start-Process -FilePath "D:\Prometheus\prometheus.exe" -WorkingDirectory "D:\Prometheus" -- 2. 安装和配置SQL Server Exporter # 下载SQL Server Exporter wget https://github.com/microsoft/mssql_exporter/releases/download/v1.4.2/mssql_exporter-1.4.2-windows-amd64.zip # 解压SQL Server Exporter Expand-Archive -Path "mssql_exporter-1.4.2-windows-amd64.zip" -DestinationPath "D:\SQLServerExporter" # 配置SQL Server Exporter cat > D:\SQLServerExporter\config.yml << 'EOF' connection_string: "Server=localhost;Database=master;User Id=sa;Password=Password123!;" collectors: - performance - waitstats - database - index - sqlstats - availability_group - job - tsql - database_io - memory_clerks - os - plan_cache - server - database_properties - database_size - database_stats - cpu - memory - disk - network - session - transaction_log - backup - restore - replication - mirroring - log_shipping - broker - service_broker - endpoints - linked_servers - dmv - sql_errors - blocking - deadlocks - query_store - extended_events - query_execution_stats - query_wait_stats - query_memory_grants - query_io_stats - query_cpu_stats - query_stats - query_store_wait_stats - query_store_runtime_stats - query_store_plan_stats - query_store_runtime_stats_interval - query_store_wait_stats_interval - query_store_plan_stats_interval - query_store_runtime_stats_interval - query_store_wait_stats_interval - query_store_plan_stats_interval - query_store_runtime_stats_interval - query_store_wait_stats_interval - query_store_plan_stats_interval EOF # 启动SQL Server Exporter Start-Process -FilePath "D:\SQLServerExporter\mssql_exporter.exe" -WorkingDirectory "D:\SQLServerExporter" -ArgumentList "--config.file=config.yml" -- 3. 安装和配置Grafana # 下载Grafana wget https://dl.grafana.com/oss/release/grafana-9.3.6.windows-amd64.zip # 解压Grafana Expand-Archive -Path "grafana-9.3.6.windows-amd64.zip" -DestinationPath "D:\Grafana" # 启动Grafana Start-Process -FilePath "D:\Grafana\bin\grafana-server.exe" -WorkingDirectory "D:\Grafana" -- 4. 配置Grafana数据源 # 登录Grafana (http://localhost:3000, admin/admin) # 添加Prometheus数据源 # URL: http://localhost:9090 -- 5. 导入Grafana仪表板 # 导入SQL Server仪表板 # 仪表板ID: 12583 (SQL Server Overview) -- 6. 配置告警 # 配置CPU使用率告警 # 配置内存使用率告警 # 配置磁盘使用率告警 # 配置数据库连接数告警 # 配置慢查询告警

执行结果:

Prometheus安装和配置完成。
SQL Server Exporter安装和配置完成。
Grafana安装和配置完成。

启动Prometheus:
Prometheus is now running at http://localhost:9090

启动SQL Server Exporter:
SQL Server Exporter is now running at http://localhost:9187/metrics

启动Grafana:
Grafana is now running at http://localhost:3000

配置Grafana数据源:
– 数据源名称:Prometheus
– URL:http://localhost:9090
– 访问方式:浏览器

导入Grafana仪表板:
– 仪表板ID:12583
– 仪表板名称:SQL Server Overview

配置告警:
– CPU使用率:超过80%告警
– 内存使用率:超过90%告警
– 磁盘使用率:超过90%告警
– 数据库连接数:超过500告警
– 慢查询:执行时间超过10秒告警

监控面板显示:
– CPU使用率:15.6%
– 内存使用率:60.25%
– 磁盘使用率:40.00%
– 数据库连接数:10
– 慢查询:1个
– 数据库状态:正常
– 备份状态:正常
– 索引碎片:正常

Part04-生产案例与实战讲解

4.1 自动化备份案例

自动化备份实战:

— 案例:自动化备份
— 步骤1:创建备份脚本
# 创建PowerShell备份脚本
cat > /sqlserver/scripts/backup.ps1 << 'EOF' #!/usr/bin/env pwsh # backup.ps1 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn param( [string]$DatabaseName = "fgedudb", [string]$BackupPath = "\\fgedu-prod-01\Backup", [string]$BackupType = "Full" ) $date = Get-Date -Format "yyyyMMdd" $time = Get-Date -Format "HHmmss" $backupFile = "$BackupPath\$DatabaseName`_$BackupType`_$date`_$time.bak" try { Write-Host "开始备份数据库 $DatabaseName..." $query = "BACKUP DATABASE [$DatabaseName] TO DISK = '$backupFile' WITH INIT, COMPRESSION" Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query Write-Host "备份完成: $backupFile" # 清理旧备份(保留7天) $oldBackups = Get-ChildItem -Path $BackupPath -Filter "$DatabaseName`_$BackupType`_*.bak" | Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-7)} foreach ($backup in $oldBackups) { Write-Host "清理旧备份: $($backup.FullName)" Remove-Item -Path $backup.FullName -Force } } catch { Write-Host "备份失败: $($_.Exception.Message)" exit 1 } EOF -- 步骤2:创建SQL Server Agent作业 EXEC dbo.sp_add_job @job_name = N'AutomatedBackup'; EXEC dbo.sp_add_jobstep @job_name = N'AutomatedBackup', @step_name = N'Full Backup', @subsystem = N'PowerShell', @command = N'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "D:\SQLServer\Scripts\backup.ps1" -DatabaseName "fgedudb" -BackupPath "\\fgedu-prod-01\Backup" -BackupType "Full"', @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'AutomatedBackup', @schedule_name = N'DailyAt2AM'; EXEC dbo.sp_add_jobserver @job_name = N'AutomatedBackup'; -- 步骤3:测试备份脚本 powershell.exe -File "D:\SQLServer\Scripts\backup.ps1" -DatabaseName "fgedudb" -BackupPath "\\fgedu-prod-01\Backup" -BackupType "Full" -- 步骤4:查看备份作业状态 SELECT name, enabled, last_run_date, last_run_time, last_run_outcome FROM msdb.dbo.sysjobs WHERE name = 'AutomatedBackup'; -- 步骤5:查看备份历史 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 WHERE database_name = 'fgedudb' ORDER BY backup_finish_date DESC;

执行结果:

备份脚本创建成功:/sqlserver/scripts/backup.ps1

SQL Server Agent作业创建成功:AutomatedBackup

测试备份脚本:
开始备份数据库 fgedudb…
备份完成: \\fgedu-prod-01\Backup\fgedudb_Full_20250408_100000.bak
清理旧备份: \\fgedu-prod-01\Backup\fgedudb_Full_20250401_100000.bak

备份作业状态:
name enabled last_run_date last_run_time last_run_outcome
————— ——- ————- ————- —————-
AutomatedBackup 1 20250408 100000 1

备份历史:
database_name type backup_start_date backup_finish_date backup_size_mb physical_device_name
————- —- ———————– ———————– ————– ————————
fgedudb D 2025-04-08 10:00:00.000 2025-04-08 10:05:00.000 1024.00 \\fgedu-prod-01\Backup\fgedudb_Full_20250408_100000.bak
fgedudb D 2025-04-07 02:00:00.000 2025-04-07 02:05:00.000 1024.00 \\fgedu-prod-01\Backup\fgedudb_Full_20250407_020000.bak
fgedudb D 2025-04-06 02:00:00.000 2025-04-06 02:05:00.000 1024.00 \\fgedu-prod-01\Backup\fgedudb_Full_20250406_020000.bak

4.2 自动化维护案例

自动化维护实战:

— 案例:自动化维护
— 步骤1:创建维护脚本
# 创建PowerShell维护脚本
cat > /sqlserver/scripts/maintenance.ps1 << 'EOF' #!/usr/bin/env pwsh # maintenance.ps1 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn param( [string]$DatabaseName = "fgedudb" ) try { Write-Host "开始维护数据库 $DatabaseName..." # 数据库完整性检查 Write-Host "执行数据库完整性检查..." $query = "DBCC CHECKDB('$DatabaseName') WITH NO_INFOMSGS" Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query # 更新统计信息 Write-Host "更新统计信息..." $query = "UPDATE STATISTICS fgedu.sales WITH FULLSCAN" Invoke-Sqlcmd -ServerInstance "localhost" -Database $DatabaseName -Query $query # 重建索引 Write-Host "重建索引..." $query = "ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80)" Invoke-Sqlcmd -ServerInstance "localhost" -Database $DatabaseName -Query $query Write-Host "维护完成" } catch { Write-Host "维护失败: $($_.Exception.Message)" exit 1 } EOF -- 步骤2:创建SQL Server Agent作业 EXEC dbo.sp_add_job @job_name = N'AutomatedMaintenance'; EXEC dbo.sp_add_jobstep @job_name = N'AutomatedMaintenance', @step_name = N'Maintenance', @subsystem = N'PowerShell', @command = N'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "D:\SQLServer\Scripts\maintenance.ps1" -DatabaseName "fgedudb"', @database_name = N'master'; 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'AutomatedMaintenance', @schedule_name = N'WeeklyAt3AM'; EXEC dbo.sp_add_jobserver @job_name = N'AutomatedMaintenance'; -- 步骤3:测试维护脚本 powershell.exe -File "D:\SQLServer\Scripts\maintenance.ps1" -DatabaseName "fgedudb" -- 步骤4:查看维护作业状态 SELECT name, enabled, last_run_date, last_run_time, last_run_outcome FROM msdb.dbo.sysjobs WHERE name = 'AutomatedMaintenance'; -- 步骤5:检查索引碎片 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;

执行结果:

维护脚本创建成功:/sqlserver/scripts/maintenance.ps1

SQL Server Agent作业创建成功:AutomatedMaintenance

测试维护脚本:
开始维护数据库 fgedudb…
执行数据库完整性检查…
更新统计信息…
重建索引…
维护完成

维护作业状态:
name enabled last_run_date last_run_time last_run_outcome
——————– ——- ————- ————- —————-
AutomatedMaintenance 1 20250408 100000 1

索引碎片检查:
(0 rows affected)

4.3 自动化监控案例

自动化监控实战:

— 案例:自动化监控
— 步骤1:创建监控脚本
# 创建PowerShell监控脚本
cat > /sqlserver/scripts/monitor.ps1 << 'EOF' #!/usr/bin/env pwsh # monitor.ps1 # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn param( [string]$OutputFile = "/sqlserver/monitor/metrics.json" ) try { Write-Host "开始收集监控指标..." # 收集CPU使用率 $cpuUsage = (Get-WmiObject -Class win32_processor | Measure-Object -Property LoadPercentage -Average).Average # 收集内存使用率 $memory = Get-WmiObject -Class win32_operatingsystem $memoryUsage = ((($memory.TotalVisibleMemorySize - $memory.FreePhysicalMemory) / $memory.TotalVisibleMemorySize) * 100).ToString("0.00") # 收集磁盘使用率 $disk = Get-WmiObject -Class win32_logicaldisk -Filter "DeviceID='D:'" $diskUsage = ((($disk.Size - $disk.FreeSpace) / $disk.Size) * 100).ToString("0.00") # 收集数据库连接数 $query = "SELECT COUNT(*) AS connection_count FROM sys.dm_exec_sessions" $connectionCount = Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query | Select-Object -ExpandProperty connection_count # 收集慢查询 $query = "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" $slowQueries = Invoke-Sqlcmd -ServerInstance "localhost" -Database "master" -Query $query # 生成指标JSON $metrics = @{ timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" cpu_usage = $cpuUsage memory_usage = $memoryUsage disk_usage = $diskUsage connection_count = $connectionCount slow_queries = $slowQueries | ForEach-Object { @{ total_time_ms = $_.total_time_ms execution_count = $_.execution_count sql_text = $_.sql_text } } } # 输出到文件 $metrics | ConvertTo-Json -Depth 3 | Out-File -FilePath $OutputFile -Force Write-Host "监控指标收集完成: $OutputFile" } catch { Write-Host "监控失败: $($_.Exception.Message)" exit 1 } EOF -- 步骤2:创建SQL Server Agent作业 EXEC dbo.sp_add_job @job_name = N'AutomatedMonitor'; EXEC dbo.sp_add_jobstep @job_name = N'AutomatedMonitor', @step_name = N'Monitor', @subsystem = N'PowerShell', @command = N'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File "D:\SQLServer\Scripts\monitor.ps1" -OutputFile "D:\SQLServer\Monitor\metrics.json"', @database_name = N'master'; EXEC dbo.sp_add_schedule @schedule_name = N'Every15Minutes', @freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @active_start_time = 000000; EXEC dbo.sp_attach_schedule @job_name = N'AutomatedMonitor', @schedule_name = N'Every15Minutes'; EXEC dbo.sp_add_jobserver @job_name = N'AutomatedMonitor'; -- 步骤3:测试监控脚本 powershell.exe -File "D:\SQLServer\Scripts\monitor.ps1" -OutputFile "D:\SQLServer\Monitor\metrics.json" -- 步骤4:查看监控作业状态 SELECT name, enabled, last_run_date, last_run_time, last_run_outcome FROM msdb.dbo.sysjobs WHERE name = 'AutomatedMonitor'; -- 步骤5:查看监控指标 Get-Content "D:\SQLServer\Monitor\metrics.json"

执行结果:

监控脚本创建成功:/sqlserver/scripts/monitor.ps1

SQL Server Agent作业创建成功:AutomatedMonitor

测试监控脚本:
开始收集监控指标…
监控指标收集完成: D:\SQLServer\Monitor\metrics.json

监控作业状态:
name enabled last_run_date last_run_time last_run_outcome
————— ——- ————- ————- —————-
AutomatedMonitor 1 20250408 100000 1

监控指标:
{
“timestamp”: “2025-04-08 10:00:00”,
“cpu_usage”: 15.6,
“memory_usage”: “60.25”,
“disk_usage”: “40.00”,
“connection_count”: 10,
“slow_queries”: [
{
“total_time_ms”: 543210,
“execution_count”: 10000,
“sql_text”: “SELECT * FROM fgedu.sales WHERE sale_date > ‘2025-01-01′”
}
]
}

Part05-风哥经验总结与分享

5.1 自动化运维最佳实践

自动化运维最佳实践:

  • 需求驱动:根据实际需求确定自动化范围和目标
  • 循序渐进:从简单任务开始,逐步扩展自动化范围
  • 标准化:制定标准的自动化流程和脚本
  • 测试验证:在生产环境前进行充分测试
  • 监控告警:监控自动化系统的运行状态,及时发现问题
  • 文档化:详细记录自动化流程和脚本
  • 持续改进:根据实际情况不断优化自动化流程和脚本
  • 团队协作:充分发挥团队的力量,共同完成自动化任务

更多视频教程www.fgedu.net.cn

5.2 自动化运维常见问题

常见问题:

  • 脚本错误:脚本语法错误或逻辑错误
  • 权限问题:脚本执行权限不足
  • 环境差异:不同环境下脚本执行结果不一致
  • 监控盲区:某些指标未被监控
  • 告警风暴:告警过多,导致重要告警被忽略
  • 维护成本:自动化系统需要定期维护和更新

学习交流加群风哥微信: itpux-com

5.3 自动化运维未来趋势

未来趋势:

  • 智能化:使用AI和机器学习技术,实现智能运维
  • 容器化:使用容器技术,简化部署和管理
  • 云原生:结合云服务,实现弹性运维
  • DevOps:结合开发和运维,实现持续集成和持续部署
  • 自动化编排:使用编排工具,实现复杂任务的自动化
  • 可视化:使用可视化工具,提高运维效率和可操作性

学习交流加群风哥QQ113257174

风哥提示:自动化运维是数据库运维的发展趋势,应积极探索和实践自动化技术,提高运维效率和可靠性。

更多学习教程公众号风哥教程itpux_com

from SQLServer视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息