如何在部署期间保持数据同步?

时间:2008-11-26 15:30:14

标签: drupal deployment drupal-database

我有机会使用开发,登台和制作环境来制作Drupal网站。使用subversion确保代码在站点之间保持同步是一项简单的任务。不那么简单的是在安装之间传播对数据库数据(而不仅仅是模式)的更改。

任何Drupal开发人员都会熟悉这个原因。 Drupal在数据库中存储某些配置设置,特别是与CCK字段,视图和其他允许使用管理界面动态设置的模块相关。简单地同步模式是不够的 - 基本信息也在数据中。

我正在寻找的是一种同步这些数据库更改的方法,这样,如果一个开发人员在登台服务器上进行CCK字段更改,他们就可以向下传播到本地开发环境以进行更多工作,并最终进入生产阶段环境。

是否有工具可以做到这一点?在这样的项目中处理单个或多个开发人员的过程是什么?

4 个答案:

答案 0 :(得分:5)

对于基本数据同步:我使用mysqldump每晚将所有数据转储到.sql文件。然后脚本将其检入版本控制系统。这是在一个简单的bash脚本中编写的,但你可以在几乎任何平台上做类似的事情......

我刚刚读了一点,我不确定我的方法是否会有所帮助。我从来没有必要合并SQL转储,所以我无法评论它的管理效率。

虽然您应该能够将更改(架构,新数据)推送到登台/生产服务器,但您可能会有更多麻烦将更改拉回到开发人员中。正如我所说 - 合并可能有也可能不可能。我只是不知道。

答案 1 :(得分:2)

在这里,我们几乎将CCK降级为原型和v.simple节点类型。尝试将“配置”与数据库中的“内容”分开是不值得的。有各种各样的方法可以让你保持同步,但简而言之,除非它在一个文件中或者你可以选择导出一个,你就会受到伤害。 (作为一个额外的好处,将视图导出到文件将比每次使用它时将其从数据库中拉出来快一点。)

你提到Dev,Staging&实时服务器 - 如果你让开发人员在Staging中进行无证的更改,那你就搞砸了。如果你有定期与Live&同步的分段强制执行(常识)策略,即对Staging所做的唯一更改是在Dev& D中已经完成的事情。在转移到Live之前正在接受测试,您可能会获得更多成功。

答案 2 :(得分:1)

我试图在另一个问题中回答我是如何做到这一点的。我也会在这里发布

我认为这里的一个好策略是使用安装配置文件API。使用安装配置文件API,您可以使用Drupal管理工具执行大多数操作。大多数核心表单只是在变量表中设置变量。为了能够合理地对非内容数据库内容进行版本化,即配置,使用更新功能是明智的。

在我的网站上,我们有模块“ec”,除了它的ec.install文件包含更新功能之外几乎没有什么作用。 ec_update_6001()

您的主要安装功能可以在您为使您的模块更新而进行的任何新安装上实际运行更新。

function ec_install() {
  $ret = array();
  $num = 0;
  while (1) {
   $version = 6000 + $num;
   $funcname = 'ec_update_' . $version;
   if (function_exists($funcname)) {
     $ret[] = $funcname();
     $num++;
   } else {
     break;
   }
  }
return $ret;
}

现在可以按照实际文件中的一两个样本更新功能

// Create editor role and set permissions for comment module
function ec_update_6000() {
  install_include(array('user'));
  $editor_rid = install_add_role('editor');
  install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
  install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval'));
  install_add_permissions($editor_rid, array('administer comments', 'administer nodes'));
  return array();
}
// Enable the pirc theme.
function ec_update_6001() {
  install_include(array('system'));
  // TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789.
  install_enable_theme('pirc');
  return array();
}

// Add the content types for article and mtblog
function ec_update_6002() {
  install_include(array('node'));
  $props = array(
    'description' => 'Historical Movable Type blog entries',
  );
  install_create_content_type('mtblog', 'MT Blog entry', $props);
  $props = array(
    'description' => 'Article',
  );
install_create_content_type('article', 'Article', $props);
return array();
}

实际上,这主要解决了数据库和Drupal代码的版本控制问题。我们广泛使用它。它允许我们推广更改数据库配置的新代码,而无需重新导入数据库或进行实时更改。这也意味着我们可以正确测试版本,而不必担心隐藏的数据库更改。

最后cck和views支持这种方法。请参阅此代码段

// Enable CCK modules, add CCK types for Articles in prep for first stage of migration,
// enable body for article, enable migration modules.
function ec_update_6023() {
  $ret = array();
  drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets'));
  install_include(array('content', 'content_copy'));
  install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article');
  $sql = "UPDATE {node_type} SET body_label='Body', has_body=1
  WHERE type = 'article'";
  $ret[] = update_sql($sql);
  return $ret;
} 

答案 3 :(得分:0)

使用数据库版本控制系统。为此,您需要数据库中的VersionInfo表以及xml格式的所有sql ddl和dml查询以及版本信息。现在你只需要一个简单的.net工具来检查VersionInfo表并运行xml中所有在该版本之后添加的查询,并将版本更新为versionInfo中的当前版本。