不能直接复制.mdf和.ldf文件,因为sql server 2008 r2以独占方式持有数据库文件句柄,只要数据库处于online状态,windows就禁止外部进程访问;必须先分离数据库或设为single_user模式才能安全拷贝。

不能直接拷贝,会报错“文件已在 SQL Server(MSSQLSERVER) 中打开”。
为什么不能直接复制 .mdf 和 .ldf 文件
SQL Server 2008 R2 默认以独占方式持有数据库文件句柄。只要数据库处于 ONLINE 状态,Windows 就不允许外部进程(包括资源管理器)复制或移动这些文件。
- 常见错误现象:
无法复制 XXX.mdf:访问被拒绝或该文件正由另一进程使用 - 即使数据库没在被应用访问,SQL Server 后台仍持续读写日志和缓存页,文件始终被锁定
- 强行终止 SQL Server 进程再复制风险极高:可能损坏文件一致性,导致附加失败或数据丢失
必须先分离或设为单用户模式才能安全拷贝
两种可行路径,本质都是断开 SQL Server 对文件的控制:
-
推荐用分离(Detach):右键数据库 → 任务 → 分离 → 勾选
删除连接和更新统计信息;分离后文件可自由复制 -
替代方案:设为 SINGLE_USER + 立即回滚:执行
ALTER DATABASE [dbname] SET SINGLE_USER WITH ROLLBACK IMMEDIATE,再停服务或手动复制(但不如分离直观可靠) - 注意:分离前务必确认无长事务、无人正在操作该库,否则会中断业务
只复制 .mdf 不带 .ldf 的风险与补救
有人尝试只拷贝 .mdf,指望 SQL Server 自动重建日志——这在 SQL Server 2008 R2 中不可靠,尤其当原库非干净关闭时:
- 附加时大概率报错:
Could not open new database 'xxx'. CREATE DATABASE is aborted.或The log scan number in the log file header does not match... - 若坚持只用
.mdf,需用CREATE DATABASE ... FOR ATTACH_REBUILD_LOG语句,但仅适用于ONLINE状态下正常关闭的数据库 - 更稳妥做法:分离时确保
.ldf一并复制;若已丢失,优先考虑从备份还原,而非冒险重建日志
真正容易被忽略的是:分离操作本身会强制断开所有连接,而很多运维人员在生产环境没检查当前活动会话就直接点确定——结果是正在跑的报表或批量任务突然中断,甚至引发未提交事务回滚风暴。动手前务必先查 SELECT * FROM sys.dm_exec_sessions WHERE database_id = DB_ID('your_db')。











