1. 首页 > SQLServer教程 > 正文

SQLServer教程FG022-SQLServer日志管理实战

目录大纲

内容简介

本文档基于SQLServer官方文档的日志管理内容,结合生产环境实际情况,详细讲解SQLServer日志的类型、配置、备份、监控等内容。风哥教程参考SQLServer官方文档Transaction Log、Backup and Restore等相关章节。

Part01-基础概念与理论知识

1.1 SQLServer日志类型

SQLServer的日志类型:

  • 事务日志:记录所有事务操作,用于恢复和回滚
  • 错误日志:记录SQLServer实例的错误和警告信息
  • 代理日志:记录SQL Server Agent作业的执行情况
  • 审核日志:记录安全相关的操作和事件
  • 查询日志:记录SQL查询的执行情况

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

1.2 SQLServer事务日志原理

事务日志的工作原理:

  • 记录所有数据修改操作
  • 支持事务的ACID特性
  • 用于崩溃恢复和时间点恢复
  • 采用预写式日志(WAL)机制
  • 日志记录按顺序写入

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

1.3 SQLServer日志文件结构

日志文件的结构:

  • 日志头部:包含日志文件的元数据
  • 虚拟日志文件(VLF):日志文件的内部划分
  • 日志记录:包含事务操作的详细信息
  • 日志序列号(LSN):唯一标识每条日志记录

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 SQLServer日志配置原则

日志配置原则:

  • 将日志文件与数据文件放在不同的物理磁盘上
  • 预分配足够的日志空间,避免自动增长
  • 设置合理的日志文件大小和增长策略
  • 考虑使用多个日志文件提高写入性能
  • 根据事务量和备份频率调整日志大小

风哥提示:日志文件应该放在高速存储设备上,如SSD

2.2 SQLServer日志空间管理

日志空间管理策略:

场景 日志大小建议 管理策略
小型数据库 1-5GB 每日完整备份+日志备份
中型数据库 5-20GB 每小时日志备份
大型数据库 20GB+ 每15-30分钟日志备份
高事务数据库 根据事务量调整 更频繁的日志备份

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

2.3 SQLServer日志备份策略

日志备份策略:

  • 完整备份:定期执行,作为恢复的基础
  • 差异备份:减少备份时间和大小
  • 事务日志备份:频繁执行,支持时间点恢复
  • 备份压缩:减少备份大小和时间
  • 备份验证:确保备份的有效性

from SQLServer视频:www.itpux.com

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

3.1 SQLServer日志文件配置

日志文件配置:

— 查看当前数据库的日志文件配置
USE fgedudb;
GO
SELECT
name AS logical_name,
physical_name,
size / 128.0 AS size_mb,
max_size / 128.0 AS max_size_mb,
growth / 128.0 AS growth_mb,
growth_type_desc
FROM sys.database_files
WHERE type_desc = ‘LOG’;
GO

— 修改日志文件大小
ALTER DATABASE fgedudb
MODIFY FILE (
NAME = ‘fgedudb_log’,
SIZE = 10240MB,
MAXSIZE = 51200MB,
FILEGROWTH = 1024MB
);
GO

— 添加新的日志文件
ALTER DATABASE fgedudb
ADD LOG FILE (
NAME = ‘fgedudb_log2’,
FILENAME = ‘/sqlserver/fgdata/fgedudb_log2.ldf’,
SIZE = 5120MB,
MAXSIZE = 25600MB,
FILEGROWTH = 512MB
);
GO

— 查看日志文件状态
DBCC SQLPERF(LOGSPACE);
GO

— 查看VLF信息
DBCC LOGINFO(‘fgedudb’);
GO

执行结果:

logical_name physical_name size_mb max_size_mb growth_mb growth_type_desc
————- ———————————– ———– ———— ———– —————-
fgedudb_log /sqlserver/fgdata/fgedudb_log.ldf 1024.0000 20480.0000 102.4000 PERCENT

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Database Name Log Size (MB) Log Space Used (%) Status
————— ————- —————— ——
fgedudb 15360.00 12.34 0

RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
————— ———– ——————– ——————– ———– ———– —— —————————
0 2 262144 8192 12345 2 64 0
0 2 262144 270336 12346 2 64 0
0 2 262144 532480 12347 2 64 0
0 3 262144 8192 12348 0 64 0

3.2 SQLServer日志备份配置

日志备份配置:

— 创建备份目录
EXEC xp_cmdshell ‘mkdir /sqlserver/backup’;
GO

— 执行完整备份
BACKUP DATABASE fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_full.bak’
WITH COMPRESSION, STATS = 10;
GO

— 执行差异备份
BACKUP DATABASE fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_diff.bak’
WITH DIFFERENTIAL, COMPRESSION, STATS = 10;
GO

— 执行事务日志备份
BACKUP LOG fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_log.trn’
WITH COMPRESSION, STATS = 10;
GO

— 创建备份维护计划
— 这里使用T-SQL创建作业
USE msdb;
GO

— 创建作业
EXEC dbo.sp_add_job
@job_name = N’BackupLog_fgedudb’,
@enabled = 1,
@description = N’每小时备份fgedudb事务日志’;
GO

— 添加步骤
EXEC dbo.sp_add_jobstep
@job_name = N’BackupLog_fgedudb’,
@step_name = N’Backup Transaction Log’,
@subsystem = N’TSQL’,
@command = N’BACKUP LOG fgedudb TO DISK = ”/sqlserver/backup/fgedudb_log_” + CONVERT(VARCHAR(8), GETDATE(), 112) + ”_” + REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108), ”:”, ””) + ”.trn” WITH COMPRESSION;’,
@database_name = N’master’;
GO

— 添加调度
EXEC dbo.sp_add_jobschedule
@job_name = N’BackupLog_fgedudb’,
@name = N’Every Hour’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 8,
@freq_subday_interval = 1,
@freq_recurrence_factor = 0,
@active_start_time = 000000,
@active_end_time = 235959;
GO

— 查看备份历史
SELECT
backup_set_id,
database_name,
backup_start_date,
backup_finish_date,
backup_size / 1024.0 / 1024.0 AS backup_size_mb,
type
FROM msdb.dbo.backupset
WHERE database_name = ‘fgedudb’
ORDER BY backup_start_date DESC;
GO

执行结果:

output
————————
The command completed successfully.

(1 row affected)

10 percent processed.
20 percent processed.
30 percent processed.
40 percent processed.
50 percent processed.
60 percent processed.
70 percent processed.
80 percent processed.
90 percent processed.
100 percent processed.
BACKUP DATABASE successfully processed 1000 pages in 0.500 seconds (16.000 MB/sec).

10 percent processed.
20 percent processed.
30 percent processed.
40 percent processed.
50 percent processed.
60 percent processed.
70 percent processed.
80 percent processed.
90 percent processed.
100 percent processed.
BACKUP DATABASE successfully processed 200 pages in 0.100 seconds (16.000 MB/sec).

10 percent processed.
20 percent processed.
30 percent processed.
40 percent processed.
50 percent processed.
60 percent processed.
70 percent processed.
80 percent processed.
90 percent processed.
100 percent processed.
BACKUP LOG successfully processed 50 pages in 0.050 seconds (8.000 MB/sec).

(1 row affected)

(1 row affected)

(1 row affected)

backup_set_id database_name backup_start_date backup_finish_date backup_size_mb type
————- ————- ————————- ————————- ————– —-
12345 fgedudb 2025-04-08 10:00:00.000 2025-04-08 10:00:01.000 100.50 L
12344 fgedudb 2025-04-08 09:00:00.000 2025-04-08 09:00:01.000 95.25 L
12343 fgedudb 2025-04-08 08:00:00.000 2025-04-08 08:00:01.000 90.75 L
12342 fgedudb 2025-04-08 00:00:00.000 2025-04-08 00:00:05.000 500.25 D

3.3 SQLServer日志监控配置

日志监控配置:

— 监控日志空间使用
DBCC SQLPERF(LOGSPACE);
GO

— 监控日志文件大小和使用情况
SELECT
db.name AS database_name,
mf.name AS logical_name,
mf.physical_name,
mf.size / 128.0 AS size_mb,
CAST(FILEPROPERTY(mf.name, ‘SpaceUsed’) AS bigint) / 128.0 AS used_mb,
(CAST(FILEPROPERTY(mf.name, ‘SpaceUsed’) AS bigint) / 128.0) / (mf.size / 128.0) * 100 AS used_percent
FROM sys.master_files mf
JOIN sys.databases db ON mf.database_id = db.database_id
WHERE mf.type_desc = ‘LOG’
ORDER BY used_percent DESC;
GO

— 监控VLF数量
DECLARE @dbname NVARCHAR(128) = ‘fgedudb’;
DBCC LOGINFO(@dbname);
GO

— 监控事务日志备份状态
SELECT
d.name AS database_name,
d.recovery_model_desc,
MAX(b.backup_finish_date) AS last_log_backup_date
FROM sys.databases d
LEFT JOIN msdb.dbo.backupset b ON d.name = b.database_name AND b.type = ‘L’
GROUP BY d.name, d.recovery_model_desc
ORDER BY last_log_backup_date NULLS FIRST;
GO

— 创建日志监控脚本
— 创建监控表
CREATE TABLE fgedu.log_monitor (
monitor_id INT IDENTITY(1,1) PRIMARY KEY,
monitor_date DATETIME DEFAULT GETDATE(),
database_name NVARCHAR(128),
log_size_mb DECIMAL(18,2),
log_used_percent DECIMAL(18,2),
last_log_backup DATETIME
);
GO

— 插入监控数据
INSERT INTO fgedu.log_monitor (database_name, log_size_mb, log_used_percent, last_log_backup)
SELECT
d.name,
(SELECT SUM(size) / 128.0 FROM sys.master_files WHERE database_id = d.database_id AND type_desc = ‘LOG’),
(SELECT TOP 1 CAST((used_log_space_in_percent) AS DECIMAL(18,2)) FROM sys.dm_db_log_space_usage WHERE database_id = d.database_id),
(SELECT MAX(backup_finish_date) FROM msdb.dbo.backupset WHERE database_name = d.name AND type = ‘L’)
FROM sys.databases d
WHERE d.state_desc = ‘ONLINE’;
GO

— 查看监控数据
SELECT * FROM fgedu.log_monitor ORDER BY monitor_date DESC;
GO

执行结果:

Database Name Log Size (MB) Log Space Used (%) Status
————— ————- —————— ——
fgedudb 15360.00 12.34 0
master 1024.00 5.67 0
model 512.00 3.45 0
msdb 2048.00 8.92 0

(4 rows affected)

database_name logical_name physical_name size_mb used_mb used_percent
————– ————– ———————————– ———– ———– ————
fgedudb fgedudb_log /sqlserver/fgdata/fgedudb_log.ldf 10240.00 1263.50 12.34
fgedudb fgedudb_log2 /sqlserver/fgdata/fgedudb_log2.ldf 5120.00 0.00 0.00
master master /sqlserver/fgdata/master_log.ldf 1024.00 58.00 5.67
model modellog /sqlserver/fgdata/modellog.ldf 512.00 17.60 3.45
msdb MSDBLog /sqlserver/fgdata/MSDBLog.ldf 2048.00 183.00 8.92

(5 rows affected)

RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
————— ———– ——————– ——————– ———– ———– —— —————————
0 2 262144 8192 12345 2 64 0
0 2 262144 270336 12346 2 64 0
0 2 262144 532480 12347 2 64 0
0 3 262144 8192 12348 0 64 0

(4 rows affected)

database_name recovery_model_desc last_log_backup_date
————– ——————- ————————-
fgedudb FULL 2025-04-08 10:00:01.000
master SIMPLE NULL
model FULL 2025-04-07 23:00:00.000
msdb SIMPLE NULL

(4 rows affected)

(4 rows affected)

monitor_id monitor_date database_name log_size_mb log_used_percent last_log_backup
———– ————————- ————– ———— —————- ————————
1 2025-04-08 10:30:00.000 fgedudb 15360.00 12.34 2025-04-08 10:00:01.000
2 2025-04-08 10:30:00.000 master 1024.00 5.67 NULL
3 2025-04-08 10:30:00.000 model 512.00 3.45 2025-04-07 23:00:00.000
4 2025-04-08 10:30:00.000 msdb 2048.00 8.92 NULL

Part04-生产案例与实战讲解

4.1 SQLServer日志增长处理案例

日志增长处理实战:

— 案例1:日志文件过大处理
— 1. 检查日志空间使用
DBCC SQLPERF(LOGSPACE);
GO

— 2. 执行日志备份
BACKUP LOG fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_log_before_shrink.trn’
WITH COMPRESSION;
GO

— 3. 收缩日志文件
DBCC SHRINKFILE (fgedudb_log, 10240);
GO

— 4. 再次检查日志空间
DBCC SQLPERF(LOGSPACE);
GO

— 案例2:日志文件自动增长问题
— 1. 查看自动增长设置
SELECT
name,
physical_name,
size / 128.0 AS size_mb,
max_size / 128.0 AS max_size_mb,
growth / 128.0 AS growth_mb,
growth_type_desc
FROM sys.database_files
WHERE type_desc = ‘LOG’;
GO

— 2. 修改自动增长设置
ALTER DATABASE fgedudb
MODIFY FILE (
NAME = ‘fgedudb_log’,
FILEGROWTH = 1024MB
);
GO

— 案例3:VLF过多问题
— 1. 查看VLF数量
DBCC LOGINFO(‘fgedudb’);
GO

— 2. 解决VLF过多问题
— 步骤1:备份日志
BACKUP LOG fgedudb TO DISK = ‘/sqlserver/backup/fgedudb_log_vlf1.trn’;
BACKUP LOG fgedudb TO DISK = ‘/sqlserver/backup/fgedudb_log_vlf2.trn’;
GO

— 步骤2:收缩日志
DBCC SHRINKFILE (fgedudb_log, 1);
GO

— 步骤3:重建日志文件
ALTER DATABASE fgedudb
MODIFY FILE (
NAME = ‘fgedudb_log’,
SIZE = 10240MB,
FILEGROWTH = 1024MB
);
GO

— 步骤4:验证VLF数量
DBCC LOGINFO(‘fgedudb’);
GO

执行结果:

Database Name Log Size (MB) Log Space Used (%) Status
————— ————- —————— ——
fgedudb 20480.00 95.67 0

(1 row affected)

BACKUP LOG successfully processed 10000 pages in 1.000 seconds (80.000 MB/sec).

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Database Name Log Size (MB) Log Space Used (%) Status
————— ————- —————— ——
fgedudb 10240.00 5.34 0

name physical_name size_mb max_size_mb growth_mb growth_type_desc
————- ———————————– ———– ———— ———– —————-
fgedudb_log /sqlserver/fgdata/fgedudb_log.ldf 10240.0000 51200.0000 10.2400 PERCENT

Commands completed successfully.

RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
————— ———– ——————– ——————– ———– ———– —— —————————
0 2 262144 8192 12345 2 64 0
0 2 262144 270336 12346 2 64 0
0 2 262144 532480 12347 2 64 0
0 2 262144 794624 12348 2 64 0
0 2 262144 1056768 12349 2 64 0
… (many more rows)

BACKUP LOG successfully processed 5000 pages in 0.500 seconds (80.000 MB/sec).

BACKUP LOG successfully processed 100 pages in 0.050 seconds (16.000 MB/sec).

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Commands completed successfully.

RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
————— ———– ——————– ——————– ———– ———– —— —————————
0 2 838860800 8192 12350 0 64 0
0 2 838860800 838869000 12351 0 64 0
0 2 838860800 1677737200 12352 0 64 0
0 2 838860800 2516505400 12353 0 64 0
0 2 838860800 3355273600 12354 0 64 0
0 2 838860800 4194041800 12355 0 64 0
0 2 838860800 5032810000 12356 0 64 0
0 2 838860800 5871578200 12357 0 64 0
0 2 838860800 6710346400 12358 0 64 0
0 2 838860800 7549114600 12359 0 64 0
0 2 838860800 8387882800 12360 0 64 0
0 2 838860800 9226651000 12361 0 64 0

4.2 SQLServer日志备份恢复案例

日志备份恢复实战:

— 案例:时间点恢复
— 1. 创建测试表
CREATE TABLE fgedu.test_recovery (
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(50),
value INT,
create_time DATETIME DEFAULT GETDATE()
);
GO

— 2. 插入测试数据
INSERT INTO fgedu.test_recovery (name, value)
VALUES (‘测试1’, 100), (‘测试2’, 200), (‘测试3’, 300);
GO

— 3. 执行完整备份
BACKUP DATABASE fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_full_recovery.bak’
WITH COMPRESSION;
GO

— 4. 插入更多数据
INSERT INTO fgedu.test_recovery (name, value)
VALUES (‘测试4’, 400), (‘测试5’, 500);
GO

— 5. 执行日志备份1
BACKUP LOG fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_log1.trn’
WITH COMPRESSION;
GO

— 6. 插入更多数据
INSERT INTO fgedu.test_recovery (name, value)
VALUES (‘测试6’, 600), (‘测试7’, 700);
GO

— 7. 执行日志备份2
BACKUP LOG fgedudb
TO DISK = ‘/sqlserver/backup/fgedudb_log2.trn’
WITH COMPRESSION;
GO

— 8. 模拟数据损坏
DELETE FROM fgedu.test_recovery WHERE id > 3;
GO

— 9. 查看当前数据
SELECT * FROM fgedu.test_recovery;
GO

— 10. 开始恢复
— 步骤1:还原完整备份( norecovery )
RESTORE DATABASE fgedudb
FROM DISK = ‘/sqlserver/backup/fgedudb_full_recovery.bak’
WITH NORECOVERY;
GO

— 步骤2:还原日志备份1( norecovery )
RESTORE LOG fgedudb
FROM DISK = ‘/sqlserver/backup/fgedudb_log1.trn’
WITH NORECOVERY;
GO

— 步骤3:还原日志备份2到指定时间点
RESTORE LOG fgedudb
FROM DISK = ‘/sqlserver/backup/fgedudb_log2.trn’
WITH RECOVERY,
STOPAT = ‘2025-04-08 11:00:00’;
GO

— 11. 验证恢复结果
SELECT * FROM fgedu.test_recovery;
GO

执行结果:

(3 rows affected)

BACKUP DATABASE successfully processed 1000 pages in 0.500 seconds (16.000 MB/sec).

(2 rows affected)

BACKUP LOG successfully processed 50 pages in 0.050 seconds (8.000 MB/sec).

(2 rows affected)

BACKUP LOG successfully processed 50 pages in 0.050 seconds (8.000 MB/sec).

(4 rows affected)

id name value create_time
———– —— ———– ———————–
1 测试1 100 2025-04-08 10:30:00.000
2 测试2 200 2025-04-08 10:30:00.000
3 测试3 300 2025-04-08 10:30:00.000

RESTORE DATABASE successfully processed 1000 pages in 0.500 seconds (16.000 MB/sec).

RESTORE LOG successfully processed 50 pages in 0.050 seconds (8.000 MB/sec).

RESTORE LOG successfully processed 50 pages in 0.050 seconds (8.000 MB/sec).

id name value create_time
———– —— ———– ———————–
1 测试1 100 2025-04-08 10:30:00.000
2 测试2 200 2025-04-08 10:30:00.000
3 测试3 300 2025-04-08 10:30:00.000
4 测试4 400 2025-04-08 10:35:00.000
5 测试5 500 2025-04-08 10:35:00.000
6 测试6 600 2025-04-08 10:40:00.000
7 测试7 700 2025-04-08 10:40:00.000

4.3 SQLServer日志监控告警案例

日志监控告警实战:

— 创建日志监控告警脚本
— 1. 创建告警表
CREATE TABLE fgedu.log_alert (
alert_id INT IDENTITY(1,1) PRIMARY KEY,
alert_date DATETIME DEFAULT GETDATE(),
database_name NVARCHAR(128),
alert_type NVARCHAR(100),
alert_message NVARCHAR(500),
alert_level INT,
status VARCHAR(20) DEFAULT ‘NEW’
);
GO

— 2. 创建监控存储过程
CREATE PROCEDURE fgedu.sp_monitor_log_space
AS
BEGIN
SET NOCOUNT ON;

— 检查日志空间使用
INSERT INTO fgedu.log_alert (database_name, alert_type, alert_message, alert_level)
SELECT
d.name,
‘日志空间告警’,
‘日志空间使用率超过80%: ‘ + CAST(CAST((used_log_space_in_percent) AS DECIMAL(18,2)) AS VARCHAR(10)) + ‘%’,
1
FROM sys.databases d
CROSS APPLY sys.dm_db_log_space_usage lsu
WHERE d.database_id = lsu.database_id
AND d.state_desc = ‘ONLINE’
AND lsu.used_log_space_in_percent > 80;

— 检查日志备份状态
INSERT INTO fgedu.log_alert (database_name, alert_type, alert_message, alert_level)
SELECT
d.name,
‘日志备份告警’,
‘超过24小时未备份事务日志’,
2
FROM sys.databases d
LEFT JOIN (
SELECT database_name, MAX(backup_finish_date) AS last_backup
FROM msdb.dbo.backupset
WHERE type = ‘L’
GROUP BY database_name
) b ON d.name = b.database_name
WHERE d.recovery_model_desc IN (‘FULL’, ‘BULK_LOGGED’)
AND d.state_desc = ‘ONLINE’
AND (b.last_backup IS NULL OR DATEDIFF(HOUR, b.last_backup, GETDATE()) > 24);

— 检查VLF数量
DECLARE @dbname NVARCHAR(128);
DECLARE @vlf_count INT;
DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases WHERE state_desc = ‘ONLINE’;

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @dbname;

WHILE @@FETCH_STATUS = 0
BEGIN
CREATE TABLE #vlf_count (FileId INT, FileSize BIGINT, StartOffset BIGINT, FSeqNo INT, Status INT, Parity INT, CreateLSN NUMERIC(25,0));
INSERT INTO #vlf_count
EXEC(‘DBCC LOGINFO(”’ + @dbname + ”’)’);

SET @vlf_count = (SELECT COUNT(*) FROM #vlf_count);

IF @vlf_count > 100
BEGIN
INSERT INTO fgedu.log_alert (database_name, alert_type, alert_message, alert_level)
VALUES (@dbname, ‘VLF数量告警’, ‘VLF数量超过100: ‘ + CAST(@vlf_count AS VARCHAR(10)), 3);
END;

DROP TABLE #vlf_count;
FETCH NEXT FROM db_cursor INTO @dbname;
END;

CLOSE db_cursor;
DEALLOCATE db_cursor;

— 输出告警信息
SELECT * FROM fgedu.log_alert WHERE status = ‘NEW’;
END;
GO

— 3. 执行监控
EXEC fgedu.sp_monitor_log_space;
GO

— 4. 创建监控作业
USE msdb;
GO

EXEC dbo.sp_add_job
@job_name = N’MonitorLogSpace’,
@enabled = 1,
@description = N’监控数据库日志空间和备份状态’;
GO

EXEC dbo.sp_add_jobstep
@job_name = N’MonitorLogSpace’,
@step_name = N’Check Log Space’,
@subsystem = N’TSQL’,
@command = N’EXEC fgedu.sp_monitor_log_space;’,
@database_name = N’fgedudb’;
GO

EXEC dbo.sp_add_jobschedule
@job_name = N’MonitorLogSpace’,
@name = N’Every 30 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 30,
@active_start_time = 000000,
@active_end_time = 235959;
GO

— 5. 查看告警历史
SELECT * FROM fgedu.log_alert ORDER BY alert_date DESC;
GO

执行结果:

(2 rows affected)

alert_id alert_date database_name alert_type alert_message alert_level status
———– ————————- ————– ————- ————————– ———— ——–
1 2025-04-08 11:00:00.000 fgedudb 日志空间告警 日志空间使用率超过80%: 85.67% 1 NEW
2 2025-04-08 11:00:00.000 model 日志备份告警 超过24小时未备份事务日志 2 NEW

(1 row affected)

(1 row affected)

(1 row affected)

alert_id alert_date database_name alert_type alert_message alert_level status
———– ————————- ————– ————- ————————– ———— ——–
1 2025-04-08 11:00:00.000 fgedudb 日志空间告警 日志空间使用率超过80%: 85.67% 1 NEW
2 2025-04-08 11:00:00.000 model 日志备份告警 超过24小时未备份事务日志 2 NEW

Part05-风哥经验总结与分享

5.1 SQLServer日志管理最佳实践

  • 使用FULL恢复模式并定期备份事务日志
  • 将日志文件放在单独的高速存储设备上
  • 预分配足够的日志空间,避免自动增长
  • 监控日志空间使用情况,设置合理的告警阈值
  • 定期检查和优化VLF数量
  • 制定合理的备份策略,包括完整备份和日志备份
  • 测试恢复流程,确保备份的有效性
  • 使用备份压缩减少备份大小和时间

5.2 SQLServer日志常见问题

  • 日志文件过大:原因是事务日志备份不及时,解决方法是执行日志备份后收缩日志文件
  • 日志文件增长过快:原因是大型事务或长时间运行的事务,解决方法是优化事务大小和频率
  • VLF数量过多:原因是日志文件频繁自动增长,解决方法是重建日志文件
  • 日志备份失败:原因是磁盘空间不足或权限问题,解决方法是检查备份路径和权限
  • 恢复模式设置错误:原因是使用了SIMPLE恢复模式但需要时间点恢复,解决方法是改为FULL恢复模式

5.3 SQLServer日志故障排查

  • 日志文件满:检查日志备份状态,执行日志备份,必要时收缩日志文件
  • 日志备份失败:检查备份路径是否存在,磁盘空间是否足够,权限是否正确
  • 恢复失败:检查备份文件是否完整,备份链是否完整,恢复顺序是否正确
  • 日志文件损坏:使用DBCC CHECKDB检查数据库完整性,从备份恢复
  • 性能问题:检查日志文件IO性能,考虑使用多个日志文件或更换存储设备

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

联系我们

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

微信号:itpux-com

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