New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

さくらのレンタルサーバで、NC3が内部エラー(Database Error)頻発 #1262

Closed
ToshiAkaz opened this Issue Jun 20, 2018 · 17 comments

Comments

Projects
None yet
4 participants
@ToshiAkaz
Copy link
Contributor

ToshiAkaz commented Jun 20, 2018

いつもありがとうございます。
次の環境で、NetCommons 3.1.9をインストールしてみましたところ、内部エラーが頻発しました。NC3の設定でエラーモードを1にしてみましたところ、その内部エラーはどれもDatabase Errorでした。

【環境】
さくらのレンタルサーバ スタンダードタイプ
PHP 7.1.17
Apache 2.4.33
MySQL 5.7

 ※さくらのレンタルサーバは、1か月がそこら前からリニューアルされ、MySQLも5.7となったのが
  今回の影響の根源かなと想像しております。

【エラー症例1】

  1. お知らせプラグインをパブリックスペース(トップページ)に配置した → OK
     セッティングモードONにし、上のお知らせプラグインの歯車アイコンをクリックしたら、Database Error。以下がそのエラー内容です。

Database Error
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'kuniv_db.Announcement.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SQL Query: SELECT Announcement.id, Announcement.language_id, Announcement.block_id, Announcement.key, Announcement.status, Announcement.is_active, Announcement.is_latest, Announcement.is_origin, Announcement.is_translation, Announcement.is_original_copy, Announcement.content, Announcement.created_user, Announcement.created, Announcement.modified_user, Announcement.modified, Block.id, Block.room_id, Block.plugin_key, Block.key, Block.public_type, Block.publish_start, Block.publish_end, Block.content_count, Block.created_user, Block.created, Block.modified_user, Block.modified, TrackableCreator.id, TrackableCreator.handlename, TrackableUpdater.id, TrackableUpdater.handlename, BlocksLanguage.language_id, BlocksLanguage.block_id, BlocksLanguage.name, BlocksLanguage.is_origin, BlocksLanguage.is_translation, BlocksLanguage.is_original_copy FROM kuniv_db.announcements AS Announcement LEFT JOIN kuniv_db.blocks AS Block ON (Announcement.block_id = Block.id) LEFT JOIN kuniv_db.users AS TrackableCreator ON (Announcement.created_user = TrackableCreator.id) LEFT JOIN kuniv_db.users AS TrackableUpdater ON (Announcement.modified_user = TrackableUpdater.id) LEFT JOIN kuniv_db.blocks_languages AS BlocksLanguage ON (BlocksLanguage.block_id = Block.id AND ((BlocksLanguage.is_translation = '0') OR (BlocksLanguage.language_id = 2))) LEFT JOIN kuniv_db.frames AS Frame ON (Frame.block_id = Block.id AND Frame.id = '6') WHERE Block.room_id = 1 AND Block.plugin_key = 'announcements' AND ((Announcement.is_translation = '0') OR (Announcement.language_id = 2)) AND Announcement.is_latest = '1' GROUP BY Block.id ORDER BY Frame.block_id desc, Block.id asc LIMIT 20

Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp

Stack Trace
CORE/Cake/Model/Datasource/DboSource.php line 472 → PDOStatement->execute(array)
CORE/Cake/Model/Datasource/DboSource.php line 438 → DboSource->_execute(string, array)
CORE/Cake/Model/Datasource/DboSource.php line 675 → DboSource->execute(string, array, array)
CORE/Cake/Model/Datasource/DboSource.php line 1186 → DboSource->fetchAll(string, array)
CORE/Cake/Model/Model.php line 3040 → DboSource->read(Announcement, array)
CORE/Cake/Model/Model.php line 3012 → Model->_readDataSource(string, array)
CORE/Cake/Controller/Component/PaginatorComponent.php line 212 → Model->find(string, array)
APP/Plugin/Announcements/Controller/AnnouncementBlocksController.php line 71 → PaginatorComponent->paginate(Announcement)
[internal function] → AnnouncementBlocksController->index()
CORE/Cake/Controller/Controller.php line 491 → ReflectionMethod->invokeArgs(AnnouncementBlocksController, array)
CORE/Cake/Routing/Dispatcher.php line 193 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 167 → Dispatcher->_invoke(AnnouncementBlocksController, CakeRequest)
APP/webroot/index.php line 106 → Dispatcher->dispatch(CakeRequest, CakeResponse)

【エラー症例2】

  1. 管理ページに行き、「会員管理」メニューをクリックするとDatabase Error発生

Database Error
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'kuniv_db.UsersLanguage.name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SQL Query: SELECT User.id, User.handlename, UsersLanguage.name, User.role_key, User.status, User.modified, User.last_login FROM kuniv_db.users AS User LEFT JOIN kuniv_db.users_languages AS UsersLanguage ON (UsersLanguage.user_id = User.id AND UsersLanguage.language_id = '2') INNER JOIN kuniv_db.roles AS Role ON (User.role_key = Role.key AND Role.language_id = '2') LEFT JOIN kuniv_db.roles_rooms_users AS RolesRoomsUser ON (RolesRoomsUser.user_id = User.id) LEFT JOIN kuniv_db.roles_rooms AS RolesRoom ON (RolesRoomsUser.roles_room_id = RolesRoom.id) LEFT JOIN kuniv_db.room_roles AS RoomRole ON (RolesRoom.role_key = RoomRole.role_key) LEFT JOIN kuniv_db.rooms AS Room ON (RolesRoomsUser.room_id = Room.id AND NOT (Room.page_id_top IS NULL)) WHERE User.is_deleted = '0' GROUP BY User.id ORDER BY Role.id asc, User.id asc LIMIT 20

Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp

Stack Trace
CORE/Cake/Model/Datasource/DboSource.php line 472 → PDOStatement->execute(array)
CORE/Cake/Model/Datasource/DboSource.php line 438 → DboSource->_execute(string, array)
CORE/Cake/Model/Datasource/DboSource.php line 675 → DboSource->execute(string, array, array)
CORE/Cake/Model/Datasource/DboSource.php line 1186 → DboSource->fetchAll(string, array)
CORE/Cake/Model/Model.php line 3040 → DboSource->read(UserSearch, array)
CORE/Cake/Model/Model.php line 3012 → Model->_readDataSource(string, array)
APP/Plugin/Users/Model/UserSearch.php line 409 → Model->find(string, array)
CORE/Cake/Controller/Component/PaginatorComponent.php line 205 → UserSearch->paginate(array, array, array, integer, integer, integer, array)
APP/Plugin/Users/Controller/Component/UserSearchCompComponent.php line 110 → PaginatorComponent->paginate(UserSearch)
APP/Plugin/UserManager/Controller/UserManagerController.php line 89 → UserSearchCompComponent->search(array)
[internal function] → UserManagerController->index()
CORE/Cake/Controller/Controller.php line 491 → ReflectionMethod->invokeArgs(UserManagerController, array)
CORE/Cake/Routing/Dispatcher.php line 193 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 167 → Dispatcher->_invoke(UserManagerController, CakeRequest)
APP/webroot/index.php line 106 → Dispatcher->dispatch(CakeRequest, CakeResponse)

【エラー症例3】

  1. 管理画面を終了し、トップページに戻り、セッティングモードON
     → アクセスカウンタープラグインの「追加」ボタンをクリックすると Database Error

Database Error
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'kuniv_db.AccessCounter.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SQL Query: SELECT AccessCounter.id, AccessCounter.block_key, AccessCounter.count, AccessCounter.count_start, AccessCounter.created_user, AccessCounter.created, AccessCounter.modified_user, AccessCounter.modified, Block.id, Block.room_id, Block.plugin_key, Block.key, Block.public_type, Block.publish_start, Block.publish_end, Block.content_count, Block.created_user, Block.created, Block.modified_user, Block.modified, TrackableCreator.id, TrackableCreator.handlename, TrackableUpdater.id, TrackableUpdater.handlename, BlocksLanguage.language_id, BlocksLanguage.block_id, BlocksLanguage.name, BlocksLanguage.is_origin, BlocksLanguage.is_translation, BlocksLanguage.is_original_copy FROM kuniv_db.access_counters AS AccessCounter LEFT JOIN kuniv_db.blocks AS Block ON (AccessCounter.block_key = Block.key) LEFT JOIN kuniv_db.users AS TrackableCreator ON (AccessCounter.created_user = TrackableCreator.id) LEFT JOIN kuniv_db.users AS TrackableUpdater ON (AccessCounter.modified_user = TrackableUpdater.id) LEFT JOIN kuniv_db.blocks_languages AS BlocksLanguage ON (BlocksLanguage.block_id = Block.id AND ((BlocksLanguage.is_translation = '0') OR (BlocksLanguage.language_id = 2))) LEFT JOIN kuniv_db.frames AS Frame ON (Frame.block_id = Block.id AND Frame.id = '7') WHERE Block.room_id = 1 AND Block.plugin_key = 'access_counters' GROUP BY Block.id ORDER BY Frame.block_id desc, Block.id asc LIMIT 20

Notice: If you want to customize this error message, create app/View/Errors/pdo_error.ctp

Stack Trace
CORE/Cake/Model/Datasource/DboSource.php line 472 → PDOStatement->execute(array)
CORE/Cake/Model/Datasource/DboSource.php line 438 → DboSource->_execute(string, array)
CORE/Cake/Model/Datasource/DboSource.php line 675 → DboSource->execute(string, array, array)
CORE/Cake/Model/Datasource/DboSource.php line 1186 → DboSource->fetchAll(string, array)
CORE/Cake/Model/Model.php line 3040 → DboSource->read(AccessCounter, array)
CORE/Cake/Model/Model.php line 3012 → Model->_readDataSource(string, array)
CORE/Cake/Controller/Component/PaginatorComponent.php line 212 → Model->find(string, array)
APP/Plugin/AccessCounters/Controller/AccessCounterBlocksController.php line 69 → PaginatorComponent->paginate(AccessCounter)
[internal function] → AccessCounterBlocksController->index()
CORE/Cake/Controller/Controller.php line 491 → ReflectionMethod->invokeArgs(AccessCounterBlocksController, array)
CORE/Cake/Routing/Dispatcher.php line 193 → Controller->invokeAction(CakeRequest)
CORE/Cake/Routing/Dispatcher.php line 167 → Dispatcher->_invoke(AccessCounterBlocksController, CakeRequest)
APP/webroot/index.php line 106 → Dispatcher->dispatch(CakeRequest, CakeResponse)

@ToshiAkaz ToshiAkaz added the 00Inbox label Jun 20, 2018

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 20, 2018

#1160 でも発生していた模様。これもMySQL5.7ですね。今後あちこちのレンタルサーバで発生するかも。。。

@RyujiAMANO

This comment has been minimized.

Copy link
Contributor

RyujiAMANO commented Jun 21, 2018

mysql の strict modeですかね。

未検証ですが、
https://stackoverflow.com/questions/27846587/set-sql-mode-in-cakephp-schema/27921631#27921631
をみると
app/Config/database.phpにsettingオプション追加でsql_mode設定できるようなのでこれで設定しちゃうのがいいかもです。

下記みたいな感じ?

public $master = array(
		'datasource' => 'Database/Mysql',
		// ....
		'schema' => '',
		'encoding' => 'utf8',
		'settings' => [
			'@@SESSION.sql_mode' => '',
		],
	);

これでいけるようなら、ひとまずNC3のデフォルトになるようにインストーラ改修とかが今ところの対策かなぁ…

なやましいのは、原因となってる find をstrict modeでも問題無いように修正しようと思うと、このIssueみたいにあ、どこでエラー起きたっていう情報は集めたいので、デフォルトで発生しないようにすると情報が集まらなくなることですかね。😢

@akagane99

This comment has been minimized.

Copy link
Contributor

akagane99 commented Jun 21, 2018

mysql の strict modeの別対応案として。

MySQL5.7になって、sql_modeの初期設定が変わったようですね。(mysql5.6の時もありましたね)
MySQL5.7になって、ユーザディレクトリのmy.cnfも読むようになった。とのネット記事もありましたので、
もしかしたら、ユーザディレクトリのmy.cnf作ってsql_mode変えたらいけるかもしれません。

参考

https://opensource-workshop.jp/bbses/bbs_articles/view/346/d2e0b352c5fa3e277b4bffec86d9efec?frame_id=773
https://qiita.com/ftomo100/items/555236cf0e8e9d3a3b0e
http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0018

過去にcakephpのissueでも話題になってたみたいです。
cakephp/cakephp#10723
cakephp/cakephp#8479

https://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=1841

さくらのレンタルサーバのデータベース機能において、本日2018年1月18日より最新バージョンの「MySQL5.7」を提供開始いたしました。

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 21, 2018

情報ありがとうございます。試してまたご報告します。

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 21, 2018

まずはAMANOさんの案を試しました。
app/Config/database.phpをご指摘のようにいじってシステム管理者でログインすると、いきなり以下のようなError発生しました。

Missing Database Connection
Error: A Database connection using "Mysql" was missing or unable to connect.	
The database server returned this error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

Notice: If you want to customize this error message, create app/View/Errors/missing_connection.ctp`

次に、一旦、AMANOさんの案を無効にし(コメントアウトし)システム管理者でログインしました。
この状態で、再度 AMANOさんの案を有効にし、症例1〜3が発生するかどうか確認したところ、どれも同じ症状として発症してしまいました。

`'@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'"`

と空でない値を与えてみましたが、症例1〜3とも発生しました(T_T)

GitHubのエディタの使い方が少しわかってきたので、見た目だけ修正しました(2018.6.22) あれ、この文だけ文字が大きいな(^^?

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 21, 2018

MySQL 5.7のデフォルトsql_modeを無効にするのは良くないみたいですね。
http://gihyo.jp/dev/serial/01/mysql-road-construction-news/0018

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 21, 2018

MySQL 5.1と古い事例ですが、~/.my.cnf で上書きできるとあるのでやってみました。
http://sawara.me/mysql/2073/

[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION

しかし、やはり症例1〜3は発生しました。
MySQL 5.7の場合、ユーザディレクトリのmy.cnfってどこにどう書くのかが不明のため、今回の検証作業自体が間違っているかもしれません。
mycnf

(追記)5.7でも ~/.my.cnfでいいみたい。
https://qiita.com/bezeklik/items/3fb55bfb9b7c3447f03f

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 21, 2018

MySQLのデーモンを再起動できたらいいんだけど、さくらのレンタルサーバではムリ(T_T)

@RyujiAMANO

This comment has been minimized.

Copy link
Contributor

RyujiAMANO commented Jun 22, 2018

ローカルで検証してみました。

		'settings' => [
			'@@SESSION.sql_mode' => "''",
		],

こうでないとダメみたい(ダブルクォート、シングルクオート、シングルクォート、ダブルクォートです)

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 22, 2018

さくらのレンタルサーバで、app/Config/database.php の中身のうち、該当箇所を以下のように変更して、試してみました(host名とユーザ名とパスワードは伏せ字)。

	public $master = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => '********.db.sakura.ne.jp',
		'port' => '3306',
		'login' => '********',
		'password' => '********',
		'database' => 'kuniv_db',
		'prefix' => '',
		'schema' => 'public',
		'encoding' => 'utf8',
		'settings' => [
			'@@SESSION.sql_mode' => "''",
		],
	);

しかし、残念ながら症例1〜3は発生してしまいました(TT) ログイン時のエラーは発生しませんでしたが。

/.my.cnfの影響があるといけませんので、/_my.cnfとリネームして上記を試しました。補足まで。
↑取り消し線は付けておりません。GitHubのエディタがなぜか勝手に付けてます...それと/の前のチルダが表示されてないです...困るなぁ〜

@RyujiAMANO

This comment has been minimized.

Copy link
Contributor

RyujiAMANO commented Jun 22, 2018

$slaveも変更されましたか?

@akagane99

This comment has been minimized.

Copy link
Contributor

akagane99 commented Jun 22, 2018

お試しありがとうございます。
さくらのレンタルサーバに、phpにせよ、my.cnfにせよsql_modeをユーザ側で変更できるのか、問合せてみるのがいいかもです。
そういえばレンサバで設定変更ゆるしてるのか、謎だったので。
参考まで。

https://help.sakura.ad.jp/hc/ja/articles/206052622-%E3%81%8A%E5%95%8F%E3%81%84%E5%90%88%E3%82%8F%E3%81%9B%E5%89%8D%E3%81%AB%E3%81%94%E7%A2%BA%E8%AA%8D%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 22, 2018

さくらインターネットではMySQLはサポート外というスタンスなんです。コントロールパネルには「わからない方は利用しないで」の旨、書かれておりましてとても問い合わせる雰囲気でありませんw
db

$slave は変更してないので、また深夜に試してご報告しますね。

@akagane99

This comment has been minimized.

Copy link
Contributor

akagane99 commented Jun 22, 2018

にゃにー!失礼しましたm(_!_)m
確認ありがとうございます。

@RyujiAMANO

This comment has been minimized.

Copy link
Contributor

RyujiAMANO commented Jun 22, 2018

$slave は変更してないので、また深夜に試してご報告しますね。

たぶん、これでエラーだったんですね。

NC3は参照系は$slaveの接続を使って、更新系だけ$masterの接続使うようになってますー

@ToshiAkaz

This comment has been minimized.

Copy link
Contributor

ToshiAkaz commented Jun 22, 2018

NC3は参照系は$slaveの接続を使って、更新系だけ$masterの接続使うようになってますー

ニャンと=^o^=!

さてそれで、内部エラー(Database Error)が発生しないようになりました!AMANOさんのご指摘に従い、以下のように$slave1にも settings要素を追加しました。

	public $slave1 = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => '********.db.sakura.ne.jp',
		'port' => '3306',
		'login' => '********',
		'password' => '********',
		'database' => 'kuniv_db',
		'prefix' => '',
		'schema' => 'public',
		'encoding' => 'utf8',
		'settings' => [
			'@@SESSION.sql_mode' => "''",
		],
	);

症例1〜3ともに発生せず。また、nc2公式サイトのトラブル報告に投稿のあった「ブログ」「リンクリスト」「フォトアルバム」についてもエラーの発生なく、配置することができました。
https://nc2.netcommons.org/bb86xca3b-6666/#_6666

これで当面は、MySQL 5.7のレンタルサーバでもNC3を運用できますね。
ありがとうございました!

@akagane99

This comment has been minimized.

Copy link
Contributor

akagane99 commented Jul 12, 2018

コアのプログラム修正しました。
次期バージョンnc3.1.10で、新規インストールした場合、この設定が自動的に入るようになります。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment