小编Ste*_*Bov的帖子

幽灵清理设置

我正在运行一个高事务数据库(平均约 175k 事务/分钟,每小时添加和删除近 900 万条记录)

直到最近,这还不是什么大问题,因为我们已经添加和删除了大约 750 万条记录,但是随着最新数据的涌入,幽灵清理似乎无法跟上清理表/索引上未使用的空间。

几天前,我们在 16 个表(主要是其中的 2 个)中达到了 53 GB 的“未使用空间”,因此开始研究 ghost 清理过程,发现它每 5 秒运行一次,并运行超过 10 页。

我目前的解决方案是清晨我正在运行以下命令的三个线程:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END
Run Code Online (Sandbox Code Playgroud)

赶上前一天晚上的积压(当我们大部分删除发生时)

我想知道是否有任何方法可以将默认设置从 5 秒和 10 页更改为每秒一次或运行超过 20 页,有没有办法做到这一点,或者我应该继续启动多个清理过程来清除数据,或者是否有任何其他操作可以帮助解决此问题

重新索引至少每周一次在最受影响的索引上运行(大多数是每隔一天)

AlwaysOn 高可用性集群上的 SQL Server 2012 Enterprise SP3_CU8(明天升级到 CU9)也带有复制(在单独的服务器上分发)

sql-server-2012 ghost-cleanup

10
推荐指数
1
解决办法
1993
查看次数

Always On 可用性组,始终将用户重定向到只读实例

我们有一个 Always On 可用性组,其中包含一个主要和一个已启用读取的次要。我们有一个实施团队的用户,他使用数据库来检查他们打算放入数据库的数据的正确性。

用户只有从数据库读取的权限,但是当他们通过 AG 侦听器连接(通过 SSMS)时,他们总是连接到活动节点。

我试图让他们直接访问只读实例,但他们坚持自己的方式,一两天后他们又回到了活动节点上。

SQL Server 有没有办法说这个用户总是打算只读并将他们重定向到那里?

注意:我已经尝试在附加连接参数中设置“ApplicationIntent = ReadOnly”,但这似乎没有重定向到辅助节点,并且不是理想的解决方案,因为他们不可避免地会忘记为新的初学者设置它。

SQL Server 2012 Enterprise,可用性组 1 主要,1 可读次要同步提交。

我不打算让用户连接到链接服务器,或通过任何其他服务器。用户通过 SSMS(没有其他应用程序)直接连接到数据库,我希望 AG 侦听器(或那里的其他东西)能够将该用户引导到一个可用的辅助节点(因为它只有读取访问权限)访问主节点是没有意义的)而用户无需做任何事情,因为他们在机器周围移动并且会忘记添加应用程序意图。此外,我发现将其添加到其他连接参数并不总是将您定向到辅助节点。

sql-server configuration sql-server-2012 listener availability-groups

9
推荐指数
1
解决办法
2226
查看次数

TempDB 内部空间使用量从 Service Broker 缓慢增长

正在SQL Server 2012 (11.0.6540.0)与另一台服务器一起在 AO 高可用性组中运行。

tempDB 使用量通常约为 819MB(从 2 周前开始平均超过一周),但由于我们进行了故障转移和补丁周期,tempDB 开始逐渐增长(此时未进行 DDL 更改)。我们刚刚完成了一个测试故障转移,并将 tempDB 从两台机器都可以访问的联合 SAN 驱动器上移开,(我们不希望一个硬件可以同时关闭我们的主要和次要副本)。

最近的故障转移和实例重新启动(移动 tempDB)看到 tempDB 使用量跃升至 6348MB,并且其缓慢增长。

增长全部在内部对象上,可以使用以下方法查看:

SELECT   top 5 session_id, request_id, 
         SUM(internal_objects_alloc_page_count) AS request_internal_objects_alloc_page_count
FROM     sys.dm_db_task_space_usage 
GROUP BY session_id, request_id
ORDER BY request_internal_objects_alloc_page_count DESC
Run Code Online (Sandbox Code Playgroud)

看看它,它都是从 spid 35 和 32 运行的,它们都与服务代理相关。

我环顾四周,有人谈论这是由于进行WITH CLEANUP了最后的对话,但清理这个词只出现在评论中,所以我相信这不是问题。

当实例恢复并接管主节点时,服务代理不工作,所以我需要将所有队列循环到禁用然后启用状态(我们在一年前必须这样做,但没有请参阅此问题)。

临时数据库使用

您可以在此处查看 tempDB 上的使用情况,因为它目前在过去 4 天中保持不变。今天早上的下降是实例重启和故障转移。

有谁知道我缺少什么来控制它。

sql-server service-broker sql-server-2012 tempdb

7
推荐指数
1
解决办法
686
查看次数

SQL Server - SQL 代理 - 允许组拥有作业

设想

我们的组织中有三个独立的用户组(开发、支持、实施)。就目前情况而言,每个人都使用一次登录来完成所有事情。我们正开始摆脱这种情况。每个人都通过自己的登录名访问数据库,每个人都可以访问其组系统。因此,支持人员可以访问支持职能和工作等。

过程和表的允许权限非常简单。从 windows 组创建登录名。然后根据该登录创建一个用户,并允许它在我们为他们创建的新架构上读取和执行。

我们正在运行 SQL Server 2012 和 2008 R2。

问题

SQL 代理作业位于用户级别之上,需要将登录名分配给所有者。但它不接受组登录作为接受的参数:

指定@owner_login_name无效(有效值由sp_helplogins[不包括Windows NT 组]返回)。

希望允许这些组拥有自己的一组可以直接操作的作业(在报告服务器上而不是实时数据库上)。不影响其他部门的工作或其他工作(数据库维护任务、复制等)。但如果原始作者不在办公室或已经离开,则允许团队的其他成员操纵工作。

我尝试过四处搜索,但到目前为止,我在 2010 年在sqlservercentral.com上发现的唯一一件事说这是无法完成的。

我正在看的东西

将 SQL 代理作业分配给无人有权访问的支持/开发通用帐户。但每个人都可以以某种方式操纵自己的工作。

这将允许人们改变团队的工作,同时允许个人离开公司后继续使用工作。

我还没有找到一种方法让人们能够通过其他所有者访问/运行作业(即使他们使用相同的 Windows 组登录到 sql)。不授予他们SQLAgentOperateorRole (这会破坏将他们锁定在外的意义)彼此(和管理员)的工作。

每个组创建一个用户,该用户具有 msdb 权限的附加访问权限以及他们可以登录以操作作业的标准支持功能。

这样做的缺点是现在用户有两个登录名,其中之一不会改变。因此,离开公司的用户仍然可能拥有该帐户的登录凭据,这也会导致用户变得懒惰,只在该帐户下登录。(他们不应该这样做,但说实话,他们会的)。

每个组都有一个每 5 分钟运行一次的 SQL 作业,其中包含一个表,其中包含用于以频率 x 运行此命令的命令(本质上一个 SQL 代理作业运行自定义编写的 SQL 代理作业列表)

我认为我不需要经历这是一个多么可怕的想法。但这是已经半考虑过的事情。

概述

显然,我们可以看到的最佳解决方案是允许一个组拥有 SQL 代理作业,但似乎这是不可能的。

有人有主意吗?目前,我们将不胜感激有关如何实施此类事情的指导。

permissions sql-server-2008-r2 sql-server-2012 sql-server-agent

6
推荐指数
1
解决办法
1万
查看次数

在存储过程中生成数据库创建脚本

我希望自动擦除我们的测试环境,使其在每个冲刺结束时与生产保持一致。

就目前而言,这目前正在通过测试环境获取完整备份并使用移动和替换进行恢复来完成,但这占用了我们拥有的大部分空间。

目的是从头开始创建环境并仅填充所需的表。

我可以使用“右键单击 > 任务 > 生成脚本...”来创建数据库框架。

有没有办法从存储过程中创建该脚本,以便可以用于重新创建数据库

此外,我正在按原样处理这一点,但显然该脚本只会以其当前大小创建数据库,因此一旦生成脚本,就需要修改所有文件大小

为任何帮助干杯

sql-server stored-procedures restore sql-server-2012

4
推荐指数
1
解决办法
655
查看次数