标签: sql-server-2014

连接 AlwaysOn AG 侦听器问题

我是微软技术的新手,我在 SQL Server 2014 的连接部分遇到了问题。这可能是一个简单的问题,但我被卡住了。

我有4台服务器。其中之一是 Active Directory 域控制器,一个是应用程序服务器,另一个用于 SQL Server。由于这是一个连接问题,服务器的 IP 是; -AD DC:10.6.0.100(也是 DNS 服务器) -APP:10.6.0.110 -SQL 1:10.6.0.120 -SQL 2:10.6.0.121

我已经成功创建了一个故障转移集群 (DBCLUSTER) 并将 FC 的 IP 地址设置为10.6.0.130(这不是实际的服务器 IP,我真的不明白这部分..)。

后来,我为 sql 服务器创建了一个 AlwaysOn 可用性组。我已经成功创建了没有侦听器的 AG。我可以从彼此连接到服务器,数据库同步没有问题。然后,我创建了一个监听器(AG侦听),并设置它的IP为10.6.0.131(这是实际的服务器IP,?)和它的端口设置为5525。它没有给任何问题。

所以我想测试连通性。当我想从APP服务器直接连接到SQL 1SQL 2 时,我可以毫无问题地连接。但是当我尝试连接到AG-LISTENER 时,它在网络上找不到它。当我检查 DNS 记录时。我可以看到它托管在10.6.0.131 上

当我尝试从AD-DC、APP、SQL 2服务器ping AG-LISTENER 时,它响应目标主机无法访问(它正在 ping 10.6.0.131,但响应来自 AD-DC、APP …

sql-server availability-groups connectivity active-directory sql-server-2014

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

在批处理文件中使用多个 SQLCMD 调用进行事务

有没有什么好方法可以做以下事情?

SQLCMD -S %SERVER% -E -Q "BEGIN TRANSACTION"
FOR %%f in (script1 script2 script3) do (
    SET CURRENT_SCRIPT=%%f
    SQLCMD -S Localhost -E -b -V 1 -i %%f.sql -o %%f.log
    IF !ERRORLEVEL! NEQ 0 GOTO ERROR
    SET CURRENT_SCRIPT=
)
SQLCMD -S %SERVER% -E -Q "COMMIT TRANSACTION"
Run Code Online (Sandbox Code Playgroud)

sql-server transaction sqlcmd sql-server-2014

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

Unicode 字符的模式匹配问题

我正在编写一段对 unicode 字符使用模式匹配的代码,但我遇到了一个奇怪的问题。有些字符有效,有些则无效。

DECLARE @Pattern nvarchar(50) = N'%[^a-z]%' -- Simple pattern
SELECT PatIndex(@Pattern, nchar(46797)), nchar(46797) -- Works
SELECT PatIndex(@Pattern, nchar(14843)), nchar(14843) -- Doesn't Work
Run Code Online (Sandbox Code Playgroud)

该模式应该适用于任何不是 az 的字符,但由于某种原因它没有捕捉到某些字符。有谁知道为什么某些 unicode 字符会匹配而其他字符则不会?

sql-server pattern-matching sql-server-2014 unicode

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

为什么注释中带有“ xp_cmdshell ”的脚本因传输级别错误而失败?

执行作为大型脚本一部分的以下批处理时:

...
GO
-----------------------------------------------------------------------------------------------
-- Removed the xp_cmdshell for deleting the backup file 
-----------------------------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PR_MyProc]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[PR_MyProc]
GO
...
Run Code Online (Sandbox Code Playgroud)

我们在远程 SQL Server 上收到以下错误:

Msg 121, Level 20, State 0, Line 0 从服务器接收结果时发生传输级错误。(提供者:TCP 提供者,错误:0 - 信号量超时期限已过期。)

当我们从注释中删除“xp_cmdshell”时,批处理成功。此错误仅发生在我们的某些 SQL 服务器上。我们正在远程运行脚本。失败的 SQL Server 版本是:

Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Microsoft Corporation 标准版(64 位)在 Windows NT 6.2 (X64) …

sql-server sql-server-2014 xp-cmdshell

7
推荐指数
2
解决办法
926
查看次数

MAXDOP 不工作?

我想MAXDOP在我的电脑上测试一下。所以我MAXDOP为特定查询设置为 2。但是,当我在运行查询时查看任务管理器中的逻辑处理器时,看起来它们都被使用了。我认为如果MAXDOP设置为 2 ,它只会使用 2 个逻辑处理器?有谁知道发生了什么?请看下图。

另一个问题是,DOP执行计划返回的值是1。现在我知道设置MAXDOP并不意味着SQL Server 会实际使用设置的数字。然而,考虑到我的 4 个逻辑处理器似乎都被用于处理查询,看到DOP1.

这是我运行的查询: 在此处输入图片说明

这是我运行时发生的情况(即看起来所有 4 个逻辑处理器都用于运行查询): 在此处输入图片说明

sql-server parallelism maxdop sql-server-2014

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

帮助理解 sys.dm_exec_cached_plans 和 dm_os_memory_clerks 之间的差异

在我们的 SQL Server 2014 实例之一上,根据 sys.dm_exec_cached_plans 用于缓存计划的内存量与根据 sys.dm_os_memory_clerks 查看 CACHESTORE_SQLCP 类型(我理解)的内存量之间存在奇怪的差异用于即席查询缓存计划)。

如果我们查询缓存计划如下:

select cp.cacheobjtype, cp.objtype, 
  sum(cast(cp.size_in_bytes as money))/1024/1024 as sizeMB
from sys.dm_exec_cached_plans as cp
group by cp.cacheobjtype, cp.objtype;
Run Code Online (Sandbox Code Playgroud)

那么我们似乎总共有大约 90 MB 用于缓存计划,只有 2MB 用于临时计划。缓存中也只有 300 个计划。

但是,如果我们查看 dm_os_memory_clerks 视图如下:

select mc.type, mc.pages_kb/1024 as pagesMB
from sys.dm_os_memory_clerks as mc
where mc.type = 'CACHESTORE_SQLCP'
Run Code Online (Sandbox Code Playgroud)

然后它报告大约使用了 12 GB。我们的实例有大约。其中有 300 GB 的 RAM。

我们想了解这种差异,并在理想情况下采取一些措施来确保计划缓存得到有效使用(即其中有 300 多个计划以提高目前非常差的缓存命中率)。能够考虑这个空间将是第一步。

关于差异可能是什么以及为什么这个空间不被用于缓存计划的任何想法?

sql-server dmv sql-server-2014

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

选择最低的 ID 并计算与最低的偏差

我正在尝试创建一个视图。我的 SQL Server 数据库中有一些数据,我想按它们mark1mark2. 现在,当我对它们进行排序时,我想选择mark1谁最低,mark2并计算与其他mark1s的偏差是多少。表格现在看起来像这样,但没有偏差。

|   mark1    |    mark2    |      mass    ||    deviation |
|:-----------|------------:|:------------:||:------------:|
| 0001       |      10000  |     10,0     ||    min0001   |
| 0001       |      15000  |     12,0     ||    +20%      |
| 0002       |      11200  |     18,0     ||    min0002   |
| 0002       |      13000  |     35,5     ||    +97.2%    |
| 0002       |      14565  |     85,5     ||    375%      |
| 0003       |      15004  |     15,4     ||    min0003   |
| …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014

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

NULL 时在表中使用“默认值”

我正在构建一个配置表并希望将一行作为默认值。例如,我有一个list包含所有数据库的表和一个msg包含我所有返回值的表。在里面msg表中,我有一行是“alldbs”,如果连接的数据库没有另一行,我希望返回该值。

所以输出应该是:

--LIST TABLE
dbname                                             createdate
-------------------------------------------------- -----------------------
master                                             2015-06-23 10:05:14.363
model                                              2015-06-23 10:05:14.363
msdb                                               2015-06-23 10:05:14.363
tempdb                                             2015-06-23 10:05:14.363
dummy                                              2015-06-23 10:05:14.363

--MSG Table
dbname                                             msgval
-------------------------------------------------- --------------------
alldbs                                             Message 1
dummy                                              Message 2


--DESIRED OUTPUT
dbname                                             msgval
-------------------------------------------------- --------------------
dummy                                              Message 2
master                                             Message 1
model                                              Message 1
msdb                                               Message 1
tempdb                                             Message 1
Run Code Online (Sandbox Code Playgroud)

现在我可以得到结果,但查询很笨重,似乎应该有更好的方法:

select
    a.dbname
    ,b.msgval
from
    list a
    join msg b on a.dbname = b.dbname
union all
select
    a.dbname …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014

7
推荐指数
3
解决办法
1250
查看次数

为什么 SQL Server 2014 在没有存储活动数据的情况下消耗如此多的 RAM?

我在我的笔记本电脑上运行 SQL Server 2014 以及大量其他已安装的应用程序,从 Visual Studio 到视频游戏。

这显然不是生产服务器,而是仅用于开发和调试。

我已经编写了一个相当小而简单的数据库,其中包含几十个表和视图 - 我插入了不到 100 行的虚拟数据用于测试。

有一次我不小心创建了一个 100GB+ 的索引,使用了一些格式错误的交叉连接 - 创建这个索引的查询消耗了我的笔记本电脑 (16GB) 中 100% 的内存,这使一切变得缓慢,所以我中止了查询而不是等待它完成,然后立即删除并重新创建整个数据库,并从创建脚本中删除此索引。

但是,从那时起,SQL Server 2014 一直在消耗我所有 16GB 的 RAM,即使查询中止和数据库删除也是如此。

所以我接下来重新启动了我的笔记本电脑,SQL Server 的 RAM 使用量下降到 7GB - 从那时起它一直保持不变,无论我是否删除了所有 5MB 的现有数据库等。

我想让 SQL Server 恢复到合理的内存消耗水平,但我不知道从哪里开始寻找可能的原因。

我知道这是一个非常开放的问题,但我愿意在一些指导下进行跑腿工作。

我只是不知道从哪里开始进行故障排除,因为我自己不是 DBA - 显然 Google 也不知道。:)

sql-server memory sql-server-2014

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

SQL Server 增长和收缩事件的历史记录

有没有办法查看 SQL Server 2014 上过去几周/几个月的增长和收缩事件的完整历史记录?(要支持的新实例,从票务系统中注意到它们之前有“日志驱动器已满”的历史记录,因此希望在再次发生之前深入研究根本原因。)

这很有用:识别文件增长事件。想出了下面的查询,但它没有显示任何“手动”日志收缩事件,只显示“自动”事件。我是否以错误的方式这样做,还有其他地方可以查找过去的信息吗?

select
    te.name as event_name,
    tr.DatabaseName,
    tr.FileName,
    tr.IntegerData,
    tr.IntegerData2,
    tr.LoginName,
    tr.StartTime,
    tr.EndTime
--select * 
from 
sys.fn_trace_gettable(convert(nvarchar(255),(select value from sys.fn_trace_getinfo(0) where property=2)), 0) tr
inner join sys.trace_events te on tr.EventClass = te.trace_event_id
where 
tr.EventClass in (93, 95) --can't identify any other EventClass to add here
order by 
EndTime desc;
Run Code Online (Sandbox Code Playgroud)

sql-server shrink sql-server-2014

7
推荐指数
2
解决办法
3万
查看次数