本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月17日 at 17:18

皆さんこんにちは。
質問です。

当方のローカル環境(MAMP)で作成したサイトをデプロイしようと、
本番環境(ヘテムルのサーバー)へphpMyAdminを使ってデータベースをインポートすると
下記のエラーが出てしまいます。


SQL query:
--
-- テーブルのインデックス `AreaPermissionAssignments`
--
ALTER TABLE `AreaPermissionAssignments`
ADD PRIMARY KEY (`cID`,`arHandle`,`pkID`,`paID`),
ADD KEY `paID` (`paID`),
ADD KEY `pkID` (`pkID`);

MySQL のメッセージ: ドキュメント
#1071 - Specified key was too long; max key length is 767 bytes


これを解決する方法を教えてください。

・使用しているパソコンはMacOS
・concrete5のバージョンは8.5.5
・サーバーは「ヘテムル」のホスティングサーバー
・PHPは7.4(CGI版)

以上です。
どなたか助けていただけると嬉しいです。
どうかよろしくお願いいたします。

タグ:

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月17日 at 23:05
こちらに書かれている問題でしょうか?

http://concrete5-japan.org/community/forums/chat/post-19761/post-19762/post-19764/

mysqlのcharsetがutf8mb4の場合、utf8で解決する場合もあります。
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月18日 at 2:53
どうもご連絡ありがとうございます!
ご紹介いただいた動画で言われたとおり、ローカル→ローカルでデプロイを試したら問題なくインポート出来ました。

ただし肝心な、ローカル→リモート(ヘテムル)で行うと、どう試しても同じエラーが出てしまいます。

pictronさんのアドバイズ通りmysqlのServer charsetがutf8であることはローカル側もリモート側も確認済みです。

ただ、変だなぁ?と思うのは、phpMyAdminの一般設定の画面において、Server connection collation(サーバ接続の照合順序)を、ローカル側ではut8_unicode_ciをポップアップから選択できるのですが、リモート側だとポップアップでut8_unicode_ciを選んでも切り替わらず、何故かutf8mb4_unicode_ciに即座に戻ってしまうのです。utf8mb4でサーバ接続の照合順序が固定されてしまいます。


このあたりの話は私が明るくなく、上記の現象が良いのか悪いのか分からないのですが、どうもリモート側に問題があるように思えます。しかしヘテムルではデータベースはサポート外の様なので、この先はもう正常なデプロイは無理かなと諦めかけています。

一応、リモート側のphpMyAdminの画像を添付します。
もし解決できるのなら嬉しいのですが…
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月18日 at 9:54
実際に試したわけではないので 効果は確認していませんが
ヘムテルさん MySQL5.6 ?
phpMyAdmin の設定で

innodb_large_prefix
innodb_file_per_table
innodb_file_format=Barracuda

はどうでしょうか
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月18日 at 13:17
teraさん、ご連絡ありがとうございます。

ヘテムルさんのデータベースはMySQL5.6ですね。

ヘテムル側のphpMyAdminにて変数の画面で確認すると
innodb large prefix [ OFF ]
innodb file per table [ ON ]
innodb file format [ Barracuda ]
となっています。

ちなみにローカルホスト側では
MySQL5.7であり
innodb large prefix [ ON ]
innodb file per table [ ON ]
innodb file format [ Barracuda ]
となっています。
 

Re: Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月18日 at 13:30
ヘムテルさんも
innodb large prefix [ ON ]
でいけばいいように思います
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年6月21日 at 20:10
tera様

いろいろとありがとうごございます。
ヘテムルのphpMyAdminにおいてinnodb large prefixをユーザーが切り替えることができないため、ヘテムルへ掛け合いましたが回答は「ユーザーが切り替えられるようには出来ない」「ヘテムルが切り替えることはしない」とのことでした。

残念ですが、この件はこれ以上進展しそうにないので、別な手段を考えたいと思います。

teraさん、どうもありがとうございました。
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年7月2日 at 14:00
こんにちは。

取り急ぎ。

もしも、UTF8 の4バイト文字、特に絵文字などを取り扱っていなければ、
ローカルで構築されている concrete5 のデータベースの文字セットを utf8 にして、
SQL を出力し直し、へテムルに移管できませんか?

concrete5 で、文字セットを変更できる機能が管理画面にあります。

[管理画面] - [システム設定] - [サーバー設定一覧] - [データベース文字セット]

[c5 の URL]/index.php/dashboard/system/environment/database_charset

こちらの管理画面より、UTF8 に変更できます。

時間がかかる処理なので、
データベースのサイズによっては、1回のページロードで追わない場合があります。
その際は、ページをリロードすると完了するはずです。
PHP の max_execution_time を伸ばしたりしてもOKです。

また /application/config/database.php に書かれている文字列の設定も変更されるので、引っ越しをする際に database.php をきちんとコピーするようにお願いします。

ただ、 4バイト文字が使われていたら、エラーで止まってしまってサイトが復旧できなくなるので気をつけてください。

例えば、実施前にSQL バックアップをとってから実施していただくといいと思います。

もしも、Terminal などのCLI (コマンドライン) から実施できるのであれば、以下のコマンドで変換できます。

cd [c5 のルートディレクトリ]
concrete/bin/concrete5 c5:database:charset:set utf8
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年7月3日 at 17:01
Kats_Ueno様

ご連絡どうもありがとうございます!
実は解決を一旦あきらめてしまったのですが、
今回教えていただいたことをトライしてみようと思います。
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年7月4日 at 7:46
すいません。補足です。

> ローカルで構築されている concrete5 のデータベースの文字セットを utf8 にして、

管理画面で変更する際の、正確な文字セット名は
utf8_general_ci
です。
 

Re: 本番環境へのデータベース移設でエラー(max key length is 767 bytes)

2021年7月7日 at 10:53
もしかしてDBのバージョンさかのぼりではないでしょうか?

一度公開先で空のサイトを作って DBをエクスポートして AreaPermissionAssignments ENGINEは何で定義されているか確認して合わせるとよいかもです。

※ ENGINE=​MyISAMにして回避したことがあるような気がします。