見出し画像

【14日目】ドットインストール:MySQLのバージョンアップに学ぶ

昨日の反省を踏まえてきちんと基礎固めをすることにしました。

すると、きちんと講義の中でDBや言語のバージョン確認とバージョンアップが含まれているではありませんか!

しかし確認したのは、MySQL、PHP、Python、Node.JS、Python、Rubyだけで、SQLiteは含まれていませんでした。
なおかつ、ほとんどのコマンドを解説無しにコピペするだけなのですが、ここで使うバージョンアップのためのコマンドは何か役に立つかもしれないので、一個ずつ調べていくことにします。

【MySQLとSQLiteの違い】

詳しいことはわかりませんが下記のサイトを参考にしました。
https://www.ossnews.jp/compare/MySQL/SQLite

SQLiteというのは、ソフトウェアへの組み込みでも使用できる軽量のラブラリ型データベースらしい。単独のアプリケーションとしても使用可能。大規模利用は非推奨

対するMySQLはマルチユーザー、マルチスレッド対応で、高性能なオープンソースデータベースプロダクトだそう。

大分真逆の製品だということはわかったが、データベースについて学ばないと、あまり仕組みも違いも詳しいことはわからない。


【MySQLのバージョンアップ】

まずはバージョンを確認しました。

mysql --version

ちなみに調べてみると、SQLiteの場合は

mysql --version

です。確かにSQLiteは3.7.17が入っています。

次に旧バージョンのMySQLを削除します

sudo yum -y remove mysql-config mysql55-server mysql55-libs mysql55

中々長いですね。分解して調べていきます。
sudoはさすがに知っています。rootとしてコマンドを実行するやつ。

yumはパッケージを管理する系のやつだということはわかります。ヘルプを見てみました。それと詳しいサイトがありました。
https://www.atmarkit.co.jp/ait/articles/1608/29/news019.html

ここでは -y オプション(全部YESで一括回答)で remove というコマンドを実行していますが、ヘルプにもサイトにもremoveというコマンドは書いていません。

調べてみると読んで字のごとく、パッケージを削除するコマンドらしい。パッケージは半角スペースで並べれば、複数削除できる。ここでは、mysql-config mysql55-server mysql55-libs mysql55という4つのパッケージを削除している模様。(自分でやろうと思うと、SQLite関連のどれを削除すればいいのかの選定ができない)

ただしyum removeには注意点が一つ。

コマンドに書いたパッケージだけでなく、パッケージに依存するパッケージも削除するようです。この辺依存性関連とかはまだよくわかりませんが、安易に -y オプションを付けると、思ってもいないパッケージを消してしまうことになりそうです。
SQLiteでこのコマンドを使うなら、気を付けたいところ。
MySQLについてはドットインストール側で問題ないことを判断してくれているのでしょう。

teratailにも恐ろし気な投稿があります。気を付けよう。
https://teratail.com/questions/13880

削除したら、次は新しいバージョンをインストール

sudo yum -y install mysql57-server mysql57

この意味は分かりやすい。でもさっきは -config とか -libs とかのファイルも削除したのに、これは追加しないんだな。特に-libsファイルが何かは調べてもよくわからず。

インストールするだけではなく、vimを使って何か設定をいじります

sudo vi /etc/my.cnf

my.cnfというのはMySQLの設定を書く場所だそう。
https://qiita.com/yoheiW@github/items/bcbcd11e89bfc7d7f3ff

ここでは下記のように書き換えました

[mysqld]
 character-set-server=utf8mb4

 [client]
 default-character-set=utf8mb4

どうやらこれは、文字コードがデフォルトではutf-8になっている部分があって、そこをutf-8mb4というものに直している様子。使える文字に違いがあったりする模様。詳しくは下記のスライドで説明を見つけました。特に8頁。
https://www.slideshare.net/tmtm/mysql-62004569
もしかしたらSQLiteのバージョンアップでは不要かもしれませんが、下記サイトを見る限り、SQLiteではそもそもutf-8mb4は扱えないのかな?
https://iwakurabit.com/training-sqlite3-check-or-set-character-code/

文字コードの違いがよくわかっていないので、いったんスルーします。

で、これでは終わりではなく、次はMySQLサーバーを立ち上げて、データベースのアップグレードをしています。

sudo mysql_upgrade -u root --force

これがよくわからなかった。MySQL自体のバージョンアップと、データベースのバージョンは違うの・・・?

公式でmysql_upgradeコマンドを調べてみると

mysql_upgrade はすべてのデータベースのすべてのテーブルに対して、MySQL サーバーの現在のバージョンとの非互換性を調べます。また、mysql_upgrade は、システムテーブルをアップグレードして、追加された可能性のある新しい権限または機能を利用できるようにします。

mysql_upgrade は、テーブルに非互換性がある可能性が見つかった場合はテーブルのチェックを実行し、問題が検出された場合はテーブルの修復を試みます。テーブルを修復できない場合は、手動でテーブルを修復する方法について、セクション2.11.4「テーブルまたはインデックスの再作成または修復」を参照してください。

mysql_upgrade は、MySQL をアップグレードするたびに実行するようにしてください。
https://dev.mysql.com/doc/refman/5.6/ja/mysql-upgrade.html

とのこと。アップグレードのたびにmysql_upgradeをして、データベースのテーブルとの互換性を調べるのは当たり前のことだったようです。
しかもデータが壊れる可能性があるので、バックアップ必須のようです。
今回はデータがないので不要ですが、バックアップの取り方はわかりません。次やるときは調べよう。
ちなみにDBは勉強していないので、テーブルが何かはまだわかりません。
しかもMySQL8からはduplicatedなのだとか。頭の片隅。
https://qiita.com/tana6/items/c925ff2648e395c004ac

ついているオプションを調べました。
-u rootは多分root userとしてコマンドを起動って意味だと思われる。
--forceはすでにmysql_upgradeされているものも強制的に実行するそう。

それでsudo service mysqld restartで再起動して、終わり。
講義では「chkconfig サービス名 on」を使って起動時自動実行を有効にしていました。

【これでSQLiteをバージョンアップできる?】

正直微妙

実行した手順は

1既存のものを削除
2最新版インストール
3文字コード修正
4MySQL起動
5データベースのアップグレード
6再起動

でした。

これに倣ってやってみるとした場合に、1のところで「依存性の判定」ができないのと、そもそも2のインストールの仕方がいまいちわかっていないことがあります。

とりあえずほかの講義も受けたうえで、Udemy講師からの回答を待ち、そのうえでもわからなければ物は試しでやってみよう。
どうせ壊れても困るデータなどないのだから!

ではまた











この記事が気に入ったらサポートをしてみませんか?