SionGames 技術Blog

C#やUnityを触っているサーバープログラマーが色々と書いていく所

CentOS7にMySQL5.7をインストールする手順

データベースを初めて触ってみるという方にも分かりやすいように、CentOS7にMySQLをインストールする手順を案内したいと思います。
CentOS7の環境がまだ無い方はVMWareとCentOS7をインストールする手順に従って環境構築をお願いします。

blog.siongames.net

まずはMariaDBの削除


CentOS7には最初からMariaDBというMySQLから別に派生したDBが入っています。
MariaDBが入っているとMySQLのインストール時に競合を起こしてしまい、うまくインストールできません。
試しにMariaDBが入っているか確認して下さい。

ちなみに自分は検証用途なのでrootユーザーで操作しています。
一般ユーザーアカウントから操作する際はsudoコマンドを利用して下さい。

$ rpm -qa | grep maria
mariadb-5.5.60-1.el7_5.x86_64
mariadb-server-5.5.60-1.el7_5.x86_64
mariadb-libs-5.5.60-1.el7_5.x86_64
$ mysql --version
mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1

このような具合でMariaDBがインストールされているのが分かります。
では早速削除していきましょう。

$ yum -y remove mariadb-libs
色々出ますが省略
$ rm -rf /var/lib/mysql

/var/lib/mysql の削除はmariaDBの環境設定が残らないように念のため行っています。
CentOS7を立ち上げて間もない状態ではフォルダ自体存在しないかもしれません。

ひとまずこれで削除は完了したと思います。
MariaDBが正しく削除されたか確認だけ行います。

$ rpm -qa | grep maria
$ mysql --version
-bash: mysql: コマンドが見つかりません

問題なさそうですね。

MySQLのインストール


準備が整ったところでyumの中にMySQL5.7のインストールを行います。
公式のmysql8.0の入ったrpmをインストールしますが、このrpmの中にMySQL5.7も含まれています。

$ yum -y localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

※ CentOS6の場合は mysql80-community-release-el6-3.noarch.rpm にすると良いみたいです。

yum-config-managerコマンドでMySQL8.0を無効化するためにyum-utilsをインストールします。

$ yum -y install yum-utils

yum-utilsが入ったので、先ほどインストールしたrpmのMySQL8.0無効化とMySQL5.7有効化を行います。

$ yum-config-manager --disable mysql80-community
$ yum-config-manager --enable mysql57-community

yumのキャッシュをクリアして準備完了です

$ yum clean all

準備が整ったのでMySQLをyumからインストールします。

$ yum -y install mysql-community-server

これでひとまずMySQL5.7のインストールは終了です!

利用前の初期設定


とはいえ初期状態では設定がいまいち使いにくい状態なので、使い始める前に少々初期設定を行うのが良いです。
/etc/my.cnf にMySQLの設定ファイルがあるので、viコマンドで編集していきます。

$ vi /etc/my.cnf

viエディタを起動後は [mysqld] 以下に追記していきます。

念のためviエディタの基本操作も載せておくと、
「i」で入力モード
「Esc」で入力モードからコマンドモードへ脱出
コマンドモードで :wq 入力後に「Enter」で保存後に閉じる操作が出来ます。

[mysqld]
色々とデフォルトの設定があります。ここでは省略
character_set_server=utf8mb4
collation-server=utf8mb4_bin
default_password_lifetime=0

[client]
default-character-set=utf8mb4

設定内容を箇条書きすると下記のような具合になります。

  • デフォルト文字コードをutf8mb4に変更
  • デフォルト照合順序をutf8mb4_binに変更
  • パスワードの有効期限を360日から無期限に変更

DBテーブルの文字列カラムで日本語を扱う事があるなら、utf8mb4をデフォルト文字コードに設定しておくとミスが無くて良いです。
特殊な漢字や絵文字など4バイトでないと表せない文字があるのですが、MySQLのutf8指定だと4バイト文字が扱えないので文字化けを起こします。

照合順序設定ですが、これは文字列の比較で使用される物で「A」と「a」など文字の揺らぎを吸収するかどうかの設定になります。
色々と種類がありますが、utf8mb4_binは文字の揺らぎを全て区別する設定です。
例えば先ほどの「A」と「a」は区別されるようになります。

my.cnfの修正が終わったらMySQLが自動起動するように設定しておきます。

$ systemctl enable mysqld.service

これでCentOSを再起動させてもMySQLが自動で立ち上がるようになります。

初回起動


まずは下記コマンドで起動させます。
startの部分をstopやrestartにすると停止・再起動できます。

$ systemctl start mysqld.service

初回起動時はMySQLのrootユーザーに仮の初期パスワードが設定されています。
各環境で異なるので下記コマンドでパスワードを探します。

$ cat /var/log/mysqld.log | grep "temporary password"

出力の中から下記の様な物があると思うので、パスワード部分をメモしておきます。

temporary password is generated for root@localhost: (初期パスワードをメモ)

パスワードをメモしたらmysqlにrootでログインしてみます。

$ mysql -u root -p
Enter password:

rootユーザーが仮のパスワードのままなので別の物に設定します。
今回自分は検証用途で大事なデータを入れる予定も無いので適当に設定します。
パスワードも'root'にするのであれば下記の様に打ち込みます。(本番環境では絶対しちゃダメ)

mysql> SET GLOBAL validate_password_length=4;
mysql> SET GLOBAL validate_password_policy=LOW;
mysql> set password for root@localhost=password('root');

そして外部からアクセスできるrootユーザーを今回作ります。
CentOS外からアクセスする予定が無ければ設定する必要はありません。

mysql> grant all privileges on *.* to root@"%" identified by 'root' with grant option;

説明しておくと、identified by の後に続く'root'がパスワード部分で、with grant option は管理者権限を付与する設定です。
つまり外部アクセスに対してrootユーザーに対してパスワードrootで管理者権限付きのログインが出来るというわけですね。
甘々セキュリティ。

これでmysql側の設定は終了です。
外部アクセス用rootユーザーが作れたのか確認だけしておきましょう。

mysql> select user, host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+

ついでにエンコーディング設定も確認します。

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

良い感じですね。
問題ないようであればMySQLからログアウトした後、念のためMySQLの再起動を行います。

mysql> exit;
Bye
$ systemctl restart mysqld.service

CentOS7のファイアーウォールにmysqlの外部アクセスを許可する


先ほど外部アクセス用のrootユーザーをmysqlで作成しましたが、デフォルトのままだとCentOS7のファイアーウォールで外部アクセス出来ないように遮断されています。
なのでmysqlに外部アクセスを許可するように設定を修正します。 外部アクセスさせる予定が無ければこちらも設定不要です。

$ firewall-cmd --add-service=mysql --zone=public --permanent
success

許可されたか確認します

$ firewall-cmd --list-services --zone=public --permanent

mysqlが表示されたら大丈夫です。
正しく設定されているようであれば、ファイアーウォールを再読み込みさせます。

$ firewall-cmd --reload
success

後書き


長かったですがこれで一旦終了です!お疲れ様でした。
自前のDBを手に入れてようやくサーバープログラマっぽい事が色々とできるようになりました。
ローカルの仮想環境なら失敗してもへっちゃらなので、DBの勉強には最適です。
DBの基本の使い方もそのうち記事にしようかと思います。