将开发 MySQL 数据库同步到生产 MySQL 数据库的最简单方法是什么?

将开发 MySQL 数据库同步到生产 MySQL 数据库的最简单方法是什么?

我们有一个本地安装了 MySQL 的临时服务器。我们计划运行 Expression Engine,它需要一个数据库。在生产端,我们有两台负载平衡的 Apache 服务器,因此我们需要在专用硬件上安装一个 mysql 服务器,并让两个 Web 服务器从中读取数据。现在,由于我们的大部分工作都是在临时服务器上完成的(添加、编辑、删除文章),我需要弄清楚如何将更改同步到生产端。生产端不会进行任何更改。

我考虑过主/从设置,但我们不想实时“发布”我们的更改;直到管理层批准我们才可以。

答案1

如果您在生产机上运行“stop slave”,主/从设置就可以工作。这将停止两个机箱之间的所有同步。然后,您只需要在管理部门允许同步两个机箱时启动从机即可。只是不要忘记在完成后在其上运行“stop slave”。

我假设关闭生产环境不是一个选项,但如果可以的话,你还有其他选择。一个选项是关闭两个 mysql 服务器并将文件从暂存复制到生产环境。这是保证两个服务器完全同步的最简单方法。

答案2

只要您只对文章进行插入、更新和删除操作,我的建议是:

您应该使用主/从复制 (MSR)。操作方法如下:

步骤 1)设置 MSR,将开发机作为主机,将生产机作为从机

步骤2)运行SET GLOBAL SQL_LOG_BIN = 0;

这将阻止开发机器复制到生产。每次重新启动开发机器或在开发机器上重新启动 mysql 时,请确保在允许生产机器从开发复制之前运行此命令。事实上,请确保在生产上停止 SLAVE,在开发上重新启动 mysql,在开发上运行 SET GLOBAL SQL_LOG_BIN = 0;,并在生产上运行 START SLAVE;。

步骤 3)这是真正有趣的地方

您需要使用 Percona 的两个工具执行表同步:
mk-表校验和mk-表同步

在 shell 脚本中运行mk-表校验和并生成主服务器和从服务器之间所有表和校验和值的报告。找出哪些表的表校验和不匹配。报告的第 2 列包含数据库,第 4 列包含表,第 7 列包含校验和值。

将这些表名收集到文本文件中,作为“database.tablename”。我们将文件命名为 TablesToSync.txt

在另一个 shell 脚本中,遍历 TablesToSync.txt 并使用以下参数运行 mk-table-sync:

mk-表同步--print --with-triggers --sync-to-master h=HostIPofSlave,u=userid,p=password,D=database,t=tablename >> AllChanges.sql

文件 AllChanges.sql 将包含您需要运行的每个 SQL 语句,以使从属服务器与主服务器的内容相匹配,就像您对指定表运行 mk-table-sync 时一样。

4)在Prod中运行AllChanges.sql脚本。

警告

如果您知道需要同步的表数量是固定的,那么另一种方法是跳过执行 mk-table-checksum 步骤并直接对您知道需要同步的每个表运行 mk-table-sync。

结论

每当您想要将新数据从 Dev 发送到 Prod 时,您都必须按需运行此过程。一旦您更改任何表结构(即 DDL),这些表就需要从 Dev 到 Prod 进行 mysqldump。

答案3

虽然这些想法可行,但我不喜欢从开发中向上推送的想法。生产数据库的从属副本对于备份和恢复目的非常有用。如果您想在部署到生产环境之前测试查询并等待批准,请制定在生产机器上直接运行查询的政策。在您的开发系统上进行开发和测试,然后当工作令人满意时,您的开发人员可以将查询提交给适当的人员以在生产环境中运行。这也提供了职责分离,这在某些受监管机构影响的环境中是有益的。

如果您定期禁用从属服务器并启用它,那么即使只是短暂的一段时间,生产环境中也会有坏数据。假设您运行了更改或更新,但没有产生预期的结果。然后您撤消它,并运行另一个稍后有效的查询。当这些在生产环境中重放时,它将在那里产生相同的效果。

如果您使用这种方法,maatkit 工具可能有助于同步它们,但我鼓励您反过来思考。手动同步上游会更安全、更明智。

我也不知道你的应用程序是如何工作的。用户是否会通过正常使用你的网站/应用程序在生产环境中生成数据?如果是这样,你不应该同步它,它应该在其他地方同步,除非你有一个双主设置,每个主设置都有自动 ID 偏移。即便如此,想到数据变得混乱,即使使用事务引擎,我仍然感到不安。

答案4

这是否可行将在一定程度上取决于您的数据库的大小,但我更愿意回到基础并进行转储和加载。即从源转储并将其加载到目标中。为什么要寻找不必要的复杂性?

相关内容