事务日志 (SQL Server)
每个 SQL Server 数据库都有一个事务日志,用于记录所有事务以及每个事务所做的数据库修改。
事务日志是数据库的关键组件。如果出现系统故障,您将需要该日志才能使数据库恢复到一致状态。
事务日志支持以下操作:
如果应用程序发出语句,或者数据库引擎检测到错误(如与客户端的通信丢失),则日志记录用于回滚未完成事务所做的修改。
如果服务器发生故障,数据库可能会处于从未从缓冲区缓存写入数据文件的某些修改的状态,并且数据文件中未完成的事务可能会进行一些修改。启动 SQL Server 实例时,它会运行每个数据库的恢复。日志中记录的可能尚未写入数据文件的每个修改都将前滚。然后回滚在事务日志中找到的每个未完成的事务,以确保保留数据库的完整性。
在影响数据库文件的硬件丢失或磁盘故障之后,可以将数据库还原到故障点。首先还原上一个完整数据库备份和最后一个差异数据库备份,然后将事务日志备份的后续序列还原到故障点。
还原每个日志备份时,数据库引擎会重新应用日志中记录的所有修改以前滚所有事务。还原上次日志备份后,数据库引擎将使用日志信息回滚此时未完成的所有事务。
日志读取器代理监视为事务复制配置的每个数据库的事务日志,并将标记为复制的事务从事务日志复制到分发数据库中。
备用服务器解决方案、AlwaysOn 可用性组、数据库镜像和日志传送严重依赖事务日志。
在 Always On 可用性组方案中,对数据库(主副本)的每次更新都会立即在数据库的单独完整副本(辅助副本)中重现。主要副本将每个日志记录立即发送到次要副本,次要副本将传入的日志记录应用于可用性组数据库,并不断向前滚动
在日志传送方案中,主服务器将主数据库的事务日志备份发送到一个或多个目标。每个辅助服务器将日志备份还原到其本地辅助数据库。
在数据库镜像方案中,对数据库(主体数据库)的每次更新都会立即在数据库(镜像数据库)的单独完整副本中重现。主体服务器实例将每个日志记录立即发送到镜像服务器实例,镜像服务器实例将传入的日志记录应用于镜像数据库,并不断前滚。
SQL Server 数据库引擎事务日志的特征:
事务日志作为数据库中的单独文件或一组文件实现。日志缓存与数据页的缓冲区缓存分开管理,从而在 SQL Server 数据库引擎中生成简单、快速且可靠的代码。
日志记录和页面的格式不受数据页面格式的限制。
事务日志可以在多个文件中实现。可以通过设置日志的值将文件定义为自动扩展。这减少了事务日志中空间不足的可能性,同时减少了管理开销。有关详细信息,请参阅更改数据库 (事务处理 SQL) 文件和文件组选项。
重用日志文件中的空间的机制非常快速,对事务吞吐量的影响最小。
日志截断可释放日志文件中的空间,以供事务日志重用。您必须定期截断事务日志,以防止它填满分配的空间。有几个因素可能会延迟日志截断,因此监视日志大小很重要。可以最少记录某些操作,以减少它们对事务日志大小的影响。
日志截断从 SQL Server 数据库的逻辑事务日志中删除非活动虚拟日志文件 (VLF),从而释放逻辑日志中的空间以供物理事务日志重用。如果事务日志从未被截断,它最终将填满分配给物理日志文件的所有磁盘空间。
为避免空间不足,除非日志截断由于某种原因而延迟,否则在发生以下事件后会自动截断:
监视 SQL Server 事务日志大小、收缩事务日志、添加或放大事务日志文件、优化 tempdb 事务日志增长率以及控制事务日志文件的增长。
使用 sys.dm_db_log_space_usage 监视日志空间使用情况。此 DMV 返回有关当前使用的日志空间量的信息,并指示事务日志何时需要截断。
有关当前日志文件大小、其最大大小和文件的自动增长选项的信息,您还可以在 sys.database_files 中使用该日志文件的大小、max_size和增长列。
若要减小物理日志文件的物理大小,必须收缩日志文件。当您知道事务日志文件包含未使用的空间时,这很有用。您只能在数据库处于联机状态时收缩日志文件,并且至少有一个虚拟日志文件 (VLF) 可用。在某些情况下,在下一次日志截断之前可能无法收缩日志。
收缩日志文件会删除一个或多个不保存逻辑日志部分的 VLF(即非活动 VLF)。收缩事务日志文件时,将从日志文件末尾删除非活动 VLF,以将日志减小到大约目标大小。
(1)收缩日志文件(不收缩数据库文件)。
DBCC SHRINKFILE (Transact-SQL)。
收缩文件。
(2)监视日志文件收缩事件。
(3)监视日志空间。
sys.dm_db_log_space_usage。
sys.database_files。
可以通过放大现有日志文件(如果磁盘空间允许)或将日志文件添加到数据库(通常在其他磁盘上)来获取空间。一个事务日志文件就足够了,除非日志空间即将用完,并且保存日志文件的卷上的磁盘空间也已用完。
若要将日志文件添加到数据库,请使用语句的子句。添加日志文件允许日志增长。ADD LOG FILEALTER DATABASE
若要放大日志文件,请使用语句的子句,指定 和 语法。有关详细信息,请参阅更改数据库 (事务处理 SQL) 文件和文件组选项。
重新启动服务器实例会将 tempdb 数据库的事务日志大小调整为其原始的自动增长前大小。这会降低 tempdb 事务日志的性能。
可以通过在启动或重新启动服务器实例后增加 tempdb 事务日志的大小来避免此开销。
使用 ALTER 数据库 (Transact-SQL) 文件和文件组选项语句来管理事务日志文件的增长。请注意以下几点:

我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和
如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我正在使用ruby标准记录器,我想要每天轮换一次,所以在我的代码中我有:Logger.new("#{$ROOT_PATH}/log/errors.log",'daily')它运行完美,但它创建了两个文件errors.log.20130217和errors.log.20130217.1。如何强制它每天只创建一个文件? 最佳答案 您的代码对于长时间运行的应用程序是正确的。发生的事情是您在给定的一天多次运行代码。第一次运行时,Ruby会创建一个日志文件“errors.log”。当日期改变时,Ruby将文件重命名为“errors.log
在运行Cucumber测试时,我得到(除了测试结果)大量调试/日志相关的输出形式:D,[2013-03-06T12:21:38.911829#49031]DEBUG--:SOAPrequest:D,[2013-03-06T12:21:38.911919#49031]DEBUG--:Pragma:no-cache,SOAPAction:"",Content-Type:text/xml;charset=UTF-8,Content-Length:1592W,[2013-03-06T12:21:38.912360#49031]WARN--:HTTPIexecutesHTTPPOSTusingt
我最近将我的http客户端切换到faraday,一切都按预期工作。我有以下代码来创建连接:@connection=Faraday.new(:url=>base_url)do|faraday|faraday.useCustim::Middlewarefaraday.request:url_encoded#form-encodePOSTparamsfaraday.request:jsonfaraday.response:json,:content_type=>/\bjson$/faraday.response:loggerfaraday.adapterFaraday.default_ada
保存成功后可以回滚吗?让我有一个带有属性名称、电子邮件等的用户模型。例如u=User.newu.name="test_name"u.email="test@email.com"u.save现在记录将成功保存在数据库中,之后我想回滚我的事务(不是销毁或删除)。有什么想法吗? 最佳答案 您可以通过交易来做到这一点,请参阅http://markdaggett.com/blog/2011/12/01/transactions-in-rails/例子:User.transactiondoUser.create(:username=>'Nemu
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
我正在使用此代码在我的Sinatra应用程序中启用日志记录:log_file=File.new('my_log_file.log',"a")$stdout.reopen(log_file)$stderr.reopen(log_file)$stdout.sync=true$stderr.sync=true实际的日志记录是使用:logger.debug("Startingcall.Params=#{params.inspect}")事实证明,只有INFO或更高级别的日志消息被记录,而DEBUG消息没有被记录。我正在寻找一种将日志级别设置为DEBUG的方法。 最佳