Главная > Development > Перенос Drupal

Перенос Drupal

Так получилось, что я в некоторый момент начал хостить на своем сервере веб-сайт своих друзей. Друзья – люди совершенно некомпьютерные, а сайт поддерживать хотят. Поэтому на сайт был установлен CMS Drupal. В качестве БД был выбран PostgreSQL, поскольку он мне просто больше нравится. И все было бы хорошо, если бы не пришла пора менять хостинг.

В начале выяснилось, что на новом хостинге пользователь не может создавать объекты внутри схемы «public».

Про схемы надо рассказать отдельно. Когда-то давно PostgreSQL старался походить на Oracle во многих отношениях, в том числе в структуре объектов БД. Так в PostgreSQL появились схемы (schema). Для PostgreSQL схема – это именованный контейнер для объектов базы (таблицы, индексы, сиквенсы и т.п.). Для определения порядка использования схем в базе существует текстовый параметр search_path. По умолчанию сначала в качестве схемы используется имя пользователя, потом константа public.

К сожалению, на хостинге имя логина к БД содержало символ «-», который запрещен в идентификаторах объектов БД. Пришлось создать схему с другим названием и переместить все объекты туда. В процессе переноса выяснилось, что команда ALTER SOMETHING name SET SCHEMA ’something’ поддерживается только с версии 8.3 базы. Хорошо хоть так, иначе бы пришлось какие-то скрипты нетривиальные писать. Перенеслось, с горем пополам.

Далее выяснилось, что drupal по умолчанию не дружит со схемами в PostgreSQL. По мотивам интернета был написан патч, который позволяет drupal 6.9 задружиться с PostreSQL. Вот патч:

?Download pgsql.patch
*** database.pgsql.inc.orig     Thu Apr  9 04:25:13 2009
--- database.pgsql.inc  Thu Apr  9 06:48:22 2009
***************
*** 51,56 ****
--- 51,57 ----
    }
 
    $url = parse_url($url);
+   $db_and_schema = explode(".", $url['path']);
    $conn_string = '';
 
    // Decode url-encoded information in the db connection string
***************
*** 63,70 ****
    if (isset($url['host'])) {
      $conn_string .= ' host='. urldecode($url['host']);
    }
!   if (isset($url['path'])) {
!     $conn_string .= ' dbname='. substr(urldecode($url['path']), 1);
    }
    if (isset($url['port'])) {
      $conn_string .= ' port='. urldecode($url['port']);
--- 64,71 ----
    if (isset($url['host'])) {
      $conn_string .= ' host='. urldecode($url['host']);
    }
!   if (isset($db_and_schema['0'])) {
!     $conn_string .= ' dbname='. substr(urldecode($db_and_schema['0']), 1);
    }
    if (isset($url['port'])) {
      $conn_string .= ' port='. urldecode($url['port']);
***************
*** 85,90 ****
--- 86,94 ----
    // Restore error tracking setting
    ini_set('track_errors', $track_errors_previous);
 
+   // set schema
+   if(!empty($db_and_schema['1'])) pg_query($connection, 'SET search_path TO '.$db_and_schema['1']);
+
    pg_query($connection, "set client_encoding=\"UTF8\"");
    return $connection;
  }

После патча можно указывать в settings.php название базы в виде «<имя базы>.<имя схемы>«.

Таким образом, миграция со всеми исследованиями заняла примерно 3 вечера. Получилось немало. Надеюсь, что этот пост поможет кому-то быстрее провести аналогичную миграцию.

alik Development ,

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.