zoukankan      html  css  js  c++  java
  • SQL Server 日志收缩方法

    在日常运维中,有时会遇到“The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'.”这样的报错信息。
    此错误消息表明:数据库的事务日志文件空间耗尽,log 文件不能再存储新的transaction log。
    这个时候我们需要进行日志收缩。本文将介绍日志收缩的两种方法。

    通过图形界面进行日志收缩

    第一步:右键数据库属性

    在这里插入图片描述

    第二步:更改数据库恢复模式,将模式改为Simple

    在这里插入图片描述

    第三步:右键数据库,TasksShrinkFiles

    在这里插入图片描述

    第四步:收缩数据库日志,选择文件类型Log,并在Shrink action 中将文件收缩到给出的Minimum 值,这里的数据库因为是新建的没有数据,所以提供的Minimum 值为0MB,可以将红框3中的数字修改为0。

    在这里插入图片描述
    File type:选择所要收缩的是“数据库文件”还是“日志文件”。
    Currebtly allocated space:数据库为该文件分配的大小,就是在磁盘上看到的文件大小。
    Available free space:就是“当前分配的空间” 减去“实际使用的空间”。
    Shrink action:
    ① Release unused space:将该文件中未使用的空间释放出来,数据在文件中不移动;
    ② Reorganize pages before releasing unused space:此选项可以将文件收缩到“指定大小”,并将数据重新组织。其最小值为数据库“实际使用的空间”;
    ③ Empty file by migrating the data to other files in the same filegroup:该选项很少用。

    上述操作也可以使用T-SQL替代:

    DBCC ShrinkFile(‘数据库名’,  targetsize);		/* 收缩数据库文件 */
    DBCC ShrinkFile(‘数据库名_log’,  targetsize);		/* 收缩日志文件 */
    

    Targetsize:单位为兆,必须为整数,DBCC SHRINKFILE 尝试将文件收缩到指定大小。
    DBCC SHRINKFILE 不会将文件收缩到小于“实际使用的空间”大小,例如“分配空间”为10M,“实际使用空间”为6M,当制定targetsize为1时,则将该文件收缩到6M,不会将文件收缩到1M。

    用本例中的数据库替换后如下:

    DBCC ShrinkFile(‘TEST01’,  1);			/* 收缩数据库文件 */
    DBCC ShrinkFile(‘TEST01_log’, 1);		/* 收缩日志文件 */
    

    注意:如若磁盘空间已满,无法进行收缩数据库事务日志文件,可采取先分离出部分暂未使用的数据库,然后将MDF文件及LDF文件进行拷贝到其他空余盘,进行释放磁盘空间,待日志收缩后,再次将分离出的数据库文件进行附加。

    分离数据库操作如下:
    右击数据库,TaskDetach
    在这里插入图片描述
    点击OK
    在这里插入图片描述
    此时发现数据库列表中已经没有TEST01,说明数据库分离成功了。
    在这里插入图片描述
    附加数据库操作如下:
    右击Databases,单击Attach
    在这里插入图片描述
    点击Add,添加数据库文件
    在这里插入图片描述
    选择需要添加的文件后点击OK
    在这里插入图片描述
    检查添加的文件无误后,点击OK
    在这里插入图片描述
    此时在数据库列表中可看到刚附件上去的数据库TEST01
    在这里插入图片描述
    若未显示TEST01,请刷新数据库列表
    在这里插入图片描述

    通过 Transact-Sql 进行日志收缩

    执行如下命令:

    USE [数据库名]
    GO
    ALTER DATABASE [数据库名] SET RECOVERY SIMPLE WITH NO_WAIT
    GO
    --设为简单模式
    ALTER DATABASE [数据库名] SET RECOVERY SIMPLE 
    GO
    USE [数据库名]
    GO
    DBCC SHRINKFILE (N'[log文件名]', [ targetsize], TRUNCATEONLY) 
    GO
    USE [数据库名]
    GO
    ALTER DATABASE [数据库名] SET RECOVERY FULL WITH NO_WAIT
    GO
    --还原为完全模式
    ALTER DATABASE [数据库名] SET RECOVERY FULL 
    GO
    

    [数据库名]替换为具体数据库, [ targetsize]替换为收缩目标值。

    替换为本例中的数据库修改如下:

    USE TEST01
    GO
    ALTER DATABASE TEST01 SET RECOVERY SIMPLE WITH NO_WAIT
    GO
    --设为简单模式
    ALTER DATABASE TEST01 SET RECOVERY SIMPLE 
    GO
    USE TEST01
    GO
    DBCC SHRINKFILE (N'TEST01_log', 1, TRUNCATEONLY) 
    GO
    USE TEST01
    GO
    ALTER DATABASE TEST01 SET RECOVERY FULL WITH NO_WAIT
    GO
    --还原为完全模式
    ALTER DATABASE TEST01 SET RECOVERY FULL 
    GO
    
  • 相关阅读:
    Java 读取txt文件,读取结果保存到数据库
    Java 读取大文件方法
    利用File类过滤器列出目录下的指定目录或文件
    Java 读取指定目录下的文件名和目录名
    利用js日期控件重构WEB功能
    简洁js日历控件的使用
    Tomcat中配置URIEncoding="UTF-8"来处理中文的方法
    Java MVC 增删改查 实例
    严重:The web application [web01] appears to have started a thread named ...
    警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} 解决方法
  • 原文地址:https://www.cnblogs.com/ruishine/p/14310494.html
Copyright © 2011-2022 走看看