我們是2010年底開始使用Drupal的,當時Drupal 7還沒正式版,所以就用了Drupal 6,在2012年2月的時候就以本博客為例做過Drupal 6到Drupal 7的升級,雖然有些麻煩但好歹算是可以升級成功,而涉及到大數據量Drupal的站點升級卻讓我吃到苦頭,後來新站都用Drupal 7搭建,而Drupal 6的一些網站也就繼續停留在Drupal 6,隻進行小版本升級,不敢輕易進行大版本的升級。
最近由于在轉雲服務器,就想一并做Drupal大版本升級,把現在支持越來越少的Drupal 6升級到目前主流的Drupal 7,Drupal 8因為還沒有推出正式版還不宜在正式網站采用,與以前手工菜單操作升級不一樣,現在可以用Drush批量處理的方式,如果沒有這種方式那簡直不敢想如何進行,目前嘗試了一部分,先把步驟記錄下來:
- 做好準備:查閱升級相關資料、準備服務器環境;
- 備份數據庫、備份Web文件,傳到新服務器上恢複;
- 升級Drupal 6到最新的Drupal 6版本,包括核心模塊和第三方模塊(drush up -y);
- Drupal 6站點下卸載各種第三方模塊,隻剩下核心模塊(drush pm-disable views -y等);
- 下載最新穩定版本Drupal 7安裝,将Drupal 6下的sites目錄複制過來,去掉老的模塊、模闆、翻譯等文件,進行settings.php修改等;
- Drupal 7站點下升級核心模塊數據庫(drush updatedb -y,注意如果數據量大這個過程可能比較長);
- Drupal 6的CCK到Drupal 7的Content Type的轉換(drush content-migrate-fields -y,這其實分為結構遷移和數據遷移兩部分,也可以用web界面進行,注意如果數據量大的話,這個過程可能比較長,而且要設置php内存限制到比較大,否則可能報錯);
- Drupal 7站點下安裝各種需要的第三方模塊(drush pm-enable views -y等,不一定要安裝與Drupal 6中對應一樣的第三方模塊,根據新站的需要取舍、補充,如果要改響應式設計可以這裡一起啟用responsive_bartik),再次升級數據庫(drush updatedb -y);
- block的檢查修改(例如drush sql-query "UPDATE block SET region='-1', weight=0, status=0 WHERE module='locale' AND delta='language' AND theme='seven';");
- views的檢查修改(例如views打開編輯、直接保存type從broken到正确的,翻頁鍊接、菜單等的重新設置等);
- 設置新的模闆(html.tpl.php, page.tpl.php, node--content_type.tpl.php等);
- 設置新的自定義模塊(例如areacode.info, areacode.module, areacode.views_default.inc等);
- 首頁或者其它單獨頁面處理(例如drupal 6中的drupal_set_html_head改為drupal 7中支持的drupal_add_html_head(
$keywords_meta = $keywords;
),views block調用$block = module_invoke('views', 'block_view', 'sic_list-block');$sic_link=render($block['content']);)
$description_meta = $description;
$meta= "
<meta name=\"keywords\" content=\"$keywords_meta\" />
<meta name=\"description\" content=\"$description_meta\" />
";
$element = array(
'#type' => 'markup',
'#markup' => $meta,
);
drupal_add_html_head($element, 'meta'); - 多語言的處理(增加fil語言、修改pt-pt為pt,翻譯更新等);
- 其它雜項處理(.htaccess, robots.txt的修改,apc, memcache, cron, action, trigger, 變量cron_safe_threshold=0 / cache_lifetime="86400" / page_cache_maximum_age="86400" / block_cache=1 / page_compression=1 等檢查、設置,新老站點的功能對比)。
遇到的一些特殊情況:
- drush updatedb遇到報錯:WD php: DatabaseSchemaObjectExistsException: Cannot add field sessions.ssid: field already exists、WD php: DatabaseSchemaObjectExistsException: Cannot add index system_list to table system: index already exists之類,原因是settings.php中加入了一些多餘的設置,在升級的時候應該保持settings.php盡量簡單純淨,解決辦法是drop table掉庫裡所有表,重新導入表,修改settings.php後重新來過;
- drush content-migrate-fields遇到報錯:PHP Fatal error: Allowed memory size of 134217728 bytes,這是遇到大數量的時候PHP内存不足,解決辦法是修改php.ini,增加内存限制128M可以改為1024M等,重啟apache使之生效,然後重新運行;
- 打開頁面遇到報錯:Warning: Invalid argument supplied for foreach() in以及Warning: Illegal string offset '#children' in drupal_render()等,解決辦法是把調用views_block的辦法進行修改,改為例如:$block = module_invoke('views', 'block_view', 'sic_list-block');$sic_link=render($block['content']);,
- 升級後編輯頁面的時候遇到Notice: Undefined index: required in field_default_form() (line 109 of /drupal_path/modules/field/field.form.inc).的報錯,就去對應的内容類型,管理編輯自動添加的分類字段 http://example.com/admin/structure/types/manage/postcode/fields/taxonomyextra,不做任何改變隻要保存一遍,就可以了,再編輯頁面的時候那個報錯就沒有了
- 對于數據量特别巨大的網站(例如百萬條以上記錄),在drush content-migrate-field-data field_name的最後可能出現General error: 2006 MySQL server has gone away: DELETE FROM {semaphore} ...... in lock_release_all() 這樣類似的報錯,這是因為最後階段清理緩存等需要運行的時間比較長,超過了wait_timeout,或者被我們自己添加的腳本殺死,可以考慮的解決辦法:增加max_allowed_packet、wait_timeout,或者修改我們自己的腳本(對于正在運行數據遷移的數據庫不殺死進程,例如添加判斷條件$2!="youbianku_gbr" && $2!="youbianku_bra" && $2!="youbianku_can" && )、2015-10-14 modify aliyun-duoku-ecs-2 php.ini mysqlnd Read buffer size from 32k to 128k然後migrate data field_admin3成功了,這是是修改的mysql client端的内存限制,以前都是改的server端的内存限制,某些特殊情況下需要client端也修改
- ckeditor升級遇到報錯PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'xxx.ckeditor_input_format' doesn't exist,辦法是關閉、卸載、重新安裝ckeditor這個模塊:drush pm-disable ckeditor; drush pm-uninstall ckeditor; drush pm-enable ckeditor;
- 列模塊的時候在日志中有報錯:Notice: Undefined index: distribution_name 在 drupal_install_profile_distribution_name(),嘗試這樣:drush vset install_profile standard; drush -l pm-enable standard; drush vset "profiles/standard/standard.profile" 1; 在settings.php中添加$conf['install_profile'] = 'standard';(本條還待驗證)
- 某些頁面出現array_flip():Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load()或者Notice: Undefined index: tid in taxonomy_field_formatter_prepare_view等報錯,可能是d6到d7某些字段遷移造成的一些問題,可以嘗試關閉部分不需要字段的顯示、修改字段設置(例如根據提示需要增加reference views等)
- 數據量大的站點進行content-migrate的時候,可能碰到這樣的報錯The external command could not be executed due to an application error,查詢資料說是一台機器上兩個php版本造成的, http://drupal.org/node/1402120 or http://drupal.org/node/436968 這兩篇中别人說了一些辦法
- 遇到這樣的報錯:Cause: exception "PDOException" with message "SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column "field_address_pinyin_value" at row xxx,是因為字段内容過長,超過255個字符,在Drupal 6中是運行的,但在Drupal 7中普通的text字段最多255個字符,遷移失敗的兩種解決辦法:1、對于少量超長的字段 ,删除或者截短内容,然後重新遷移;2、對于大量超長的字段,人工新建long text字段,然後遷移數據
- 發現模闆管理或者其它頁面出現報錯Notice: Undefined index: distribution_name in drupal_install_profile_distribution_name,可以執行一條sql語句解決:UPDATE system SET status = 1 WHERE filename= 'profiles/standard/standard.profile';(drush命令:drush sql-query "UPDATE system SET status = 1 WHERE filename= 'profiles/standard/standard.profile';")
- 遇到這樣的報錯:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'comment_node_some-content-type_form' for key 'PRIMARY'以及captcha module Update #7000 Failed: PDOException: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'comment_node_some-content-type_form' for key 'PRIMARY': INSERT INTO {captcha_points},可以去運行sql語句删除這條記錄:DELETE FROM captcha_points WHERE captcha_points.form_id = 'comment_node_some-content-type_form',然後就可以重新運行drush updatedb了;
- 遇到Fatal error: Call to undefined function taxonomy_get_term() in...是因為drupal 7中寫法變了:taxonomy_term_load($tid);
- 頁面編輯、預覽的時候遇到報錯:Notice: Undefined index: taxonomy_term in taxonomy_field_formatter_view() (line ... 以及Notice: Trying to get property of non-object in entity_extract_ids() (line ... , 網上搜到一個老外也遇到這樣的問題 https://groups.drupal.org/node/151519 ,按照那個辦法修改字段顯示就解決了;
- 在包含ubercart的數據銷售站中添加關聯文件時報錯:PDOException: in _uc_file_gather_files() (line 1176... ,原因是上傳的文件中名包含了特殊字符(如中文或者全角标點符号);
遷移、升級還在進行中,以後補充完善上面的信息,希望對其他人有用。
评论