我已经完成了这项工作,但不知道我所做的是否正确和/或您是否会以不同的方式执行这项工作。
几个负责基础架构的人员来找我,说他们正在为其中一个SQL Server移动存储,他们想检查在移动过程中是否出现了连接或性能中断-他们有一家公司说,他们可以移动存储而不会对业务产生任何影响,这是第一次尝试。
为了测试这一点,他们希望我编写一个查询,该查询将使用存储并报告任何中断,因此我临时编写了以下脚本:
CREATE TABLE [dbo].[TomAndRickysSpecialTable]
( [Counter] INT IDENTITY(1,1) NOT NULL
,[Result] VARCHAR(10) NOT NULL
,[TimeStamp] DATETIME2(0) NOT NULL DEFAULT(GETDATE())
,CONSTRAINT PK_TikkiTavi PRIMARY KEY CLUSTERED ([counter] ASC)
)
exec sp_configure 'remote query timeout', 0
go
reconfigure with override
go
CREATE PROC RICKYRICKYRICKYRICKYrickyTom
AS
TRUNCATE TABLE TomAndRickysSpecialTable;
INSERT TomAndRickysSpecialTable(Result) VALUES ('Start');
SET NOCOUNT ON;
TryAgain:
WHILE 1 = 1
BEGIN
BEGIN TRY
WAITFOR DELAY '00:00:01';
IF EXISTS (SELECT TOP 1 [Counter] FROM TomAndRickysSpecialTable)
INSERT TomAndRickysSpecialTable(Result) VALUES ('Yup');
RAISERROR('Yup',10,1) WITH NOWAIT;
END TRY
BEGIN CATCH
RAISERROR('Nop',10,1) WITH NOWAIT;
Goto TryAgain;
END CATCH
END
我创建了表和存储过程,他们从服务器执行它,让它运行并观察时间戳中的任何中断。
我想我应该写一些东西来查询和写入内存,这样我们就可以看看是否有问题,但我不知道这个推理是否正确...
我的问题是--我的脚本真的能完成他们想要的吗?运行它有意义吗?或者它会失败得很严重吗?比如,如果有一个中断,没有可报告的结果?我能写一个更简单或更好的脚本来完成同样的工作吗?
我讨厌写while循环和后藤,但我想在这种奇怪的情况下它会完成这项工作!
1条答案
按热度按时间tv6aics11#
我的剧本能达到他们的目的吗
是的。SQL Server将数据缓存在内存中,但必须在提交时将更改固化到磁盘,并且默认情况下SQL Server在每个语句之后提交。因此,如果包含数据库日志的磁盘不可用,INSERT将失败。
顺便说一句,“远程查询超时”是无关紧要的。
我讨厌写While循环和后藤,
这是不需要的。在CATCH块之后,WHILE循环将再次运行。