我按照这个问题的顺序问这个问题我可以使用 T-SQL 通过 TCP 发送一个字符串吗?
Remus Rusanu 揭示了它似乎是我问题的最佳解决方案,但是......我太不成熟了,无法理解和理解他所说的一切。
到目前为止,我认为我需要为 DATABASE_MIRRORING_STATE_CHANGE 创建通知事件,我说得对吗?
我如何创建此事件通知,以使其触发时在表中插入一行,该行存储来自通知的时间戳和 ID。
到目前为止,我正在为每个 ID 设置一个警报,每个警报都运行这样的作业(此示例适用于 ID = 1):
DECLARE @state AS varchar(50);
SELECT @state = mirroring_state_desc FROM SYS.database_mirroring WHERE mirroring_guid IS NOT NULL;
IF (@state IS null) SET @state = ' ';
INSERT INTO MirroringAlerts (DateTime, alertID, alertDesc, Sync, alertCreator) values (SYSDATETIME(), 1, 'Principal synchronized with W ', @state, @@SERVERNAME)
Run Code Online (Sandbox Code Playgroud)
基本上我在这个数据库中创建一个内部日志:
CREATE TABLE [dbo].[MirroringAlerts](
[DateTime] [datetime] NOT NULL,
[alertID] [smallint] NOT NULL,
[alertDesc] [nchar](50) NOT NULL,
[Sync] [nchar](12) …
Run Code Online (Sandbox Code Playgroud) 我正在测试 4 个数据库之间的事务复制,其中 2 个在一台机器(虚拟)中,2 个在其他(也是虚拟的)中。我的虚拟机都没有运行防病毒软件。
这一切都按预期工作,除非我尝试插入一个相当大的 blob(在这种情况下为 65mb),如果我插入一个 3kb 的 blob 工作得很好。
我遇到以下错误“分发代理未能在‘C:\Program Files\Microsoft SQL Server\100\COM’目录中创建临时文件。系统返回错误代码 5”。
此问题记录在此处。我已经更改了该文件夹的设置,因此不再是只读的(右键单击文件夹-> 属性并更改只读属性)我不确定这是否正确授予权限的方法。
我说我没有运行防病毒软件的原因是因为我也读过这是这个问题的一个来源,因为防病毒软件可能会在检查文件夹时阻止它。
还尝试更改 OLEDB 流的分发配置文件,这也不起作用..
我还能做些什么来解决这个问题?
我希望能够锁定一行,选择它,增加它的值,然后释放锁定。(不锁定其他行,以便其他连接可以与表的其余部分一起使用)
我找到了这个
BEGIN TRAN SELECT * FROM tablename WITH (HOLDLOCK, ROWLOCK)
WHERE ID = 1
Run Code Online (Sandbox Code Playgroud)
我的问题是我做不到
UPDATE tablename
SET columnName = -1
WHERE ID = 2
Run Code Online (Sandbox Code Playgroud)
在我提交上一个事务之前,为什么行锁会锁定整个表?
编辑:
此代码是否保证在此更新命令期间不会更新所选行的数据?
UPDATE [tablename] WITH (ROWLOCK)
SET columnName = columnName + 5
WHERE ID = 1
Run Code Online (Sandbox Code Playgroud) 有什么理由可以用 [schema].[tableName] 而不是 schema.tablename 来指定表名吗?
是它JUST允许在表名的空间?
我正在设计一个应用程序并考虑有关数据库系统的一些选项,因为我不熟悉 Microsoft SQL Server。我想知道是否可以让 2 个服务器共享相同的文件,如下所示。
这个想法是数据在一个突袭系统中,所以它会给我们一些安全。这样我们就可以节省同步两个数据库的工作量并节省一些存储费用。我们一次只需要一个数据库,第二个只是为了在第一个失败的情况下使用。
这可能吗?
我对不同的方法持开放态度。主要问题是数据库冗余,我们的应用程序必须保证这一点。
目前我使用的是 Windows 7 和 SQL Server 2008R2。
编辑
我正在测试数据库冗余和高可用性的可能解决方案,我测试了镜像它工作正常,但缺乏可扩展性,而且在一台服务器上会有很多工作。现在我发现了 Merge Replication,在纸上看起来很棒(尽管我仍然需要知道如果服务器宕机而它们又重新活跃起来会发生什么,它会同步吗?你也能回答我这个吗?)
编辑
我的目标是让各种应用程序同时工作并仅与一个数据库进行通信。但是让数据库在它们之间同步,并且在一个数据库出现故障的情况下,它的所有数据都不会丢失。
是否可以使用合并复制来做到这一点??其中所有 sql 实例都是发布者和订阅者,并且在其中有一个分发者。
我应该考虑什么,或者我的问题的其他可能解决方案?
问候
我正在创建一个脚本来自动配置 2 个数据库进行镜像,使用这个方法,但我想确保没有已经创建的端点或主密钥,所以我想首先做一些清理:
DROP ENDPOINT End_Mirroring;
DROP CERTIFICATE PRIM_cert;
DROP MASTER KEY
Run Code Online (Sandbox Code Playgroud)
但是只有当它们已经存在时,我怎么才能做到这些?(我需要这个来避免我的脚本以错误退出)
我想在 SYS.database_mirroring 上创建一个触发器,因为它不是一个真正的表,只是一个视图......我做不到。
我想知道字段 mirroring_state_desc 是否来自,以便我可以在更改时在该表上创建触发器。
我如何知道哪些表用于创建该视图?
我根据这篇文章设置了一些警报
现在我想让alert触发的Job向ac#应用程序发送一些信息(这个应用程序可以运行在SQL实例的同一台机器上,然后C#应用程序将信息发送到其他机器上)。
我的应用程序可以接受 TCP 连接,所以我正在考虑使用它,但也欢迎 SQL 服务器与我的应用程序通信的任何其他形式。
关于我如何做到这一点的任何建议?
*编辑: *能够通过 T-SQL 在另一个数据库(在其他情况下)中进行插入也可以解决我的问题。
背景信息: 我这样做是为了监视主体服务器何时公开运行以及镜像服务器何时同步。因此,如果证人出现故障,然后校长也出现故障,根据这些警报的记录,我可以判断将镜像升级为校长是否安全。
请注意,在这种情况下,我无法在不破坏镜像配置的情况下读取镜像数据库,因此在镜像数据库中使用表不是解决方案。