MacBookの環境　mysql5.6からmysql8.0に更新

## やったこと

どこかで、rails6　色々変わりすぎてヤバイ！笑
っていう話を耳にして、そういえば開発環境に関してはスクールから言われるままに特定のバージョンを入れただけだな〜と思い確認すると案の定、古い安定バージョンを入れていた。自分は金がかからない限りは無駄に冒険してしまうところがあるので、Rails、Ruby、Mysqlをバージョンアップさせようと思いついてしまった。

ちなみにちなみに、自分は少数派のキチンとバックアップタイプですが、timemachineで外付けHDDにバックアップがある為、いつでも戻れる！という安心感の中でやりました。

## 新旧バージョン

|app|旧|新|
|---|---|---|
|Ruby|2.5.1|2.6.5|
|Rails|5.2.3|6.0.2.1|
|Mysql|5.6|8.0|

※Rubyに関しては、最新2.7.0にしてしまうと、対応しているgemが少なくなってしまう為開発に甚大なダメージが・・・ということで、その前のバージョンで我慢しておく事にした。

## RubyとRails

Homebrewをアップデートして、

1. 最新バージョンをダウンロードしてきて、
1. 最新バージョンをインストールして、
1. 最新バージョンをデフォルト指定した。

Railsは旧バージョンをアンインストールしたかもしれない。Rubyはインストールしたバージョンを残しておけるみたい(brew??)。

実行したコマンドは忘れた。けど大して苦労はしてないハズ。

Rubyだけ、最新2.7.0にした時に既存アプリをrails startした時にエラーがいっぱい出てきて、それらのエラーはgemが未対応な事によるエラーだよ、っていう記事を見つけて考え直して2.6.5を入れたぐらい。

## 時刻設定

色々やって手順が前後する(Mysqlの設定にも関わる)が、まずRailsからMysql使ってた時に自動保存される時刻情報が無茶ずれてる(UTC時刻になってる)事が気に入らなかった。これに関してはRailsアプリを使っている時にRailsのプログラム内で日本時間に直すようなことをやっていたが、結局のところMysql自体にはUTC時間のまま保存されていたので、それを分かりやすく日本時間にしたかった。

デスクトップから右上に見える時刻表示(正常に日本時間表示)を気にしながら、コマンドラインでDateコマンドを打ってみると、なぜかUTC時刻になっていた。ひょっとしたらMacBookPro2017のデフォルトではJSTになっていたのかもしれないが、色々触りまくったので定かではない・・・

ということで、まずはシステム時間の修正から

### システム時間(OS)

色々と調べた結果、システム時間の設定は /etc/localtime のバイナリファイルらしい。
更に、日本時間他各国のtimezone設定は /usr/share/zoneinfo/ にバイナリファイルがあり、日本時間の設定は /usr/share/zoneinfo/Japan のバイナリファイルらしい。

色々調べてたら、 /usr/share/zoneinfo/Asia/Tokyo っていう情報がいっぱい出てきたので必死にAsiaフォルダの中を探してたヨ。

```console
$ sudo ln -s /usr/share/zoneinfo/Japan /etc/localtime
でdateコマンドがJSTで表示されるようになる。
※一般的にこういう操作する時は、 /etc/localtimeのバイナリファイルをバックアップとっておくらしい。自分はtimemachineでシステムバックアップとってるので気にしなかった。 
```

んで、あ〜安心と油断してたらデスクトップ右上の時間がこれまたメチャずれてた。なんでやねん、と思いながら "日付と時刻"環境設定を開く　から時刻修正。

日付と時刻は、「日付と時刻を自動的に設定」にチェックを入れて、appleアジア(time.asia.apple.com)を選択。
時間帯は、「現在の位置情報に基づいて、時間帯を自動的に設定」のチェックを外してエリア選択で「日本」を設定した。

これで直ればいいが、すぐに時刻が設定されなかったので、なんとなくMACを再起動。
なんとか、デスクトップ右上の時刻も正常になった。

## Mysql

時刻設定した後に、mysqlの時刻設定を見てみたらキチンと日本時間が適用されていた。

```sql
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.02 sec)
```

Mysqlはバージョン共存する方法もあるらしいが、自分は旧の方はアンインストールした。

順に
旧をバックアップ、
旧をアンインストール、
(一応)再起動、
新をインストール、
my.cnf設定、
バックアップをリストア

### バックアップ(エクスポート)

※後述するが、Mysql8.0に移行させる為にこの時のバックアップファイル(.sql)を編集するので、mysqldumpコマンドのオプションでなんとかできるならば、その方が楽。

```console
$ mysqldump --single-transaction -u root -p -x --all-databases > 出力ファイル名
```

でいけるハズだけど、一時期うまく実行できなかった。
どういうコマンドで見たのか覚えていないが、データベースのプロパティをみる方法があり、--all-databases　がFALSEになっていた。原因はよくわからないが、どこかの時点から --all-databasesができるようになっていた。よく分からん。

とりあえず、コマンド実行後に何も表示されないので、***ちゃんと中身にクエリが入っているかは見ておいた方がいい***

### 旧をアンインストール

単純な話、 brew uninstall mysql@5.6 を実行すればいいがゴミが残ってしまった事で何度もインストールを繰り返したので、きちっときれいにした方がいい。

```console
$ brew uninstall mysql@5.6
```

[どうしよう！困った時のMac上のMySQLのアンインストール＆再インストール、動作確認手順](https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596)

これの「Community Editionを削除する」「brew で入れたものを削除する」は何度やったか分からんぐらいやった。内容的に、「Community Editionを削除する」はやらんでいいかもしれんが、一応。

更にまた一応、Macを再起動。

### インストール

```console
// homebrewをアップデート
$ brew update
// インストールできるmysqlのバージョン確認
$ brew infomysql
// インストール
$ brew install mysql
```

### my.cnf設定

ファイルの場所は覚えられないのに、my.cnfの候補ディレクトリを探すコマンドだけ覚えた

```console
$ mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 
```

この内、自分は /usr/local/etc/my.cnfを使った。なぜなら4か所の内、そこにだけデフォルトでファイルがあったから。

```/usr/local/etc/my.cnf
# Default Homebrew MySQL server config
[mysqld]
# Only allow connections from localhost
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
character-set-server=utf8
default_authentication_plugin=mysql_native_password
skip-slave-start
log_timestamps=SYSTEM
```

mysqlx-bind-address = 127.0.0.1
まではデフォルトで入力されてるので触らないようにする。

***character-set-server=utf8***
mysqlで日本語入力を可能にする

***default_authentication_plugin=mysql_native_password***
Mysql8.0からユーザー認証方法のデフォルトがcaching_sha2_passwordになってるらしい。これをやっておかないと多分うまくインポートできないし、Railsなんかに影響出そう。

***skip-slave-start***
なんかMysqlのログにエラー表示されてたので入れたが、結局ログにはエラーが残り続けてるのでよく分からない。入れなくてもいいかもしれない。Mysqlのバックアップをとる設定らしい。それを無視する。

***log_timestamps=SYSTEM***
Mysqlに保存されるログの時刻がこれまたUTCになっていたので日本時間にする為の設定。ちなみにログファイルは、/usr/local/var/mysql/マシン名.local.err にある。

### インポートの前にユーザーの認証方式を変更

[MySQL8系のDB接続エラーを解決する](https://kimurin.hatenablog.com/entry/2019/10/19/231116)

ここを参考に、pluginの部分を全部mysql_native_passwordに。
***ひょっとするとrootだけでいいかもしれない。***

変え終わった後に他のコマンドを打とうとすると、確か警告が出てきてた。パスワードを設定しなさい、という。一旦適当なパスワードを設定して他のコマンドを実行できることを確認した上で、またパスワード無しを設定したが、いきなりパスワード無しでもいいかもしれない。

[MySQL8でユーザーのパスワードの変更 / リセット方法](http://www-creators.com/archives/5574)

```sql
mysql> ALTER USER 'root'@'localhost' identified BY 'hoge';
mysql> ALTER USER 'root'@'localhost' identified BY '';
```

### インポートの前にファイル修正

エクスポートの段階でとったバックアップファイルを三段階で修正（部分削除）した。
vi操作を調べとかないと厳しい。特に行削除操作。

[viの基本操作](http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/command/vi.html)

####innodbに関する部分を削除

どこを見たのだったか忘れてしまった。。。これかな？
[AWS Auroraでダンプしたデータをmysqlにインポートしようとしたらはまった](https://qiita.com/maromaro0013/items/6544bfbbc817a8178fd8)

```console
$ vi 保存したログファイル名.sql
```

削除した部分は、
-- Table structure for table `` `innodb_index_stats` ``
-- Dumping data for table `` `innodb_index_stats` ``
-- Table structure for table `` `innodb_table_stats` ``
-- Dumping data for table `` `innodb_table_stats` ``
の部分。

####columns_privに関する部分を削除

これがさっきのページの情報だったか・・・
[AWS Auroraでダンプしたデータをmysqlにインポートしようとしたらはまった](https://qiita.com/maromaro0013/items/6544bfbbc817a8178fd8)

削除した部分は
-- Table structure for table `` `columns_priv` ``
-- Dumping data for table `` `columns_priv` ``
の部分。

####mysqlデータベースのuserテーブルに関する部分を削除

これのヒントは、ユーザー認証の部分を説明してくれてたページ。

[MySQL8系のDB接続エラーを解決する](https://kimurin.hatenablog.com/entry/2019/10/19/231116)

削除した部分は
-- Table structure for table `` `user` ``
-- Dumping data for table `` `user` ``

バックアップデータの修正は以上。

```
:w 一応別名で保存.sql
:q!
```

####バックアップをインポート

さっき保存したファイルを読み込み

```console
$ mysql -uroot < 一応別名で保存.sql
```

これで、最新バージョンが使えるハズだけど、railsアプリを起動して問題なくMysqlが動くか確認しておくと安心。

###Sequel Proが・・・

どういうわけか、Mysql8.0ではSequel Proが使えなくなるのでテストビルド版をインストールしないといけない・・・

[MySQL8.0.x に Sequel Pro で接続する](https://qiita.com/ucan-lab/items/b68db1db931c954da921)