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