标签: sql-server

偶尔出现“SQL Server 警报系统:发生‘警报严重性 20’”错误

我们偶尔会收到以下电子邮件警报。

\n\n

描述:用于打开连接的登录数据包在结构上无效;连接已关闭。请联系客户端库的供应商。

\n\n

描述:网络数据包有效负载中指定的长度与读取的字节数不匹配;连接已关闭。请联系客户端库的供应商。

\n\n

我尝试在网上搜索。但我还没有得到任何关于我应该如何解决这些警报问题的好的指示。在这种情况下,我应该联系应用程序团队来检查错误代码,还是联系安全团队来检查任何恶意活动?感谢您的指导。

\n

sql-server alerts

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

使用游标如果存在则更新,如果不存在则插入

我正在尝试写一个游标。我创建了一个表,用于从 sys.dm_exec_sessions 捕获登录名和时间。现在,我需要编写一个游标,以便在登录名已存在的情况下将登录时间更新为上次登录时间,并在表中不存在登录名的情况下插入一行。我想出了以下方法,但不幸的是,我收到一个错误,子查询返回多个值。有任何想法吗???

declare @log as varchar(200)
declare @log_time as datetime
declare LoginsSize cursor for
        SELECT  login_name, login_time
        FROM sys.dm_exec_sessions 
open LoginsSize
            fetch next from LoginsSize into @log, @log_time
            while( @@fetch_status = 0)
        begin                                                           
          If (Select Login from [dbo].[LoginsForDBUserList])  = @log 

             Begin
             UPDATE  [dbo].[LoginsForDBUserList]
             SET     LastLoginTime = @log_time
             WHERE   [login]= @log
             END

             Else 

             Begin
             Insert Into [dbo].[LoginsForDBUserList]
             SELECT  login_name, login_time
             FROM sys.dm_exec_sessions
             END

        fetch next from LoginsSize into @log, @log_time
        close LoginsSize
        deallocate LoginsSize

end
Run Code Online (Sandbox Code Playgroud)

sql-server cursors

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

为什么 SQL Server Developer Edition 2014 的 CPU 使用率低

CPU使用率较低,大约15%。CPU是4770K。SQL Server 数据文件分为 8 个部分,并与 tempdb(也分为 8 个部分)一起存储在 EVO 970 SSD 上。temdlog 和数据库日志位于另一个 SSD 上(读/写潜力约为 500MB/s)。我在下面的任务管理器中没有看到任何高磁盘使用率(10 MB/s),并且 RAM 使用率也不高(有 32 GB)。最大并行度设置为 8。

看起来 SQL Server 主要使用 1 个核心,但我不明白为什么。似乎不受磁盘或内存的限制,那么我怎样才能让它工作得更努力一些(使用更多的CPU)?

更新

测试了 Dan Guzman 的查询并确认 cpu 利用率更高,尽管很难有时间在任务管理器中看到(查询时间 2 秒)。很高兴知道开发者版本并未锁定一个核心。

测试了丹·布朗链接中的查询。并行化版本使我的 cpu 使用率超过 95%,因此案件似乎已经结束;cpu使用率低是因为查询。

我有很多相关子查询(在选择中选择),这对于性能来说看起来不太好。对于维护来说,最简单的方法是在一个查询中计算多个统计信息,但这种方式似乎只使用一个核心。我测试了将它们拆分,以便每个查询只计算一个指标,这样 sql server 就开始使用更多核心。

将来我想我会测试 Spark 对于相同查询的性能,看看它与 sql server 相比如何。也许还可以通过 Spark 在多个工作线程上运行针对 sql server 的查询(在这种情况下,我需要根据 pk 的模数进行分区来分割工作)。

对于感兴趣的人来说:我需要计算的是比赛的各种指标,这样对于每场比赛和每个竞争对手,我都会获取其最高记录,例如过去 3 个月、过去 6 个月等或过去 6 个月的平均时间。当查询时间约为 10 小时时,它开始影响我想做的分析工作(更改或纠正某些内容的一次迭代需要太长时间)。

sql-server

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

如何使用 SQL Server 数据库邮件发送 Unicode 符号?

如何使用 SQL Server 数据库邮件发送 Unicode 符号?我的目标是发送关于电子邮件主题的符号。比方说,我想发送关于该主题的“带有符号的主题”。我想使用的符号来自 Segoe UI Emoji 字体。

谢谢!

sql-server database-mail unicode

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

SQL 获取分区边界和文件组

对于给定的分区方案名称,我需要检索一组

  • 边界值
  • 文件组名称

必须在不存在参与该方案的任何表的情况下起作用。

通过 sys.indexes 加入将不起作用。

认为答案在于 sys.destination_data_spaces,但尚未弄清楚与 sys.partition_range_values 的连接。

sql-server query metadata partitioning sql-server-2012

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

带有历史表的 SQL Server 复制

是否可以复制 SQL Server 数据库并让副本拥有临时/历史表?

详细信息:
我有一个生产系统,运行 SQL Server 2014。我想要一个副本数据库,并且我还想跟踪历史更改。

将生产数据库复制到 SQL Server 2016 实例并跟踪时态/历史表的更改将是理想的选择。

这可能吗?
这在 Azure 上可能吗?

编辑:第 2 部分

在大卫·布朗的出色回答和进一步阅读之后,我有了更多的方向和更多的问题。我将使用 Azure SQL 数据库/逻辑服务器。我将使用事务复制,因为 1. Azure SQL 数据库支持它,2. 我们可以在发布者 (Sql Server 2014) 上禁用时态表,并在订阅者 (Azure SQL 数据库/逻辑服务器) 上启用时态表。大卫·布朗的出色回答。

第 2 部分问题:当“发布者”数据库成为发布者时,它会承受多少额外负载?

设置此功能时如何避免停机和锁定发布者?

我有多个“发布者”数据库。我可以在一个 Azure SQL 数据库/逻辑服务器实例上拥有多个订阅者数据库吗?

replication sql-server sql-server-2014 temporal-tables sql-server-2016

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

阻止对主 AG 副本进行读取访问,但允许在可读辅助副本上进行读取访问

我们有一个独特的情况,我们希望允许用户使用 SSMS 查询数据库的可读辅助副本以进行临时报告,但不允许他们从主副本中读取数据。我们设置了只读路由来完成此任务。这也是 SQL 2016 上的全部。

我最初的想法是在主副本和辅助副本上创建登录名,并授予对相关数据库的读取访问权限。然后我们将拒绝连接或禁用当前主副本上的登录。在 SSMS 中,用户可以使用 ApplicationIntent=ReadOnly 连接到侦听器,并路由到辅助副本,而无需接触主副本。

我们将使用基本逻辑在主副本服务器和辅助副本服务器上设置一个简单的作业:如果当前服务器=主服务器,则禁用登录;如果当前服务器 = 辅助服务器,则启用登录。

问题是,当在主服务器上禁用登录时,以只读意图连接到侦听器时,我会遇到登录失败。当我在主副本上重新启用登录时,它工作得很好,并且连接已正确路由到可读的辅助副本。

我在主服务器上设置了跟踪,果然,我可以看到登录连接并在主副本上的 master 和 msdb 中运行一些系统类型查询 - 即使我在 SSMS 中使用 ApplicationIntent=ReadOnly 进行连接。我不确定这是否是 SSMS 在幕后执行的操作,或者是否是登录通过只读路由过程的默认行为。

以下是我在主数据库上使用快速分析器跟踪捕获的查询:

--msdb query

    select 
        case 
            when object_id('dbo.sysdac_instances') is not null then 1             
        else
            0 
        end

--master query

SELECT
dtb.name AS [Name],
dtb.database_id AS [ID],
CAST(has_dbaccess(dtb.name) AS bit) AS [IsAccessible]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC
Run Code Online (Sandbox Code Playgroud)

以前有人处理过这种情况吗?看来我们基本上需要允许主副本上的登录连接权限,同时拒绝其对主副本上 AG 中的数据库的读取访问权限,但授予该登录权限以读取可读辅助副本上的数据库。

另一种选择是创建一个直接指向辅助副本的 DNS 条目,但我们不能保证该副本始终是辅助副本,因为可能会发生故障转移。

sql-server availability-groups read-only-database sql-server-2016

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

BST/GMT 转换为 UTC 时间

无论如何,将存储在 DB 中的 BST 日期时间转换为 UTC

查看了“时区”,但似乎是从 UTC 到其他时间。

数据库将日期时间存储为 BST/GMT 历史上需要将这些日期时间返回为 UTC

SELECT CONVERT(datetime,GETDATE()) AT TIME ZONE 'UTC' 
Run Code Online (Sandbox Code Playgroud)

例如

2019-07-08 12:01:55.060 ->  2019-07-08 11:01:550
Run Code Online (Sandbox Code Playgroud)

需要回溯大量历史日期数据,因此可能是 GMT 或 BST,具体取决于一年中的时间以及哪一年将确定回溯的切换日期

下面的示例,我存储了 GMT/BST 时区时间,需要使用 UTC 格式

DECLARE @dayLight TABLE(season VARCHAR(50), [gmt/bst] datetime, uct Datetime) 
INSERT INTO  @dayLight
VALUES('winter','2019-02-10 15:00:00','2019-02-10 15:00:00')
       ,('winter','2019-03-30 15:00:00','2019-03-30 15:00:00')
       ,('summer','2019-03-31 02:00:00','2019-03-31 01:00:00') --cut over
       ,('summer','2019-04-15 15:00:00','2019-03-30 14:00:00')
       ,('summer','2019-10-27 02:00:00','2019-10-27 01:00:00') --cut over
       ,('winter','2019-10-27 03:00:00','2019-10-27 03:00:00')

SELECT season,uct,[gmt/bst] FROM @dayLight     
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

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

在 azure 托管实例上恢复差异备份?

我正在将数据库从本地迁移到 Azure 托管实例。为了移动数据库,我正在使用组织每周完整备份,并且我要求他们在应用程序脱机后进行比较(数据库非常大)。

问:我可以在 Azure 托管实例上还原差异备份吗?

当我尝试在没有恢复的情况下恢复完整内容时,而不是应用差异。我收到错误:“azure 托管实例中不支持使用 norecovery 进行还原”

sql-server azure-sql-database azure-sql-managed-instance

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

SSMS 处理换行符的方式不一致

可能更多的是 SQL Management Studio 问题而不是 SQL 本身,但是当我运行以下简单查询时:

SELECT results = 'Foo' + CHAR(13) + CHAR(10) + 'Bar'
Run Code Online (Sandbox Code Playgroud)

根据我选择“结果到网格”还是“结果到文本”,我似乎会得到不同的结果。

将 SSMS 设置为“结果到文本”后,我得到(如预期):

results
--------
Foo
Bar

(1 row affected)
Run Code Online (Sandbox Code Playgroud)

但是将 SSMS 设置为“结果到网格”,然后复制并粘贴结果,我得到

Foo  Bar
Run Code Online (Sandbox Code Playgroud)

sql-server ssms sql-server-2012

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