这是在 SSC 交叉发布的,但现在恢复需要 6 个小时。
你好,
一夜之间,我使用 NORECOVERY 对 5tb 数据库以及其他几个 250GB - 1.3tb 数据库进行了恢复。我这样做是因为有时我们的 3rd 方备份软件会在认为某些内容超时而实际上没有超时时抛出古怪的 LSN 错误。无论如何,恢复完成没有错误。今天早上,我开始运行 RESTORE WITH RECOVERY 命令,使它们联机以进行 DBCC 检查。
在第一个数据库上运行良好,在 5tb 数据库上卡住了大约一个小时,然后我在其余六个数据库上与 5tb 并行运行命令。他们都恢复得很快。5tb 的数据库现在已经恢复了大约 3 个小时。
任何想法:
为什么这会比两者都花费更长的时间:
a) 恢复通常需要多长时间,以及 b) 比其他数据库恢复所需的时间长得多?
如果我应该取消/终止交易并尝试重新开始
我可以看到它在 sp_WhoIsActive 中做了一些事情,即信息列正在增加,等待信息发生变化(尽管它似乎总是处于等待状态是 IO_COMPLETION),但状态似乎总是被挂起。
在研究时,我发现一篇文章表明高 VLF 计数可能导致此问题,并且日志文件中大约有 5k VLF,但我使用的是 2012 版本,已针对该问题进行了修补:
Microsoft SQL Server 2012 - 11.0.5532.0 (X64) 2014 年 7 月 14 日 15:00:27 版权所有 (c) Microsoft Corporation Developer Edition(64 位)在 Windows NT 6.3(Build 9600:)(Hypervisor)上
谢谢
编辑:
这是在我用于卸载 DBCC …
我们目前有一些ALLOW_PAGELOCKS设置为关闭的索引。这样做大概是为了减少死锁。但是,我怀疑当时它真的会产生影响。
现在我试图了解 SQL Server 何时实际选择开始锁定页面而不是聚集索引中的键。我最近问过 Jonathan Keyhaisas,他告诉我如果我在多个后续页面上触摸行,就会发生这种情况。但是,我没有通过使用示例查询更新聚集索引中的行来获得任何独占页面锁。
你能通过示例查询和表帮助我更好地理解页锁吗?我正在运行 SQL Server 2008 SP4。
提前致谢
马丁
我想破坏一个数据库页面,并恢复相同的页面。
我怎么做?
我已经在 SQL Server 2016 中实现了 Always Encrypted 功能。 CMK 的有效期为一年。如何更新或延长有效期?
我们有一个来自应用程序团队的 AD-HOC 流程,该流程从我们在 SQLserver 中频繁使用的 OLTP 数据库之一获取数据,以将数据迁移到 MongoDB。
在性能测量期间,我们可以看到,当从这个 sql server 获取数据时,他们运行的那部分 CPU 峰值出现了将近一个小时,几乎达到 60-80%。
因此,为了减少这种影响,我们正在考虑使用资源调控器来限制 CPU/内存资源。我从未使用过 RG,但阅读博客似乎是理想的选择。
请建议是否可以实现这一点,或者根据您的经验提出更好的建议。
上述活动是每月一次在 SQL Server 2008R2 中的 5 TB 数据库上获取约 8000 万条数据
我问这个问题的方式是尝试了解我遇到的类似情况,并尝试了解插入视图是如何工作的。
我有这些表:
Create table A([id] int primary key not null, value nvarchar(50) NULL)
Create table B([id] int primary key not null, value nvarchar(50) NULL)
Run Code Online (Sandbox Code Playgroud)
我从两个表创建视图,如下所示:
create View V as (select * from A) UNION ALL (select * from B)
Run Code Online (Sandbox Code Playgroud)
我在 V 视图上有这个触发器:
Create trigger v_trig on V instead of insert AS
insert into v (id,value) select id,value from inserted
Run Code Online (Sandbox Code Playgroud)
当我尝试插入到我的视图中时,出现以下错误:
消息 4436,级别 16,状态 12,过程 v_trig,第 2 行
UNION ALL 视图“db.dbo.V”不可更新,因为未找到分区列
我有一个具有类似视图(带有union all)的数据库,出于某种原因,我可以毫无问题地插入它,我试图理解为什么。
我应该怎么做才能允许插入到诸如视图之类的视图中?有没有办法以插入的方式决定(不更改触发器)哪个是视图的默认表?
我不熟悉 SQL Server 中的执行计划,我试图了解 SQL Server 执行某些操作的原因。查询是:
select P.PERSONID
from KSS_V_EMPLEADOS_PER_3_CERRADOS p, COMBHOMEACCT c, LABORACCT L, kss_carga_empl_centros k, CALENDAR ca
where p.PERSONID = c.EMPLOYEEID
and c.LABORACCTID = l.LABORACCTID
and k.empleado = p.PERSONNUM
and convert(date,ca.CALENDARDTM,103) between DBO.KSS_PrimerDiaMes(convert(DATE,@DFECHA, 103)) and DBO.KSS_UltimoDiaMes(convert (DATE,@DFECHA, 103))
and convert(date,ca.CALENDARDTM,103) between p.Inicio and p.Fin
and convert(date,ca.CALENDARDTM,103) between convert(date,c.EFFECTIVEDTM,103) and convert(date,c.EXPIRATIONDTM-1,103)
and convert(date,ca.CALENDARDTM,103) between k.FECHA_INI and k.FECHA_FIN
and l.LABORLEV4NM <> k.CENTRO
Run Code Online (Sandbox Code Playgroud)
KSS_V_EMPLEADOS_PER_3_CERRADOS是一个没有索引的视图,涉及一些表和函数。它有 12827 行
COMBHOMEACCT c 是一个有 16771 行的表
LABORACCT 是一个有 2460 行的表
kss_carga_empl_centros 是一个有 6594 …
我已经成为 DBA 大约 2 年了,我仍然不了解 AlwaysOn 可用性组的一些微妙之处。首先,据我所知,它们只是麻烦,主要是因为我们环境中经常发生的情况。
我们每月打一次 Windows 补丁,预计服务器会重新启动。大约每月一次,我们会遇到这样一种情况,即具有多个可用性组的集群在集群的节点之间进行自我划分。
如果我正在安排备份作业,我通常会通过主服务器的多服务器管理来管理这些作业。我按照侦听器的分辨率执行此操作,因为它连接到可用性组的主节点。问题是,如果我指定“所有数据库”,则无论给定可用性组的主要/次要状态如何,整个节点都会尝试备份。
因此,在我们的监控解决方案中会产生很多干扰,因为任何具有分散可用性组的集群都会返回备份失败状态,因为失败发生在尝试在二级AG。
在这些情况下,我是否必须编写由可用性组运行的作业脚本?
是否存在仅备份该节点主要的可用性组的设置组合?
我已经提出了合并组的论点,以便我们可以通过 SERVER 而不是 AG 进行管理。我的老板认为我们应该使用 AG 来跨集群进行负载平衡,这样我们就不必为仅用于 HADR 的节点支付 SQL 许可证。我已经提出了这些漫反射 AG 可能出错的所有内容,但也许有一些我不知道的东西。
为清楚起见,我知道我们可以将侦听器指向不同的 AG,并且它们将连接到其各自节点的主节点。我似乎无法管理任何类型的通用备份计划,这些计划不会针对这些拆分 AG 情况产生监控和写入功能冲突。任何人都可以提供的任何清晰度将不胜感激。
这个问题纯粹是由于锁资源导致的死锁。
我正在阅读这篇文章:使用聚集索引解决 SQL Server 死锁问题
他们解释了如何添加非聚集索引或聚集索引解决死锁问题。
一般的想法是 - UPDATE 查询不会因为索引查找而阻塞,这将导致只有少数行被锁定。
然而,SQL Server 的工作方式是 - 引擎在任何时刻(例如在 5000 个行级锁之后 [来源:https ://www.youtube.com/watch ?v=EqfAPZGKifA at 30:25])决定提升lock 为页级锁或表级锁,从而锁定整个对象(例如表)。那么本文给出的解决方案——添加聚集索引是解决死锁的办法——可靠吗?
sql-server ×10
backup ×1
corruption ×1
deadlock ×1
functions ×1
locking ×1
optimization ×1
performance ×1
view ×1