请教一个关于事务日志管理的问题

shaolunyuan 2005-06-08 01:22:40
大家好!问题是这样的:
有一个数据库实时接收外部发送过来的数据,进行数据写入操作。
SQL为数据写入做了大量的事务日志管理。很快将硬盘吃光。硬盘大小为 120 G。硬盘满了后,数据救无法写入;我发现这个问题后,参看SQL帮助,将原有的事务日志删除后(按照SQL帮助里说的方法无法将日志删除,我采用的方法是分离数据库,然后删除日志,再附加),同时将日志文件大小限制为500M,然后,随着数据写入工作进行。很快500M大小就被写满,写满后,数据还是无法进行写入。每次写入数据都是失败。没有办法,我又重新将日志文件大小改为:自动增加!

我想请问各位朋友,该如何设置维护计划,使得日志文件大小限制在500M内,同时将要达到500M的时候,自动的删除以前的日志文件。

谢谢!
...全文
138 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
duanduan1122 2005-06-08
  • 打赏
  • 举报
回复
因此,我还想请教下面几个问题:
1、dbcc shrinkfile(logfilename) 这个语句是什么作用呢?我不会执行,不知道 logfilename 该如何输入。所以,在上面我没有执行这个语句。请问该如何输入呢?
回答:
use 你的数据库
sp_helpfile --可以看到你的log文件名称。
dbcc shrinkfile(logfilename)
2、自动收缩数据库何时会被触发呢?经过上面的测试,我发现执行:backup log 数据库名 with no_log 后,只要收缩数据库,日志文件就会被删除。但是,我不知道自动收缩何时会进行,何时才能删除多余的日志。
企业管理器--数据库--右击某个数据库--属性--选项--选择‘自动收缩’
5分钟生效,以后每30分钟系统自动执行一次数据库压缩。
duanduan1122 2005-06-08
  • 打赏
  • 举报
回复
示例
下例将 UserDB 用户数据库中名为 DataFil1 的文件收缩到 7 MB。

USE UserDB
GO
DBCC SHRINKFILE (DataFil1, 7)
GO

duanduan1122 2005-06-08
  • 打赏
  • 举报
回复
DBCC SHRINKFILE
收缩相关数据库的指定数据文件或日志文件大小。

语法
DBCC SHRINKFILE
( { file_name | file_id }
{ [ , target_size ]
| [ , { EMPTYFILE | NOTRUNCATE | TRUNCATEONLY } ]
}
)

参数
file_name

是已收缩文件的逻辑名称。文件名必须符合标识符的规则。有关更多信息,请参见使用标识符。

file_id

是要收缩的文件的标识 (ID) 号。若要获得文件 ID,请使用 FILE_ID 函数或在当前数据库中搜索 sysfiles。

target_size

是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,DBCC SHRINKFILE 将文件大小减少到默认文件大小。

如果指定 target_size,DBCC SHRINKFILE 将试图将文件收缩到指定大小。将要释放的文件部分中的已使用页将重新定位到保留的文件部分中的可用空间。例如,如果数据文件为 10MB,则带有 target_size 为 8 的 DBCC SHRINKFILE 将导致文件最后 2 MB 中所有已用页重新分配到文件前 8 MB 中的任何可用槽中。DBCC SHRINKFILE 不会将文件收缩到小于存储文件中的数据所需要的大小。例如,如果使用 10MB 数据文件中的7 MB,带有 target_size 为 6 的 DBCC SHRINKFILE 语句只能将该文件收缩到 7 MB,而不能收缩到 6 MB。

EMPTYFILE

将所有数据从指定文件中迁移到同一文件组中的其它文件。Microsoft® SQL Server™ 不再允许将数据放在用于 EMPTYFILE 选项的文件上。该选项允许使用 ALTER DATABASE 语句除去文件。

NOTRUNCATE

导致将释放的文件空间保留在文件中。

当与 target_size 一起指定 NOTRUNCATE 时,释放的空间不会释放给操作系统。DBCC SHRINKFILE 的唯一影响是将已使用的页从 target_size 行上面重新定位到文件的前面。当未指定 NOTRUNCATE 时,所有释放的文件空间返回给操作系统。

TRUNCATEONLY

导致文件中的任何未使用的空间释放给操作系统,并将文件收缩到上一次分配的大小,从而减少文件大小,而不移动任何数据。不尝试将行重新定位到未分配页。如果使用 TRUNCATEONLY,将忽略 target_size。

shaolunyuan 2005-06-08
  • 打赏
  • 举报
回复
To: duanduan1122(我要做老大!!!)

非常感谢。我按照你说的这样做的:
1、backup log 数据库名 with no_log
2、手工通过SQL的企业管理器进行收缩数据库

然后就可以发现日志文件删除了。

然后,我还做了这样一个测试:
1、设置数据库的收缩数据库为自动收缩。
2、执行:backup log 数据库名 with no_log

然后,我并没有发现日志文件没有了。

因此,我还想请教下面几个问题:
1、dbcc shrinkfile(logfilename) 这个语句是什么作用呢?我不会执行,不知道 logfilename 该如何输入。所以,在上面我没有执行这个语句。请问该如何输入呢?
2、自动收缩数据库何时会被触发呢?经过上面的测试,我发现执行:backup log 数据库名 with no_log 后,只要收缩数据库,日志文件就会被删除。但是,我不知道自动收缩何时会进行,何时才能删除多余的日志。

再次感谢你的热心!
duanduan1122 2005-06-08
  • 打赏
  • 举报
回复
1。然后将上述代码放到一个作业中
2。定时的调用这个作业就可以实现了
duanduan1122 2005-06-08
  • 打赏
  • 举报
回复
减小日志的方法:
一、用如下步做了:
1、DUMP TRANSACTION 庫名 WITH no_log
2、dbcc shrinkfile(logfilename)
3、收縮數據庫
4、設定自動收縮。

二、
分离数据库,删除日志文件,再附加,OK!
右击数据库--所有任务--分离or 附加

三、

1、backup log 庫名 WITH no_log
2、dbcc shrinkfile(logfilename)
3、收縮數據庫
4、設定自動收縮。
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 C#开发基于FreeSql多库分布式事务、跨库查询、跨库分页查询、跨库增删改等功能实现源码+项目说明+sln.zip **前言** 话说2021年开始了一个基于ASP.NET Core 微服务的项目,谈到微服务 多库环境下 分布式事务、分库分表这些问题都是逃不开的,于是首先从ORM开始调研,需要考虑到一些重要的因素 **功能强大、支持多种数据库(并且行为一致,防止出现换库的情况)、支持分库分表** 等等,这时候第一时间就想到了 [FreeSql](https://github.com/dotnetcore/FreeSql) ,FreeSql的架构设计非常好,每一种支持的数据库都有对应的Provider实现 做到行为一致,而且支持CodeFirst和DbFirst,分库分表FreeSql也有比较简单切有效的方案,本人也经常向FreeSql的作者叶老板请教学习,非常佩服他的技术与人品,也非常感谢他能做出这么好的ORM框架。 **分布式事务** 既然分库了 分布式事务怎么处理,说到分布式事务 常见的解决方案有TCC/SAGA/消息队列最终一致性,在.NET生态中有基于消息队列实现的分布式事务 [CAP](https://github.com/dotnetcore/CAP) ,TCC和SAGA调研了很久没有发现有比较成熟的实现,那么就决定使用`CAP(最终一致性事务)` 由于项目持续的改版,业务的实时性变得越来越高,基于消息队列的这种最终一致性或者说异步事务的方案 越来越不适合我们的项目,这时候就需要同步的事务方案,TCC/SAGE又没有太好的解决方案(我真的没有找到。。),于是想着自己设计一个,基于FreeSql实现事务管理器。 想要的效果:和单库事务一样,出现错误回滚 但是问题来了 多库呢?不同的数据库呢? * 在多库事务的开启时,每个库管理开启自己的事务 * 如果某一个事务开启后的操作出现异常,则回滚全部数据库事务 * 在多库事务提交时,每个库的事务统一提交 * 记录日志,第一个执行Common的数据库称之为主库,会自动创建一个日志表,用于记录多库事务的信息、执行的SQL、业务模块 用于人工介入或者事务补偿 * 如果主库(第一个库)Common成功后,其他某一个库可能由于网络原因、数据库宕机 无法Common事务,导致数据不一致,这时候要根据日志进行事务补偿或者人工介入,例如 存在三个库(订单库、物流库、商品库) 订单库就是主库(会记录日志) 在Common事务时,如果订单库(主库)Common失败,则(订单库、物流库、商品库)事务全部回滚,如果`订单库`(主库)Common成功,但是`物流库`由于其他原因无法Common成功 则会被日志记录并跳过,然后再去Common `商品库` 以及其他库.. **跨库查询/跨库分页查询** 通过时间分片定位、事件委托、分页算法实现跨库分页查询 1.appsettings.json配置 2.初始化数据库 3.获取IFreeSql操作对象 5.跨库分页查询 6. 跨库增删改 7.跨库并行查询(不分页) 8.跨库ToOne查询 9.跨库Any查询 10.分布式事务、多库事务

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧