本文命令基于 SQL Server 2016+ 测试。日志收缩效果与数据库 recovery model 强相关,操作前务必确认当前模式。
一、全量备份
基本命令
BACKUP DATABASE ecology
TO DISK = 'D:\bak\ecology_full_20250816.bak'
WITH INIT, -- 覆盖目标文件中的所有现有备份集
STATS = 10, -- 每完成 10% 输出一次进度
COMPRESSION; -- 启用备份压缩,通常节省 80% 磁盘空间
三个参数的含义:
| 参数 | 作用 | 什么时候用 |
|---|---|---|
INIT |
覆盖目标 .bak 文件里的所有历史备份集 |
目标路径已有旧备份,本次要完全替换时 |
NOINIT(默认) |
追加到目标文件,不覆盖历史备份集 | 需要在同一 .bak 文件里保留多版本时 |
COMPRESSION |
压缩备份集,写入时 CPU 稍高,但磁盘 I/O 和存储空间大幅降低 | 磁盘紧张时强烈推荐,生产环境默认值 |
STATS = N |
每完成 N% 打印一行进度 | 看进度就用 = 10,看总数用 = 100 |
⚠️
INIT会删除目标文件中的所有历史备份集。如果同一.bak文件里有差异备份(differential backup)或日志备份(log backup),执行INIT后这些备份集永久丢失。泛微 Ecology 通常只做全量备份,这种情况下INIT是安全的。💡 建议的备份命名规范:
ecology_full_YYYYMMDD.bak—— 日期在文件名里,不用INIT也能通过文件名区分版本。生产环境推荐 每日全量 + 每 15 分钟日志备份 的组合。
备份到网络路径(推荐做法)
BACKUP DATABASE ecology
TO DISK = '\\NASServer\SQLBackup\ecology_full_20250816.bak'
WITH COMPRESSION,
STATS = 10;
💡 把备份写到独立存储而不是数据库服务器本地盘,可以防止服务器硬盘故障导致备份一起丢。泛微 Ecology 数据库通常 50GB~200GB,建议 NAS 留至少 2 倍数据库大小的空间。
二、收缩事务日志
核心前提:只有
SIMPLE恢复模型的数据库,日志才能被SHRINKFILE真正收缩。FULL恢复模型的数据库,日志在LOG_BACKUP之前永远不会真正释放空间。
第一步:备份(或截断)事务日志
有备份空间 → 标准日志备份:
BACKUP LOG ecology
TO DISK = 'D:\bak\ecology_log_20250816.trn'
WITH COMPRESSION;
没有备份空间 → 丢弃日志(高风险,仅紧急释放空间时使用):
-- ⚠️ 危险:此命令不生成日志备份,截断后无法做 point-in-time 恢复
-- 仅在磁盘即将爆满、无法立即做日志备份时临时使用
BACKUP LOG ecology TO DISK = 'NUL';
⚠️
BACKUP LOG TO NUL会永久丢失日志链。一旦执行,此数据库只能在最近一次日志备份的时间点之后恢复,无法再做 point-in-time 恢复。生产库严禁使用,除非磁盘已满到连 SSMS 都打不开。💡 正确做法:如果磁盘紧张,优先增大备份盘或改用压缩备份,而不是截断日志。
COMPRESSION参数通常能让.trn文件比数据文件小 5~10 倍。
第二步:收缩日志文件
USE ecology;
GO
DBCC SHRINKFILE (ecology_Log, 20480); -- 目标收缩到 20 MB (单位:页,1页=8KB)
💡
DBCC SHRINKFILE的单位是页(8KB):20480页 =20480 × 8KB = 163,840KB ≈ 160MB,不是 20MB。如果想让日志收缩到真正 20MB,应该用2560(20MB ÷ 8KB/页)。💡
SHRINKFILE会从日志文件末尾向前推移已使用的 VLFs(virtual log files,虚拟日志文件),不会删除仍在使用的日志,所以实际收缩结果可能比目标大——这是正常行为。
第三步:查看日志空间使用情况
DBCC SQLPERF(LOGSPACE);
输出示例:
Database Name Log Size (MB) Log Space Used (%) Status
--------------------------------------------------------------
ecology 20480.00 3.27 0
💡 关键列是 Log Space Used (%)。如果日志已收缩到目标大小但使用率仍 >80%,说明:
- 仍有未提交的长事务持有日志末端
- 复制/CDC/镜像等组件在等待日志
这种情况
SHRINKFILE不会生效,需先解决长事务或相关组件。
防止日志再次暴涨的长期方案
| 根因 | 对策 |
|---|---|
恢复模型是 FULL,但从不备份日志 |
设置定时日志备份(每 15~60 分钟一次) |
| 单个大事务(如批量 UPDATE 全表)产生大量日志 | 改成小批次提交,每批加 CHECKPOINT |
索引重建(ALTER INDEX REBUILD)产生大量日志 |
生产时段避免大索引重建,或改用 ONLINE = ON |
| 磁盘本身太小 | 扩容或迁移到更大磁盘,日志暴涨是磁盘不足的症状,不是根因 |
三、还原数据库
第一步:查看备份文件中的逻辑文件名
RESTORE FILELISTONLY
FROM DISK = 'D:\bak\ecology_backup_2025_08_14_020000_7656250.bak';
输出示例:
LogicalName PhysicalName Type FileGroupName
----------------------------------------------------------------------
ecology_Data D:\SQLData\ecology.mdf D PRIMARY
ecology_Log D:\SQLData\ecology_log.ldf L NULL
💡
FILELISTONLY只读不写,不会触发还原,安全。必须先拿到逻辑文件名(ecology_Data/ecology_Log),否则MOVE参数会报"找不到逻辑名"。
第二步:还原数据库(可能需要 MOVE)
场景 A:原始路径可用,直接还原:
RESTORE DATABASE ecology
FROM DISK = 'D:\bak\ecology_backup_2025_08_14_020000_7656250.bak'
WITH REPLACE,
STATS = 5;
场景 B:原始路径不可用(如 E:\ 盘损坏),需要 MOVE:
⚠️ 必须提前创建目标目录,否则报错:
Directory E:\Database does not exist。
RESTORE DATABASE ecology
FROM DISK = 'D:\bak\ecology_backup_2025_08_14_020000_7656250.bak'
WITH MOVE 'ecology_Data' TO 'E:\Database\ecology.mdf', -- 数据文件目标路径
MOVE 'ecology_Log' TO 'E:\Database\ecology_log.ldf', -- 日志文件目标路径
REPLACE, -- 覆盖已有数据库(紧急时使用,会丢失未提交事务)
STATS = 5; -- 每 5% 输出进度
💡
MOVE适合以下场景:
- 磁盘损坏,原路径不可用
- 数据库迁移到新服务器,路径结构不同
- 泛微 Ecology 安装时默认路径是
D:\或C:\,迁移到新服务器后路径变了
REPLACE适合:紧急覆盖同名数据库,接受丢失最后一次备份后写入的数据。日常恢复不要用REPLACE,优先用新数据库名(如ecology_restore_test)先验证备份完整性。
第三步:查询还原进度
SELECT
r.session_id,
r.command,
r.percent_complete,
r.start_time,
r.estimated_completion_time / 1000 / 60 AS est_minutes_remaining,
r.total_elapsed_time / 1000 / 60 AS elapsed_minutes
FROM sys.dm_exec_requests r
WHERE r.command LIKE 'RESTORE%';
💡 还原与备份可以并行做:
RESTORE FILELISTONLY+RESTORE VERIFYONLY(验证备份完整性)可以在正式还原前先执行,确保备份文件没损坏:RESTORE VERIFYONLY FROM DISK = 'D:\bak\ecology_full_20250816.bak';返回
The backup set is valid则备份完好。
泛微 Ecology 备份策略建议
泛微 Ecology 数据库通常 50GB~200GB,建议如下:
| 操作 | 频率 | 保留策略 | 存储位置 |
|---|---|---|---|
| 全量备份 | 每日 1 次(凌晨 02:00) | 保留 7~30 天 | NAS 独立目录 |
| 日志备份 | 每 15~60 分钟 | 保留 7 天 | 同 NAS,独立子目录 |
| 备份验证 | 每周 1 次 | 还原到测试库验证 | 测试服务器 |
💡 泛微 Ecology 有一个特点:数据库频繁写操作(流程流转、附件上传等),日志增长快。建议 recovery model 保持 FULL + 定时日志备份,而不是改成 SIMPLE——否则万一需要 point-in-time 恢复,日志已丢失。
⚠️ 泛微 Ecology 不支持
NORECOVERY还原后直接应用日志。如果用WITH NORECOVERY做备用库,需要确认泛微中间件的数据库连接配置是否支持只读副本。
📚 相关阅读
- CentOS 7 EOL 后更换阿里云 Vault yum 源 — 另一类"旧系统维护"场景,思路相通