スマートスタイル TECH BLOG

MySQL 5.7 における sys スキーマの破損について

はじめに

MySQL 5.7 で追加された sys スキーマを使おうとしたところ、以下のようなエラーが出力されて参照できませんでした。

この原因について調査した結果を以下にまとめます。

環境

  • OS:CentOS 6.9
  • DBMS:MySQL 5.7.24
    ※データは別サーバーから取得した mysqldump を使用してリストアしています。

調査内容

まずは ERROR の内容について確認します。

どうやら DDL に不正な情報が混じっているようなので、対象のビューの再作成を試みます。

sys.format_time() が存在しないことが原因で失敗しているようです。そのため、sys スキーマ内のストアドファンクションの情報を確認します。

ストアドファンクションのみならず、ストアドプロシージャも存在していませんでした。これがエラーの直接的な原因であると考えられます。

原因と対策

上記の内容をもとにバグ情報を確認したところ、Bug #83259:All routines in the sys schema are deleted by restoringに該当していることがわかりました。

mysqldump --all-databases で取得したデータを MySQL 5.7 にリストアするとこのバグに該当します。ソースコード上は以下の内容が実行されており、 –all-databases オプション(opt_alldbs)が有効である場合、mysql.proc テーブル内に保持されている sys スキーマの ストアドプロシージャやストアドファンクションが取得されなくなるようです。

公式の mysqldump マニュアルには以下の記載がありますが、既に存在している sys スキーマの情報が上書きされることまでは示されていないので、注意する必要があります。
引用:4.5.4 mysqldump — A Database Backup Program

mysqldump does not dump the INFORMATION_SCHEMA, performance_schema, or sys schema by default. To dump any of these, name them explicitly on the command line. You can also name them with the –databases option.

この問題の回避方法については、以下の 2 つの方法があります。

  • mysql_upgrade を実行する。
  • sys スキーマの定義のみを別サーバーから取得してリストアする。

今回は mysql_upgrade によるテーブルロックが許容できなかったため、検証環境で初期インストールした MySQL 5.7 から sys スキーマの定義を mysqldump で取得して、リストアする方法を取りました。

リストアすることで、正常に参照できるようになりました。

まとめと余談

  • データを移行した後には mysql_upgrade を実行して、問題がないか確認するようにしてください。
  • MySQL 8.0 ではバグの原因となる mysql.proc テーブルが存在しないため、この問題は発生しなくなります。
  • 以下のビューは sys スキーマ内のストアドファンクションやストアドプロシージャを使用していないので、問題なく参照することができます。
metrics ps_check_lost_instrumentation
schema_auto_increment_columns schema_redundant_indexes
schema_unused_indexes session_ssl_status
sys_config version

MySQL

 

Return Top