Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 2005事务日志将不会截断_Sql Server_Transactions_Database Backups_Ssms - Fatal编程技术网

Sql server SQL Server 2005事务日志将不会截断

Sql server SQL Server 2005事务日志将不会截断,sql-server,transactions,database-backups,ssms,Sql Server,Transactions,Database Backups,Ssms,我有一个138 GB的数据库.mdf文件以及55 GB的事务日志文件 恢复模式已设置为“完全”(不需要设置)。我运行了数据库和事务日志的完整备份。事务日志仍为55 GB,没有可用空间来收缩文件 我通过SQLServerManagementStudio GUI运行了备份。然后,我运行以下命令,试图强制trans日志收缩: BACKUP LOG database WITH TRUNCATE_ONLY DBCC SHRINKFILE (logfile, TRUNCATEONLY ) 日志文件仍然是5

我有一个138 GB的数据库
.mdf
文件以及55 GB的事务日志文件

恢复模式已设置为“完全”(不需要设置)。我运行了数据库和事务日志的完整备份。事务日志仍为55 GB,没有可用空间来收缩文件

我通过SQLServerManagementStudio GUI运行了备份。然后,我运行以下命令,试图强制trans日志收缩:

BACKUP LOG database WITH TRUNCATE_ONLY
DBCC SHRINKFILE (logfile, TRUNCATEONLY )
日志文件仍然是55 GB。然后,我将恢复模式更改为
Simple
,并让它搁置几天,但仍然是55GB。我再次尝试了上面的两个命令,但仍然没有截断任何内容

不管我怎么做,这个日志文件都不会缩小。因为我们根本不需要事务日志,我甚至尝试分离数据库,重命名日志文件并重新连接。这也不起作用,因为实际上有两个事务日志,我在尝试在没有日志的情况下重新连接时出错。另一个日志文件只有1MB,我也尝试过删除它,但也得到一个错误,说它不是空的

有什么我不知道的,或者我可以试试的


谢谢你的帮助

尝试设置检查点

这将把所有脏页写入磁盘,从当前数据库的缓冲区缓存中刷新日志页,最大限度地减少恢复过程中必须前滚的修改次数。它会创建一个新的最小恢复日志序列号(lsn),并删除该lsn之前的所有记录,从而缩小文件。

“我甚至尝试分离数据库,重命名日志文件并重新连接”:日志不是可选组件!立即运行DBCC CHECKDB以查看是否已导致损坏。如果由于某种原因存在未刷新的页面,则会导致损坏。即使不是,你也在赌博

SQL Server日志文件不是信息性文本日志

如果您不需要日志,请切换到简单模式并收缩日志文件(您已经这样做了),我不知道它是否有任何作用


查看系统数据库,并查看log\u reuse\u wait\u desc列中的值。它会告诉您是什么使日志保持在原来的位置。

首先,您能将日志文件的初始大小设置得更低吗?如果有人以55GB启动它,它可能不会低于这个值

第二,你可能。第二个将处于“活动”状态,但在第一个已满之前不会使用。如果您没有受限的增长,并且仍然有剩余的磁盘空间,那么第一个磁盘可能永远不会满

第三,正如@JohnNolan所建议的(正如我即将建议的),尝试一个检查点,因为在简单恢复模型下,它应该允许日志截断


此外,建议您

在极少数需要收缩事务日志的情况下,我在SQL Server 2005上使用的命令与您尝试的命令略有不同:

backup log database with no_log
dbcc shrinkfile (logfile,1)
…没有日志
而不是
…只有truncate\u
,并且
dbcc shrinkfile
的第二个参数必须是所需的日志文件新大小)

为了确保日志文件的名称正确(而且因为我懒得键入数据库的名称),我使用以下脚本自动获取数据库和日志文件的名称:

declare @dbname varchar(255)
declare @logfile varchar(255)

select @dbname = db_name()
select @logfile = name from sysfiles where filename like '%.ldf'

backup log @dbname with no_log
dbcc shrinkfile (@logfile,1)
您需要直接在要收缩日志文件的数据库中运行它。
免责声明:我从未在像您这样有多个日志文件的数据库上使用过它。如果默认情况下发现错误的日志文件,您可能必须更改它

如果您不需要
Full
恢复模式,可以在运行脚本之前将恢复模式设置为
Simple

您应该在缩减日志后立即进行完整备份。
如果数据库处于
完全恢复模式,这一点非常重要

(因为缩减日志会破坏日志链,这意味着后续日志备份在您执行下一次完全备份之前是无用的)

ms sql Server一直存在一个问题,但解决方案如下

要强制截断数据库,请执行以下操作:

  • 在收缩之前运行完整的数据库备份
  • 将恢复从完全恢复设置为简单恢复
  • dbcc收缩文件
  • 将恢复设置回完全恢复
  • 收缩后运行完整数据库备份
  • 这是强制收缩的代码

     use master
     Alter database dbname set Recovery simple; 
    
     use dbname
     DBCC SHRINKFILE (dbname_log, 0, TRUNCATEONLY)
     Alter database dbname set Recovery full;
    

    希望这能有所帮助。

    我将如何解决此问题:

    1) 从sys.databases中选择log\u reuse\u wait\u desc,其中name='your\u db\u name'

    这将给你什么阻止VLF被重用。在缓慢期间(即当日志未被大量使用时,应为“无”)。如果看到其他值,可能需要进行故障排除

    2) 看看dbcc loginfo的输出。它为日志文件中的每个VLF返回一行。状态栏告诉您VLF是否正在使用中。为了缩小日志,需要将未使用的VLF放在文件末尾。您可能需要等待自然活动来完成此操作。由于VLF在某种环中使用,因此未使用的VLF最终应位于文件末尾。

    使用以下查询:

    backup log [dbname] with truncate_only
    go
    DBCC SHRINKDATABASE ([dbname], 10, TRUNCATEONLY)
    go
    

    是的,我想今晚下班后我得运行CHECKDB。我希望避免这种情况,但这确实是我唯一没有尝试过的事情…除了从最新的完整备份中恢复。是的,我以前做过分离-重新连接的事情,但破坏得很糟糕。@TonyNelson,日志-重用-等待-描述列显示了什么?它用于准确诊断此场景。运行log\u reuse\u wait\u desc生成“复制”。在服务器上翻找,没有任何复制设置,因此此数据库必须是在某个具有复制的点从其他服务器还原的。不是那样,就是我之前的人做得不对。无论如何,我运行了:使用master EXEC sp_removedbreapplication@dbname='dbname'GO删除replic