SQL Server 主要支持两种恢复模式:
完整恢复模式 (Full Recovery Model)
简单恢复模式 (Simple Recovery Model)
大容量日志恢复模式 (Bulk-Logged Recovery Model)
-- 1. 右键点击数据库 → 属性
-- 2. 选择"选项"页
-- 3. 在"恢复模式"下拉列表中选择新模式
-- 4. 点击"确定"
方法2:使用T-SQL命令
-- 更改为简单恢复模式
ALTER DATABASE [YourDatabaseName]
SET RECOVERY SIMPLE;
GO
-- 更改为完整恢复模式
ALTER DATABASE [YourDatabaseName]
SET RECOVERY FULL;
GO
-- 更改为大容量日志恢复模式
ALTER DATABASE [YourDatabaseName]
SET RECOVERY BULK_LOGGED;
GO
方法3:使用PowerShell
# 连接到SQL Server实例
$server = New-Object Microsoft.SqlServer.Management.Smo.Server "YourServerName"
# 更改数据库恢复模式
$database = $server.Databases["YourDatabaseName"]
$database.RecoveryModel = [Microsoft.SqlServer.Management.Smo.RecoveryModel]::Full
$database.Alter()
-- 查询当前恢复模式
SELECT name, recovery_model_desc
FROM sys.databases
WHERE name = 'YourDatabaseName';
-- 检查数据库状态
SELECT name, state_desc
FROM sys.databases;
2. 完整恢复模式下的关键操作
-- 更改为完整恢复模式后,必须立即进行完整备份
ALTER DATABASE [YourDatabaseName] SET RECOVERY FULL;
GO
-- 执行完整数据库备份
BACKUP DATABASE [YourDatabaseName]
TO DISK = 'D:\Backup\YourDatabaseName_Full.bak'
WITH INIT, STATS = 10;
GO
-- 定期进行日志备份(建议每15-30分钟)
BACKUP LOG [YourDatabaseName]
TO DISK = 'D:\Backup\YourDatabaseName_Log.trn'
WITH INIT, STATS = 10;
3. 监控日志文件大小
-- 监控日志文件使用情况
DBCC SQLPERF(LOGSPACE);
-- 查看日志文件详细信息
SELECT
name,
physical_name,
size/128.0 AS SizeMB,
growth
FROM sys.database_files
WHERE type_desc = 'LOG';
4. 处理大型日志文件
-- 如果从完整恢复模式改为简单模式,可收缩日志文件
ALTER DATABASE [YourDatabaseName] SET RECOVERY SIMPLE;
GO
-- 收缩日志文件
DBCC SHRINKFILE (YourDatabaseName_Log, 1024); -- 收缩到1024MB
GO
-- 1. 通知用户并确保无活跃事务
-- 2. 执行完整备份(如果当前是完整恢复模式)
BACKUP DATABASE [ProductionDB]
TO DISK = '\\BackupServer\SQLBackups\ProductionDB_Full.bak';
-- 3. 更改恢复模式
ALTER DATABASE [ProductionDB] SET RECOVERY BULK_LOGGED;
-- 4. 执行批量操作
-- ... 执行ETL或批量更新 ...
-- 5. 立即切换回完整恢复模式
ALTER DATABASE [ProductionDB] SET RECOVERY FULL;
-- 6. 执行日志备份
BACKUP LOG [ProductionDB]
TO DISK = '\\BackupServer\SQLBackups\ProductionDB_Log.trn';
场景2:紧急情况处理(日志文件已满)
-- 1. 检查恢复模式
SELECT recovery_model_desc FROM sys.databases WHERE name = 'ProblemDB';
-- 2. 如果是完整恢复模式且日志备份失败
-- 临时切换到简单模式释放日志空间
ALTER DATABASE [ProblemDB] SET RECOVERY SIMPLE;
-- 3. 收缩日志文件
DBCC SHRINKFILE (ProblemDB_Log, 1024);
-- 4. 切回完整恢复模式并立即备份
ALTER DATABASE [ProblemDB] SET RECOVERY FULL;
BACKUP DATABASE [ProblemDB] TO DISK = '...';
-- 定期检查恢复模式变更
CREATE TABLE RecoveryMode_Audit (
AuditID INT IDENTITY(1,1) PRIMARY KEY,
DatabaseName NVARCHAR(128),
OldRecoveryMode NVARCHAR(60),
NewRecoveryMode NVARCHAR(60),
ChangeDate DATETIME DEFAULT GETDATE(),
ChangedBy NVARCHAR(128)
);
-- 创建DDL触发器监控恢复模式变化
CREATE TRIGGER Audit_RecoveryMode_Change
ON ALL SERVER
FOR ALTER_DATABASE
AS
BEGIN
DECLARE @EventData XML = EVENTDATA();
IF @EventData.value('(/EVENT_INSTANCE/AlterType)[1]', 'nvarchar(128)') = 'RECOVERY'
BEGIN
INSERT INTO YourAuditDB.dbo.RecoveryMode_Audit
(DatabaseName, OldRecoveryMode, NewRecoveryMode, ChangedBy)
VALUES (
@EventData.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(128)'),
@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText/Previous)[1]', 'nvarchar(60)'),
@EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText/New)[1]', 'nvarchar(60)'),
ORIGINAL_LOGIN()
);
END
END;
GO
生产环境变更流程
性能影响
兼容性检查
备份策略调整
-- 常见问题1:更改恢复模式失败
-- 检查数据库状态
SELECT name, state_desc, is_in_standby
FROM sys.databases
WHERE name = 'YourDatabaseName';
-- 常见问题2:日志文件持续增长
-- 检查长时间运行的事务
DBCC OPENTRAN;
-- 检查日志重用等待
SELECT name, log_reuse_wait_desc
FROM sys.databases;
通过遵循这些指南和最佳实践,您可以安全、有效地管理SQL Server的恢复模式变更,确保数据的安全性和系统的稳定性。