Перенос 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. Вот патч:
*** 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 вечера. Получилось немало. Надеюсь, что этот пост поможет кому-то быстрее провести аналогичную миграцию.
Комментарии