# baserCMS 3.0.9 → 4.0.2.1 移行時に起きたエラー ## 環境 * Ubuntu 14.04.5 LTS * Apache 2.4.25 * PHP 5.6.30 * MariaDB 10.1.22 サーバ内に /home/basermg/www ディレクトリ(=ドキュメントルート)を作り baserCMS 4.0.2.1 を展開。データベース名は basermg とした。 ## 手順 [baserCMS3系から4系への移行方法](http://magazine.basercms.net/article/archives/39)の手順で作業進行(データバックアップ・復元以外の記録については省略)。 1. 既存 3.0.9 にてバックアップファイル作成 2. 1 でダウンロードした ZIP ファイルを、新規インストールした 4.0.2.1 内の「DBマイグレーター」で変換・ダウンロード 3. 2 で変換・ダウンロードした ZIP ファイルを、4.0.2.1 の[システム管理]-[ユーティリティ]にてインポート インポートしたところ An Internal Error Has Occurred …… ## エラーメッセージ デバッグレベル 1 にて確認。 ### フロント側 ``` エラー: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Content.name' in 'field list' SQL Query: SELECT `Content`.`id`, `Content`.`name`, `Content`.`plugin`, `Content`.`type`, `Content`.`entity_id`, `Content`.`url`, `Content`.`site_id`, `Content`.`alias_id`, `Content`.`main_site_content_id`, `Content`.`parent_id`, `Content`.`lft`, `Content`.`rght`, `Content`.`level`, `Content`.`title`, `Content`.`description`, `Content`.`eyecatch`, `Content`.`author_id`, `Content`.`layout_template`, `Content`.`status`, `Content`.`publish_begin`, `Content`.`publish_end`, `Content`.`self_status`, `Content`.`self_publish_begin`, `Content`.`self_publish_end`, `Content`.`exclude_search`, `Content`.`created_date`, `Content`.`modified_date`, `Content`.`site_root`, `Content`.`deleted_date`, `Content`.`deleted`, `Content`.`exclude_menu`, `Content`.`blank_link`, `Content`.`created`, `Content`.`modified`, `Site`.`id`, `Site`.`main_site_id`, `Site`.`name`, `Site`.`display_name`, `Site`.`title`, `Site`.`alias`, `Site`.`theme`, `Site`.`status`, `Site`.`use_subdomain`, `Site`.`relate_main_site`, `Site`.`device`, `Site`.`lang`, `Site`.`same_main_url`, `Site`.`auto_redirect`, `Site`.`auto_link`, `Site`.`domain_type`, `Site`.`created`, `Site`.`modified`, `User`.`id`, `User`.`name`, `User`.`password`, `User`.`real_name_1`, `User`.`real_name_2`, `User`.`email`, `User`.`user_group_id`, `User`.`nickname`, `User`.`created`, `User`.`modified` FROM `basermg`.`mysite_contents` AS `Content` LEFT JOIN `basermg`.`mysite_sites` AS `Site` ON (`Content`.`site_id` = `Site`.`id`) LEFT JOIN `basermg`.`mysite_users` AS `User` ON (`Content`.`author_id` = `User`.`id`) WHERE `Content`.`url` IN ('/', '/index') AND ((`Site`.`status` = '1') OR (`Site`.`status` IS NULL)) AND ((`Site`.`same_main_url` = '0') OR (`Site`.`same_main_url` IS NULL)) AND ((`Site`.`use_subdomain` = '0') OR (`Site`.`use_subdomain` IS NULL)) AND `Content`.`status` = '1' ORDER BY `Content`.`url` DESC LIMIT 1 ``` ### 管理画面側 ``` エラー: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'UserGroup.use_move_contents' in 'field list' SQL Query: SELECT `UserGroup`.`id`, `UserGroup`.`name`, `UserGroup`.`title`, `UserGroup`.`auth_prefix`, `UserGroup`.`use_admin_globalmenu`, `UserGroup`.`default_favorites`, `UserGroup`.`use_move_contents`, `UserGroup`.`modified`, `UserGroup`.`created` FROM `basermg`.`mysite_user_groups` AS `UserGroup` WHERE `UserGroup`.`id` <> 1 LIMIT 1 ``` --- エラーメッセージに沿って調べてみると、インポートする前にデータベース内に存在していた ``Content.name`` および ``UserGroup.use_move_contents`` のカラムが消えていた。 ## エラーログ エラーに該当するとおぼしき箇所を抽出した。 ### /app/tmp/logs/error.log ``` 2017-02-27 22:31:03 Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' 2017-02-27 22:31:04 Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' 2017-02-27 22:31:05 Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' 2017-02-27 22:31:07 Error: [PDOException] SQLSTATE[42S22]: Column not found: 1054 Unknown column 'UserGroup.use_move_contents' in 'field list' Request URL: /admin/tools/maintenance Stack Trace: #0 /home/basermg/www/lib/Baser/Model/Datasource/DboSource.php(471): PDOStatement->execute(Array) #1 /home/basermg/www/lib/Baser/Model/Datasource/DboSource.php(437): DboSource->_execute('SELECT `UserGro...', Array) #2 /home/basermg/www/lib/Baser/Model/Datasource/DboSource.php(679): DboSource->execute('SELECT `UserGro...', Array, Array) #3 /home/basermg/www/lib/Baser/Model/Datasource/DboSource.php(1119): DboSource->fetchAll('SELECT `UserGro...', false) #4 /home/basermg/www/lib/Baser/Model/Behavior/BcCacheBehavior.php(100): DboSource->read(Object(UserGroup), Array) #5 /home/basermg/www/lib/Baser/Model/BcAppModel.php(1448): BcCacheBehavior->readCache(Object(UserGroup), true, 'all', Array) #6 /home/basermg/www/lib/Baser/Controller/BcAppController.php(401): BcAppModel->find('all', Array) #7 [internal function]: BcAppController->beforeFilter(Object(CakeEvent)) #8 /home/basermg/www/lib/Baser/Event/CakeEventManager.php(245): call_user_func(Array, Object(CakeEvent)) #9 /home/basermg/www/lib/Cake/Controller/Controller.php(677): CakeEventManager->dispatch(Object(CakeEvent)) #10 /home/basermg/www/lib/Cake/Routing/Dispatcher.php(189): Controller->startupProcess() #11 /home/basermg/www/lib/Cake/Routing/Dispatcher.php(167): Dispatcher->_invoke(Object(ToolsController), Object(CakeRequest)) #12 /home/basermg/www/index.php(159): Dispatcher->dispatch(Object(CakeRequest), Object(CakeResponse)) #13 {main} ``` ### /app/tmp/logs/debug.log ``` 2017-02-27 22:31:03 Notice: Notice (1024): SoftDeleteBehavior::setup(): model Content has no field deleted in [/home/basermg/www/lib/Baser/Model/Behavior/SoftDeleteBehavior.php, line 61] Trace: SoftDeleteBehavior::setup() - CORE/Baser/Model/Behavior/SoftDeleteBehavior.php, line 61 BehaviorCollection::load() - CORE/Cake/Model/BehaviorCollection.php, line 145 BehaviorCollection::init() - CORE/Cake/Model/BehaviorCollection.php, line 66 Model::__construct() - CORE/Cake/Model/Model.php, line 774 BcAppModel::__construct() - CORE/Baser/Model/BcAppModel.php, line 52 ReflectionClass::newInstance() - [internal], line ?? ClassRegistry::init() - CORE/Cake/Utility/ClassRegistry.php, line 169 DboSource::readSchema() - CORE/Baser/Model/Datasource/DboSource.php, line 4177 DboSource::loadCsv() - CORE/Baser/Model/Datasource/DboSource.php, line 4217 ToolsController::_loadBackup() - CORE/Baser/Controller/ToolsController.php, line 208 ToolsController::_restoreDb() - CORE/Baser/Controller/ToolsController.php, line 141 ToolsController::admin_maintenance() - CORE/Baser/Controller/ToolsController.php, line 88 ReflectionMethod::invokeArgs() - [internal], line ?? Controller::invokeAction() - CORE/Cake/Controller/Controller.php, line 491 Dispatcher::_invoke() - CORE/Cake/Routing/Dispatcher.php, line 193 Dispatcher::dispatch() - CORE/Cake/Routing/Dispatcher.php, line 167 [main] - ROOT/index.php, line 159 ``` ----- ## 20170317追記 「DBマイグレーター」を 4.0.1 に変えてみたもののやはり 「UserGroup.use_move_contents が見つからない」的なエラーが出てインポートに失敗。その後、以下の作業を行い一応インポートができた。 1. 4.0.2.1 の[システム管理]-[ユーティリティ]-[スキーマファイル生成]で、コアテーブル名すべて・プラグインテーブル名すべてを書きだし 1. 3.0.9 の /lib/Baser/Controller/ToolsController.php を [3.0.x の最新版](https://github.com/baserproject/basercms/commit/a3f296157beca05e1f32f97507d663f576cbcc7c#diff-1e6ba64e72d878c4d5caab09a6d2f35b) に差し替え 1. 3.0.9 でバックアップファイル作成 2. 3 のファイルを 4.0.2.1 内の「DBマイグレーター」で変換・ダウンロード 1. 4.0.2.1 内に移設した 3.0.9 のテーマ・プラグインを「アドオンマイグレーター」で変換 1. 4 のファイル内の \*.php ファイル(スキーマファイル)を 1 で書き出したスキーマファイルで上書きし再度圧縮 1. 6 でつくった ZIP ファイルを 4.0.2.1 内にインポート。その際、文字コードを UTF-8 で決めうちして読み込む 1. 3.0.9 の /app/Config/install.php 内の Security.salt, Security.cipherSeed の値を 4.0.2.1 の同ファイルに書き込む 2. 管理者権限でログインした際に[コンテンツ管理]でドラッグ&ドロップでのコンテンツ移動ができなかったので、[システム設定]-[ユーザー管理]-[ユーザー一覧]より管理者の設定を再保存 3. 4.0.2.1 に合わせて適宜テーマファイル修正 どうやら「DBマイグレーター」が生成するスキーマファイル内で一部のカラムが欠落していたのが原因のようだ( \*.csv の方は正しく書き出されている模様)。当方の環境特有の現象かも。 標準以外のプラグインを使っている場合、上記のような方法ではうまくいかない可能性あり?