小编bil*_*nkc的帖子

我的 SQL Server 打补丁了吗?

如何判断我的 SQL Server 实例是否已打补丁?是否有本机功能可以识别我的服务器是否有可用的补丁?哎呀,我什至有可用的版本数据吗?

sql-server

23
推荐指数
1
解决办法
6254
查看次数

SQL Server 数据库同步

问题定义

我们的用户需要能够查询大部分是最新的数据库。数据可能会过时长达 24 小时,这是可以接受的。使用生产副本获取和保持第二个数据库最新的最低成本方法是什么?有没有我没有想到的方法?

工作量

我们有一个第三方应用程序用于监控股票交易活动。白天,作为各种工作流程的一部分,会发生许多小的变化(是的,这笔交易是有效的。不,这是可疑的,等等)。晚上,我们执行基于大集合的操作(加载前一天的交易)。

当前的解决方案和问题

我们使用数据库快照。晚上 10 点,我们删除并重新创建快照。然后开始 ETL 处理。这显然对我们的磁盘造成了负担,但允许我们的用户能够在不锁定数据库的情况下查询数据库(他们使用 Access 前端)。他们在深夜和清晨使用它,因此他们会注意到停机时间。

这种方法的问题有两方面。首先,万一夜间处理失败,这种情况并不少见,我们可以恢复导致快照被删除的数据库。另一个问题是我们的处理时间超过了 SLA。在确定了写得不好的查询和缺乏索引后,我们正试图通过与供应商合作来解决这个问题。数据库快照也是造成这种放缓的罪魁祸首,这一点可以从存在与不存在时的速度差异中得到证明——我知道,这令人震惊。

考虑的方法

聚类

我们打开了数据库集群,但这并没有解决使数据可用的需求,而且通常只会使管理员的生活变得复杂。它已被关闭。

SQL Server 复制

我们上周开始研究复制。我们的理论是,我们可以建立第二个目录并与生产数据库同步。在 ETL 开始之前,我们将切断连接,只有在 ETL 过程完成后才重新启用它。

管理员从快照复制开始,但他担心需要多天的高 CPU 使用率来生成快照以及所需的磁盘消耗。他表示,它似乎在向订阅者发送之前将所有数据写入物理文件,因此我们的 .6TB 数据库将花费 1.8TB 的存储成本。此外,如果生成快照需要数天时间,则它不符合所需的 SLA。

阅读完这篇好文章后,似乎 Snapshot 可能是初始化订阅者的方式,但之后我们希望切换到事务复制以保持同步。我假设打开/关闭事务复制不会强制完全重新初始化?否则,我们将打破我们的时间窗口

数据库镜像

我们的数据库处于完全恢复模式,因此数据库镜像是一种选择,但我对它的了解甚至比复制还要少。我确实找到了指示“数据库镜像阻止直接访问数据,镜像数据只能通过数据库快照访问”的SO 答案

日志传送

听起来日志传送也可能是一种选择,但这是我一无所知的另一件事。它会是比其他任何解决方案(实施和维护)成本更低的解决方案吗?基于 Remus 的评论“日志传送允许对副本副本进行只读访问,但在应用收到的下一个备份日志时(例如,每 15-30 分钟)将断开所有用户的连接。” 我不确定停机时间会转化为多长时间,因此可能会导致用户有些焦虑。

微软同步

我上周末才听说使用Sync,还没有研究它。我不想为像这个问题那样具有高知名度的东西引入新技术,但如果它是最好的方法,那就这样吧。

安全信息系统

我们在这里做了大量的 SSIS,所以生成几百个 SSIS 包来保持辅助同步对我们来说是一种选择,尽管这是一个丑陋的选择。我不喜欢这样做,因为我不希望我的团队承担很多维护开销。

SAN“魔术”快照

过去,我听说我们的管理员使用一些 SAN 技术对整个磁盘进行即时备份。也许有一些 EMC …

replication sql-server sql-server-2008-r2

21
推荐指数
1
解决办法
9023
查看次数

24x7 vs 夜间时间窗口

我在哪里可以找到有关如何更好地转向 24x7 运营的资源?拥有大数据库的大公司是如何做到这一点的?我们的夜间工作,例如

  1. 清除旧数据
  2. 重新索引
  3. 更新统计

所有这些似乎都会对我们的系统造成严重影响(在线用户和实时数据馈送)。我已经在亚马逊上查找了与此主题相关的任何书籍,但到目前为止还没有找到任何内容。

sql-server

19
推荐指数
1
解决办法
1200
查看次数

随机数和连接类型的意外结果

我有一个简单的脚本,它获取四个随机数(1 到 4),然后重新连接以获取匹配的 database_id 数。当我使用 LEFT JOIN 运行脚本时,我每次都返回四行(预期结果)。但是,当我使用 INNER JOIN 运行它时,会得到不同数量的行——有时是两行,有时是八行。

从逻辑上讲,应该没有任何区别,因为我知道 sys.databases 中存在 database_ids 1-4 的行。因为我们是从四行的随机数表中选择的(而不是加入它),所以返回的行不应该超过四行。

这在 SQL Server 2012 和 2014 中都会发生。是什么导致 INNER JOIN 返回不同数量的行?

/* Works as expected -- always four rows */

SELECT rando.RandomNumber, d.database_id
FROM 
  (SELECT 1 + ABS(CHECKSUM(NEWID())) % (4) AS RandomNumber 
   FROM sys.databases WHERE database_id <= 4) AS rando
LEFT JOIN sys.databases d ON rando.RandomNumber = d.database_id;


/* Returns a varying number of rows */

SELECT rando.RandomNumber, d.database_id
FROM 
  (SELECT 1 + ABS(CHECKSUM(NEWID())) …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

16
推荐指数
2
解决办法
920
查看次数

SQL 代理 powershell 上下文参考

在我的新工作中,我们在每台服务器上都有多个命名实例。例如

  • 服务器 1\开发
  • Server1\DevIntegrated
  • 服务器 1\QA

我在工作中有一个 SQL PowerShell 脚本,它调用操作系统,调用Foo.exe但需要传递命令行参数(连接字符串)。每个实例上都将存在一个 SQL 代理作业,带有 PowerShell 类型的步骤,需要知道当前上下文是什么。此执行在 DevIntegrated 上开始。

我不想让每个脚本都以...开头

$thisInstance = "Dev"
Run Code Online (Sandbox Code Playgroud)

...特别是因为当我们在接下来的几个月中迁移到环境(新服务器和命名实例)时,我必须对其进行编辑。

如果我启动 SQLPS,我可以通过切片和切块 Get-Location 的结果或运行来确定我的实例

(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Run Code Online (Sandbox Code Playgroud)

当 SQL 代理启动 PowerShell 类型的作业时,它会在 C:\windows\system32 中启动,并且Get-Location路由不起作用,因为它不在 SQLSERVER 上下文中。我可以切换到该上下文,但我将处于 SQL Server 的“根”,并且不知道我应该在哪个实例中。Invoke-Sqlcmd出于相同的原因,使用该路由也不起作用(从技术上讲,它在那里超时不是默认实例)

据我所知,我已经列举了我可以进入工作日志的所有基本“事情”,但似乎没有任何显示 SQLSERVER:\SQL\Server1\DevIntegrated

Get-Process似乎我可以使用它和一些尝试通过击中实例和匹配 spid 来拼凑东西的巫术,但这听起来像是来自地狱的血腥黑客。一定有一些基本的东西我错过了,有人能解释一下吗?

研究 PowerShell 的替代方案

我曾调查过使用其他工作类型,但没有得到令人满意的解决方案。研究表明,SQL 代理下列出的 PowerShell 是 SQLPS,通过右键单击代理启动它的实例会自动将我放到正确的位置。只有当我将交互式代码粘贴到作业步骤中时,我才知道前面提到的差异。

操作系统的作业类型使我处于相同的状态,因为我找不到确定哪个实例将我放入命令外壳的方法。当然,我可以使用 sqlcmd 并获取 的值,@@servername …

sql-server-2005 sql-server-2008 sql-server powershell

14
推荐指数
2
解决办法
2314
查看次数

将 ExecutionInstanceGUID 与 SSISDB 相关联

2012 年发布的 SQL Server 集成服务 SSIS 提供了一个 SSISDB 目录,用于跟踪包的操作(除其他外)。使用项目部署模型的解决方案的默认包执行将打开 SSISDB 的日志记录。

当一个包执行时,System::ExecutionInstanceGUID填充有一个值,如果使用显式日志记录(到sys.sysdtslog90/ sys.sysssislog)将记录特定包执行的所有事件。

我想知道的是,如何将 ExecutionInstanceGUID 绑定到SSISDB 目录中的任何内容。或者,在 SSISDB 中执行的 SSIS 包是否知道其值catalog.executions.execution_id

最终,我尝试使用现有的自定义审计表并将其链接回 SSISDB 目录中的详细历史记录,但似乎找不到链接。

ssis sql-server-2012

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

用户定义表类型的 sp_executesql 行为不正确

问题

用户定义的表类型作为sp_executesql 的参数是否存在已知问题?

设置脚本

此脚本创建一个表、过程和用户​​定义的表类型(仅限 SQL Server 2008+)。

  • 堆的目的是提供一个审计,是的,数据进入了程序。没有限制,没有任何东西可以阻止数据被插入。
  • 该过程将用户定义的表类型作为参数。proc 所做的就是插入到表中。
  • 用户定义的表类型也很简单,只有一列

我已经运行了以下内容11.0.1750.32 (X64)10.0.4064.0 (X64)是的,我知道可以修补该框,但我无法控制。

-- this table record that something happened
CREATE TABLE dbo.UDTT_holder
(
    ServerName varchar(200)
,   insert_time datetime default(current_timestamp)
)
GO

-- user defined table type transport mechanism
CREATE TYPE dbo.UDTT
AS TABLE
(
    ServerName varchar(200)
)
GO

-- Stored Procedure to reproduce issue
CREATE PROCEDURE dbo.Repro
(
    @MetricData dbo.UDTT READONLY
)
AS
BEGIN
    SET NOCOUNT ON

    INSERT INTO dbo.UDTT_holder 
    (ServerName) …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server sql-server-2012

12
推荐指数
1
解决办法
7452
查看次数

SSIS 2012 创建环境变量失败

我正在编写一个脚本来将环境从一台服务器移植到另一台服务器。我遇到了一个调用问题,catalog.create_environment_variable其中出现错误“输入值的数据类型与‘字符串’的数据类型不兼容。” 从过程“check_data_type_value”出来。

奇怪的是,如果我让 GUI 脚本输出变量,该查询将起作用

DECLARE @var sql_variant = N'\\myserver\ssisdata'
EXEC [catalog].[create_environment_variable]
    @variable_name = N'FolderBase'
,   @sensitive = False
,   @description = N''
,   @environment_name = N'Development'
,   @folder_name = N'POC'
,   @value = @var
,   @data_type = N'String'
GO
Run Code Online (Sandbox Code Playgroud)

但是,采用这种脚本方法是行不通的。我所做的工作表明此错误消息通常是通过使用 nvarchar 数据类型而不是 varchar 来解决的。然而,我的东西不是这样。

以下脚本的第 108 行。我的假设是sql_variant 有点奇怪,但我不知道是什么。

USE SSISDB;
GO

DECLARE
    @folder_id bigint
,   @folder_name nvarchar(128) = N'POC'
,   @environment_name nvarchar(128) = N'Development'
,   @environment_description nvarchar(1024)
,   @reference_id bigint
,   @variable_name nvarchar(128) …
Run Code Online (Sandbox Code Playgroud)

ssis sql-server-2012 sql-variant-property

12
推荐指数
1
解决办法
5503
查看次数

将数据从一个 Cassandra ColumnFamily 复制到同一个 Keyspace 上的另一个(如 SQL 的 INSERT INTO)的好方法是什么?

试图找到一种方法来轻松地将所有行从 Cassandra ColumnFamily/Table 转移到另一个。

COPY我了解,该命令是一个不错的选择。但是,由于它将所有数据转储到.csv磁盘上,然后将其重新加载,我不禁想知道是否有更好的方法在引擎中执行此操作。

我的意思的一个具体例子是INSERT * FROM my_table INTO my_other_table在许多SQL数据库中可用。当然,我意识到 Cassandra 是 NoSQL,因此不会以相同的方式工作 - 但它似乎是可用的。

什么是实现这一目标的好方法?

非常感谢!

nosql migration cassandra

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

CPU 调度器离线

我登录到一个新的客户端系统并运行 sp_blitz 以查看发生了什么变化。它报告说“ CPU Schedulers Offline ”对我来说是一个新的。

由于关联屏蔽或许可问题,SQL Server 无法访问某些 CPU 内核。

很公平,我运行基本查询

SELECT
    DOS.is_online
,   DOS.status
,   DOS.*
FROM
    sys.dm_os_schedulers AS DOS
ORDER BY
    1;
Run Code Online (Sandbox Code Playgroud)

那报告说我有 8 个设置为离线可见,43 个设置为在线。据我所知,该客户端上的任何人都不会故意设置任何 CPU 关联性。

我决定看看我是否可以解开它。当我查看属性窗口时,我看到 40 个可用的处理器,但没有一个设置为具有关联性。

在此处输入图片说明

为什么在 is_online 为 true 的 dm_os_schedulers 中有 40 个显示 43 个条目似乎也很好奇。8离线的cpu_id是32到39。

sys.configurations 似乎同意没有明确开启关联

name                 value  value_in_use  description
affinity I/O mask    0      0             affinity I/O mask
affinity mask        0      0             affinity mask
affinity64 I/O mask  0      0             affinity64 I/O mask
affinity64 mask      0      0             affinity64 mask …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 sp-blitz

10
推荐指数
1
解决办法
3170
查看次数