我们使用类似于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
。newtable
如果系统上的数据库未称为mydb,则(...)将失败。我们创建了一个注释前的SVN钩子,该钩子将禁止包含该mydb
字符串的.sql文件,这是一个确定的迹象,表明有人未经适当检查就从phpMyAdmin复制/粘贴了该文件。