gpt4 book ai didi

database - 使用快照和事务日志复制数据库

转载 作者:搜寻专家 更新时间:2023-10-30 22:59:54 24 4
gpt4 key购买 nike

出于学习目的,我想编写自己的数据库,该数据库能够 self 复制。我取得了一些进步,但现在我面临着一个我无法解决的问题。假设我有一个数据库(我们称之为源),我想将其复制到另一个数据库(我们称之为目标)。

基本原则很简单:在源代码中,您不存储实际的表,而是存储事务日志。将事务日志发送到目标很容易,然后数据库会在目标中重建自身。如果你想更新目标,你只需请求事务日志中自那以后发生变化的部分。基本上这就是几乎每个数据库所做的。

虽然这可行,但它有一个主要缺点:如果一张表已经存在很长时间,事务日志很长,因此复制该表需要很多时间......

为避免这种情况,您也可以存储当前状态。这意味着您拥有可以快速复制的最新快照。此外,目标必须订阅源的事务日志。一旦它包含其他条目,目标就会将它们应用于其复制的表。这也很有效,而且在性能和传输量方面要好得多。

但是现在我面临一个问题:假设快照很大,那么可能会在发送的时候对它进行更改。这意味着复制的快照包含一些旧数据和一些新数据。现在,如何使目标数据库处于一致状态?即使我知道从哪里开始事务日志,我也必须应用已经应用到某些记录的更改,或者我必须将其保留,但更改根本不会应用到其他一些记录.

当然我可以使用顺序隔离级别,但性能会下降。当然我可以做CouchDB 会记住每个记录中的当前表修订,并为每个修订保留每个记录的副本。但随后所需的空间会急剧增长。

那么,我该怎么办呢?

我在网上能找到的所有东西要么依赖于重放整个事务日志的想法,要么使用像 CouchDB 中那样占用大量空间的进程。

有什么想法吗?

最佳答案

您的快照需要保持一致,并且您需要知道它在什么时间(关于 tx 日志)是一致的。然后应用自此时起已提交的所有事务。

获取一致的快照可以通过排他锁定来完成,这可能会延迟其他事务的提交,或者使用行版本 (MVCC)。

祝你的项目好运。

关于database - 使用快照和事务日志复制数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35198728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com