我们使用 SQL Server 2012 及其新的可用性组 (AG) 功能。有一项任务是将某些表的旧数据从一个数据库移动到另一个数据库。两个数据库都包含在不同的可用性组中。
以前(在使用 AG 功能之前)通过将第二个服务器实例添加为链接服务器 ( sp_addlinkedserver) 并按以下方式执行分布式事务来解决该任务:
不幸的是,AG 不支持分布式事务,因为在故障转移的情况下数据库可能会变得不一致 ( http://technet.microsoft.com/en-us/library/ms366279.aspx )。
是否有某种方法可以在保留 AG 功能的情况下实现此任务,并且在发生异常时不实现回滚逻辑?
sql-server-2012 availability-groups distributed-transactions
我们注意到,自部署 Windows 2012/SQL Server 2012 以来,性能DTUTIL有所下降。DTUTIL.exe在 8 GB VM 上的 2 个核心中的每一个上消耗 50%。针对 Win 2008 R2/SQL Server 2008 R2 的相同语法显示对具有相似规格的 VM 几乎没有影响。总的来说,部署一个包大约需要 90-120 秒。
我们在 SP1 上使用 64 位 SQL Server 2012 企业版;命令的语法是:
"C:\Program Files\Microsoft SQL Server\110\DTS\Binn\dtutil.exe" /DestS COMPUTER1 /FILE "e:\folder\SSISPackage.dtsx" /COPY "SQL;FOO\BAR\SSISPackage" /QUIET
Run Code Online (Sandbox Code Playgroud)
我们还没有在 2012 年使用新的 SSIS 方法尝试过这个。我们已经验证了跨多个不同包的行为重现。我们还查看了所有 SP1 之后的累积更新;它们似乎没有解决这个问题,但我们也没有应用它们来排除这个问题。
有没有其他人遇到/解决过这个问题?诚然,包部署不是高频操作,但我们确实在自动化部署过程中注意到了这一点。
我什至不确定这个问题是否有必要,但我很想知道每个人的想法。我在同一台服务器上有两个数据库,dbFoo、dbBar。dbFoo 有下表,请注意这是一个简单的例子,语法可能不正确,因为我很匆忙,对潜在问题的答案更感兴趣,然后是代码......
CREATE TABLE dbo.CodeNumbers(
CodeNumbersID INT IDENTITY (1,1) NOT NULL PRIMARY KEY,
CodeValue VARCHAR(30) NOT NULL
IsUsed BIT NOT NULL DEFAULT(0)
);
Run Code Online (Sandbox Code Playgroud)
dbo.CodeNumbers使用每月提供的 CSV 填充,您选择的导入方法已经写入以将它们放入那里。我们从来没有得到重复的代码。
为了论证,让我们假设表中有 10,000,000 行。导入时都遵循以下格式:
1, 'ajdirjfisofklrlfo039402', 0 all the way till
10000000, 'fkeiir9489', 0
Run Code Online (Sandbox Code Playgroud)
现在在 dbBar 我有 2 个存储过程,第一个应该访问 dbFoo 中第一个未使用的代码,将它返回到一个 out 变量中并将其标记为已使用。所以我有类似的东西:
CREATE PROCEDURE GetNextUseableCode
@CodeOut VARCHAR(30) OUTPUT,
@CID INT OUTPUT
AS
SELECT @CID = CodeNumbersID, @CodeOut = CodeValue
FROM dbFoo.dbo.CodeNumbers
WHERE IsUsed = 0
UPDATE dbFoo.dbo.CodeNumbers
SET IsUsed = 1
WHERE CodeNumbersID …Run Code Online (Sandbox Code Playgroud) 我们正在构建一个新的 BizTalk 群集,其中包含两个 BizTalk 应用程序服务器和两个 SQL Server。从 BizTalk AppServer #1 上的 SSMS(与 #2 类似),我们有两个场景:
当前- 我们的基础架构团队刚刚重建了 2012/R2 Windows。它无法连接到特定的 SQL Server,但可以连接到其他 SQL Server。令人困惑的部分是,任何其他机器似乎都能够很好地连接到同一个 SQL Server,并且还可以针对它运行查询。
昨天- (我们从昨天开始重建盒子,所以不能回去......只是想描述问题。)它似乎偶尔连接。当它连接时,我尝试了一些查询,创建了一个测试数据库和表,并尝试了以下内容:
代码:
declare @MaxLoops int = 100
declare @LoopCounter int = 0
while (@LoopCounter < @MaxLoops)
begin
set @LoopCounter = @LoopCounter + 1
--select SYSDATETIME(), * from NealTest.dbo.NealTest
waitfor delay '00:00:01'
print @LoopCounter
print SYSDATETIME()
end
Run Code Online (Sandbox Code Playgroud)
我编写脚本的初衷是查看在它“滚动”后我们是否会丢失连接,换句话说,我可以设置它并增加它@MaxLoops并让它运行一个小时左右。(也可以添加 try/catch 以帮助它继续查看它们是否是偶发的连接问题。)
脚本(Select注释掉了语句)给出了一个
传输级错误
所以我们开始一次突出显示一两行。声明工作正常,我可以在声明后打印值。当我们将其降低@MaxLoops到 5 时,它实际上运行了。我们增加到 15 它失败了Transport-level …
请建议我如何解决错误 如何解决错误
消息 547,级别 16,状态 0,第 1 行
ALTER TABLE 语句与 FOREIGN KEY 约束“MyForeignKeyName”冲突。冲突发生在数据库“MyDatabase”、表“dbo.MyTable”、“IMyColumn”列中。
我想在 where 子句中使用一个参数,仅当它的值由强类型数据集提供时,这是我目前正在尝试的,当我提供时我得到正确的结果,parameter3而当我不提供它的值时没有结果。
我想要的是,当我没有为 提供值时parameter3,它不应该在查询中使用它,因为它的值为空,我想查看查询中的所有结果,而不是where Paramerter3 = null:
ALTER procedure [dbo].[GetData]
(
@Parameter1 varchar(256),
@Parameter2 varchar(256),
@Parameter3 int = null
)
AS
SELECT
*
FROM
Table1
WHERE
Table1.URL LIKE '%' + @Parameter1 + '%'
AND Table1.ID = @Parameter2
AND (@Parameter3 IS NULL OR Table1.ID2 = @Parameter3)
ORDER BY
Table1.Title
Run Code Online (Sandbox Code Playgroud)
编辑:我试过托马斯的回答并像这样执行:
EXEC @return_value = [dbo].[GetData]
@Parameter1 = N'asda',
@Parameter2 = N'asda',
@Parameter3 = null
SELECT 'Return Value' = @return_value
GO
Run Code Online (Sandbox Code Playgroud)
正如托马斯所说,我还更新了存储过程。
我们正在我们的项目中引入持续集成,我们决定使用新的生产数据自动刷新我们的测试数据库实例。
我目前正在寻找最佳方法,以避免任何生产中断或减速。
我首先想通过sqlcmd实用程序从命令行使用备份/恢复命令......
但它似乎有问题,因为它仅生成一个.bak文件,尽管该文件仍与 .mdf/.ldf 文件“链接”。因此,在我们的测试环境中恢复它时,找不到这些.mdf/.ldf文件。
然后我继续在恢复命令中指定一个“WITH MOVE”选项,以便通过网络共享指定.mdf/.ldf文件的位置,但我认为生产服务器锁定这些文件并防止从测试服务器读取它们。
所以基本上,你知道一种直接(有效)的方法来将数据库转储到单个文件中,以便在我们的测试环境中轻松加载它吗?
当然不会破坏生产环境。
编辑:
生产和测试 SQL Server 版本都是 12.0.2000。
但我首先测试从生产加载到本地开发 SQL Server Express(也是 v12.0.2000)
我有一个 SQL Server 代理作业,它在一个步骤中调用 PowerShell 脚本。我想将 SQL 服务器名称和当前作业 ID 传递给我的脚本。
有了工作 ID,我没有问题。但是使用服务器名称...
我的 PowerShell 调用如下所示:
.\StopServices.ps1 -ServerName $(ESCAPE_DQUOTE(A-SVR)) -JobId $(ESCAPE_DQUOTE(JOBID))
Run Code Online (Sandbox Code Playgroud)
作业 ID 工作正常,但服务器名称为空。
如何将服务器名称传递给我的 PowerShell 脚本?
我正在使用 SQL Server 2014 设置一个 OLAP 数据库。核心事实表有大约 40,000,000 行、225 列,平均行大小为 181 字节。我一直在玩聚簇列存储索引,但运气不佳。一般来说,我发现使用新技术时查询性能要慢 4 倍以上。
一个特殊的例子 - 使用 int32 主键选择单行现在需要 12 秒......这是对行存储表的亚秒操作(当然它在 PK 上有一个唯一索引,这不允许与聚集列存储索引)。
我试图找出我做错了什么 - 从 MS 文档中听起来这是完成这项任务的理想技术;也许我错过了一些东西。
我正在 Windows 8.1 64 位上运行 SQL 2014 Enterprise,具有 128GB RAM 和 SSD 用于数据存储。此应用程序的数据是只读的。
最近我遇到了一个问题,来自一个域的用户无法登录 SQL Server 并收到此错误:
错误:17806,严重性:20,状态:2。SSPI
握手失败,错误代码为 0x8009030c,同时建立具有集成安全性的连接;连接已关闭。[客户:xxxxxx]错误:18452,严重性:14,状态:1
。用户登录失败”。用户未与受信任的 SQL Server 连接相关联。[客户:xxxxxx]
我们有两个域,比如说 A 和 B。我的 SQL Server 在域 B 中运行。在正常情况下,两个域用户都能够连接。但是前几天,域A的所有用户都无法连接到域B中运行的SQL Server。但是域B的用户却能够成功连接。用户联系 SQL Server DBA 团队调查问题。
当我检查时,即使我无法使用 SSMS 并使用域 A 的凭据远程连接到 SQL Server。但是,当我尝试使用域 A 的凭据对服务器进行 RDP 时,它工作正常,并且在远程访问 SQL Server 后也开始工作美好的。所以在我看来,当我对服务器进行 RDP 时,某些东西得到了刷新并且我的登录远程开始正常工作。我确信实际问题与 AD 和 kerberos 身份验证有关,但无法证明。
我在网上研究了这个问题,并找到了两个解决方案来解决它。一是修复故障 DC,二是重新启动运行 SQL Server 的服务器。我采用了第二种方式,因为 Windows 管理员不接受这是 DC 问题。我从 SQL 端检查了所有内容,最近没有任何变化。还发现在运行 SQL Server 的服务器上记录以下事件后,此问题开始发生:
日志名称:系统
来源:NETLOGON
日期:xxxxxxxx
事件 ID:5719 任务
类别:无
级别:错误
关键字:经典
用户:不适用
计算机:xxxxxxxxxx
描述:这台计算机无法与域控制器建立安全会话domain xxxxxx 由于以下原因: 当前没有可用于为登录请求提供服务的登录服务器。这可能会导致身份验证问题。确保此计算机已连接到网络。如果问题仍然存在,请联系您的域管理员。附加信息 如果此计算机是指定域的域控制器,它会设置与指定域中的主域控制器模拟器的安全会话。否则,此计算机将与指定域中的任何域控制器建立安全会话。
我的问题是:
sql-server ×8
t-sql ×2
columnstore ×1
copy ×1
errors ×1
foreign-key ×1
olap ×1
powershell ×1
ssis ×1
ssis-2012 ×1