Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

2
在线页面恢复达到1000个限制
我的任务是尝试恢复遭受损坏的数据库(由于I / O故障,此问题已修复)。我不熟悉数据库或其包含的内容。 我得到了旧的(约3周)完整备份和一系列事务日志...但是缺少事务日志,因此我只能恢复到某个日期。大约有2.5周的数据丢失(并且不断有大量数据添加到该数据库中)。 我还收到了损坏的数据库的副本(可以访问,但是有很多页面损坏/丢失)。 我已经尝试了典型的DBCC CHECKDB命令(仍然没有repair_allow_data_loss,如果没有其他方法,那将是我的最后选择)。 在许多数据库进入数据库之后(数据库是一个1.5 TB的小怪物,我所做的一切都很缓慢并且需要一段时间),我尝试从上次已知的损坏页面备份中恢复联机页面。 为此,我已经完成了一个脚本,该脚本RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'从DBCC CHECKDB输出中创建了许多命令(基本上是一个正则表达式和一个单独的命令)...到目前为止,效果很好,可以说达到了1000页的限制每个还原命令每个文件(此db上有8个文件)。 因此,它要求我“完成在线还原”,但是我对如何做到这一点感到茫然。我基本上不知道如何完成还原以继续尝试其余页面。 我尝试了一个,RESTORE DATABASE <foo> WITH RECOVERY但是也没有用,它要求我提供我没有的日志。 有人对我如何从此处恢复任何内容有任何提示吗?还是如何“完成”在线还原,以便我可以继续尝试恢复更多页面?如果我尝试脱机还原(基本上添加WITH NORECOVERY到所有内容,然后尝试将其恢复到最后,是否会遇到相同的问题?) 手工计算数据库基本上是不可能的……有数百个表和数百万行,并且没有明确的含义。数SELECT百万行后,损坏的数据库将对查询失败,但是我不确定我可以算出哪里。我试过重建所有非聚集索引,但是有行数据损坏的页面,所以也行不通。 某些数据丢失是可以接受的,但至少应尝试实现数据库的一致性。 损坏的数据库仍处于联机状态,并且客户正在使用它(因此它将不断获取新数据),因此,我在实验室工作台上执行的任何过程都应可在生产数据库上重现(停机将非常困难)。 这是SQL Server 2014 Enterprise PS:我不是DBA ...我是一名程序员,但是客户端尝试了一些“专家” sql灾难恢复服务,但他们已经放弃了,所以我被要求研究一下,看看是否可以做任何事情。 更新:经过多次测试,逐页还原是不可行的,因此我们放弃了这个想法。我们将进行手动恢复(手动从损坏的表中选择丢失的记录,并将其插入到最后一个已知的良好备份中),为此做一些自动化的工具(同样,有成百上千的表)。

2
内部联接的基数估计问题
我正在努力理解为什么行估计是如此严重的错误,这是我的情况: 简单连接-使用SQL Server 2016 sp2(在sp1上存在相同问题),dbcompatiblity = 130。 select Amount_TransactionCurrency_id, CurrencyShareds.id from CurrencyShareds INNER JOIN annexes ON Amount_TransactionCurrency_id = CurrencyShareds.Id option (QUERYTRACEON 3604, QUERYTRACEON 2363); SQL估计1行,而SQL为107131,并选择做一个嵌套循环(链接到plan)。在CurrencyShareds上更新统计信息之后,估算就可以了,并选择了合并联接(链接到新计划)。一旦仅将一条记录添加到CurrencyShareds,统计信息就会“过时”,并且sql返回错误的估计。 我不太担心这个简单的查询,但这只是一个更大的查询的一部分,而这就是多米诺骨牌的开始... 为什么在100条记录表中添加一行会造成这种损坏?查看基数估计跟踪的输出时,我看到此警告,***WARNING: badly-formed histogram ***但在此主题上找不到更多信息。 这是基数估计的全部输出: Begin selectivity computation Input tree: LogOp_Join CStCollBaseTable(ID=1, CARD=107131 TBL: annexes) CStCollBaseTable(ID=2, CARD=100 TBL: CurrencyShareds) ScaOp_Comp x_cmpEq ScaOp_Identifier QCOL: [test.MasterData].[dbo].[CurrencyShareds].Id …


1
SQL 2017 TDE数据库中的备份压缩导致损坏
在SQL Server 2017(CU3)上,每当我在一个TDE数据库上启用备份压缩时,备份过程始终会损坏数据库中的特定页面。如果我运行备份时不进行压缩,则不会损坏它。这是我为验证和重现此问题而采取的步骤: 在数据库“ TDE_DB1”上运行DBCC CheckDB;一切都很好,没有错误; 成功备份数据库而无需压缩;RESTORE VERIFYONLY表示一切都很好; 成功将数据库还原为“ TDE_DB2”;一切都很好,DBCC CheckDB没有显示任何错误; 使用压缩成功备份“ TDE_DB1”数据库;RESTORE VERIFYONLY错误,提示“检测到备份集损坏”; 尝试将数据库还原为“ TDE_DB2”;错误,说“ RESTORE在数据库中的页面(1:92454)上检测到错误” 重复步骤1-3;一切都很好; DROP“ TDE_DB1”和“ TDE_DB2”; 从备份中还原“ TDE_DB1”;一切都很好; 重复步骤1-5;得到相同的结果 总结一下:数据库和常规备份看起来不错,在数据库上运行CHECKDB并在备份上运行VERIFYONLY不会报告任何错误。使用压缩备份数据库似乎会导致损坏。 下面是有错误的代码示例。(注意:将压缩与TDE数据库一起使用需要MAXTRANSFERSIZE) -- Good, completes with no corruption; BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM; RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM; RESTORE …

1
SQL Server表名以用户数据库中的#开头,而不是tempdb(不是临时表)
几十年前,以某种方式在我们的数据库中创建了一个以#。开头的表。它显示在应用程序数据库下的对象资源管理器中,而不是中tempdb。由于某些原因,Azure不会像这样导入数据库。 我们无法删除它,对其重命名或与之交互。我试过从对象资源管理器中删除,从GUI中删除脚本,重命名,但它们都没有起作用。 我们正在使用SQL 2008 R2。 drop table [*app*].[dbo]."#OBSOLETE"; Database name '*app*' ignored, referencing object in tempdb. Msg 3701, Level 11, State 5, Line 1 Cannot drop the table '#OBSOLETE', because it does not exist or you do not have permission. exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete" Msg 15225, Level 11, State 1, …

4
此WHERE子句中的%有何作用?
我正在训练中,其中一个脚本具有以下命令: SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1 我想知道此代码段在WHERE子句中的作用: Col1 % 3 = 1 我在互联网上进行了一些研究,但没有找到有关此命令的参考。
13 sql-server  t-sql 

2
DBCC FREEPROCCACHE或DBCC FREESYSTEMCACHE('SQL Plans')都不执行任何操作来释放CACHESTORE_SQLCP内存
CACHESTORE_SQLCP几天后,SQL计划占用超过38 GB的内存。 我们已经在运行“优化临时工作负载”选项。(实体框架和自定义报告会产生很多特殊条件!) 具有多可用区镜像的AWS RDS上的SQL Server 2016 SE 3.00.2164.0.v1 当我跑步时: DBCC FREESYSTEMCACHE('SQL Plans'); 要么 DBCC FREEPROCCACHE 要么 DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL 要么 DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL; 它似乎无法清除: SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb desc type name pages_kb CACHESTORE_SQLCP SQL Plans 38321048 我在启用查询存储的情况下运行,但是我禁用了它以查看是否有任何干扰,这似乎没有帮助,但我将其保留了下来。 …

1
差异备份问题-为什么?这可能吗?
我正在使用SQL Server 2014,情况是这样的: 我有服务器A和服务器B。 隔夜ETL在服务器A上处理。 加载过程完成后,将备份数据库X(使用CHECKSUM和RESTORE VERIFYONLY确保可靠性),然后将其发送到服务器B。 服务器B接收到该bak文件,然后在那里还原数据库。 我想使用差异备份策略,以便: 完全备份仅在星期六执行, 即在星期六在服务器A上进行完全备份->运送到服务器B->恢复服务器B上的完全备份 剩下的日子将是差异备份, 即服务器A上的差异备份->运送到服务器B->恢复服务器B上的差异备份 我已经尝试过,但出现错误,说: 日志或差异备份无法还原,因为没有文件准备好前滚。 不知道为什么。我检查sys.database_files了服务器A和服务器B,可以看到differential_Base_LSN和differential_base_GUID相同。还有其他地方要检查吗? 顺便说一句,在上面的步骤2中,当我在服务器B上还原差异备份时,是否总是需要每次都还原完全备份+差异备份? 我只还原了差异备份WITH RECOVERY(并收到该错误消息),因为完整备份已于前一天还原。 需要说明的是:是的,我希望服务器B上的数据库在差异之间可读。我该如何解决?是我每晚唯一的RESTORE FULL (WITH NORECOVERY)+ RESTORE DIFF (WITH RECOVERY)组合顺序选项吗? 任何指导将不胜感激。

1
在运行查询时如何模拟低内存状态
我试图更好地了解SQL Server的执行引擎在低内存状态下的行为。说到内存授予,我想知道是否有某种方法可以强制GrantedMemory等于RequiredMemory。(我的猜测是有一个未记录的跟踪标志可以做到这一点。有人知道它是什么吗?)


3
每小时自动在MS SQL Studio中执行查询
我支持大型企业中的应用程序,我的职责之一是清理数据。我需要每小时执行一次查询,我想使其自动化。由于组织政策的原因,我无法创建SQL Server代理作业或修改架构,只能操作数据。 一望无际 WHILE(1=1) BEGIN WAITFOR DELAY '01:00'; --do work END 为我完成了工作,但是我对永久开放的连接感到耸耸肩。 理想情况下,我会编写脚本来编写MS SS本身,以每小时执行一次给定的代码,但是我不确定是否可行。 这个问题有解决方案吗?

3
克服LIKE字符长度限制
通过阅读这里的LIKE字符长度限制,看起来我在LIKE子句中发送的文本长度不能超过4000个字符。 我正在尝试从特定查询的查询计划缓存中获取查询计划。 SELECT * FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st where st.text like '%MY_QUERY_LONGER_THAN_4000_CHARS%' ESCAPE '?' 如果其中的查询LIKE超过4000个字符,那么即使我的查询在缓存计划中,我也会得到0个结果。(我期待至少是错误)。 有没有办法解决此问题或采取其他措施?我的查询长度可能超过了>个10000字符,看起来好像无法使用来查找它们LIKE。

2
为什么丢弃外键要花很长时间?
我制作了一个脚本,可以一次删除一个数据库中的所有外键,就像这样: ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2 令我惊讶的是,该脚本花费的时间很长:每个DROP FK平均需要20秒。现在,我知道创建FK可能是一件大事,因为服务器必须去检查FK约束是否从一开始就没有受到侵犯,而是放弃了?服务器删除需要很长时间的FK时会做什么?这既出于我自己的好奇心,又是为了了解是否有一种使事情更快的方法。能够删除FK(而不仅仅是禁用它们)可以使我在迁移过程中更快,从而最大程度地减少停机时间。

1
Perfmon计数器“次优计划/秒”实际测量什么?
在SQL Server中,Perfmon计数器“工作负载组状态:次优计划/秒”的测量结果是什么? 它是Resource Governor计数器之一,因此按工作负载组(是否配置RG来衡量)进行测量。 我不是在问什么是好的计划或坏的计划,而是该采取什么对策,以及在哪里可以找到确切的相应计划?例如,我在扩展事件中找不到与触发“次优计划/秒”计数器的查询相匹配的任何内容。
13 sql-server 

2
SQL Server 2016中用于空间数据的MakeValid()的替代方法
我有一张非常大的地理LINESTRING数据表,我正在从Oracle迁移到SQL Server。在Oracle中有许多针对此数据执行的评估,并且也需要针对SQL Server中的数据执行评估。 问题是:SQL Server对有效的要求LINESTRING比对Oracle的要求严格;“ LineString实例不能在两个或多个连续点的间隔内重叠”。 碰巧的是,我们LINESTRING的某个百分比不符合该标准,这意味着我们需要评估数据的功能会失败。我需要调整数据,以便可以在SQL Server中成功对其进行验证。 例如: 验证一个非常简单的方法LINESTRING,使其自身加倍: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).IsValidDetailed() 24413: Not valid because of two overlapping edges in curve (1). MakeValid针对它执行功能: select geography::STGeomFromText( 'LINESTRING (0 0 1, 0 1 2, 0 -1 3)',4326).MakeValid().STAsText() LINESTRING (0 -0.999999999999867, 0 …

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.