Questions tagged «sql-server-2008-r2»

SQL Server 2008 R2(主要版本10.50.xxxx)。请同时用sql-server标记。

3
SQL Server 2008 / R2恢复模型
我们某些服务器上的几乎所有数据库都不需要完全恢复模型(我们不执行事务日志备份),默认应始终是创建数据库并指定简单恢复模型。 出于某些实际原因,经常使用SSMS创建许多数据库。但是,可能会出错,并且操作员会忘记指定简单恢复模型。几天后,由于三个或四个从未被截断的60GB日志文件而导致磁盘空间不足时,这会导致“意外”。 通过在model数据库上配置恢复模型,可以使简单恢复模型成为新数据库的默认设置。但是,是否建议这样做,如果我这样做,将来它会以任何方式咬我吗?

1
SQL Server 2008 R2脏读-如何非原子性?
我想知道在未提交未提交的隔离级别下,“脏”读取会“多么脏” 。我知道已经更新但尚未提交的行是可见的,但是: 行是否可以显示为部分更新-即某些列已更新而另一些未更新? 单个列是否可以显示为部分更新。例如,如果您有一个varchar(4000)列正在完全更新并且假设它实际上包含4000个字符。您能读说以前状态的2k字符和新状态的2k字符吗?长度大于8k的varchar(max)呢? 更新:经过一番辩论,最小的共识是,如果列大小> 8KB,则即使在列本身内也可能进行脏读。

2
接收到“对对象的SELECT权限被拒绝”,即使已被授予
我是程序员,而不是dba。。。我知道足够危险了。 我继承了一个旧用户,该旧用户是该数据库的db_owner。出于业务原因,我们无法调整该用户对现有表,模式等的权限,但是正在创建一些新表,我只希望该用户对其具有SELECT访问权限。 已为这些用户设置了这些表的权限,以便除SELECT(设置为GRANT)以外的所有内容都被拒绝。 但是,当此用户(dbadmin)尝试对这些表之一(AccountingAudit)执行SELECT时,会发生此错误: The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. 我已经运行此SQL来尝试查看为此表/用户设置了哪些权限: select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) as grantor, permission_name, state_desc from sys.database_permissions 这就是我得到的: AccountingAudit dbadmin dbo ALTER DENY AccountingAudit dbadmin dbo CONTROL DENY AccountingAudit dbadmin dbo DELETE DENY AccountingAudit dbadmin …



1
生成名称列的排列和组合
我有以下示例数据用于排列和组合。 create table tbltest ( name varchar(50), addres varchar(100) ); insert into tbltest values('Sam Mak John','Street 1 HNo 101 USA'); insert into tbltest values('Donatella Nobatti','HNo 101 UK'); insert into tbltest values('Sam Buca','Main Road B Block UAE'); insert into tbltest values('Juan Soponatime','Hight Street CA'); insert into tbltest values('Aaron Spacemuseum','HNo A10 100 …

1
确定导致数据库卡在RESTORING状态的根本原因
我知道有一些问题可以解决数据库卡在RESTORING状态中的问题,并使用这些解决方案手动将数据库恢复在线状态,但是我的情况有所不同。 我使用Powershell脚本进行了自动还原,该脚本将生产的副本还原到DEV实例。这些脚本在大约一年内没有发生变化,并且偶尔会完成还原过程,但是还原后的数据库仍处于RESTORING状态(有时脚本可以正常工作,有时会失败)。 每当我手动重新运行该过程时,或者从SSMS的用户界面或通过T-SQL手动还原数据库时,它都会毫无问题地完成。 我找到了建议CHECKDB在还原后的数据库上运行的答案,但没有任何结果导致此问题。 由于还原脚本还原了数据库的完整备份并使用了一个"WITH RECOVERY"选项,因此我试图找出可能停止还原过程的原因,尽管实际上是使用进行还原的"WITH RECOVERY"。 真的很感谢任何建议,因为我一直努力了解为什么会不时发生这种情况。 我非常想解决问题的根本原因,而不是解决症状,那就是再次手动还原数据库。 更新: Github Gist如@Brent建议- 在此处。

1
在Python中检索到的SQL Server VARCHAR列的编码问题
最近,我们遇到了与字段相关的编码问题,该字段在SQL Server中存储为varchar(120)。在SSMS中,varchar显示为: “谁杀了乔本?” 但是,将其引入python后,显示为: 我已经从Python方面对此进行了研究,并且没有任何奇怪的事情发生。我的理论是,SQL Server中的varchar接受的是UTF-8字符,这些字符在python中的显示方式不同于SSMS。我对SQL Server中的编码不是很熟悉。有人可以让我知道以下内容: SSMS中有没有办法查看varchar的编码?例如,看到\ x82而不是显示当前来自SSMS的逗号? 我们正在使用SQL Server2008。是否可以在不使用导入/导出工具或转储到平面文件的情况下,将任何UTF-8字符的编码更改为ASCII字符?即可以通过查询进行此转换吗? 有什么方法可以通过查询以编程方式识别有问题的记录(问题定义为ASCII不支持的UTF-8字符)? 先感谢您! 使用,sp_help N'table_name';我发现此VARCHAR列的归类为SQL_Latin1_General_CP1_CI_AS。

2
在SQL Server 2014上具有完全扫描的更新统计信息使用100%cpu,在2008 R2上为15%
为什么对于具有相同硬件功能的相同表,全扫描更新统计信息在SQL Server 2014上可能使用20%的CPU,而在SQL Server 2014上却使用100%的CPU? 我一直在寻找MAXDOP,其他选项,但实际上看不到任何脱颖而出的东西。我意识到可能存在可能导致这种情况的设置,但是两个数据库的设置都非常相似(例如,两个数据库的设置均为MAXDOP4,并且两个数据库都有多个内核)。两者都是企业版。 SQL Server 2014与SQL Server 2008 R2中是否有某些“不同之处”可以解释这一点?两台服务器的内存选项均为90%。对寻找什么有任何想法吗? 我每周在使用SQL Server 2008 R2 / SP3和SQL Server 2014 / SP2的两台服务器上以完整(100%)扫描运行更新统计信息,并且数据库具有相同的结构。在2008 R2服务器上,两个非常大的表的更新状态需要花费几个小时,这是我期望的,但是CPU始终保持在20%左右的利用率以下。但是,在2014年服务器上,CPU会在100%的时间内运行40分钟。这些表格在2014服务器上要小一些。我通过使用SQL Monitor分析菜单看到了这一点。 这是2014 SQL Server上Ola日志文件的输出,CPU从大约2:10到2:45达到100%: Date and time: 2017-06-24 02:10:20 Command: UPDATE STATISTICS [InVA].[dbo].[AuditField] [_WA_Sys_00000005_15502E78] WITH FULLSCAN Outcome: Succeeded Duration: 00:07:48 Date and time: 2017-06-24 02:18:08 Date and …

2
Tablock提示触发死锁
我使用最少的日志记录,通过两个并行运行的Execute SQL Tasks和以下形式的SQL将两个数据集插入到空堆表中。 INSERT INTO Table (TABLOCK) SELECT FROM ... 作业暂停后,其中一个SQL任务成为死锁受害者。下面是死锁图的XML输出。 有人可以解释幕后发生的事情吗? <resource-list> <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746"> <owner-list> <owner id="process9609dc8" mode="Sch-S"/> <owner id="process9609dc8" mode="IX"/> </owner-list> <waiter-list> <waiter id="process5e13048" mode="X" requestType="convert"/> </waiter-list> </objectlock> <objectlock lockPartition="0" objid="1586156746" subresource="FULL" dbid="7" objectname="dbo.TargetTable" id="lock7374a00" mode="IX" associatedObjectId="1586156746"> <owner-list> <owner id="process5e13048" mode="Sch-S"/> …

2
大型删除查询似乎已冻结
我们在具有18亿行的数据库上运行了删除查询。此删除操作将删除12亿行。 事后看来,我们会一次将这个查询分解为100m,但是我们处于一个已运行24小时且日志文件位于2Tb的位置,这似乎是日志文件允许的最大大小。 数据库处于SIMPLE恢复模式。 是否有保存此查询的内容?还是只需要重启SQL Server看看会发生什么?数据库将无法使用吗?我们有什么办法可以尽可能彻底地消除这种情况?


3
用空格替换列中的特殊字符
我正在尝试编写一个查询,以空格替换特殊字符。下面的代码有助于识别行。(字母数字字符,逗号和空格有效): SELECT columnA FROM tableA WHERE columnA like '%[^a-Z0-9, ]%' 如何将替换功能集成到select语句中,以便结果集中的所有字符(字母数字,逗号和空格除外)都被替换为''(空格)。这将不起作用: SELECT replace(columnA,'%[^a-Z0-9, ]%',' ') FROM tableA WHERE columnA like '%[^a-Z0-9, ]%'

1
如何重现“由于数据移动,无法使用NOLOCK继续扫描”
我偶尔会遇到NOLOCK一些大型作业“确实由于数据移动而无法继续扫描”的情况,这些作业确实存在WITH (NOLOCK)于选择查询中。 我知道这与尝试在发生页面拆分时选择数据有关,这导致数据不再位于应有的位置-我认为这就是我的环境中发生的事情。 我将如何重现? 我试图做一个短期的变通办法来捕获错误并在发生这种情况时重试,但是如果无法重现它,我将无法对其进行测试。是否有合理可靠的方法引起这种情况? 当发生这种情况时,再次执行查询会成功-因此,我对实际数据或数据库永久损坏没有任何担心。查询中的某些表(以及它们的索引)经常被删除,重新创建和重新填充,因此我假设它与此相关。 删除NOLOCK是我要解决的长期问题。首先NOLOCK放在这里的原因是,查询是如此糟糕,以至于它们陷入日常事务的僵局中,因此NOLOCK,用于阻止僵局(工作正常)的创可贴也是如此。因此,在我们可以做一个永久性解​​决方案之前,我需要一个创可贴。 如果我可以用《 Hello World》来复制它,我计划在不到一个小时的时间内将创可贴打入工作。无法进行搜索和替换删除NOLOCK,因为我将再次开始遇到应用死锁,这对我来说比偶尔的失败工作更糟糕。 使用读取提交的快照隔离是一种很好的可能性-我将不得不与我们的数据库团队合作以获取有关该快照的更多详细信息。问题的一部分是,我们没有SQL Server专家来处理此类问题,而且我对隔离级别的理解不充分,无法立即进行更改。

3
应用程序查询空表
我公司使用的应用程序存在很大的性能问题。我正在研究数据库本身存在许多问题,但是许多问题纯粹与应用程序有关。 在调查中,我发现有数百万个查询命中SQL Server数据库,查询空表。我们大约有300个空表,其中一些表每分钟最多查询100-200次。这些表与我们的业务领域无关,实际上是原始应用程序的一部分,当我的公司与他们签约为我们提供软件解决方案时,供应商并未删除这些原始应用程序。 除了我们怀疑应用程序错误日志中充斥着与此问题相关的错误以外,供应商还向我们保证,应用程序或数据库服务器不会对性能或稳定性造成影响。错误日志泛滥成灾,以至于我们看不到价值超过2分钟的错误来进行诊断。 这些查询的实际成本显然会在CPU周期等方面很低。但是,谁能说出对SQL Server和应用程序有什么影响呢?我怀疑发送请求,确认请求,处理请求,返回请求以及确认应用程序已收到请求的实际机制本身会对性能产生影响。 我们将SQL Server 2008 R2,Oracle Weblogic 11g用于该应用程序。 @ Frisbee-长话短说,我创建了一个包含querytext的表,该表命中了应用程序数据库中的空表,然后对其查询以获取我知道为空的所有表名,并得到了很长的列表。考虑到该应用通常在上午8点至下午6点使用,因此在30天的正常运行时间中,执行次数最高的是270万次执行,因此这些数字更多地集中在运营时间。多个表,多个查询,可能有些通过联接释放,有些则没有。命中率最高(当时为270万)是从一个带有where子句,无联接的空表中进行的简单选择。我希望连接到空表的较大查询可能包括对链接表的更新,但是我将检查并尽快更新此问题。 更新:有1000个查询,执行计数在1043-4622614之间(超过2.5个月)。我将不得不挖掘更多信息以找出缓存计划的产生时间。这只是为了让您了解查询的范围。大多数都相当复杂,有20多个连接。 @ srutzky-是的,我相信会有一个与计划编制时间相关的日期栏,因此您将对此感兴趣,因此我将对其进行检查。我想知道,当SQL Server位于VMware群集上时,线程限制是否会成为一个因素?值得庆幸的是,即将成为专用的Dell PE 730xD。 @Frisbee-对不起,您的回复很晚。正如您所建议的,我使用SQLQueryStress在空表中对24个线程运行了10,000次select *(实际上是240,000次迭代),并立即达到10,000个批处理请求/秒。然后,我在24个线程中减少了1000次,并达到了4,000个批处理请求/秒以下。我还仅在12个线程上尝试了10,000次迭代(因此总共进行了120000次迭代),这产生了持续的6,505批/秒。实际上,对CPU的影响非常明显,在每次测试运行期间,约占CPU总使用量的5-10%。网络等待时间可以忽略不计(例如,工作站上的客户端需要3毫秒),但是对CPU的影响是肯定的,就我而言,这是非常确定的。这似乎归结为CPU使用率和一些不必要的数据库文件IO。每秒总执行次数约为3000次,这比生产中的要多,但是我只测试了数十个这样的查询之一。数百个查询以每分钟300-4000次之间的速率命中空表的最终结果在CPU时间方面不可忽略。所有测试都是针对具有双闪存阵列和256GB RAM,12个现代内核的空闲PE 730xD进行的。 @ srutzky-好主意。默认情况下,SQLQueryStress似乎使用连接池,但是无论如何,我发现,是的,连接池复选框已选中。更新以跟随 @ srutzky-应用程序上的连接池显然未启用-如果已启用,则无法使用。我进行了探查器跟踪,发现对于审计登录事件,连接具有EventSubClass“ 1-Nonpooled”。 RE:连接池-检查了weblogics,发现启用了连接池。针对活着的发现更多痕迹,发现池化迹象没有正确/根本没有: 这是当我对填充的表没有连接的情况下运行单个查询时的样子。异常显示为“与SQL Server建立连接时发生与网络有关或特定于实例的错误。找不到服务器或无法访问该服务器。请验证实例名称正确并且已将SQL Server配置为允许远程连接。 (提供程序:命名管道提供程序,错误:40-无法打开与SQL Server的连接)“请注意批处理请求计数器。在生成异常的时间内对服务器执行ping操作会成功执行ping响应。 更新-两次连续的测试运行,相同的工作量(select * fromEmptyTable),启用/未启用池。CPU使用率略高,故障很多,并且从未超过500个批处理请求/秒。测试显示10,000个批处理/秒,并且在启用池的情况下没有失败,大约400个批处理/秒,然后由于禁用了池而导致很多失败。我想知道这些故障是否与连接可用性不足有关? @srutzky-从sys.dm_exec_connections中选择Count(*); 启用池化:即使在负载测试停止后也始终保持37 禁用池化:11-37,具体取决于是否 在SQLQueryStress 上发生异常,即:当这些低谷出现在Batchs / sec图上时,在SQLQueryStress上发生异常,并且 连接数下降到11,然后逐渐恢复到37当批次开始达到高峰且未发生异常时。非常非常有趣。 两个测试/活动实例上的最大连接数设置为默认值0。 已经检查了应用程序日志并且找不到连接问题,但是由于错误的数量和大小(即:大量的堆栈跟踪错误),只有几分钟的可用日志记录可用。应用程序支持的一位同事建议,发生大量与连接有关的HTTP错误。似乎基于此,由于某种原因,应用程序无法正确地建立连接池,结果服务器反复耗尽连接。我将进一步研究应用日志。我想知道是否有办法从SQL Server方面证明这种情况正在生产中发生? @ …

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.