我很好奇,为什么 SQL Server 将msdb.dbo.sysschedules日期和时间的值保存int为datetime. 我认为原因可以追溯到 SQL Server 2000 中的某些内容。
是存储容量问题、性能问题还是其他问题?
我有一个可用性组,需要将一些登录名映射到活动辅助副本上的数据库用户。(Node2) 不幸的是,当我尝试exec sp_change_users_login或 时alter user with login,我收到一条错误消息,告诉我数据库是只读的。这并不奇怪,但我不知道如何解决它。我昨晚尝试故障转移,修复 Node2 上的登录,然后故障返回到 Node1,但随后登录/用户映射最终在 Node1 上出错。当我修复这些问题时,Node2 的登录再次失灵。
这是一个生产系统,所以直到今晚晚些时候我才能做任何我想做的事情。我在我们的测试实验室中没有遇到这个问题。不同之处可能是我之前在加入数据库之前创建了登录名,而这次我尝试在之后创建它们,但未能正确记录该过程。如果可以,我宁愿避免将 AG 拆除并重建它。
这个问题对我来说很有意义,我只是不知道如何解决它。
我们进行了不同类型的基本测试,并且 AlwaysOn 通过了许多测试。我们终于对 AlwaysOn 进行了大量的写测试,它给出了令人惊讶的结果。
实际的测试详细信息在这里,目标是查看 AlwaysOn 可用性组是否可以容纳高写入负载。
我有两个虚拟机,每个虚拟机都运行在 8 个内核和 17GB 的 RAM 上,分配给 SQL Server。
我们编写了一个脚本来生成相当不错的写 I/O(在 20 个线程中)。
每个线程基本上将 24 MB 的数据插入到一个表中,然后在无限循环中删除。
在测试运行的 15 分钟内,自动故障转移的恢复时间估计达到了 12 分钟,这是非常糟糕的。我们尝试了故障转移来确认是否真的需要 12 分钟,大约需要 5 分钟,这仍然太高了。此外,如果我们继续测试三个小时的恢复时间,ETA 几乎是 3 小时,并且在故障转移时需要几个小时才能恢复(显然,如果是集群故障转移,情况就不应该如此,因为所有事务都是已提交的事务)。
所以有几件事..
很明显,synchronous次要副本无法跟上主要正在生成的负载(即使两台机器的配置相同)。这样做的副作用是主日志将继续增长(即使我们进行日志备份,它也无法截断日志)。
我们知道辅助节点每 4 个 CPU 核心使用一个线程来执行重做,这看起来是一个明显的限制。如果主节点运行 100 个线程来生成负载,那么辅助节点无论如何都不能使用那么多线程。
此外,主要在内存中执行其所有事务,并将实际数据文件写入到检查点。但是,secondary 似乎必须从物理日志驱动器读取所有事务并重做。辅助日志池应该使这个过程更快?但是在这种情况下它做得不好。
最后向 AlwaysOn 专家提问:
redo过程究竟是如何发生的?
二级是否使用日志池来缓存日志条目以进行重做?
日志池的大小是多少?它可以增长到最大可用内存吗?
当重做发生时,重做线程将页面读取到缓冲池并像正常事务一样维护它们?
如果二级不能跟上怎么来AlwaysOn文章说恢复时间是几秒?
这使得可用性组的高可用性部分存在问题,因为这些恢复时间是不可持续的。
[由提问者编辑]澄清,由于人们似乎认为这已得到回答,因此主服务器上的事务确实得到了确认(即日志已硬化),因为辅助服务器的状态始终是“同步的”。所以日志的硬化不是问题。因此,在故障转移时永远需要重做过程。这意味着对于生成日志 > 重做线程容量的任何负载,AlwaysOn 将始终比没有它需要更长的时间来恢复。
sql-server sql-server-2012 high-availability availability-groups
碰巧我不得不同时使用 SQL Server 和 Oracle 很长一段时间(幸好不是同时使用)。
仍然让我困惑的是将表存储为平衡树的方法。在类似 Oracle 的 RDMS 堆中是默认的,在 SQL Server(和许多其他)中,相反(集群,IOT)是真实的。每种方法的专家都声称他们的方法是唯一“正确”的,并支持通过大量测试/演示选择的观点。但是,在我看来,他们证明的唯一一点是“非默认”方法的实施很差,并且不应该用于大多数情况......
我很确定这两种方法都足够好(只是因为它们仍然存在于市场上并且表现出相当的性能)并且下面有一些数学运算,但是我没有找到任何好的参考。
我意识到这个话题可能太宽泛而无法回答,非常欢迎好的链接,但我真的很想知道为什么两种看似有争议的方法都证明它们都是有效的。
我在上周有两个实例,其中DROP扩展事件会话的命令花费了一天的时间来完成,等待:PREEMPTIVE_XE_CALLBACKEXECUTE。
谁能解释一下这种等待类型是什么意思?
更多背景信息:
首先,我运行了一个 T-SQL 命令来删除会话,一天后它完成了。使用 时sp_whoisactive,我看到查询正在等待PREEMPTIVE_XE_CALLBACKEXECUTE。
在此期间,对象资源管理器收集元数据的查询被阻止并收到锁定超时,但没有其他抱怨(或者我当时认为)。
我试图在星期五放弃另一个会话,并且发生了相同的行为,只是它不像第一次事件那样在一天后消失。相反,我今天早上发现客户端应用程序无法连接。它被DROP EVENT SESSION查询阻止了。
重新启动 SQL 服务清除了阻塞查询。
我找不到任何有助于诊断这是什么等待类型的东西……以及为什么我的事件会话不会像它们应该的那样下降。你能帮我吗?
服务器信息: SQL 2008 R2 Enterprise with SP2
是否有任何边缘情况建议在存储过程开始时显式检查、删除和创建临时表,而不是仅仅创建它们?
同样,是否存在在存储过程结束时显式删除它们比让 SQL Server 清理它们更可取的情况?
sql-server stored-procedures sql-server-2012 tempdb sql-server-2014
抱歉,如果之前有人问过这个问题,建议的“相关”问题不相关,而且我自己的搜索结果很少。
我需要列出所有存储过程的定义(代码),以便我可以开始处理所有 450 个并添加分号以实现 v2014 标准。
我在这里找到了以下代码并稍微修改了它:
SELECT
obj.Name AS SPName,
REPLACE(modu.definition, 'CREATE PROC', 'ALTER PROC') + 'GO' AS SPDefinition
FROM
sys.sql_modules modu INNER JOIN
sys.objects obj ON modu.object_id = obj.object_id
WHERE
(obj.type = 'P')
ORDER BY
obj.name;
Run Code Online (Sandbox Code Playgroud)
上面的代码是使用 SA 帐户运行的。
我认为这正是我需要的,但是,我刚刚注意到 MSDN 上有人声称它没有按预期显示全文。
将结果粘贴到 SSMS 编辑器中时,我有 46,000 行代码需要处理,因此如果缺少任何内容,对我来说并不明显。我想确保在编辑器中浪费一天之前我已经正确地开始了这个过程。
因此,我正在联系您的专业人士,询问这是否是这种方法的真正缺点,或者是否有替代方法而不是一个一个?
我写了这个查询:
SELECT
"BD - Utilizadores".Utilizador,
"BD - Utilizadores"."Palavra passe",
"BD - Áreas".área
FROM "BD - Utilizadores"
INNER JOIN "BD - Permissões"
on "BD - Utilizadores".id = "BD - Permissões"."user_id"
Join "BD - Áreas"
on "BD - Permissões".area_id = "BD - Áreas".id
Run Code Online (Sandbox Code Playgroud)
我想将表“bd - utilizadores”中的数据与“bd - áreas”连接起来。由于他们没有直接联系,我不得不使用“中间人”,即“bd - Permissões”。这是图表:
我的主要问题是,有没有其他方法可以做到这一点并获得相同的结果?
目前,这些更新可用于 SQL Server 2014:
如果我想做滑流安装:
仅下载 #1 并使用它进行滑流安装就足够了吗?
或者我应该下载 #3,然后进行滑流安装,然后应用 #1?
我现在正在阅读SQL Server 2012 Internals书。SOS 缩写词有几个短语,例如“SOS 调度程序”(在关于调度程序的章节中)、“SOS 内存节点”(在关于空闲缓冲区列表和惰性写入器的章节中)。但我在任何地方都找不到意思。