问题标签 [replication]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
1941 浏览

database - 使用什么类型的数据库记录 ID:long 还是 guid?

近几年在使用MSSQL数据库,表中所有唯一记录的ID列类型为bigint(long)。它是自动递增的,通常 - 工作正常。

目前我观察到人们更喜欢使用 GUID 来识别记录。

将 bigint 交换为 guid 以获得唯一记录 ID 是否有意义?

我认为这是没有意义的,因为生成 bigint 和排序总是比 guid 快,但是......当使用两个(或更多)分离的应用程序和数据库实例并使它们保持同步时会出现一些麻烦,所以你必须管理 sql 服务器之间的 id 池(例如:sql1 使用从 100 到 200 的 id,sql2 使用从 201 到 300 的 id) - 这是一个薄冰。使用 guid id,您不必关心 id 池。

您对我的镜像应用程序(和数据库)有何建议:继续使用传统 ID 还是转向 GUID?

提前感谢您的回复!

0 投票
1 回答
833 浏览

sql - 如何将数据从远程系统复制并验证到 SQL Server

我手头的任务是为数据库创建某种逻辑。今天有一个 IBM MQ 系列设置,可以从几个远程系统复制数据。目前它在远程系统中发生变化并将数据转储到 SQL Server 2005 数据库中的临时表中。

我想根据一些简单的验证逻辑(必填字段和数据格式)和数据层次结构的一些更高级的检查来验证数据。正在导入的数据是分层的,其中一些数据之间存在父子关系。分层验证应检查暂存表和生产表中当前可用的数据,以确保在导入完成后存在有效的层次结构。

如果记录验证失败,应该以某种方式记录失败并且不应该导入失败的记录,但应该导入剩余的记录。如果当前生产表中的记录具有相同的 id,则应将其替换为新记录。在数据出现在临时表中之后,应尽快从临时表传输数据。

据我所知,生产表中的记录总数不会超过100万条,每批更新项目的可能数量最多为几千行。

我的问题是什么解决方案最适合导入数据?

我想到了几个可能的解决方案:

开始转移的方式:

  • 定期轮询临时表并在插入新数据时启动某种传输过程的 Windows 服务。
  • 将新数据插入表中时,使 MQ 启动传输过程
  • 安排 SSIS 作业定期运行

验证和传输数据的方法:

  • 创建 SSIS 作业
  • 创建存储过程
  • 自定义 .NET 代码

我主要担心的是,生产表中的层次结构必须始终保持不变,并且数据应该在出现在暂存表中后不久就可以在生产表中使用。我不能确定临时表中是否始终有完整的层次结构可用。

0 投票
3 回答
3379 浏览

sql-server - 通过 VPN 的 SQL Server 事务复制

我通过专用 VPN 连接在两台服务器之间运行事务复制。数据库相当大,所以我最初使用备份和恢复方法将初始快照传送到订阅者机器,然后让它从那里应用增量事务。

一切都运行良好,直到 VPN 线路变得不稳定(它偶尔会这样做),此时复制过程很容易锁定。当我查看订户端时,有一些 SQL 进程似乎已挂起,并且在订户数据库和表上持有锁。疯狂的是,这些进程来自复制服务。我可以向您保证(通过反复试验),除了复制本身之外,没有其他进程正在锁定该数据库。

那么,为什么复制过程会像这样绊倒自己呢?为什么它会因为失去网络连接而挂起?有什么建议可以让它更可靠吗?

0 投票
1 回答
8210 浏览

sql-server - SQL Server 事务复制和添加新表

我有一组非常大的现有表通过专用 VPN 连接在两台服务器之间复制(事务性)。我需要添加一个新表。重新加载所有表不是一种选择。

我认为只需将新文章添加到出版物中,它就会复制它们,但这不起作用。当然,需要告诉订阅者有关新文章的信息。然后我在发布器上选择了 Generate Snapshot,但我不知道它在做什么(可能是编写了所有数据的脚本?)所以我关闭了它。也许我应该让它运行?我不知道。

那么如何安全地将新文章添加到现有订阅中呢?

0 投票
5 回答
3072 浏览

java - 具有大量实体的 Ehcache / Hibernate 和 RMI 复制

我目前正在研究如何在 ehcache 中使用 RMI 分发选项。我已经正确配置了 ehcache.xml 并且复制似乎工作正常。但是我有两个问题:

-> ehcache/hibernate 似乎为每个实体创建 1 个缓存。这很好,但是当复制到位时,它会创建 1 个线程/缓存来复制。这是预期的行为吗?由于我们的域很大,它创建了大约 300 个线程,这在我看来真的很大

-> 另一个令人讨厌的后果是心跳消息似乎聚合了所有这些缓存名称。从我看到的消息应该适合 1500 字节,但它不适合,这导致我的日志中出现这条消息:心跳不工作。为复制配置更少的缓存。大小为 1747 但不应大于 1500。关于如何改变的任何想法?

非常感谢你的帮助

0 投票
8 回答
26001 浏览

sql-server - SQL 复制“未找到行”错误

我在两个数据库之间运行事务复制。我担心它们会稍微不同步,但我不知道哪些记录受到影响。如果我知道,我可以在订户端手动修复它。

SQL Server 给我这个消息:

应用复制命令时,在订阅服务器上未找到该行。(来源:MSSQLServer,错误号:20598)

我环顾四周,试图找出是什么表,甚至更好的是是什么记录导致了问题,但我在任何地方都找不到该信息。

到目前为止,我发现的最详细的数据是:

交易序号:0x0003BB0E000001DF000600000000,命令ID:1

但是我如何从中找到表格和行?有任何想法吗?

0 投票
6 回答
16240 浏览

sql-server - 按计划将 SQL Server 数据从一台服务器复制到另一台服务器

我在不同的虚拟主机上有一对 SQL Server,我正在寻找一种方法来使用另一个服务器定期更新一个服务器。这就是我要找的东西:

  1. 尽可能自动化 - 理想情况下,一旦设置完成,我无需参与。
  2. 将多个数据库完全(包括任何架构更改)从一台服务器推送到另一台服务器
  3. 在不破坏我的进程的情况下自由地允许源服务器上的更改。出于这个原因,我不想使用复制,因为每次源更新时我都必须打破它,然后重新创建发布和订阅
  4. 一个数据库大小约为 4GB,包含二进制数据。我不确定是否有办法将其导出到脚本,但如果我这样做了,那将是一个庞大的文件。

最初,我正在考虑编写一些东西,对每个数据库进行预定的完整备份,完成后将备份从一台服务器 FTP 到另一台服务器,然后新服务器将其拾取并恢复。我能看到的唯一缺点是在开始传输之前无法知道备份是否已完成 - 这些备份可以同步完成吗?此外,正在刷新的服务器是我们的测试服务器,所以如果移动数据涉及一些停机时间,那很好。

有没有人有更好的主意,或者我目前正在考虑最好的非复制方式?谢谢大家的帮助。

更新: 我最终设计了一个自定义解决方案,使用 BAT 文件、7Zip、命令行 FTP 和 OSQL 完成此任务,因此它以完全自动的方式运行并聚合来自全国十几个服务器的数据。我在博客条目中详细介绍了这些步骤

感谢您的输入!

0 投票
3 回答
15886 浏览

database - 将 postgres 服务器扩展到多个服务器

我们的 postgres 服务器即将达到其容量,我们正在考虑添加第二个数据库服务器。有没有特别适合 postgres 设置的扩展解决方案?

0 投票
6 回答
5588 浏览

sql-server - 请提供建议:使用实体框架时的 SQL Server 标识与唯一标识符键

我正在设计一个相当复杂的系统。我们的主要关注点之一是支持 SQL Server 对等复制。这个想法是支持几个地理上分离的节点。

第二个问题是在中间层使用现代 ORM。我们的首选一直是实体框架,主要是因为开发人员喜欢使用它。(他们喜欢 LiNQ 支持。)

所以问题来了:

考虑到点对点复制,我决定对每个表的主键使用具有默认值 newsequentialid() 的 uniqueidentifier。这似乎在避免键冲突和减少索引碎片之间提供了良好的平衡。

然而,事实证明,当前版本的 Entity Framework 有一个非常奇怪的限制:如果实体的键列是唯一标识符 (GUID),则无法将其配置为使用数据库提供的默认值 (newsequentialid())。应用层必须生成 GUID 并填充键值。

所以这里是辩论:

  1. 放弃实体框架并使用另一个 ORM:
    • 使用 NHibernate 并放弃对 LiNQ 的支持
    • 使用 linq2sql 并放弃未来的支持(更不用说绑定到数据库上的 SQL Server)
  2. 放弃 GUID 并采用另一种 PK 策略
  3. 设计一种在应用层生成顺序 GUID(COMB?)的方法

我倾向于使用 linq2sql(我的开发人员真的很喜欢 linq2[stuff])和 3 的选项 1。这主要是因为我有点不知道支持我们目标的复制方案的替代关键策略,同时也让事情保持清醒开发人员的观点。

任何见解或意见将不胜感激。

0 投票
1 回答
247 浏览

sql-server - 对于设置为合并复制推送订阅者的 SQL Server 2005 数据库,是否也可以使用与发布者相同的数据库?

我们在不同办公室的数据库之间设置了合并(推送)复制。每个数据库都承载着完整的数据集,因此每个办公室的用户只需要连接到他们办公室的数据库服务器。当用户想要离开现场时,他们需要将一部分数据提取到本地(在用户的笔记本电脑上)SQL Express 数据库。是否可以使用 SQL Server 2005 复制从订阅者数据库之一中提取此子集,然后再将其本地更改复制回来?

编辑:我们不希望区域办事处的用户针对我们的主要发布者数据库进行复制,而是针对订阅者数据库进行复制。因此,每个订阅者都必须充当该办公室中用户的发布者(甚至可能使用事务复制而不是合并复制)