úterý 23. srpna 2011

Drupal: Migrace z verze 6 na verzi 7 - Část první

Provozuji několik webů, hlavně tedy svůj vlastní ;-) na redakčním systému Drupal a to tuším do verze 4.7. Začal jsem s ním hlavně proto, že jsem přestával mít čas na nějaký velké hraní si s HTML a CSS a vůbec klasickou tvorbou webu. To se dosud nezměnilo, takže systém využívám v podstatě jen k rychlému poskládání webovek z již připravených komponent a za využití většinou jen minimálně modifikované grafické šablony.

Jelikož jsem v současnosti potřevobal udělat pár nových webů a jelikož je aktuální Drupal ve verzi 7.7 (v době psaní příspěvku) pochopitelně jsem jej nasadil na nové weby a nevypadal vůbec zle (na první pohled - na ten druhý už to tak růžové nebylo, ale o tom jindy) a tak jsem se rozhodl pokusit se o upgrade nějakého stávajícího, který spokojeně funguje na Drupalu 6. Volba padla ma soukromé rodinné stránky, které jsou již skoro 2 roky neaktualní a případné odstavení napáchá minimum škody.

Tedy začněmež. Výchozí stav byl - nejaktulálnější Drupal verze 6, nějaké ty celkem běžné moduly a lehce modifikované téma vzhledu (foliage). Postup přesně dle návodu (tedy souboru UPGRADE.txt v rozbaleném Drupalu 7). Po zadání obligátního http://domena.com/update.php jsem celkem s klidem ignoroval hromadu Warning hlášek v hlavičce stránky a pokračoval klasickým Continue. Po dokončení procesu upgrade databáze začala teprve ta správná zábava.

Takže první kolo dopadlo následovně:

The following updates returned messages
user module
Update #7000

    User passwords rehashed to improve security

Update #7002

    Migrated user time zones

node module
Update #7008

    Failed: PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'weight' in 'order clause': SELECT r.rid AS rid, r.name AS name FROM {role} r INNER JOIN {role_permission} p ON r.rid = p.rid WHERE (p.permission = :db_condition_placeholder_0) ORDER BY weight ASC, name ASC; Array ( [:db_condition_placeholder_0] => administer nodes ) in user_roles() (line 2741 of /home/www/ciganek.cz/www/modules/user/user.module).

filter module
Update #7003

    Failed: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-filter_autop' for key 1: INSERT INTO {filter} (format, module, name, weight, settings, status) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5); Array ( [:db_insert_placeholder_0] => 1 [:db_insert_placeholder_1] => filter [:db_insert_placeholder_2] => filter_autop [:db_insert_placeholder_3] => 2 [:db_insert_placeholder_4] => a:0:{} [:db_insert_placeholder_5] => 1 ) in filter_update_7003() (line 334 of /home/www/ciganek.cz/www/modules/filter/filter.install).

system module
Update #7007

    Inserted into {role_permission} the permissions for role ID 1, Inserted into {role_permission} the permissions for role ID 2, Inserted into {role_permission} the permissions for role ID 3

Update #7061

    Upload module has been migrated to File module.

Update #7067

    Failed: PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'weight' in 'order clause': SELECT r.rid AS rid, r.name AS name FROM {role} r INNER JOIN {role_permission} p ON r.rid = p.rid WHERE (p.permission = :db_condition_placeholder_0) ORDER BY weight ASC, name ASC; Array ( [:db_condition_placeholder_0] => access administration pages ) in user_roles() (line 2741 of /home/www/ciganek.cz/www/modules/user/user.module).


Tedy celkem 3 Failed aktualizace. Vyřešit problém s aktualizací modulu user a system se podařilo celkem brzo pomocí dotazu do fóra. Zájemcům mohu zaslat modifikovaný system.install a user.install. Zajímavé je, že jsem musel tyto upravené soubory použít ve všech verzích Drupalu - 7.2, 7.4 i 7.7 - předpokládám, že chyba je tedy spíš u mne, protože při čisté instalaci D7.7 nebo update z 7.4 na 7.7 žádný problém není.

Horší to bylo s tím filtrem. Nevím uplně přesně k čemu ta tabulka je, každopádně jsem to řešil na fóru snad několik měsíců.

Zjednodušeně: chybová hláška říká, že při vkládání dat do tabulky filter došlo k poruše integrity - tedy vkládaný záznam nevyhovuje nějakému unikátnímu indexu, tedy ještě jinak, záznam obsahuje nějakou kombinaci nějakých hodnot, které v tabulce již jsou a tato kombinace je definována jako unikátní a tedy se nesmí opakovat.

No a vzhledem k tomu, že se chyba objevila zřejmě při převodu starých dat do nově vytvořené tabulky, tak bylo zjištěno (pochopitelně ne mnou, ale někým kdo tomu opravdu rozumí), že mi opravdu v tabulce filter chyběl unikátní index fmd (sloupce format, module a delta).

Řešení pak bylo nasnadě. Celkem drze jsem vymazal "duplicitní" záznamy a index vytvořil. POZOR, při novém pokusu o upgrade musíte vycházet znovu z původní databáze, znovuspuštění update.php způsobí úplně jsou chybu ;-)

Takže po několika měsících zkoušení a rezignovaných návratu k Drupalu 6 jsem po konečně bezchybném průběhu procesu upgrade uviděl následující administrační stránku Drupalu verze 7:



A jak sami vidíte, to již dávalo naději na snadné dokončení průběhu migrace.
Ale o tom zas příště.