如何检测两个数据库之间的表和存储过程更改?

时间:2012-09-14 14:00:47

标签: mysql stored-procedures deployment table-structure

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

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

目前我更新了一个文本文件,其中包含表存储过程的所有结构更改。我想自动执行此操作,例如在部署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

3 个答案:

答案 0 :(得分:1)

您可以使用像SQLyog这样的MySQL GUI工具轻松完成。 SQlyog的Schema Synchronization向导能够满足您的需求,即检查结构的变化并同步它们。请参阅随附的屏幕截图。

Schema Sync SQLyog

答案 1 :(得分:1)

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

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

  • Visual Studio通过创建一个数据库项目对此进行了一个角度,该项目保留了某种版本日志中的所有更改。不完全确定具体细节。只需按同步和tada即可!它有效,但如果你问我,它会非常全面和缓慢。

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

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

而是按Extract SQL;不要按保存。

我现在建议的是:

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

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

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

如果您对数据库进行了更改,例如添加之前的表,请改用此工具。

现在,您可以在一个漂亮的版本列表中对数据库进行所有更改。要更新数据库,您只需执行changeLogSQLVersionThingyTable中的每一行,从上次更新特定数据库的版本开始。

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

答案 2 :(得分:1)

当实际上是一个被打破的过程时,你正试图制定一个技术解决方案。谁没有安排将完全相同的sql 应用于登台,QA和开发,是否将原始更改投入生产?

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

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

完成后,将新架构检查到源代码存储库中。它有一天会派上用场。