我们使用 Attunity 的 CDC 服务将数据从 Oracle 移动到 SQL Server。
使用 Oracle CDC Designer 管理单元工具,我可以看到服务的当前状态以及出现问题时的错误消息。我可以单击工具中的“收集诊断”来收集某个日期范围内的消息并写入文件。
我想找出诊断信息的存储位置,以便我可以从监控服务器通过 powershell 直接读取它。
我查看了事件日志,可以看到一些状态消息,但诊断报告包含更多数据。
我们使用 Attunity 的 CDC 服务将数据从 Oracle 移动到 SQL Server。
使用 Oracle CDC Designer 管理单元工具,我可以看到服务的当前状态以及出现问题时的错误消息。我可以单击工具中的“收集诊断”来收集某个日期范围内的消息并写入文件。
我想找出诊断信息的存储位置,以便我可以从监控服务器通过 powershell 直接读取它。
我查看了事件日志,可以看到一些状态消息,但诊断报告包含更多数据。
我使用 PowerShell 脚本将多个 SQL Server 作业部署到一组服务器。我可以创建作业步骤、成功失败操作,甚至输出文件。这一切都适用于多台服务器。我无法确定的是如何指定要附加而不是覆盖输出文件。
以下是我的主要脚本的部分。$Job
在上一步中填充。
$JobStep = new-object ('Microsoft.SqlServer.Management.Smo.Agent.JobStep') ($Job, 'MyJobStepName')
$JobStep.ID = 1
$JobStep.SubSystem = 'PowerShell'
$Command = 'dir d:\'
$JobStep.Command = $Command
$JobStep.OnSuccessAction = 'GotoNextStep'
$JobStep.OnFailAction = 'GotoNextStep'
$JobStep.OutputFileName = 'D:\MyJobFile.txt'
$JobStep.Create()
我一直在使用这个 MSDN页面作为参考。
我使用 SQL Server Management Studio 修改了其中一个步骤并跟踪了结果。这看起来很有希望。我可以在创建作业步骤后发出 SQL 命令。
EXEC msdb.dbo.sp_update_jobstep @job_id=N'12156dcb-c8cd-4267-901a-55175dd44960', @step_id=1 ,
@flags=2
我有几个需要将数据写入 Oracle 数据库的 Powershell 脚本。我不想硬编码登录凭据。
连接到 SQL Server 时,我依赖于 Windows 身份验证和 Active Directory,但这不是这里的选项,因为 Oracle 数据库位于单独的网络 (Unix) 上。这些脚本将通过 SQL Server 代理在 SQL Server 上执行。
我希望提出一种安全的策略,并在更改密码时最大限度地减少所涉及的工作。
我发现我最近花了很多时间检查由索引调整顾问或其他一些自动化过程生成的建议索引列表。
回到那天(大约 2005 年),我发现这些建议相当糟糕,因为它们似乎是针对一个特定查询的,而且通常只是一个包含表中每一列的覆盖索引,无论这些列是否已经是索引.
随着时间的推移,我觉得索引调整顾问有了很大的改进,但我仍然有一种内在的不信任,仍然想花时间去审查每一个。
我试图不悲观,但是当供应商(Microsoft)建议添加多个重叠覆盖索引以提高性能时,这很困难,尤其是当我们为存储空间付费时。我也不想浪费自己的时间。我宁愿修复写得不好的查询。
是否有在数据库级别加密数据的通用方法?我正在处理的应用程序将存储只有系统用户自己才能查看的敏感数据。
我正在寻找一种方法来找出 Windows Server 上次仅使用 t-sql 命令启动的时间。
我试图保持默认的安全配置(即我不想启用 xp_cmdshell)
有没有办法在 Amazon 的 RDS 中查看 SQL Server 错误日志?我通常使用 sp_ReadErrorlog,但是在 RDS 中我们需要成为 securityadmin 角色的成员。
我正在创建一系列将启用页面级压缩的新表。
这也会影响索引,还是在创建索引时我还必须指定压缩?
create table Message
(
pk_Message int identity NOT NULL constraint PK_Message primary key,
[Message] varchar(900) NOT NULL constraint UK_Message__Message unique,
DateCreated datetime NOT NULL default getdate()
) with (data_compression = page)
go
正如您在我的示例中看到的那样,我计划在相当大的数据类型上创建一个唯一约束,并希望利用压缩。
在准备将服务器场迁移到云中时,我试图列举多年来定义的所有链接服务器。我还需要找到(并更正)引用这些链接服务器的代码。
这是我一起扔的东西,以帮助识别引用链接服务器的对象的名称,但这仅适用于存储的过程、视图、函数和触发器:
declare @sql varchar(2000)
select @SQL = 'use ?;
print ''?'';
print replicate(''-'',len(''?''));
print '' '';
select object_name(sc.id)
from syscomments sc
where text like ''%TheLinkedServer%''
'
exec sp_msforeachdb @sql
我知道我将不得不打开 DTS/SSIS 包......我只是想尽快完成尽可能多的工作。
我知道这是古老的技术,但有时升级并不总是一种选择。
现在有人知道如何列出 SQL 2000 全文索引中当前使用的实际干扰词吗?
我们在非常旧的 SQL 2000 系统上反复出现问题。它是一个 3 路 Windows 2003 集群。集群偶尔会故障转移到一个新节点,当该节点上线时,它似乎使用了与我们想要的不同的干扰词列表。
似乎 SQL 2000 的各种服务包都留下了噪音词文件,当故障转移发生时,第一个找到的噪音词文件(在任何目录中)被加载。
我处境艰难,正在寻求有关如何进行的建议。我必须将一些数据从一个环境导入到另一个环境。80% 的记录已被修改,所以计划是简单地删除所有现有记录,并导入新记录。
不幸的是,这是一个基表。其他几个表定义了FK,指向这个表。为了删除数据,我需要删除 FK 并在完成导入后重新创建它们,或者禁用约束并重新启用它们。
没有记录被删除。制作了 prod 的副本,开发人员调整了数据并添加了新记录。
你会采取哪种方法?
一位开发人员说我应该简单地将我所有的数据库升级脚本包装在一个事务中。如果失败,只需回滚所有更改。我所有的直觉都告诉我这是错误的,尤其是在处理大量数据和/或过程和函数时。
我通常在单实例数据库上手动执行升级过程,如下所示:
然而,当涉及到对数百个实例进行更改时,我更改了我的流程如下:
我使升级脚本更加健壮:它们可以在同一台服务器上多次运行而不会造成伤害,数据库版本号受到尊重,如果脚本针对运行版本运行,脚本将终止,等等。
为每个服务器生成一个进程(使用 powershell、osql 等)
我正在尝试确定将 SQL 脚本部署到数百个分布式服务器的最佳方式。我有一个慢速的 SSIS 包和一个非常快的 OSQL/BATCH 进程。
我在一个项目中,我们在现场部署了数百个数据库服务器。我需要能够定期查询服务器和/或应用数据库升级脚本。
当我们只有 20 台服务器时,我构建了一个 SSIS 包来获取服务器列表并一次处理它们。SSIS 包工作得很好,有大量的错误处理和日志记录等。它能够从每个服务器捕获结果集并将它们存储在一个中央位置以供进一步分析。然而,由于我构建它的方式,它会串行处理每个服务器。20 台服务器大约需要 10 分钟来处理。我正处于这种方法太慢的地步。
在我投入更多时间重新编写这个包以生成其他包(每个服务器一个)之前,我希望从其他面临类似情况的人那里得到一些建议。
您会以这种方式使用 SSIS,还是切换到 powershell,甚至是 OSQL?
几乎是在开玩笑,我翻阅了我的档案并提取了我 12 年前写的一个批处理程序,用于在远程服务器上应用脚本。我做了一些调整(更改为 OSQL),它运行得非常快。我可以在 20 秒内处理 100 台服务器。我从 Windows 7 机器上启动它,它不会在打开那么多命令窗口时阻塞。
OSQL/BATCH 解决方案的缺点是批处理文件是用服务器名和密码硬编码的。但它是如此之快,我将继续使用它,直到找到更好的解决方案。
SSIS 包 - 当前的 SSIS 包执行以下操作: - 连接到中央服务器 - 检索需要查询的服务器列表 - 使用 forloop 容器,连接到每个服务器(串联)并执行查询 - 如果查询返回结果集,此信息被捕获并存储在中央服务器 - 中央服务器更新以反映每个服务器的成功/失败 - 所有错误都记录在中央服务器
我有一个对服务器列表执行简单查询的 SSIS 包。我对一个特定的简单查询有疑问:如果表存在,请获取行数。否则报告“不存在”。
如果我直接连接,SQL 代码可以在 Management Studio 中运行,但是当我使用 ADO NET 数据流任务与 SSIS 连接来执行代码时,我会收到验证错误。在我看来,SSIS 正在检查代码中的所有对象,以查看它们在执行之前是否存在。它甚至在尝试运行之前就失败了。
如果我注释掉“从 Table1 中选择计数(*)”,那么一切正常。
分布式服务器均使用 SQL Server 2008R2 Express Edition。
declare @Result varchar(1000),
@Table1Count int
select @Result = '',
@Table1Count = 0
-- If tables exist, get the counts
IF EXISTS(select 1 from information_schema.Tables where Table_Name = 'Table1')
BEGIN
select @Table1Count = count(*) from Table1
select @Result = 'Table1: ' + convert(varchar(12),@Table1Count)
END
ELSE
select @Result = 'Tables do not exist'
有任何想法吗?
我有一个数据库,可以根据嵌入鞋子中的 RFID 标签来跟踪人们。此数据到达VARCHAR(MAX)
与其他数据混合的列中,没有特定顺序。到目前为止,所有 RFID 值的格式如下:
AnnnnnnnnAnnAAAA (where A = 0-9 and n = A-Z)
我正在写一份报告以从这些消息中提取 RFID 并将它们存储在自己的表中。只要 RFID 遵循相同的模式,我就能找到它们。如果 RFID 格式发生变化,我的提取过程将失败。
RFID标签有标准格式吗?哪种数据类型最适合存储 RFID 标签?
我现在就去VARCHAR(20)
。
我有一份报告,显示过去 12 小时内的事件计数,按小时分组。听起来很容易,但我正在努力解决的是如何包含填补空白的记录。
这是一个示例表:
Event
(
EventTime datetime,
EventType int
)
数据如下所示:
'2012-03-08 08:00:04', 1
'2012-03-08 09:10:00', 2
'2012-03-08 09:11:04', 2
'2012-03-08 09:10:09', 1
'2012-03-08 10:00:17', 4
'2012-03-08 11:00:04', 1
我需要创建一个结果集,该结果集在过去 12 小时中的每一小时都有一条记录,无论该小时内是否有事件。
假设当前时间是“2012-03-08 11:00:00”,报告将显示(大致):
Hour EventCount
---- ----------
23 0
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 1
9 3
10 1
我想出了一个解决方案,它使用一个表,该表在一天中的每个小时都有一条记录。我设法在 where 子句中使用 UNION 和一些复杂的案例逻辑来获得我正在寻找的结果,但我希望有人有一个更优雅的解决方案。
我有一个包含超过 400,000,000 条记录的表,我正在寻找有关如何快速解析它的建议。
TheNameTable
(
NameID int primary key,
TheName varchar(500)
)
名称存储如下:“FirstName,LastName”(不是我的表,只是我必须使用的)
我需要提取一个唯一的姓氏列表。我最初的想法是分批处理表(比如一次 50,000 条记录),使用 NameID 来控制批范围。然后,我将使用 SQL 的内置字符串函数在“,”处断开字符串并保留字符串的右半部分。
right(TheName,charindex('.',reverse(TheName))-1)
我有一种感觉,这仍然需要很长时间。
有没有人有其他想法?
简单地导出数据并在数据库外处理文件是否值得?
我采用的解决方案:
按照建议,我创建了两个计算列。一个用于名字,一个用于姓氏。它们没有持久化,因为我的空间有限。
alter table TheNameTable
add LastName as substring(TheName, charindex(',',TheName)+1,1000)
alter table TheNameTable
add FirstName as left(TheName,charindex(',',TheName)-1)
我要求管理员临时增加 RAM,他们将 VM 提高到 32GB。
我创建了一个新表,其中包含 FirstName 和 LastName 列。我在列上放置了一个唯一的复合索引,但指定了 IGNORE_DUP_KEY = ON。
我刚刚插入了前 1,000,000 条记录。它过滤掉了 125,000 个重复项。整个语句运行了 9 秒。
这就是我想要的速度!
是否可以创建数据库别名或同义词?我希望能够做的是将 NewDatabaseName 别名为 OldDatabaseName 以防止不得不重写大量代码。
背景故事:一位客户找到了我,他提出了一个荒谬的自我引发的问题。他们有一个具有 SQL 服务器后端的第三方应用程序。用户一直在使用 Visual Basic 针对该数据库编写自定义报告,所有数据库连接信息都硬编码在他们的程序中。
最近第三方软件重命名了他们的数据库。现在所有的报告 EXE 都失败了。
哦,他们也没有很多源代码。
我忍住笑,说我会看看我能做些什么。
我需要在不属于域的数百台服务器上运行一些临时查询。每个服务器都有一个低权限 SQL 用户帐户,该帐户对一些感兴趣的表具有只读访问权限。
我的想法是将这些服务器的名称存储在一个表中,并使用该表来驱动 OPENDATASOURCE 或 OPENROWSET 命令。
服务器要么位于不同的域、不受信任的域、工作组等中。一团糟。
我一生都找不到如何配置这些命令以使用 SQL Server 帐户/密码组合的示例。
注意:这发生在沙盒中,并不适用于现实世界。它只是一个概念证明,因此安全性不是主要问题。这些服务器是通过一个模拟网络真实增长的过程来创建的。
作为记录,我能够让 OPENROWSET 工作:
SELECT *
FROM OPENROWSET('SQLNCLI',
'DRIVER={SQL Server};SERVER=MyServer;UID=MyUserID;PWD=MyCleverPassword',
'select @@ServerName')
我有一份报告,每 30 秒自动刷新一次。通常这种情况发生得足够快,以至于您甚至都没有注意到。但是,有时负载需要更长的时间。发生这种情况时,现有数据会稍微“变灰”,并出现一个显示“正在加载”的动画框。
有什么办法可以防止数据“变灰”?我觉得这很让人分心。
该报告是监控工具的一部分。我们有它在一个巨型加速器上。在某些条件下,它会改变颜色,从而引起人们的注意。“变灰”也引起了人们的注意,但原因是错误的。