コムセント 技術情報

  1. TOP
  2. コムセント 技術情報
  3. MySQL5.7からMySQL8.0へのシステム移行

MySQL5.7からMySQL8.0へのシステム移行

弊社では社内にある検証用のサーバーでは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に比べて高速に動作、機能の向上など非常に魅力的なアップデートになっていることもあり、そのままのアップデートする方が多いとは思うが、別サーバーに新しく立ち上げる際は、上記のような手順で既存データを移して貰えば、と思う。

おすすめ記事