Sql server 为什么可以';我不能收缩事务日志吗?
我正在将一些历史数据库转换为只读,并尝试清理它们。我想把事务日志压缩到1MB。我意识到收缩事务日志通常被认为是不好的做法,但我认为这可能是规则的例外 数据库在SQL Server 2012标准上设置为简单恢复。因此,我本以为在发出CHECKPOINT语句之后,事务日志的内容可以收缩,但这不起作用 我试过:Sql server 为什么可以';我不能收缩事务日志吗?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我正在将一些历史数据库转换为只读,并尝试清理它们。我想把事务日志压缩到1MB。我意识到收缩事务日志通常被认为是不好的做法,但我认为这可能是规则的例外 数据库在SQL Server 2012标准上设置为简单恢复。因此,我本以为在发出CHECKPOINT语句之后,事务日志的内容可以收缩,但这不起作用 我试过: 手动发出检查点命令 分离/附加文件 备份/还原数据库 从简单恢复切换到完全恢复,再切换到简单恢复 以威胁的方式挥舞我的拳头 每次尝试之后,我都试着跑步: DBCC收缩文件(N'MYDAT
- 手动发出检查点命令
- 分离/附加文件
- 备份/还原数据库
- 从简单恢复切换到完全恢复,再切换到简单恢复
- 以威胁的方式挥舞我的拳头
- DBCC收缩文件(N'MYDATABASE_2010_log',0)
- DBCC收缩文件(N'MYDATABASE_2010_log',0,仅截断)
- DBCC收缩文件(N'MYDATABASE_2010_log',1)
RecoveryUnitId FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
0 2 5266014208 8192 15656 0 64 0
0 2 5266014208 5266022400 15673 2 128 0
有人知道我做错了什么吗?这对我来说是一个新的错误。然而,过程似乎很清楚;通过少量扩展日志文件来创建一些新的VLF,然后在数据库中引入一些搅动,以便当前的大型VLF不是活动VLF。前两个VLF的大小各为5GB。你得设法摆脱它们。我想不出有任何一系列的收缩和生长可以做到这一点。我从来没有听说过分裂或缩小VLF的可能性
只需创建一个新的日志文件。一个数据库可以有多个数据库。然后,删除旧的日志文件。考虑到有关预先备份的常见警告。我找到了答案 分离数据库,重命名日志文件,使用以下方法连接数据库:
CREATE DATABASE xxxx ON (FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\xxxx.MDF') FOR ATTACH_REBUILD_LOG;
如果您无法截断和收缩日志文件,那么您应该做的第一件事是检查是否存在避免截断日志的真正原因。执行此查询:
SELECT name ,
log_reuse_wait ,
log_reuse_wait_desc ,
FROM sys.databases AS D
您可以按数据库名称进行筛选
如果log\u reuse\u wait
的值为0
,则可以截断数据库日志。如果该值不是0,则可以避免截断。有关详细信息,请参阅文档中的日志重用等待值说明。或者在这里更好:。如果值为1
,则可以等待检查点,或手动运行检查点:
检查无任何原因可以避免日志文件截断后,可以执行常规的备份顺序(日志,全部增量)和DBCC SHRINKDATABASE
或DBCC SHRINKFILE
。文件是否应该收缩
如果此时文件没有收缩,不要担心,原因是日志文件的物理结构,可以解决:
日志文件用作循环缓冲区,只能通过删除文件结尾来截断。如果循环缓冲区的已用部分位于文件的末尾,则不能将其截断。您只需等待事务日志的已用部分前进,并从文件的末尾移动到文件的开头。一旦发生这种情况,您可以运行其中一个shrink命令,您的文件将无故障地收缩。这在本页中有很好的解释:
如果要强制日志文件活动部件从缓冲区的末尾移动到开头:
- 在事务中对DB执行一些非常繁重的操作并回滚,以进一步移动事务日志指针
- 重复备份以截断日志
- 缩小文件。如果日志的活动部分移动得足够远,文件将收缩
msg5020,16级,状态1,第1行,不能从数据库中删除主数据或日志文件。
好吧,我想你必须研究一下如何做到这一点。听起来您必须先转移主属性。我投票将此问题作为离题题结束,因为它属于dba.stackexchange.com上的dba问题。
SELECT name ,
log_reuse_wait ,
log_reuse_wait_desc ,
FROM sys.databases AS D