如何对MySQL数据模型进行版本控制和同步?

时间:2010-11-21 05:36:25

标签: mysql release-management mysql-error-1050

保存MySQL数据模型并自动将更改应用到我的开发数据库服务器(或至少每晚一次)的最佳方法是什么?

例如,今天我正在处理我的项目并在我的数据库中创建此表,并将语句保存到SQL文件以便稍后部署到生产中:

create table dog (
  uid int,
  name varchar(50)
);
明天,我决定要记录每只狗的品种。所以我将SQL文件更改为:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

该脚本将在第一个版本的生产中使用,但它不会帮助我更新我的开发数据库,​​因为ERROR 1050 (42S01): Table 'dog' already exists。此外,如果在第一次发布后进行了此更改,则无法在生产中使用。所以我现在需要ALTER表。

所以现在我有两个问题:

  1. 这是我应该如何拯救我的 数据模型(一堆创建 SQL文件中的语句)和
  2. 如何 我应该应用更改吗? 这到我的数据库?
  3. 我的目标是准确发布更改并实现持续集成。我使用名为DDLSYNC的工具在Oracle数据库中查找并应用差异,但我不确定MySQL存在哪些类似的工具。

2 个答案:

答案 0 :(得分:1)

在工作中,我们开发了一个小脚本来管理我们的数据库版本控制。对任何表或数据集的每次更改都会获得它自己的SQL文件。

文件按顺序编号。我们通过将该信息存储在数据库中来跟踪已运行的更新文件。当文件即将执行时,脚本会插入带有文件名的行,并在执行完成时使用完成时间戳更新行。这包含在事务中。 (值得记住的是,MySQL中的DDL命令不能在事务中发生。任何在事务中执行DDL的尝试都会导致隐式提交。)

因为SQL文件是我们源代码存储库的一部分,所以我们可以使更新脚本成为正常部署过程的一部分。这使得数据库和代码保持同步变得容易。老实说,最困难的部分是确保另一个开发人员没有在挂起的提交中抓取下一个数字。

我们将此更新系统与我们的开发数据库的(可选)夜间擦除相结合,将内容替换为昨晚的实时系统备份。恢复备份后,将运行更新,并在此过程中运行任何挂起的更新文件。

恢复的方式是只覆盖实时数据库中的表。因此,任何添加表的更新也必须负责仅在不存在时添加它。 DROP TABLE IF EXISTS很方便。不幸的是,并非所有数据库都支持这一点,因此更新系统还允许执行用我们选择的语言编写的脚本,而不仅仅是SQL。

所有这些都在大约150行代码中。它就像读取目录,将内容与表格进行比较,以及按照确定的顺序执行尚未执行的任何内容一样简单。

答案 1 :(得分:0)

在许多框架中都有标准的工具:Rails有一些名为Migrations的东西,可以用PHP或任何类似的语言轻松复制。