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でも設定できるようですが、今回は試しませんでした。
参考
こちらのスライドに詳しくまとめられていました😀
コメント