mysql5.6から5.7へのアップグレード方法

MySQLmysql

mysql5.6から5.7へのアップグレード方法

某システムをmysql5.6から5.7にアップグレードしました。
本記事にはmysql5.6から5.7へのアップグレード方法とアプリケーションでエラーが出た箇所について記載しています。

アップグレード前にデータをエクスポート

アップグレード前にmysqlからデータをエクスポートしました。

mysql workbenchからエクスポートする場合は
server > data export > データベースを選択 でエクスポートします。

mysql5.7にアップグレードする

yum-utilsをインストール

yum-config-managerを使うためにインストールします。

sudo yum -y install yum-utils

mysqlのサービス停止

アップグレードする前にサービスを停止します。

sudo service mysqld stop

既存のmysqlを削除

既存のmysqlを削除します。

sudo yum -y remove mysql*

リポジトリを追加

リポジトリを追加します。

sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

yum-config-managerを使ってmysql5.7を有効化する

mysql 5.6を下記のコマンドで無効化します。

sudo yum-config-manager --disable mysql56-community

mysql 5.7を下記のコマンドで有効化します。

sudo yum-config-manager --enable mysql57-community-dmr

mysql5.7をインストール

mysql 5.7を下記のコマンドでインストールします。

sudo yum -y install mysql mysql-devel mysql-server mysql-utilities

mysql_upgradeコマンドにてアップグレードします。

mysql_upgradeコマンドを使用して、アップグレードします。
mysql5.6のテーブル構造から全てのテーブルに対して、mysql5.7の形式に合うようにアップグレードしてくれるようです。
詳細については公式ドキュメントはこちらを確認してください。

sudo mysql_upgrade -u root -p

バージョンを確認する

mysqlを起動後にmysqlのバージョン確認します。

起動します。

sudo service mysqld start

ログインします。

mysql -u root -p

5.7になっているか確認します。

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.32    |
+-----------+
1 row in set (0.00 sec)

OK!👌

sql_modeの違いでエラーが発生する

システムでdate型に0000-00-00をインストールしている箇所がありましたが、エラーになり動きませんでした。
エラーの内容は下記です。

ERROR 1292 (22007): Incorrect date value: ‘0000-00-00’ for column ‘xxxxx’

原因

このエラーはdate型のカラムに入れる値が正しくないということで発生していました。
mysql5.6では発生していませんでしたが、mysql5.7になってsql_modeが変わったことによってエラーになっていました。

mysql5.6のデフォルトsql_modeは下記です。
NO_ENGINE_SUBSTITUTION

mysql5.7のデフォルトsql_modeは下記です。
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

追加されたNO_ZERO_DATEに引っかかってエラーが出ていたようでした。

こちらの公式ドキュメントをみると下記のように記載があります。

NO_ZERO_DATE モードは、サーバーが ‘0000-00-00’ を有効な日付として許可するかどうかに影響します。

解決策

解決策としては、2つあると思います。

  • 0000-00-00でインサートしている箇所を調べて、適切な形式に戻す
  • mysql5.6と同じsql_modeを設定する

今回はmysql5.6と同じように設定するようにしました。

sql_modeをmysql5.6と同じようにするには下記のSQLで設定可能です。

sql_modeの設定をする。

SET GLOBAL sql_mode = ‘NO_ENGINE_SUBSTITUTION’; 

現在のsql_modeを確認する。

SELECT @@GLOBAL.sql_mode;

my.cnfでも設定できるようですが、今回は試しませんでした。

参考

こちらのスライドに詳しくまとめられていました😀

コメント

タイトルとURLをコピーしました