Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么可以';我不能收缩事务日志吗?_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 为什么可以';我不能收缩事务日志吗?

Sql server 为什么可以';我不能收缩事务日志吗?,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我正在将一些历史数据库转换为只读,并尝试清理它们。我想把事务日志压缩到1MB。我意识到收缩事务日志通常被认为是不好的做法,但我认为这可能是规则的例外 数据库在SQL Server 2012标准上设置为简单恢复。因此,我本以为在发出CHECKPOINT语句之后,事务日志的内容可以收缩,但这不起作用 我试过: 手动发出检查点命令 分离/附加文件 备份/还原数据库 从简单恢复切换到完全恢复,再切换到简单恢复 以威胁的方式挥舞我的拳头 每次尝试之后,我都试着跑步: DBCC收缩文件(N'MYDAT

我正在将一些历史数据库转换为只读,并尝试清理它们。我想把事务日志压缩到1MB。我意识到收缩事务日志通常被认为是不好的做法,但我认为这可能是规则的例外

数据库在SQL Server 2012标准上设置为简单恢复。因此,我本以为在发出CHECKPOINT语句之后,事务日志的内容可以收缩,但这不起作用

我试过:

  • 手动发出检查点命令
  • 分离/附加文件
  • 备份/还原数据库
  • 从简单恢复切换到完全恢复,再切换到简单恢复
  • 以威胁的方式挥舞我的拳头
每次尝试之后,我都试着跑步:

  • DBCC收缩文件(N'MYDATABASE_2010_log',0)
  • DBCC收缩文件(N'MYDATABASE_2010_log',0,仅截断)
  • DBCC收缩文件(N'MYDATABASE_2010_log',1)
我已经多次看到此错误消息:

无法收缩日志文件2(MYDATABASE_2010_log),因为 逻辑日志文件不能少于2个

有一次,我尝试创建一个虚拟表并向其中添加记录,试图让事务日志滚动到文件末尾,但这只是一个猜测

以下是DBCC SQLPERF(日志空间)的结果

以下是DBCC LOGINFO的结果:

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执行一些非常繁重的操作并回滚,以进一步移动事务日志指针
  • 重复备份以截断日志
  • 缩小文件。如果日志的活动部分移动得足够远,文件将收缩

不确定这是否有帮助,因为前两个VLF的大小为5GB。你总得摆脱他们啊。。。你说得对。由于loginfo输出的格式问题,我没有意识到第一个是5GB。不过,新的日志文件应该可以工作。感谢您的回复!我试过了,但上面说:
msg5020,16级,状态1,第1行,不能从数据库中删除主数据或日志文件。
好吧,我想你必须研究一下如何做到这一点。听起来您必须先转移主属性。我投票将此问题作为离题题结束,因为它属于dba.stackexchange.com上的dba问题。
SELECT  name ,
    log_reuse_wait ,
    log_reuse_wait_desc ,
FROM sys.databases AS D