MySQL/MariaDB でリモートデータベースのダンプ時に発生する "Unknown column 'generation_expression' in 'field list'" エラーの解決方法
MySQL/MariaDB でリモートデータベースをダンプしようとすると、"Unknown column 'generation_expression' in 'field list'" エラーが発生することがあります。これは、ダンプしようとしているデータベースに GENERATED
列が存在し、その列の generation_expression
定義がダンプを実行するユーザーにアクセス権がない場合に発生します。
解決方法
このエラーを解決するには、以下のいずれかの方法を実行する必要があります。
ダンプを実行するユーザーの権限を付与する
ダンプを実行するユーザーに、GENERATED
列の generation_expression
定義を参照する権限を付与する必要があります。具体的には、以下のコマンドを実行します。
GRANT SELECT ON *.* TO 'dump_user'@'%' WITH GRANT OPTION;
このコマンドを実行すると、dump_user
ユーザーにすべてのデータベースのすべてのテーブルに対する SELECT
権限が付与されます。また、GRANT OPTION
オプションを指定することで、このユーザーは他のユーザーにも権限を付与することができます。
generation_expression 定義をダンプから除外する
ダンプを実行するユーザーに generation_expression
定義を参照する権限を付与したくない場合は、ダンプから generation_expression
定義を除外することができます。具体的には、以下のコマンドを実行します。
mysqldump --skip-column-list generation_expression database_name > dump.sql
このコマンドを実行すると、database_name
データベースのダンプが生成されますが、generation_expression
定義は含まれません。
--column-list オプションを使用する
ダンプする列を指定する --column-list
オプションを使用することもできます。具体的には、以下のコマンドを実行します。
mysqldump --column-list col1,col2,col3 database_name > dump.sql
このコマンドを実行すると、col1
、col2
、col3
列のみを含む database_name
データベースのダンプが生成されます。
注意事項
GENERATED
列は、MySQL 8.0 以降で導入された機能です。generation_expression
定義は、列の値を自動的に生成するために使用されます。
GRANT SELECT ON *.* TO 'dump_user'@'%' WITH GRANT OPTION;
このコマンドを実行すると、dump_user
ユーザーにすべてのデータベースのすべてのテーブルに対する SELECT
権限が付与されます。
mysqldump --skip-column-list generation_expression database_name > dump.sql
mysqldump --column-list col1,col2,col3 database_name > dump.sql
注:
- 上記のコードはあくまで例であり、状況に合わせて変更する必要があります。
このエラーは、MySQL 8.10 以降の MySQL/MariaDB クライアントで発生することがあります。MySQL 8.10 以前のバージョンを使用している場合は、このエラーが発生しない可能性があります。
mysqldump コマンドを実行するサーバー上でダンプを実行する
リモートサーバーからではなく、mysqldump コマンドを実行するサーバー上でダンプを実行することで、このエラーを回避できる場合があります。
mysql mariadb dump