最简单的方法来同步开发MySQL数据库到生产MySQL数据库?

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

我想过一个主/从设置,但我们不想实时“发布”我们的变更; 直到pipe理层让我们继续前进。

如果您在生产箱上运行“停止从站”,则主站/从站设置可以工作。 这将停止两个盒子之间的所有同步。 那么只要pipe理人员提前将两者同步,就可以启动从属服务器。 当你完成后,不要忘记运行“停止奴隶”。

我假设closures生产不是一个select,但如果可以的话,你有其他的select。 一个select是closures两个MySQL服务器,并将文件从分段复制到生产。 这是保证两台服务器完全同步的最简单的方法。

只要你只是在做插入,更新和删除的文章,我有build议:

您应该使用主/从复制(MSR)。 这是如何工作的:

步骤1)设置MSR,开发机器为主机,产品为从机

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

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

第3步)这里是非常有趣的地方

您需要使用Percona的两个工具来执行表同步:
mk-table-checksum和mk-table-sync 。

在shell脚本中,运行mk-table-checksum并生成所有表的报告以及主从机之间的校验和值。 find哪些表的表校验和不匹配。 该报告将在第2列中具有数据库,在第4列中具有该表以及在第7列中具有校验和值。

将这些表名以文本文件的forms收集为“database.tablename”。 我们将调用文件TablesToSync.txt

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

mk-table-sync –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。

虽然这些想法是有效的,但我不喜欢从开发推动的想法。 你的prod数据库的奴隶副本将是出色的备份和恢复的目的。 如果要在部署到生产之前testing查询并等待批准,请将策略直接在prod计算机上运行。 开发和testing您的开发系统,然后当工作满意时,您的开发人员可以将查询提交给适当的个人进行生产运行。 这也提供了在监pipe机构影响下的一些环境中可能有益的责任分离。

如果您禁用了从站并定期启用它,即使只是短暂的一段时间,您也将得到不正确的数据。 假设你运行一个没有预期结果的更改或更新。 然后撤消它,然后运行另一个稍后可用的查询。 当这些在生产中重播时,它在那里将具有相同的效果。

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

我不知道你的应用程序是如何工作的。 用户是否会通过正常使用您的网站/应用程序生成数据? 如果是这样,你不应该同步到它,它应该在其他地方同步下去,除非你有双重主设置每个自动ID偏移。 即使如此,即使使用交易引擎,我依然在思考数据变得日益枯竭。

这将取决于你的数据库的大小,这是否是可行的,但我更愿意回到基础,做一个转储和加载。 即从源代码转储并加载到目标中。 为什么寻找不必要的并发症