mysql - Mysql Db 同步选项
问题描述
关于 MySQL 复制的问题(主要)。
所以我有 2 个 MySQL 数据库,它们是相同的模式,但没有通过任何类型的网络连接。我需要单向(仅)同步数据,即 Db1 始终需要复制/转储下来,并与 Db2 同步。两者都有更新/插入/删除活动。
我已确保 DB2(它始终是接收器)具有非常高范围内的序列 - 因此在 DB2 上创建或“拥有”的记录在同步时不会与 DB1 记录冲突。还有一条规则是,在 DB2 上,我们不会编辑在 DB1 上创建的任何数据(我们可以通过序列号来判断,也可以通过每个 DB 上输入的数据类型来判断)。
我已经通过 mysqldump(来自 Db1)进行了这项工作,并将转储修改为“REPLACE INTO”而不是“INSERT into”——并将这个修改后的 mysqldump-output 作为 SQL 脚本运行。音量不太高,效果很好。
是否可以通过复制来做到这一点(足够简单)。Mysql 可以创建快照转储,我会复制它们并运行复制命令 - 是否可行。
解决方案
我会使用
auto_increment_increment
&auto_increment_offset
来确保记录不重叠。我知道您说过您将 DB2 上的记录设置为较高的范围,但最终它们可能仍会重叠。只是让 DB1 使用奇数值而 DB2 使用偶数值就可以确保永远不会发生这种情况。如果两个实例未通过网络连接,则不能使用复制。复制要求副本能够与其主服务器建立连接。
但是您可以使用二进制日志,这是复制工作方式的一部分。在 DB1 上,启用二进制日志记录,它将记录对数据库所做的每一次更改。定期将这些日志复制到 DB2 的服务器(如果您当前正在使用 mysqldump,我假设您有一些方法可以做到这一点)。使用该
mysqlbinlog
工具将日志转换为 SQL 命令以针对您的 DB2 实例进行回放。例子:
mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p
您可以跟踪您已复制和执行的二进制日志。就在您复制一组 binlog 文件之前,
FLUSH LOGS
在 DB1 上运行。这会导致 DB1 关闭它当前正在写入的 binlog 文件,并打开一个新的 binlog 文件。这样您就可以一次处理整个文件,而不必担心部分文件。
推荐阅读
- reactjs - vscode jest 断点未在主编辑器中打开
- for-loop - 如何在 for 循环中等待所有生成的 JoinHandles
- javascript - NodeJs如何实现http包的listen()函数?
- javascript - 在桌面上显示平板电脑/移动版的某些区域,反之在 WordPress 中显示
- authentication - 用于公共 SaaS 产品的 Active Directory (AD)?
- java - 将 postgres bytea 与字符串进行比较时,Spring JDBC 抛出异常
- c - 树函数检查一个节点的值是否等于前两个节点的值
- python - 解压不可迭代的 NoneType 对象
- ruby - 函数参数数量的问题
- java - “非法 base64 字符 3”,通过 TCP 连接发送整数(AES 加密字符串)