Questions tagged «sql-server-2012»

SQL Server 2012(主要版本11.00.xxxx)。还请标记sql-server。

1
SQL Server中的“在检查点上截断日志”选项
长话短说,但我们的长期顾问(前雇员)早在2006年左右就编写了一个自定义脚本来与Tivoli Storage Manager交互,并且似乎正在检查名为的SQL Server DB选项truncate log on checkpoint。他们的说法是,它阻止脚本在SQL 2012实例上运行和执行备份。 我觉得这是完整的BS,因为我找不到任何这样的选项,sp_configure并且备份在一个实例之外的任何地方都可以工作。但是,我想删除一个地雷(如果确实如此),并删除其他过时的元素。我确实让他们与供应商核实,但我对他们所说的话没有高度的信心。 我所做的研究只返回了SQL 2000或Sybase选项。另一个说法是,当恢复模型使用SIMPLE并且没有明确的选项打开或关闭它时,它在更高版本(2008及更高版本)中被隐式调用/使用。 由于该TRUNCATE LOG命令由于这些天的事务日志的工作方式已过时,因此我认为这不是一个可以查询的选项。 由于我没有任何SQL Server 2000实例,因此我希望有人可以回忆起此事,或者可以检查周围放置的实例。我告诉他们,我没有什么可以推荐的。我也希望有人可以确认这已经过时了。

3
在不使用触发器的情况下,在SQL Server中查找触发查询的客户端的身份?
我目前正在使用Change Data Capture(CDC)来跟踪数据更改,并且希望跟踪提交进行了更改的查询的客户端的主机名和IP地址。如果有5个不同的客户端通过相同的用户名登录,则一个客户端将面临跟踪5个客户端中的哪一个引发查询的难题。我发现的其他可能的解决方案包括使用以下命令更改CDC表: ALTER TABLE cdc.schema_table_CT ADD HostName nvarchar(50) NULL DEFAULT(HOST_NAME()) 但是,这将返回在其上触发查询的服务器的主机名,而不是触发该查询的客户端的主机名。 有办法解决这个问题吗?这将有助于记录客户端的主机名或IP地址(或其他唯一身份)。我不想使用触发器,因为它会减慢系统速度,而且CDC还会生成系统表,因此显然不可能在上面设置触发器。

2
SARG基数估计,为什么不进行全扫描?
为什么没有全扫描(在SQL 2008 R2和2012上)? 测试数据: DROP TABLE dbo.TestTable GO CREATE TABLE dbo.TestTable ( TestTableID INT IDENTITY PRIMARY KEY, VeryRandomText VarChar(50), VeryRandomText2 VarChar(50) ) Go Set NoCount ON Declare @i int Set @i = 0 While @i < 10000 Begin Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2) Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50))); Set @i …

6
在没有2005或2008实例的情况下从SQL Server 2000迁移到2012
我遇到了三个旧的数据库,它们都安装在SQL Server 2000上,我需要移至2012年。我认为标准方法是还原到2005或2008实例,更新,重新导出并最终还原到2012年。 很好,除非我们没有2005或2008实例。 是否有任何替代方法或其他方法可能值得尝试? 作为参考,数据库仅包含15-20个表和一些视图,它们看起来非常简单,备份大小仅为100-200MB。

1
高PAGELATCH_ *和WRITELOG等待。他们有关系吗?
我们看到非常高的PAGELATCH_EX和PAGELATCH_SH等待类型以及较高的WRITELOG等待。我已经诊断出导致PAGELATCH等待的查询,并且可以通过降低插入由IDENTITY值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。 但是我的问题是,当插入新记录时,SQL Server是否在缓冲区页面上执行排他的PAGELATCH_EX,将记录​​插入缓冲区页面,将记录写入事务日志,然后释放排他的PAGELATCH_EX,详情如下:https:// www.microsoft.com/zh-cn/download/details.aspx?id=26665第24页。还是先将记录写到事务日志中,然后再进行PAGELATCH_EX的详细说明,“解决高度并发的PAGELATCH争用-插入工作负载-背景信息SQLCAT的指南:关系引擎 如果将记录写到锁存机制之外的日志中,那么我可以排除对磁盘的慢速写入,这是导致PAGELATCH等待时间较长的原因。但是,如果保持闩锁直到记录难以记录,那么我应该考虑WRITELOG。 同样,具有多个非聚集索引会导致PAGELATCH_ *锁存器保持更长的时间,即,如果表具有聚簇且多个非聚簇索引被同时添加并释放到每个索引缓冲区页的锁存器? 更新1 阅读confio-sql-server-writelog-wait幻灯片2和一般的WAL体系结构之后。现在,我的理解是,两本白皮书中详细介绍的“记录行已被修改的日志条目”步骤是指SQL Server在事务日志缓存(而不是磁盘)中记录更改。一旦事务完成或缓冲区已满,所有记录将立即刷新到磁盘。

2
存储IP地址-varchar(45)与varbinary(16)
我要创建一个表有两个领域- ID作为BIGINT和IPAddress作为两种varchar(45)或varbinary(16)。想法是存储所有唯一的IP地址,并使用引用ID代替IP address其他表中的实际IP 。 通常,我将创建一个存储过程,该存储过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID。 我期望有很多记录(我无法确切知道有多少条记录),但是我需要上面的存储过程尽快执行。因此,我想知道如何以文本或字节格式存储实际的IP地址。哪个会更好? 我已经编写SQL CLR了将IP地址字节转换为字符串和反向的函数,因此转换不是问题(使用IPv4和都可以IPv6)。 我想我需要创建一个索引来优化搜索,但是我不确定是否应该将该IP address字段包括在聚集索引中,还是要创建一个单独的索引,并且使用哪种类型的搜索会更快?

2
了解统计信息,执行计划和“升序关键问题”
我试图更好地(从概念上)理解统计信息,执行计划,存储过程执行之间的关系。 我是否正确地说统计仅在为存储过程创建执行计划时使用,而没有在实际执行上下文中使用?换句话说,如果这是真的,那么一旦创建了计划(并假设其已正确使用),“最新”统计数据的重要性如何? 我读过的一篇文章(《统计》,《行估计》和《升序的日期》栏)使我特别受启发,该文章描述了一种非常类似于我每天都使用客户数据库的情况。 在我们使用特定存储过程定期查询的最大表之一中,我们有一个升序的日期/时间列。 当每天增加十万行时,如何防止执行计划变得过时? 如果我们经常更新统计信息以解决此问题,那么在此存储过程的查询中使用OPTION(RECOMPILE)提示是否有意义? 任何意见或建议,将不胜感激。 更新:我正在使用SQL Server 2012(SP1)。

5
SQL Server 2012无法使用计算机帐户登录
我们正在将IIS / SQL Server网站从2008年迁移到2012年,但身份验证存在问题。我们使用Windows身份验证将身份验证为DOMAIN\COMPUTER$,但这不起作用,并显示一条错误消息: 用户“ DOMAIN \ COMPUTER $”的登录失败。原因:找不到与提供的名称匹配的登录名。[客户:<本地计算机>] 我已经验证了该帐户的存在,甚至删除并重新创建了该帐户 create login "DOMAIN\COMPUTER$" from windows 如果再次执行此操作,则会收到响应: 消息15025,级别16,状态2,第1行 服务器主体“ DOMAIN \ COMPUTER $”已存在。 (DOMAIN\COMPUTER用真实域名和计算机名代替) 因此,似乎该站点正在查询SQL Server,但是SQL Server并不是很努力地查看其登录名。 我错过了什么?

3
将有关已删除记录的信息传递到“删除”触发器上
在设置审计跟踪时,我没有问题可以跟踪谁在更新或在表中插入记录,但是,跟踪谁删除记录似乎更成问题。 我可以通过在“插入/更新”字段中包含“ UpdatedBy”字段来跟踪插入/更新。这使INSERT / UPDATE触发器可以通过来访问字段“ UpdatedBy” inserted.UpdatedBy。但是,使用Delete触发器不会插入/更新数据。有没有一种方法可以将信息传递到Delete触发器上,以便它可以知道谁删除了记录? 这是一个插入/更新触发器 ALTER TRIGGER [dbo].[trg_MyTable_InsertUpdate] ON [dbo].[MyTable] FOR INSERT, UPDATE AS INSERT INTO AuditTable (IdOfRecordedAffected, UserWhoMadeChanges) VALUES (inserted.ID, inserted.LastUpdatedBy) FROM inserted 使用SQL Server 2012

1
序列正在重用
我有一个序列,可以为系统中的对象生成跟踪号。它已经运行了一段时间了。 上周,我们注意到它开始重新使用值。 似乎发生的事情是,在晚上的不同时间点,它将回滚到前一天的值。然后它将继续从该点生成值。 因此,例如,我可以得到这样的东西: 10112 10113 10114 10115 10116 10117 10118 10113 10114 10115 10116 ... 何时发生,第一次使用与第二次使用之间的持续时间(少至10分钟或几小时)或回滚了多少(少至1次至数百次)似乎没有任何规律。 我曾考虑过运行跟踪(现在仍然可以),但是我认为序列对象没有被直接修改。我认为这是因为修改日期已经过了几天,并且指出了我们手动提高该值以尝试消除重复项的时间。(此后此问题已经发生过好几次了。) 是否有人知道每晚可能导致序列回滚和重用值的原因? 更新:要回答评论中的几个问题: @@Version: Microsoft SQL Server 2012(SP1)-11.0.3000.0(X64)2012年10月19日13:38:57 创建脚本: CREATE SEQUENCE [schemaName].[SequenceName] AS [bigint] START WITH 410014104 INCREMENT BY 1 MINVALUE 410000000 MAXVALUE 419999999 CYCLE CACHE GO 我没有唯一约束(但我打算穿上)。但是,这只会让我知道何时重用了值。不是什么导致值重置。我的工作是每5分钟保存一个新值。时间和价值跳跃没有遵循规律。 我已经检查了事件日志,看是否有错误。唯一正在发生的事情是这样的:http : //support.microsoft.com/kb/2793634 我们今天正在应用此修复程序。我不认为这些是相关的,但是可能是相关的。

1
恢复差异备份会创建DEFUNCT日志文件吗?
这是我的问题。我正在尝试通过完全还原将数据库移动到新服务器,然后使用快速差异备份/还原进行切换。我可以完全还原,但是还原差异备份时会收到以下警告: 消息3127,级别16,状态1,行1还原的数据库'DatabaseName'的文件'Database_Log2'处于关闭状态,因为该数据库正在使用简单恢复模型,并且该文件被标记为可读写访问。因此,只能通过逐段还原来恢复只读文件。 数据库已还原并被视为联机,但是由于此DEFUNCT文件而导致的任何备份操作失败,并出现以下错误: 消息3636,级别16,状态2,行1处理数据库ID 10文件ID 6的“ BackupMetadata”元数据时发生错误。消息3046,级别16,状态2,行1元数据不一致。唯一可能的备份操作是使用WITH CONTINUE_AFTER_ERROR或NO_TRUNCATE选项进行尾日志备份。消息3013,级别16,状态1,第1行BACKUP DATABASE异常终止。 如果我对完整文件和差异文件执行RESTORE FILELISTONLY,则两者都给我相同的输出,这与我从源数据库上的sys.database_files中看到的输出匹配。服务器为Developer Edition上的SQL2012 SP1。 我可以进行完整备份,然后立即进行差异处理,然后将这些文件还原到同一服务器上的其他数据库中,并看到完全相同的问题,因此造成差异的原因与创建差异有关。如果使用“恢复”还原完整备份,则没有问题。我不知道该文件是否曾经存在于该数据库中,但是该文件很可能曾经存在并且很久以前就被删除了。如果我在已还原的数据库上查询sys.database_files,则DEFUNCT文件具有drop_lsn的值,似乎可以确认这一点。当前,源数据库中只有一个文件组(PRIMARY),4个数据文件和一个日志文件。 有任何想法吗?

3
db_owner无法删除数据库-错误615,SQL Server
我有一个在Amazon EC2上运行的SQL Server 2012数据库。我已经创建了一个用户,可以创建,编辑和删除数据库。我给新用户dbcreator担任服务器角色。 我的用户可以远程连接并成功运行create database foo;命令。但是,当用户尝试使用drop database foo;命令再次删除数据库时,失败并显示以下错误: Warning: Fatal error 615 occurred at Feb 1 2014 5:15PM. Note the error and time, and contact your system administrator. ErrorCode: 21 即使选择的数据库是master(所以我也不认为是因为它正在使用中)。当我再次运行该命令时,该命令成功,以管理用户身份登录。 我检查了新创建的数据库,并按db_owner预期向用户分配了该数据库中的角色,因此我的理解是,这对于该用户来说应该是足够的权限,以便能够删除他们刚刚创建的数据库。 根据http://technet.microsoft.com/zh-cn/library/ms178613.aspx,db_owner角色应具有足够的权限。“需要数据库的CONTROL权限,ALTER ANY DATABASE权限或db_owner固定数据库角色的成员身份。” 我查找了错误615,发现“找不到数据库表ID%d,名称为'%。* ls'。” 这对我来说毫无意义。http://technet.microsoft.com/zh-CN/library/aa937592(v=sql.80).aspx SQL Server版本信息:Microsoft SQL Server 2012 (SP1) - 11.0.3368.0 (X64) /n May …

3
改善STIntersects的性能
表格T_PIN有300,000个图钉和T_POLYGON36,000个多边形。T_PIN具有此索引: CREATE SPATIAL INDEX [T_PIN_COORD] ON [dbo].[T_PIN] ( [Coord] )USING GEOGRAPHY_GRID WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), CELLS_PER_OBJECT = 128, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; T_POLYGON 有: …

5
释放未使用的空间SQL Server表
我在SQL Server 2012 Express中有一个表,其中有很多未使用的空间。 我需要释放数据库中的空间。 | NAME | 行| 保留 数据| INDEX_SIZE | 未使用 | ------------- | -------- | -------------- | ----------- --- | ------------ || -------------- | | MyTableName | 158890 | 8928296 KB | 5760944 KB | 2248 KB | 3165104 KB | 如何获得SQL释放3165104KB? 我已经尝试过: Alter table MyTableName …

1
具有LOG_BACKUP log_reuse_wait_desc的SQL Server 2012简单恢复模型
虽然我在做我自己的调查,没有人知道为什么在数据库SIMPLE恢复模型LOG_BACKUP的log_reuse_wait_desc? SQL Server 2012 SP1。数据库是在几周前创建的。没有复制,没有镜像,没有日志传送,而且从未有过这些。 我们做了备份数据库,并恢复到另一个实例,它显示了SIMPLE和NOTHING在log_reuse_wait对其他实例。但是我不认为还原到另一个实例是重现此问题的好方法,因为还原操作会前滚/回滚事务。

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.