MySQL エラー 1449: The user specified as a definer does not exist
プラットフォームについて: Server および Data Center のみ。この記事は、Server および Data Center プラットフォームのアトラシアン製品にのみ適用されます。
Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.
*Fisheye および Crucible は除く
問題
After moving a MySQL database between MySQL servers we observe the following error on atlassian-confluence.log
files when trying to edit pages:
caused by: org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute statement; uncategorized SQLException; SQL state [HY000]; error code [1449]; The user specified as a definer ('username'@'hostname') does not exist; nested exception is java.sql.SQLException: The user specified as a definer ('username'@'hostname') does not exist
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
caused by: java.sql.SQLException: The user specified as a definer ('username'@'hostname') does not exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
診断
環境
- This issue affects Confluence with MySQL version 5.7 and 8.0.
原因
“The DEFINER
clause specifies the MySQL account to be used when checking access privileges at routine execution time for routines that have the SQL SECURITY DEFINER
characteristic.”
When a procedure is exported into a Dump File, it is exported having username and hostname defined in its DDL. The combination of username and hostname is the DEFINER that has permissions to run that procedure.
Error will happen if that dump is imported into a Database without the combination of username and hostname with privileges granted on the new database.
ソリューション
ご利用の環境や実行している MySQL バージョンに応じていくつかのソリューションが考えられます。
データベースの変更を行う場合は必ず事前にバックアップを取得してください。可能な場合は、まずステージング サーバーで SQL コマンドの変更、挿入、更新、または削除を行うようにします。
The following SQL statements should be run whilst Confluence is shutdown.
ソリューション 1
不足しているユーザー/アカウントを作成し、'username'@'hostname' に権限を付与
Confluence の MySQL 接続にそのユーザーを使う予定がなくても、MySQL で対象のDEFINER
でプロシージャを実行するためにユーザーが使われます。CREATE USER IF NOT EXISTS <username> IDENTIFIED BY '<password>'; GRANT ALL PRIVILEGES ON <ConfluenceDatabase>.* TO '<username>'@'<hostname>';
ソリューション 2
インポート前に MySQL のダンプ ファイルを編集
上述のように、プロシージャが以前の MySQL からエクスポートされ、'<username>'@'<hostname>' について DEFINER が設定されている状態です。
ダンプ ファイルをエクスポートしたあとにダンプ ファイルを編集し、Create Procedure ステートメントで過去のユーザー名/ホスト名の組み合わせを見つけ、それを新しいユーザー名とホスト名で置き換えます。最後に、新しい MySQL サーバーでダンプ ファイルをインポートします。
ソリューション 3
3.1. Fix up the Stored Procedures Definers:
3.2. Fix up the Triggers Definers:
ソリューション 4
データベースを移行
データベースの移行に利用されるドキュメントを利用できます。これは単一のサーバーから別のサーバーにデータベースを移動するために利用できます。MySQL のような同じデータベースを両方のサーバーで利用している場合も同様です。「別のデータベースへの移行」