MySQL5.7からMySQL8.0へのシステム移行
この記事は2022/09/30に作成されました。
弊社では社内にある検証用のサーバーではMySQL5.7を利用して多数のデータベースを運用している。新規にサーバーを立ち上げるべく、MySQL5.7にあるデータをMySQL8環境でも利用できるようにデータを移そうとしたところ、いろいろと問題が生じたので、メモ。
良くあるパターンでは、既に動いているMySQL5.7環境をそのままMySQL8にアップグレードするもので、これはいろいろな人が挑戦し情報も出そろっているので、ここでは触れない。
ここで触れるのは、既にあるMySQL5.7からデータを抜き出して、別サーバーにあるMySQL8にデータを入れるという方法である。まず、MySQL8を新しいサーバーにインストールする。今回は、Almalinux9上にmysql-community-server8.0.30をインストール。付随するcommunity-common,community-client,community-libs,community-icu-data-filsなどをインストールしておく。
一度起動させて、mysql_secure_installationを利用して初期設定を終わらせておく。ここまでは通常通りのMySQLインストールプロセス。あとは、my.cnfで設定。今回は以下のような設定をした。(パフォーマンスチューニング部分は割愛)
[mysqld] validate_password.policy=LOW default_authentication_plugin=mysql_native_password character_set_server = utf8mb4 # 文字コード collation_server = utf8mb4_ja_0900_as_cs # 照合順序 # timezone default-time-zone = SYSTEM log_timestamps = SYSTEM # Error Log log-error = /var/log/mysql/mysql-error.log # Slow Query Log slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 1.0 log_queries_not_using_indexes = 0 # General Log general_log = 1 general_log_file = /var/log/mysql/mysql-query.log
これで一度MySQLサーバーを再起動させておく。古いMySQL5.7からデータをエクスポートしてきて、インポートすれば良いので、MySQL5.7でmysqldumpコマンドで全データをエクスポート。エクスポートしたデータをMySQL8環境にインポート、、といきたいのだが、MySQL5.7のときはinformation_schemaなどのMySQL自体が利用するデータベースがMyISAMだったが、MySQL8のときはInnoDBになっているため、そのままインポートするとMySQL8が破壊される。修復する方法もあるっぽいが、どれをやっても上手くいかないので、インポートしないに限る。
mysqldumpするときにエクスポートするデータベースを選択することができるので、少ないデータベースであればMySQLのシステムデータベースを外してエクスポートすれば、そのままインポートして動かすことは可能。ただ、データベースが多い場合は非常に面倒になるため、一度全部エクスポートして、エクスポートしたSQLファイルから、
performance_schema
mysql
information_schema
の3種類のデータベースおよびそのデータのみ削除した上で、インポートすればOK。
通常はこれだけで移行が完了する。まれにインポート後にデータベースの読み込みに失敗するので、その場合は、
$ sudo mysqld --upgrade=FORCE
でデータベースをアップデートすると解決する。ちなみに、mysql_upgradeコマンドは廃止されているので、上記を利用する。
MySQL8はMySQL5.7に比べて高速に動作、機能の向上など非常に魅力的なアップデートになっていることもあり、そのままのアップデートする方が多いとは思うが、別サーバーに新しく立ち上げる際は、上記のような手順で既存データを移して貰えば、と思う。
CTO/sekiguchi