blog.kotamiyake.me

為せば成る、為さねば成らぬ何事も

つい最近とあるアプリの開発中、mysqldump でダンプを取得しようとした際に下記のようなエラーが発生して、ダンプ取得することができませんでした。

$ mysqldump --single-transaction -u root -p -h 127.0.0.1 -P 3307 xxxxxx_development > tmp/development.sql
Enter password: 
mysqldump: Couldn't execute 'SELECT COLUMN_NAME,                       JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"')                FROM information_schema.COLUMN_STATISTICS                WHERE SCHEMA_NAME = 'xxxxxxx_development' AND TABLE_NAME = 'accounts';': Unknown table 'COLUMN_STATISTICS' in information_schema (1109)

mysqldump のバージョンは8.0を使用しており、MySQL サーバー自体は5.7を利用していました。

$ mysqldump --version
mysqldump  Ver 8.0.13 for osx10.13 on x86_64 (Homebrew)
mysql --version
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

とりあえず解決方法を、ということで調べるとどうやら –column-statistics=0 というオプションを付けると良いということでした。

mysqldumpでCouldn't executeと言われた時の対策 – Qiita

そのとおり実行してみると無事正常にダンプファイルが生成されました。

$ mysqldump --single-transaction -u root -p -h 127.0.0.1 -P 3307 --column-statistics=0 xxxxxx_development > tmp/development.sql

どうやら MySQL が8.0になったときに transactional data dictionary という機能?がサポートされたこと影響しているようです。

恐らく、想定されたシステムテーブルが見つからなくてエラーになっているのではないかと思います。

MySQL 8.0にアップデート!注意すべき点 – Database JUNKY

Upgrading to MySQL 8.0? Here is what you need to know… | MySQL Server Blog

引き続き根本的な原因は調べつつ分かり次第、また記事にしたいと思います!