客户发来一个 .mdf 和一个 .ldf,说要恢复去年的数据,问在 SQL Server 里怎么打开。
.mdf 是 SQL Server 的主数据文件,存表、索引、视图这些实际内容。配套的 .ldf 是事务日志,记录所有修改,恢复和回滚都靠它。一个数据库至少这两个文件。
附加的标准流程
SSMS 里右键「数据库」,选「附加」,添加 .mdf,下面的日志行会自动带出 .ldf。如果只给了 mdf,日志那行会显示未找到,选中删掉那行再确定,SQL Server 会尝试重建日志。
也可以用语句:
CREATE DATABASE demo ON (FILENAME = 'D:/data/demo.mdf') FOR ATTACH;几个常见的报错
- 5120:无权访问或文件被占用。检查服务账号对目录的权限,确认没有别的实例挂着这个文件。
- 661 或 665:版本不兼容,高版本生成的 mdf 附加不到低版本实例。只能升实例,或者让对方导出脚本。
- 5173:已有同名逻辑文件,说明这个库曾经附加过,先去系统视图里查一下文件列表。
还有种情况是 mdf 被标成只读,或者目录在网络盘上。SQL Server 对共享路径支持有限,先把文件拷到本地数据目录再附加,成功率最高。
日志文件丢了怎么重建
只拿到 mdf 时,附加语句要加 REBUILD_LOG 选项,SQL Server 会重建一个日志。前提是数据库上次正常关闭,否则附加上去可能是可疑状态,得跑 DBCC CHECKDB 修。这一步有丢数据的风险,能要到 ldf 就一定要,别嫌麻烦。
版本号也值得先确认。文件头的内部版本对应不同的 SQL Server 大版本,2008 的库附加到 2019 没问题,反过来一定失败。遇到 661 就别再试各种参数了,换实例或者导脚本才是出路。
只看不改和导出
不确定数据要不要动,附加时加只读参数,先看内容再决定。要导到别的库,用生成脚本或者 bcp 导出,别直接复制 mdf 去覆盖生产库的文件,那是事故级操作。
最后提醒一句:mdf 别单独拷走当备份,没有 ldf 时事务可能不一致。正规备份用 BACKUP DATABASE 出的 .bak,那才是能可靠还原的东西。