我们使用类似于 bcwood 的东西来保持我们的数据库模式在 5 个不同的安装(生产、暂存和一些开发安装)之间保持同步,并在版本控制中进行备份,它运行良好。我会详细说明一下:
为了同步数据库结构,我们有一个脚本,update.php,以及一些编号为 1.sql、2.sql、3.sql 等的文件。该脚本使用一个额外的表来存储当前版本号数据库。N.sql 文件是手工制作的,从版本 (N-1) 到版本 N 的数据库。
它们可用于添加表、添加列、将数据从旧列格式迁移到新列格式然后删除列、插入“主”数据行(如用户类型)等。基本上,它可以做任何事情,并且使用适当的数据迁移脚本,您将永远不会丢失数据。
更新脚本的工作方式如下:
- 连接到数据库。
- 备份当前数据库(因为会出错)[mysqldump]。
- 如果不存在,则创建簿记表(称为 _meta)。
- 从 _meta 表中读取当前版本。如果未找到,则假定为 0。
- 对于所有编号高于 VERSION 的 .sql 文件,按顺序执行
- 如果其中一个文件产生错误:回滚到备份
- 否则,将簿记表中的版本更新为执行的最高 .sql 文件。
一切都进入源代码控制,每个安装都有一个脚本,只需执行一次脚本即可更新到最新版本(使用正确的数据库密码调用 update.php 等)。我们 SVN 通过自动调用数据库更新脚本的脚本来更新登台和生产环境,因此代码更新伴随着必要的数据库更新。
我们还可以使用相同的脚本从头开始重新创建整个数据库;我们只需删除并重新创建数据库,然后运行将完全重新填充数据库的脚本。我们还可以使用脚本填充空数据库进行自动化测试。
建立这个系统只花了几个小时,它在概念上很简单,每个人都得到了版本编号方案,它对于能够推进和改进数据库设计,而无需沟通或手动执行修改,这是非常宝贵的在所有数据库上。
不过,在粘贴来自 phpMyAdmin 的查询时要小心!这些生成的查询通常包括数据库名称,您绝对不想要它,因为它会破坏您的脚本!像 CREATE TABLE 这样的东西mydb
。newtable
(...) 如果系统上的数据库不称为 mydb,则会失败。我们创建了一个预先注释的 SVN 钩子,它将禁止包含该mydb
字符串的 .sql 文件,这是一个明确的迹象,表明有人在没有适当检查的情况下从 phpMyAdmin 复制/粘贴。