题
我不是一个SQL专家,我提醒的事实,每次我需要做一些超越基本知识。我有一个测试数据库,是不大,但交易日志的肯定。我怎么清晰的交易日志?
解决方案
做一个日志文件,小的真的应该保留用于方案中遇到了意想不到的增长,你不希望再发生。如果日志文件将增长到同样的尺寸,再次,不是很多是通过缩小它暂时的。现在,取决于恢复目标的数据库,这些都是你应做的。
第一,采取一个完整的备份
从来没有做任何改变你的数据库没有确保你可以恢复它应有的东西去错误的。
如果你关心点时间恢复
(并通过点时间恢复,我的意思是你关心的是能够恢复到什么比一个完全或差异的备份。)
大概是你的数据库是在 FULL
恢复模式。如果不是,则确保这是:
ALTER DATABASE testdb SET RECOVERY FULL;
即使你是采取定期的全备份,记录文件将成长和壮大,直到执行一个 日志 备-这是为了保护你,不要毫无必要吃掉你的磁盘空间。你应该执行这些登录备份相当频繁,根据你的恢复目标。例如,如果你有一个业务规则,各国可以承受的损失不超过15分钟的数据,在发生灾难时,应该有一份工作,这份日志,每次15分钟。这是一个脚本,将产生时间戳文件名称根据目前的时间(但你也可以这样做,与维护计划等, 只要不选择任何缩小选择,在维护计划,它们是可怕的).
DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_'
+ CONVERT(CHAR(8), GETDATE(), 112) + '_'
+ REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
+ '.trn';
BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;
注意, \\backup_share\
应该是在一个不同的计算机,表示一个不同的基础存储设备。支持这些可达到相同的机器(或不同机使用的相同的基础盘,或不同虚拟机的相同物理主)并没有真正帮助你,因为如果机的打击,你已经失去了你的数据库 和 其备份。根据网络基础设施则可能更有意义的备份地,然后将他们转移到一个不同的位置幕后;在这两种情况下,你想得到他们的主机数据库尽可能快地。
现在,一旦你有定期记录的备份在运行,它应该是合理的缩小的记录文件的更合理比任何它吹到现在。这并 不 意思是运行 SHRINKFILE
一遍又一遍直到该日志文件1MB-即使你是备份的录频繁,它仍然需要适应的总和任何并行的交易可能发生。日志文件自动增长的事件是昂贵的,因为SQL服务器零出的文件(不同于数据文件时,文件的即时初始启用),以及用户的交易必须等待的同时发生这种情况。你想要做到这一增长的收缩增长缩程序尽可能少,并且你肯定不想让你用户支付。
注意,你可能需要对备份记录之前有两次心理医生是可能的(谢谢罗伯特*).
所以,你需要拿出一个实际尺寸对于你的记录文件。这里没有人可以告诉你什么那是不知道很多关于你的系统,但是如果你已经频繁地收缩日志文件,它已再次增长,好的水印可能是10至50%,高于最大它。让我们说,涉及到200MB和你想的任何后续自动增长的事件,是50MB,然后你可以调整的记录文件的尺寸是这样的:
USE [master];
GO
ALTER DATABASE Test1
MODIFY FILE
(NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO
请注意,如果登录文件是目前>200兆,可能需要运行这一:
USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
GO
如果你不关心点时间恢复
如果这是一个测试数据库,和你不关心点时间恢复,那么你应该确保数据库是在 SIMPLE
恢复模式。
ALTER DATABASE testdb SET RECOVERY SIMPLE;
把数据库中 SIMPLE
恢复的模式将确保SQL服务器重新使用的部分记录文件(基本上逐步淘汰不活跃的交易)而不是增长保持一个记录的 所有 交易(喜欢 FULL
恢复并直到你回来了log)。 CHECKPOINT
活动将有助于控制日志,并确保它不需要增加,除非你产生很大的t-日志之间的活动 CHECKPOINT
s.
接下来,你应该做的绝对肯定,这一登录的增长是真正由于异常事件(就是说,年度春季清洁或重建最大的索引),而不是由于正常的日常生活使用。如果你缩小的记录文件可笑的小尺寸和SQL服务器只有增长,它又要满足你的正常活动,什么你有没有增加?您是否能够使用的磁盘空间,你释放了只是暂时?如果你需要立即解决,然后就可以运行如下:
USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO
否则,设置一个适当规模和增长率。为每个实例中点时间恢复的情况下,可以使用相同的代码和逻辑,以确定哪些文件的尺寸是适当和合理设置自动增长的参数。
有些事情你不想做的
回到了日志
TRUNCATE_ONLY
选项,然后SHRINKFILE
.对于一个,这个TRUNCATE_ONLY
选择已经被废弃和不再可用,在当前版本的SQL服务器。第二,如果你是在FULL
恢复模式,这将会摧毁你的日志链需要一个新的、完整的备份。分离数据库,删除的日志文件,以及重新连接.我不能不强调如何危险的,这可能是。你的数据库可能不回来了,它可以作为犯罪嫌疑人,你可能已经恢复备份的(如果有),等等。等等。
使用"缩小数据库"的选择.
DBCC SHRINKDATABASE
和维护计划中的选择这样做是不好的想法,尤其是如果你真的只是需要解决的一个日志问题的问题。目标文件要调节和调整它的独立,使用DBCC SHRINKFILE
或ALTER DATABASE ... MODIFY FILE
(实例)。收缩的记录文件1MB.这看起来很诱人,因为,嘿,SQL服务器会让我这样做在某些情况下,看看所有的空间,它可以释放!除非你的数据库的只读(是的,你应该记它作为这样使用
ALTER DATABASE
),这绝对只是导致许多不必要的增长的事件,因为该日志具有以适应当前的交易,无论恢复模式。什么是点腾出空间的暂时的,只是让SQL服务器可以拿回去慢慢地和痛苦?创建一个二日志文件.这将提供临时救济的驱动,填补了你的磁盘,但是这就像是试图解决一个被刺穿肺带的援助。你应该处理的问题日志文件,而不是直接的,只是添加另一个潜在的问题。比其他的重新定向某些交易日志活动的不同驱动的,第二登录文件确实没有什么为您(不同于第二个数据文件),因为只有一个文件以往任何时候都可以使用的时间。 保罗*兰道尔也解释了为什么多个日志文件可以咬你之后.
应积极主动的
而不是缩小日志文件,以便某些少量,让它不断自动增长在一个小的速度,设置一些相当大的尺寸(一个会容纳的总和你最大的集的并行事务),并设置一个合理的自动增长设定为后备,所以,它并没有增长,多次满足单个交易等,这将是比较少见它曾经有在成长的正常业务操作。
最可能的设置这里有1MB增长或10%的增长。有趣的是,这些默认SQL服务器(这是我们抱怨, 要求的变化都无济于事)-1MB数据文件,以及10%为登录文件。前者太小,在今天和这个时代,而后者导致长的事件,每次(说,你的记录文件是500兆,第一次增长50MB,下一个增长为55MB,下一个增长是60.5MB,等等。等等。-和在缓慢I/O,相信我,你会真注意到这一曲线)。
进一步阅读
请不要站在这里;虽然很多建议你看看,有关于缩小的记录文件本身就是坏,甚至潜在的灾难性的,有一些人,他们更关心的数据的完整性比释放磁盘空间。
一个博客后,我写在2009年,当我看到一些"这里是如何缩小的记录文件"的帖子弹了.
一篇博客Brent Ozar写了四年前,指向多的资源,响应到SQL服务器杂志上的文章应该 不 已经发表.
其他提示
免责声明: 请读下面的评论中仔细,并且我假定你已经阅读过了所接受的答案。正如我所说的将近5年前:
如果任何人有任何评论意见添加的情况下,当这不是一个 足够的或最佳解决方案然后请下面的评论
正确的点击数据库上的名称。
选择任务→缩→数据库
然后点击 "确定"!
通常我打开窗户资源管理器的目录数据库文件,这样我就可以立即看到效果。
实际上,我是很惊讶这工作!通常我用阻,但我只是试图,而且它没有收缩什么,所以我试图GUI(2005年)和它的工作的伟大解放了17GB在10秒内
在完全恢复模式,这可能不工作,所以你要么回日志的第一个,或更改对简单恢复,则收缩的文件。[感谢@onupdatecascade此]
--
PS:我很欣赏是什么一些评论关于危险这一点,但在我的环境我没有任何问题做这个我自己特别是因为我总是做一个完整的备份第一次。因此,请考虑你的环境,以及如何影响到您的备战略和工作安全之前,在继续。所有我所做的是指人们的一个特征提供微软!
USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO
你可以想到备份的第一个。
下面是一个脚本来缩小交易日志,但我会绝对让你备份的交易日志之前缩小。
如果你只是收缩的文件,你会失去一吨的数据,可能会作为一个生命的保护的情况下的灾难。交易日志包含很多有用的数据,可以读取使用一个第三方交易日志的读者(它可以阅读手动,但与极端的努力虽然).
交易日志也是一个必须时候来点时间恢复的,所以不只是把它扔掉,但要确保你回它。
这里有几个职位的人使用的数据保存在交易日志,以完成恢复:
USE DATABASE_NAME;
GO
ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);
ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO
你可能会得到一个错误看起来像这样的时执行命令以上
"无法收缩的记录文件(日志的文件的名称),因为逻辑 日志文件末尾的文件在使用"
这意味着TLOG是在使用。在这种情况下试图执行这几次在一个行或找到一种方法,以减少数据库的活动。
如果你不使用交易日志,用于恢复(即你永远只能做完整的备份),可以设置回收模式,以"简单",并且交易日志将很快缩小和永远无法填补再次出现。
如果您使用的是SQL7或2000年,可以启用"截断日志上的检查站"数据库中选择选项。这具有同样的效果。
这不是建议在生产环境中很明显,因为你将无法恢复到一的时间点。
大多数的答案在这里,迄今假设你实际上并不需要交易日志文件,但是如果你的数据库使用 FULL
恢复模式,而你想保持你的备份以防万一你需要恢复的数据库,然后 不不 截断或删除的日志的文件的方式,许多这些答复的建议。
消除日志文件(通过截断它,放弃它,删除它,等等)将打破你的备份链,并将阻止你恢复的任何时间点,因为你最后一次全、差异或交易记录备份,直到下一个完整或差异的备份。
我们建议,你从来没有使用NO_LOG或TRUNCATE_ONLY手 截断的交易日志,因为这打破了记录链。直到 下一个完整或差异的数据库备份数据库不是 保护媒体的失败。使用手册记录的截断在只有非常 特殊情况,并建立备份数据。
为了避免这种情况,日志文件备份 磁盘 之前缩小。法看起来像这样的东西:
BACKUP LOG MyDatabaseName
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'
DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)
SQL服务器交易日志需要适当地保持以防止其不必要的增长。这个装置运行交易记录备份往往不够。由不这样做,你的风险的交易日志成为完全的和开始增长。
除了回答这个问题,我建议阅读和理解的交易日志共同的神话。这些读数可能有助于理解的交易日志和决定什么样的技术用于"清除":
神话:我SQL服务器是太忙了。我不想让SQL服务器交易日志的备份
最大的一个的性能密集型行动在SQL服务器是一个自动增长的事件的在线交易日志的文件。通过不使交易日志备份往往不够,在线交易日志将成为完整的和将要增加。默认增长的尺寸是10%。繁忙的数据库,更快的在线交易日志将会增长,如果交易日志备份不是被创造 创建一个SQL服务器交易日志的备份没有方块的在线交易日志,但是一个自动增长的事件。它可以阻止的所有活动的在线交易日志
从 交易日志的神话:
神话:经常日志缩小是一个很好的维护做法
错误的。登录的增长是非常昂贵的,因为新的区块必须是零。所有写入活动停止,数据库中,直到零化是完成,并且如果你的盘写入缓慢或自动增长的尺寸大,暂停可能是巨大的,用户将通知。这是一个原因为什么你想要避免的增长。如果你缩小的记录,它将再次增长,你只是在浪费磁盘操作上不必要的缩小和成长的-再游戏
这种技术,约翰*建议不建议,因为没有保证,该数据库将没有记录文件。变化的数据库,从全面来简单,部队的一个检查站等候几分钟。SQL服务器将清除的记录,然后你就可以缩小使用阻SHRINKFILE.
第一个检查数据库恢复模式。默认情况下,SQL Server表达版创建一个数据库,用于简单的恢复 模型(如果我没有记错的话).
备份登录名称与Truncate_Only:
DBCC ShrinkFile(yourLogical_LogFileName, 50)
SP_helpfile会给你的逻辑登录文件的名称。
参考:
如果你的数据库是完全恢复模式,如果你不把TL备,然后将其更改为简单。
使用 DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)
命令。如果这是一个测试数据库和你都在试图保存/收回空间,这将有所帮助。
但记住TX日志做一样的最低/稳定的国家大小,他们会成长起来的。取决于你恢复模式可能无法收缩的日志,如果在全面和你是不是发TX登录备份的录不能缩小它将增长直到永远。如果你不需要TX登录备份,交换你回收模型 简单的.
记住,从来没有在任何情况下删除的日志(LDF)的文件!你会非常有即时的数据库腐败。熟!做!丢失数据。如果保留"并没有得到修复"的主要MDF文件可能成为腐败的永久。
永远不要删除的交易日志-你会丢失数据。部分数据是在TX记录(无论恢复模式)...如果分离和"重新命名"TX日志文件,该文件有效 删除 部分数据库。
对于那些已经删除的日志你可能需要运行一个几checkdb命令和修复损坏之前,你会失去更多的数据。
查看保罗*兰道尔的博客上的这个非常主题, 糟糕的建议.
还在一般不使用shrinkfile在MDF文件,因为它可能会严重碎片的数据。检查他的坏的建议部分更多的信息("为什么你不应该缩小数据文件")
查看保罗的网站-他涵盖了这些问题。上个月他走过许多的这些问题,他的 神话一天 系列。
截取日志文件:
- 备份的数据库
- 分离数据库,无论是通过使用企业的经理或执行: Sp_DetachDB[DBName]
- 删除的交易日志的文件。(或者重新命名的文件,只是在情况)
- 重新连接的数据库再次使用: Sp_AttachDB[DBName]
- 当附加数据库,一个新的交易日志的文件被创建。
缩小的记录文件:
- 备份的录[DBName]与No_Log
收缩的数据库通过:
使用企业管理:- 正确的点击数据库,所有的任务、缩小数据库、文件、选择日志文件,确定。
使用T-SQL:- 阻Shrinkfile([Log_Logical_Name])
你可以找到的逻辑名称登录文件通过运行sp_helpdb或通过查看的属性数据库中的企业的经理。
以我的经验,在大多数SQL服务器没有备份的交易日志。全备份,或者差异备份通常的做法,但是交易记录备份真的很少。因此交易日志的文件的增长永远(直到盘是完全).在这种情况下 恢复模式 应设定为"简单的".别忘了修改系统数据库"模型"和"临"了。
数据库的备份"临"是没有意义的,因此恢复模式的此数据库应该总是"简单"的。
- 采取的一个备份的MDB文件。
- 停止SQL服务
- 重命名的记录文件
- 开始服务
(该系统将建立一个新的日志的文件。)
删除或者移动改名为日志的文件。
试试这个:
USE DatabaseName
GO
DBCC SHRINKFILE( TransactionLogName, 1)
BACKUP LOG DatabaseName WITH TRUNCATE_ONLY
DBCC SHRINKFILE( TransactionLogName, 1)
GO
数据库→权击 性能 →文件→添加另一个日志文件,以不同的名称和设置的路径一样的旧记录文件有不同的文件名称。
该数据库自动挑选了新创建的日志的文件。
- 备份DB
- DB分离
- 重新命名登录文件
- 附DB(同时附上删除重新命名。ldf(日志文件)。请移除按钮删除)
- 新的登录文件将是重建的
- 删除重命名的日志的文件。
这将工作,但它建议采取的备份数据库的第一个。
例如:
DBCC SQLPERF(LOGSPACE)
BACKUP LOG Comapny WITH TRUNCATE_ONLY
DBCC SHRINKFILE (Company_log, 500)
DBCC SQLPERF(LOGSPACE)
这事发生我在哪里,该数据库登录文件的28GBs。
你可以做什么来减少这个吗?实际上,登录文件,这些文件数据SQL服务器保存在一个交易已采取的地方。对于一个交易过程SQL服务器分配网页一样。但是,在完成交易,这些不是释放突然希望有可能是一个交易来像同一个。这个拥有最多的空间。
步骤1:第一次运行这个命令数据库中的查询,探讨了 检查站
步骤2:正确的点击数据库 任务>回来了 选择份类型的交易日志 增加一个目的地的地址和文件名称保留备份的数据(.bak)
重复这一步骤再次在这个时候给另一个文件的名字
步骤3:现在去的数据库 右击数据库
任务>缩小>文件 选择的文件类型如日志 缩小行动,作为释放未使用的空间
步骤4:
检查你记录的文件 通常在SQL2014年这一可以发现在
C:\Program 文件\Microsoft SQL Server\MSSQL12.MSSQL2014EXPRESS\MSSQL\数据
在我的情况下,其降低,从28GB1MB
一些其他的答案没有对我的工作:这是不可能创建的检查站,而该数据库在线,因为交易日志充满(讽刺).然而,设定后的数据库为紧急模式,我能够缩小的记录文件:
alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);
DB交易日志 收缩到最小大小:
- 备份:交易日志
- 收缩的文件:交易日志
- 备份:交易日志
- 收缩的文件:交易日志
我做了测试在几个数DBs: 这个序列的工作.
它通常 缩小到2MB.
或者通过一个脚本:
DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>'; --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>'; --Input Variable
EXEC
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO