Questions tagged «transaction-log»

事务日志是由数据库管理系统执行的修改列表/历史记录,以确保ACID属性在崩溃或硬件故障时得以保留。

2
这两个SQL Server回滚有何不同?
在SQL Server 2008 R2中,这两个回滚有何不同: 运行ALTER语句几分钟,然后单击“取消执行”。完全回滚需要几分钟。 运行相同的ALTER语句,但是请确保该LDF文件的大小不足以使其成功完成。一旦达到LDF限制并且不允许“自动增长”,查询执行将立即停止(或发生回滚),并显示以下错误消息: The statement has been terminated. Msg 9002, Level 17, State 4, Line 1 The transaction log for database 'SampleDB' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases 这两个方面在以下几点上有何不同? 为什么第二个“回滚”是瞬时的?我不确定是否可以将其称为回滚。我的猜测是,事务日志是在执行过程中编写的,一旦它意识到没有足够的空间来完全完成任务,它就会以一些“结束”消息停止,而不会提交。 第一次回滚需要很多时间(回滚是单线程的)会发生什么? 2.1。SQL Server会返回并撤消LDF文件中的输入吗? 2.2。该LDF文件大小在回滚结束变得更小(从DBCC …

6
事务日志不会减少,数据库认为它正在复制
我有一个运行Kaspersky Security Center的SQL Server 2008 R2 Express数据库,我不知道在什么情况下会进行安装,但是该数据库似乎认为它已被复制并且不会从事务日志中释放任何空间。例如: USE master; SELECT name, log_reuse_wait, log_reuse_wait_desc, is_cdc_enabled FROM sys.databases WHERE name = 'KAV'; SELECT DATABASEPROPERTYEX('KAV', 'IsPublished'); 返回: name | log_reuse_wait | log_reuse_wait_desc | is_cdc_enabled -----|----------------|---------------------|--------------- KAV | 6 | REPLICATION | 0 DATABASEPROPERTYEX('KAV', 'IsPublished') ---------------------------------------- 0 [not published] 同样Replication,SSMS 的部分中没有列出任何内容。 到目前为止,我已经尝试了一些来自Google结果的陈述: USE KAV; …

1
DBCC CHECKDB每20-60秒触发一次
我有一个开发环境,正在迅速将其部署到生产环境中,并且在日志中注意到大约每20秒我会看到以下消息: Starting up database 'dbname' CHECKDB for database 'dbname' finished without errors 我注意到了这一点,因为测试此问题的最终用户遇到了一个问题,但我将其隔离为Windows事件日志(应用程序日志)中发现的错误: The log for database 'dbname' is not available. Check event log for related messages. 顺便说一句,我没有找到相关消息,但是通过离线/在线周期解决了。 我唯一能想到的是该应用程序每1毫秒收集一次数据,但是不会将所有这些数据插入数据库中。作为开发服务器,已对其进行了配置,以使日志和数据位于同一驱动器上。考虑到这两条信息,我倾向于将其作为IO问题,并且服务器正在尝试从与存储(SAN)的连接断开中恢复。但是,即使这对我来说也没有意义,因为它不会丢失所有数据库,而只是丢失所有数据库。还有什么可能导致这种情况? 平台:Windows Server 2008 R2上的SQL Server 2008 R2(Ent。)(标准)

4
使用SQL Server FILESTREAM时保持(部分)备份较小
我有一个数据库,其中有近1TB的FILESTREAM数据不需要备份(如果删除了该数据,则会在几个小时内自动重新创建,因此并不重要)。大多数数据每两天更改一次,因此差异备份并不能真正帮助减小容量。 我有工作,我需要通过恢复模式设置的方式备份Full,创建一个单独FILEGROUP的FILESTREAM,然后取的只有“主”的备份FILEGROUP。造成的问题是日志文件(也已备份)现在不必要地很大,因为它包含FILESTREAM数据。 SIMPLE恢复模式使我无法执行特定FILEGROUPs的备份,因此我也不认为这是一个选择。 我的想法只是将FILESTREAM数据移到一个单独的数据库中,但是现在我失去了参照完整性,并且肯定还会继承许多其他问题。 有什么方法可以在Simple恢复模式下创建部分备份(无需将FILESTREAM表设置为只读)?如果没有,我的问题是否还有其他合理的解决方案?



1
ALTER TABLE…DROP COLUMN真的是仅元数据操作吗?
我发现了一些表明ALTER TABLE ... DROP COLUMN是仅用于元数据的操作的源。 资源 怎么会这样?是否不需要从基础非聚集索引和聚集索引/堆中清除DROP COLUMN期间的数据? 此外,为什么Microsoft Docs暗示它是完全记录的操作? 对表所做的修改将被记录并且可以完全恢复。影响大表中所有行的更改(例如删除列或在某些版本的SQL Server上添加具有默认值的NOT NULL列)可能需要很长时间才能完成并生成许多日志记录。与影响许多行的任何INSERT,UPDATE或DELETE语句一样小心地运行这些ALTER TABLE语句。 作为第二个问题:如果未从基础页面中删除数据,引擎将如何跟踪丢失的列?

2
SQL Server事务日志备份:测试尾日志是否紧随最近的已知日志备份
我们正在使用具有完全恢复模式的SQL Server。给定完整备份和一系列日志备份,我们希望能够检查从上次完整备份到当前尾日志的日志链是否完整。(实际上并没有还原这些备份;这里的目的是测试备份的一致性。) 我已经知道如何对现有备份执行此操作:使用RESTORE HEADERONLY,我可以获取每个文件的FirstLSN和LastLSN,可以对连续文件进行比较,以确定它们是否兼容。 但是,我不知道如何检查尾日志是否在上次日志备份之后。 如果我具有尾日志的FirstLSN,则可以将其与上一个日志备份的LastLSN进行比较。但是,如何获取尾部日志的FirstLSN? 我需要一个从SQL Server 2005向上运行的解决方案(最好使用t-sql)。到目前为止,我搜索Google均无济于事。顺便说一句。我首先将其发布在stackoverflow上。但是将其迁移到这里,因为它在此处被标记为脱位。 编辑 我在一个小示例(SQL Server 2005,9.0.5057)上尝试了两个提供的解决方案: BACKUP DATABASE TestDb TO DISK = 'C:\temp\backup test\Full.bak' -- fire some update queries BACKUP LOG TestDb TO DISK = 'C:\temp\backup test\Log1.bak' -- fire both queries from the provided answers: -- Martin Smith's answer yields: 838886656088920652852608 -- Shawn …

1
具有LOG_BACKUP log_reuse_wait_desc的SQL Server 2012简单恢复模型
虽然我在做我自己的调查,没有人知道为什么在数据库SIMPLE恢复模型LOG_BACKUP的log_reuse_wait_desc? SQL Server 2012 SP1。数据库是在几周前创建的。没有复制,没有镜像,没有日志传送,而且从未有过这些。 我们做了备份数据库,并恢复到另一个实例,它显示了SIMPLE和NOTHING在log_reuse_wait对其他实例。但是我不认为还原到另一个实例是重现此问题的好方法,因为还原操作会前滚/回滚事务。

2
SQL Server 2008 R2使用事务日志还原COPY_ONLY完整备份
经过一些研究,我似乎找不到这个问题的答案。 背景我正在尝试设置一个符合以下三个要求的备份计划: 备份的可靠性,每晚进行一次完整备份 可以从中还原的事务日志备份 磁盘空间不足 备份必须在本地可用于审核工具 因此,为了满足这些需求,我正在考虑每周进行完整备份,每天进行差异备份以及每小时进行一次备份。然后,每天晚上将运行可在异地运送的copy_only备份,这样做是为了使日志链不会损坏,并且我们可以在可靠的夜间进行完整的异地备份,而不必占用太多本地磁盘空间。 问题是否可以从copy_only备份还原,然后再还原事务日志。 让我举一个例子,让您知道我在说什么。 使用下面的列表,我想知道是否可以还原FullbackupCOPY_ONLYC.bak,然后还原TransactionbackupG.trn,TransactionbackupH.trn,最后是TransactionbackupI.trn > ---List of Backups--- FullbackupA.bak 01/01/2013 00:00:00 > DifferntialbackupA.bak 02/01/2013 00:00:00 FullbackupCOPY_ONLYA.bak 02/01/2013 00:00:00 > TransactionbackupA.trn 02/01/2013 01:00:00 > TransactionbackupB.trn 02/01/2013 02:00:00 > TransactionbackupC.trn 02/01/2013 03:00:00 > DifferntialbackupB.bak 03/01/2013 00:00:00 FullbackupCOPY_ONLYB.bak 03/01/2013 00:00:00 > TransactionbackupD.trn 03/01/2013 01:00:00 > TransactionbackupE.trn 03/01/2013 …

2
事务日志文件的内容更详细
我有一个关于事务日志(简称为LDF)内容的问题。我假设数据库具有完整的恢复模型。 我已经读到LDF文件包含(记录)对数据库的每个操作(处于完全恢复模式)。与期间记录BEGIN TRAN; COMMAND(s); COMMIT有何不同?我问是因为显然您可以回滚事务,但是您不能回滚标准命令(在完全恢复模式下)。 我猜想在事务处理期间,被记录到LDF文件中的内容与常规的完全恢复日志记录中的内容不同。那正确吗?有什么不同?难道每个动作都只包含“撤消”操作吗? 在相关说明中,我听说有使用完整恢复LDF文件来“回滚/撤消”标准查询的商业工具。他们是如何做到的呢?他们是否分析LDF内容并尝试提出逆/撤消运算?

3
可怜的基数估计使INSERT无法进行最少的记录?
为什么第二个INSERT语句比第一个语句慢5倍? 从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,《数据加载性能指南》中的文档指出,两个插入都应该能够被最小限度地记录。因此,如果最小日志记录是关键性能差异,那么为什么第二个查询不符合最小日志记录的条件?可以采取什么措施来改善这种情况? 查询#1:使用INSERT ... WITH(TABLOCK)插入5MM行 考虑以下查询,该查询将5MM行插入堆中。该查询在中执行1 second并生成64MB事务日志数据,如所报告sys.dm_tran_database_transactions。 CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL) GO INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n) SELECT n -- Any table/view/sub-query that correctly estimates that it will generate 5MM rows FROM dbo.fiveMillionNumbers -- Provides greater consistency on my laptop, where other processes are running OPTION …


2
如何确定行的可见性?
在最简单的情况下,当我们在表中插入新行(并且提交事务)时,所有后续事务都将看到该行。xmax在此示例中看到为0: CREATE TABLE vis ( id serial, is_active boolean ); INSERT INTO vis (is_active) VALUES (FALSE); SELECT ctid, xmin, xmax, * FROM vis; ctid │xmin │ xmax │ id │ is_active ───────┼─────┼──────┼────┼─────────── (0,1) │2699 │ 0 │ 1 │ f 当我们更新它时(因为该标志被FALSE意外设置为),它会发生一些变化: UPDATE vis SET is_active = TRUE; SELECT ctid, xmin, …

2
镜像数据库上的事务日志维护
SQL Server版本:2008 R2 Enterprise SP2 我试图解决我们的SQL Server维护问题,遇到了一些我认为不正确的问题。我们有一个生产实例,其中有3个数据库都异地镜像到DR实例。 在查看DR实例时,我注意到LDF文件非常庞大,对于频繁使用的数据库,该文件超过35GB。 我知道这可能是由于镜像数据库处于完全恢复模式,并且从未备份过日志,它们只会继续增长直到驱动器空间用尽。 我们正在主体数据库上进行日志备份,而我的问题是在镜像上进行日志备份的陷阱是什么? 在进行日志备份之前,至少必须完成一次从镜像的完整数据库备份,在这种情况下,由于镜像是镜像,是否需要使用特殊选项? 同样,这是MIRROR数据库上的事务日志维护建议。 感谢您的输入

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.