Апгрейдим Drupal 6 + PostgreSQL до Drupal 7 в 32 простых шага.
lexa - 03/Окт/2012 16:21
Пишу чеклист для себя, но вдруг кому еще пригодится.
Проверенная на себе процедура апгрейда с D6 на D7 в общих чертах соответствует тому, что рекомендуется на drupal.org, но моя склонность к PostgreSQL ее несколько разнообразит.
Мне "повезло" с модулями (точнее, я дождался, пока все реально мне нужное перенесут на D7), поэтому совсем нестандартные шаги потребовались только с картинками.
Мотивация
Лично у меня, по состоянию на вчера, 3 сайта работали на D7, а еще пять - на D6. По результатам полугода эксплуатации, семерка лучше:- Версия 7.15 вполне стабильна (я начал с 7.11 и проблем не помню).
- Гораздо меньше проблем с PostgreSQL, чем в D6.
- Многие модули для D6 выглядят уже неживыми, а для семерки - поживее. Вот, например fbconnect.
- Ну и вообще, иметь в управлении две версии - это иметь двойной геморой.
Предварительные шаги
- Копируем БД в другую базу:
createdb new.site.ru
pg_dump -F c old.site.ru | pg_restore -d new.site.ru - Копируем весь контент сайта в другой каталог.
cd /path/to/my/sites
cp -Rp oldsite newsite - Настраиваем nginx (или что у вас там), чтобы new.site.ru запускался из
/path/to/my/sites/newsite
- Редактируем sites/mysite.ru/settings.php:
- База данных: new.site.ru
- Префикс memcached (если используется кэширование в memcached) - отличающися от old.site.ru
- Заводим в DNS new.site.ru
Апгрейд базовых модулей
- Отключаем все 3rd-party modules (в /admin/build/modules)
- Ставим стандартный дизайн Garland
- Удаляем старый код:
cd /path/to/my/sites/new.site.ru
rm * .htaccess # all files
rm -fr includes misc modules profiles scripts themes # drupal distro
rm -fr sites/all/modules/* sites/all/themes/* # 3rd party - Накатываем патчи, чтобы апгрейд с постгресом проходил:
- Преобразование типов (bytea->text) берем из этого поста
- Патч LIKE/ILIKE, накатывается на Drupal:
--- a/includes/database/pgsql/database.inc
+++ b/includes/database/pgsql/database.inc
@@ -74,6 +74,17 @@ class DatabaseConnection_pgsql extends DatabaseConnection {
}
}
+ public function prepareQuery($query) {
+ // mapConditionOperator converts LIKE operations to ILIKE for consistency
+ // with MySQL. However, Postgres does not support ILIKE on bytea (blobs)
+ // fields.
+ // To make the ILIKE operator work, we type-cast bytea fields into text.
+ // @todo This workaround only affects bytea fields, but the involved field
+ // types involved in the query are unknown, so there is no way to
+ // conditionally execute this for affected queries only.
+ return parent::prepareQuery(preg_replace('/ ([^ ]+) +(I*LIKE|NOT +I*LIKE) /i', ' ${1}::text ${2} ', $query));
+ }
+
public function query($query, array $args = array(), $options = array()) {
$options += $this->defaultOptions(); - Патч для апгрейда таксономий (безумно странное место, но патч работает):
*** a/modules/taxonomy/taxonomy.install.orig Mon Oct 1 15:45:16 2012
--- a/modules/taxonomy/taxonomy.install Mon Oct 1 15:45:55 2012
***************
*** 682,687 ****
--- 682,692 ----
$query->orderBy('tn.vid');
$query->orderBy('td.weight');
$query->orderBy('tn.tid');
+
+ $fields =& $query->getFields();
+ unset($fields['td.weight']);
+ unset($fields['tn.tid']);
+
db_insert('taxonomy_update_7005')
->from($query)
->execute();
- Преобразуем [ img_assist в <img src скриптом из этого поста
- Убираем из settings.php все настройки memcached (если они там были)
chmod 666 settings.php
- В settings.php лучше поставить
upgrade_free_access=true
, потому что авторизоваться вам пока негде. - Запускаем new.site.ru/update.php, оно должно сказать про ~160 pending patches.
Соглашаемся, процесс накатки патчей должен пройти без ошибок. Если ошибки есть - гуглим их, находим патчи. Все патчи, которые потребовались мне - показаны выше.
Ускоренный вариант шагов 1-14
Для крепких духом и не боящихся слегка разваленного сайта, ускоренный вариант:- Копируем БД в другую базу (шаг 1 в предыдущем варианте)
- Патчим новую базу (патч для bytea - text и преобразование картинок)
- Разворачиваем drupal-7.x в
/path/to/sites/newsite/
. Только дистрибутив, никаких дополнительных модулей. - Патчим друпал (шаг 9 в предыдущем варианте)
- Копируем содержимое сайта в новый каталог:
sudo cp -Rp oldsite/sites/mysite/ newsite/sites/
- Правим newsite/sites/mysite/settings.php:
- Убираем все про memcached
- Меняем db_url, чтобы указывал на новую базу.
- chmod 666
- Запускаем new.site.ru/update.php (у меня немного поругалось на locale), убеждаемся что ~160 патчей проходят без ошибок.
- Логинимся на
new.site.ru/user/login
(скорее всего там все выглядит ужасно, но залогиниться можно) - Заходим на
new.site.ru/admin/appearance
, выбираем Garaland - Set Default - Чистим кэш
new.site.ru/admin/config/development/performance
- должен получится вполне рабочий Garaland, но без админских линков в меню: старые неверны, а новые не добавили. - Заходим на
new.site.ru/admin/modules
, включаем Toolbar - Чистим тулбарное меню (см. последний пункт в самом конце поста)
- Без лишних копирований-стираний
- Ценой временного развала дизайна
- Если где-то дальше ошибемся, можно еще раз поднять базу из бэкапа, запатчить ее и перейти сразу к update.php.
Приведение в чувство
- Ставим нужные модули для D7 обычным способом (распаковкой в sites/all/modules)
- Запускаем new.site.ru/update.php, апдейтим БД для этих модулей. Для моего списка модулей это прошло без звука.
- Редактируем E-mail notifications для сообщений о заведении аккаунта, восстановлении пароля. Переменные поменялись, проще скопировать с готового D7-сайта.
- Ставим таймзоны в
/admin/config/regional/settings
- Проверяем ВСЕ Views:
- Views по комментариям - у меня гарантированно разваливались все, апгрейд их проходит как-то неверно. Проще их пересоздать.
- Views по контенту - "как повезет", т.е. сами выборки оставались вроде верные, а вот настройки листалок, количества записей - временами слетают, системы не уловил.
- В D7 добавился новый, неотключаемый тип текста 'Plain Text'. Мне он не нужен, я делаю ему такие же настройки, как Filtered HTML, а Filtered HTML - разрешаю только администраторам.
Удалять ненужные текстовые типы - опасно (на эти грабли было наступлено!), удалится (перестанет показываться) контент с этими типами. Например, комментарии (заголовок есть, текста нет). Это тоже разруливается, но одним запросом к БД (который сменит format всем записям) не обойтись, т.к. комментарии - это не отдельная таблица в БД, а сделаны теперь через Fields. - По-умолчанию, таксономии показываются вместе с контентом. Там где это не нужно - нужно отключить (Structure - Content Types - Manage display), отдельно для показа ноды, отдельно для teaser view.
Конверсия Image nodes
На страницы с картинками (image nodes) могут быть внешние ссылки, поэтому если хочется их оставить, то выполняется процедура описанная здесь- Ставим модули Field Convert и image_legacy
- Запускаем процедуру конвертирования http://new.site.ru/admin/content/field_convert
- Появляется новый Content Type Image, появляются записи этого типа, URL старые, все работает.
- Деинсталлируем image_legacy и Field Convert, они больше не нужны
Финальные штрихи
- Ставим выбранный дизайн
- Распихиваем блоки по странице:
- Если блок показывается не на всех страницах, то эта информация осталась (сохранилась при апгрейде), но прячется где-то в кэшах. Нужно в каждом таком блоке нажать Configure, а потом Save
- Внимательно проверяем Permissions:
- Система прав несколько изменилась, поэтому всю простыню с правами нужно (обязательно!) прочитать и поставить/снять правильные галочки. Не сделавший этого - будет наказан.
- Восстанавливаем memcached (настройки в settings.php), лучше - с новым префиксом, дабы из варианта со старым дизайном ничего не налезло.
- Тестируемся на предмет висящих ссылок и вообще работоспособности.
- Переконфигурируем nginx, чтобы new.site.ru стал www.site.ru, а старый вариант - old.site.ru
- Чтобы заработал админский toolbar:
delete from menu_links where module='system';
, а затем почистить кэш. Правильные ссылки в toolbar-menu заведутся после этого сами.
Comments
zfs snapshot перед каждым серьёзным пунктом может сильно пом
zfs snapshot перед каждым серьёзным пунктом может сильно помочь ;)
Ну я как-то сильно в этом сомневаюсь. То есть файлы я, понят
Ну я как-то сильно в этом сомневаюсь.
То есть файлы я, понятно, откачу (это и так не фокус), а с базой что делать? Если откатить только файлы с таблицами, то им, поди, из лога накатят все изменения после рестарта базы.
Т.е. надо отдельную копию сервера БД и откатывать и таблички и лог. Как-то это неудобно очень.
Не-не, снапшот-то (если ты только специально не выносил WAL
Не-не, снапшот-то (если ты только специально не выносил WAL на отдельную файловую систему) будет вполне консистентным, и после рестарта (да, перед роллбэком, разумеется, базу надо остановить, и пустить после) накатятся как раз все завершённые транзакции на момент снапшота.
Но при этом у меня уедут назад и остальные базы - а этого мн
Но при этом у меня уедут назад и остальные базы - а этого мне не надо.