1.清空日志
DUMP TRANSACTION 数据库名 WITH NO_LOG
2.截断事务日志:
BACKUP LOG 数据库名 WITH NO_LOG
backup log 数据库名 with TRUNCATE_ONLY
这两个执行同样事件,随便用哪个。
3.收缩数据库文件(如果不压缩,数据库的文件不会减小)
同时也注意到将数据库的恢复模式从“完整”改为“简单”。(数据库--》右击--》属性--》选项--》将故障还原 模型改为“简单”。)
SQL语句
--收缩数据库
DBCC SHRINKDATABASE(数据库名)
DBCC SHRINKDATABASE(数据库名,TRUNCATEONLY)
--------------------------------------------------------------
注:DBCC SHRINKDATABASE
( database_name [ , target_percent<释放后数据库文件中所要的剩余可用空间百分比>]
[ , { NOTRUNCATE<据库文件中保留所释放的文件空间>
TRUNCATEONLY<空间释放给操作系统, target_percent无效 )
--------------------------------------------------------------
--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)
也可以在图形界面完成:
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库
b.在我的电脑中删除LOG文件
c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库
此法将生成新的LOG,大小只有500多K
或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。
a.分离
EXEC sp_detach_db @dbname = '库名'
b.删除日志文件
c.再附加
EXEC sp_attach_single_file_db @dbname = '库名',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf'
5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"
--SQL语句设置方式:
EXEC sp_dboption '库名', 'autoshrink', 'TRUE'
6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)
--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
如果经过上面的操作后发现日志非但没有减小,反而略有增大。也考虑到是否要使用分离数据库的方法将日志文件删除后,再附加数据库。但这只是治标不治本的方法,且对系统的运行存在影响。
我们可以执行下面操作
DBCC UPDATEUSAGE 修复数据库的行记录数(DBCC UPDATEUSAGE 对表和聚集索引中 sysindexes 表的 rows、used、reserved 和 dpages 列进行更正。不对非聚集索引的大小信息进行维护。如果 sysindexes 中没有不正确的内容,DBCC UPDATEUSAGE 则不返回数据。如果发现不正确的内容,并对其进行更正,同时没有使用 WITH NO_INFOMSGS 选项,UPDATEUSAGE 就会返回 sysindexes 中所更新的行和列。)
DBCC OPENTRAN(数据库名) 如果在指定数据库内存在最旧的活动事务和最旧的分布和非分布式复制事务,则显示与之相关的信息。只有当存在活动事务或数据库包含复制信息时,才显示结果。如果没有活动事务,就显示信息性消息。
使用 DBCC OPENTRAN 确定打开的事务是否存在于日志中。使用 BACKUP LOG 语句时,只可以截断日志的非活动部分;打开的事务可以导致日志不能完全地截断。在 Microsoft? SQL Server? 的早期版本中,若要清除日志中的未提交事务,必须注销所有用户或关闭并重新启动服务器。如有必要,可以使用 DBCC OPENTRAN 标识并终止打开的事务(通过从 sp_who 输出中获得系统进程 ID)。
exec sp_removedbreplication ‘数据库名’(通常如果你设置过数据库复制或发布,而后来设置失败并没有启用,可能会导致这个问题,你看不到跟复制有关的内容,但是在数据库里却存在这样的东西,于是日志被它堵住了,这成了一个永远无法完成的命令,所以后续的日志都无法截断。执行了这个命令以后,强制清除了复制内容。)