Drupal DATABASE部署策略?

时间:2009-09-30 10:45:17

标签: svn drupal

从这个项目:What's best Drupal deployment strategy? ....我引用:

  

数据库比较棘手;清理dev / staging数据库并将其推送到最初是最容易的,但如果实时站点上的用户也在生成内容,那么在进行增量数据库更新时会有一些问题。

我想知道如何做到这一点?目前,我在本地计算机上获得了现有数据库的完整副本,提交了该subversion,然后部署整个数据库。目前文件是15megs,每次我必须上传整个文件(我认为subversion将其视为一个完整的新文件,因为它每次都有很多变化)。

所以,我的问题确实是:

  1. 如何在提交时减少我的Db大小(除了提交频率较低)?
  2. 还有其他方法可以保持我的数据库和服务器数据库同步吗?特别是考虑到用户将一直发布新数据?

4 个答案:

答案 0 :(得分:13)

  

还有其他方法可以保持我的数据库和服务器数据库同步吗?特别是考虑到用户将一直发布新数据?

我们在任何地方都有一个庞大的分布式团队和编辑人员,因此部署数据库是不可行的。

为了解决这个问题,我们广泛使用了更新功能。我们有一个没有实际代码的模块,我们用它来更新设置。每次开发人员进行配置更改时,他们都会在此模块中编写更新函数,该函数在运行时将对其他开发DB进行相应的更改,暂存和生效。

存在一些问题,尤其是交叉依赖关系(如果人们在多个模块中编写更新函数),并且可能需要一些时间来编写管理员中相对较小的更改。 Install profile api有助于此。

例如

function mysite_update_6000() {
  install_include(array('user'));
  $editor_rid = install_add_role('editor');
  install_add_permissions(DRUPAL_ANONYMOUS_RID, array('do something'));
  install_add_permissions($editor_rid, array('do something', 'administer nodes'));
  return array();
} 

将添加角色并为其分配一些权限。这样做可以保留代码中的所有更改,这样您就不必尝试迁移和同步数据库。

还有一个migration模块可以帮助解决这个问题,它会记录对表的更改并将它们保存到更新功能中。不要将其与用于内容迁移的drupal.org迁移模块相混淆。

我们取得了一些成功,但也有features模块的一些问题,这有助于迁移功能。

答案 1 :(得分:2)

对于较小的项目,我们仍然会执行类似于当前过程的操作,因为我们将实时实例锁定为仅通过阻止具有编辑权限的所有用户来读取,而不是转储数据库,将其上载到舞台实例,执行所有更新我们需要那里,一旦满意结果,我们切换舞台实例成为下一个实时版本。但即使是小型实例,这也很痛苦,远非一个好的解决方案。

在两个更大的项目中,我们与Jeremy在同一条船上,整个设置是复杂的部署完整的数据库转储,特别是因为我们无法将实例锁定为只读模式只是为了一些更新

对于那些人,我们在某种程度上使用了Migraine(另见this related discussion)。它不是一个Drupal模块,而是一个python脚本,我们根据我们的需要调整了一些。它旨在创建一些结构化的转储,将用户提供的内容与设置和其他内容分离,从而允许更有选择性的更新和分段策略。但是考虑到或多或少混乱的Drupal数据库结构(特别是缺乏参照完整性实施),使用这种方法需要在添加新模块时不断调整并且风险很大,因为需要额外确保转储/更新只有连贯的集合表。

我们尝试通过使用自定义模块的更新功能来最小化“批量”转储/更新操作的需要,我喜欢Jeremy Frenchs建议添加“虚拟”模块,只是为了为其他设置添加更新功能!

总而言之,更新/迁移Drupal实例现在是一个巨大的痛苦,我希望在未来的版本中会有一个更连贯的解决方案,尽管我可以看到,鉴于当前版本很难提出一种通用的方法数据库模式和具有单独添加的自定义模块的数量:/


PS:Backup and Migrate是一个Drupal模块,似乎采用了类似于Migraine脚本的方法,但我还没有使用它。

答案 2 :(得分:2)

Henrik和Jeremy对部署状态给出了很好的答案。我也听说过卡皮斯特拉诺(红宝石)的使用效果很好。 DrupalCampLA Case Study描述了他们使用的部署机制(包括Capistrano),据说下载包包含他们的部署脚本。

如果要最小化数据库转储的大小,请确保对其进行定制以排除缓存和监视程序表。默认情况下,备份和迁移的UI会显示它认为值得忽略的表。

答案 3 :(得分:1)

执行此操作的最佳方法是将所有更改保留在代码中,并使用features module工具将更改推送到暂存和/或生产。

在开发过程中需要做更多的工作,这是事实,但如果你与一群拥有自己数据库的人一起工作,或者你想轻松地将更改推向生产,那么功能就是def。要走的路。