0

我有两个数据库,一个用于我的开发系统,另一个用于生产系统。

是否可以检测到两个系统之间的结构变化?(无数据,只检测结构变化)

目前我更新了一个文本文件,其中包含我对表存储过程的所有结构更改。我想自动执行此操作,例如在部署 shell 脚本中。

以下是解决此问题的尝试。问题是我没有得到可以执行的完整 sql 语句。

mysqldump --skip-comments --no-data --routines --host=sql.test.de --user=root --password=123 bim_stage > /home/deploybackups/stagestructure.sql 
mysqldump --skip-comments --no-data --routines --host=sql.test.de --user=root --password=123 bim_dev > /home/deploybackups/devstructure.sql

diff /home/deploybackups/stagestructure.sql /home/deploybackups/devstructure.sql > /home/deploybackups/diffstructure.sql
4

3 回答 3

1

您可以使用SQLyog等 MySQL GUI 工具轻松完成此操作。SQlyog 的模式同步向导能够满足您的要求,即检查结构的变化并同步它们。请参阅随附的屏幕截图。

模式同步 SQLyog

于 2012-09-14T14:18:45.707 回答
1

您正在尝试制定技术解决方案,而实际上该过程已被破坏。谁在没有安排将完全相同的 sql应用于登台、QA 和开发的情况下对生产进行了原始更改?

也就是说,如果您有一个“正常”大小的数据库并且这些更改“很少”发生,我会使用diff方法来确定是否已进行更改。手动编写 SQL 脚本来影响更改并不难。不过,我仍然会骚扰做出改变的人。

请注意,diff具有忽略空白/空白行更改的选项。

完成后,将新模式签入源代码存储库。总有一天会派上用场的。

于 2012-09-14T16:00:57.970 回答
1

我相信您可以使用一些文本或 GUI 比较工具来解决大多数问题。但是,每次格式更改或有人不遵循您的标准时,一切似乎都发生了变化。在某个地方,您发现自己正在修复奇怪的错误,例如计算空格等。

我的意思是,根据我的经验,这并不完全是最好的方法。多年来,我已经看到了一些关于如何解决这个更新问题的不同尝试。

  • Visual Studio 通过创建一个数据库项目来解决这个问题,该项目将所有更改保存在某种版本日志中。不完全确定具体情况。简单地说你按同步和tada!它有效,但如果你问我,它非常全面且缓慢。

处理此 IMO 的最简单方法是将所有结构更改放入版本日志/表中;可以这么说。

假设您的基本数据库需要一个新表。您将进入您的编辑器并添加它(使用 GUI 或代码),按保存并完成。

而是按提取 SQL;不要按保存。

我现在的建议是这样的:

您构建了一个带有大输入框和提交按钮的小型内部 Web 界面。点击提交按钮将从输入框中针对您的本地开发数据库执行任何 SQL 并将结果返回给您。

如果数据库返回成功,则 SQL 字符串将添加到您的 changeLogSQLVersionThingyTable 中,其中至少包含三列:

1)自动递增版本(整数)2)sql(文本)3)时间戳(timedate)4)开发人员ID??

当您对数据库进行更改时,例如添加以前的表,请改用此工具。

现在,您对数据库的所有更改都在一个不错的版本列表中。要更新数据库,您所要做的就是执行 changeLogSQLVersionThingyTable 中的每一行,从该特定数据库上次更新到的版本开始。

通过一些努力,您还可以将数据库重建到更早的位置;只需创建一个新数据库并将所有行一直运行到您想要的版本点。

于 2012-09-14T14:34:02.100 回答