SQL Server 中的 MDF 和 LDF 内容

Edu*_*ard 8 sql-server sql-server-2008-r2

比方说,我有一个单一的数据库.mdf.ldf文件。

数据库已分离,没有事务并且 SQL Server 已停止。

我假设所有数据都已经在.mdf文件中了?

.ldf文件基本上是空的?如果.ldf文件不为空,它包含什么?

如果我删除.ldf文件并手动创建一个.ldf与以前相同名称的新的 0 字节长文件,我是否能够再次附加数据库而不会丢失数据?

Jon*_*gel 6

(对于从 Google 飞来的窥视者的免责声明:我建议使用此问题中询问的方法来回收日志文件空间!DBCC SHRINKFILE改用。)

我假设所有数据都已经在 .mdf 文件中?

是的,分离会CHECKPOINT在数据库中启动 a ,因此所有脏数据页都会进入磁盘。

数据库不能分离,如果另一个进程(镜像,复制等)或所需的事务日志如果不能(在数据库中需要提交或回滚所有打开的事务)获得独家访问。因此,日志永远不会包含进行中的事务,就像您在电源突然关闭(即崩溃)时可能看到的那样。

.ldf 文件基本上是空的?如果 .ldf 文件不为空,它包含什么?

  • SIMPLE恢复:日志文件将包含描述CHECKPOINT数据库关闭之前发生的日志记录。(CHECKPOINT在此模式下,A也会清除日志。)

  • BULK_LOGGEDFULL恢复:日志文件将包含所有尚未清除的日志记录。(此模式下唯一清除日志的过程是日志备份。)

提示:可以使用未记录的 TVF 检查日志文件中的日志记录sys.fn_dblog

如果我删除 .ldf 文件并手动创建一个新的 0 字节长的 .ldf 文件,其名称与以前相同,我是否能够再次附加数据库而不会丢失数据?

这样做会破坏文件头信息,从而破坏日志文件。

要附加数据库,您必须删除/重命名日志文件,并使用附加数据库ATTACH_REBUILD_LOG让 SQL Server 在默认位置从头开始创建新的日志文件。

假设你这样做了,

  • SIMPLE恢复过程中,不会丢失任何用户数据,因为所有消失的都是相对不重要的CHECKPOINT日志记录。

  • 在其他恢复模型中,它会破坏日志备份链,显然任何已删除的日志记录都无法再备份(并且可能尚未备份)。如果需要恢复数据库,这具有明显的含义。

所以……从技术上讲,不,不会有任何立即的数据丢失;但是,这种方法肯定不是一个好的做法,尤其是在SIMPLE.