保存 MySQL 数据模型并自动将更改应用到开发数据库服务器(或至少每晚)的最佳方法是什么?
例如,今天我正在处理我的项目并在数据库中创建此表,并将语句保存到 SQL 文件以便稍后部署到生产环境:
create table dog (
uid int,
name varchar(50)
);
明天,我决定也记录每只狗的品种。所以我将 SQL 文件更改为:
create table dog (
uid int,
name varchar(50),
breed varchar(30)
);
该脚本将在第一个版本的生产环境中运行,但它不会帮助我更新我的开发数据库,因为错误 1050 (42S01):表“dog”已存在
。此外,如果此更改是在第一个版本之后进行的,则它将无法在生产中运行。所以我现在确实需要ALTER
表格。
所以现在我有两个担忧:
- 这就是我应该如何拯救我的 数据模型(一堆创建 SQL 文件中的语句),以及
- 如何 我应该应用像这样的更改 这是我的数据库吗?
我的目标是准确发布变更并实现持续集成。我使用名为 DDLSYNC 的工具在 Oracle 数据库中查找并应用差异,但我不确定 MySQL 是否存在类似的工具。
最佳答案
在工作中,我们开发了一个小脚本来管理数据库版本控制。对任何表或数据集的每次更改都会获得其自己的 SQL 文件。
文件按顺序编号。我们通过将信息存储在数据库中来跟踪已运行的更新文件。该脚本在文件即将执行时插入包含文件名的行,并在执行完成时使用完成时间戳更新该行。这是包含在交易中的。 (值得记住的是,MySQL 中的 DDL 命令不能在事务内发生。任何在事务中执行 DDL 的尝试都会导致隐式提交。)
由于 SQL 文件是我们源代码存储库的一部分,因此我们可以将运行更新脚本作为正常推出过程的一部分。这使得保持数据库和代码同步变得非常容易。老实说,最难的部分是确保另一个开发人员没有在待处理的提交中获取下一个数字。
我们将此更新系统与(可选)每晚删除我们的开发数据库相结合,用昨晚的实时系统备份替换内容。恢复备份后,将运行更新,并在此过程中运行任何挂起的更新文件。
恢复的方式是仅覆盖实时数据库中的表。因此,任何添加表的更新也必须负责仅在表不存在时添加它。 DROP TABLE IF EXISTS
很方便。不幸的是,并非所有数据库都支持这一点,因此更新系统还允许执行用我们选择的语言编写的脚本,而不仅仅是 SQL。
所有这些都只需大约 150 行代码。就像读取目录、将内容与表进行比较以及按照确定的顺序执行尚未执行的任何内容一样简单。
关于mysql - 如何对 MySQL 数据模型进行版本控制和同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4236600/