0

保存我的 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. 我应该如何将这样的更改应用于我的数据库?

我的目标是准确发布更改并实现持续集成。我使用一个名为 DDLSYNC 的工具确实可以在 Oracle 数据库中找到并应用差异,但我不确定 MySQL 存在哪些类似的工具。

4

2 回答 2

1

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

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

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

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

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

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

于 2010-11-21T05:49:14.143 回答
0

在许多框架中都有用于此目的的标准工具:Rails 有一个叫做Migrations的东西,它很容易用 PHP 或任何类似的语言复制。

于 2010-11-21T19:38:52.340 回答