【VirtualBox】開発環境を作る – MySQL編 【CentOS】

web

こんにちは、なかだ(@newNakata)です。

前回(【VirtualBox】開発環境を作る – Apache設定編 【CentOS】)の投稿を見直してみて、やはりパッケージインストールとソースインストールを纏めて掲載すると必要な作業が簡潔にわからないと思いました。
個人的に言いたかったソースインストールのメリットは前回の「ソースインストールの最大のメリット」で書いたため、今後は投稿をわけようと思います。

本稿ではMySQL5.7をパッケージインストールしていきます。

構成

  • Virtual Box 6.1.16
  • CentOS(Linux)
  • Apache(HTTPD)
  • MySQL(MariaDB) ← 本稿はここ
  • PostgreSQL
  • PHP

MySQL(MariaDB)とは

オープンソースのリレーショナルデータベースシステムの1つです。

「ん?」って思いますよね。僕もです。
データベースとは、SQL(構造化クエリ言語)を使ってデータを容易に操作できるようにまとめて構造化したものです。
大雑把に言うと、データを管理できれる入れ物です。
リレーショナルとは、全てのデータを1つの大きな入れ物に纏めるのではなく、データを複数のテーブルと呼ばれる個別の入れ物に分割して管理する方法を言います。
なので、データベースと言う大きな入れ物にテーブルと言う小さい入れ物が沢山あって、各小さな入れ物に対してクSQL(クエリ)を発行してデータを出し入れする事ができるシステムがデータベースです。

MySQLとMariaDBについて

端的に言うと今のところほぼ一緒です。
MariaDBの方がMySQLよりも高機能高スペックで大きなデータを扱う時に適している・・・らしいです。
ただし、MySQLの歴史は長く安定感と安心感は根強いです。
以下にバージョンの表を記載します。

MySQLMariaDB
5.55.5(=10.0.)
5.610.1.
5.710.2~3
5.7.35 (現時点での最新)
8.0.26 (現時点での最新)
10.6.4(現時点での最新)


色々端折って端的に言うと、表にある様にMariaDBはMySQL5.5から派生して作られています。
このブログの構成にMySQL(MariaDB)と記載していたのもそれがあったからです。
上記で今のところ一緒と書きましたが、MySQL8とMariaDB10.3以降は互換性が無くなっていくようなことも見かけました。

以上の事から、本稿では安心安定のMySQL5.7を採用したいと思います。

準備

mariadbを削除

mysqlをインストールにあたりmariadbパッケージがあると不都合なため削除します。

rpm -qa | grep maria
yum remove -y mariadb-libs
rm -rf /var/lib/mysql/

1行目でmariadbパッケージがインストールされているか確認します。
無ければ2行目は不要です。
パッケージがインストールされている場合、2行目で削除します。
3行目はディレクトリがあっても無くても念のため実行してください。

これでmariadb関連は全て削除されました。
mariadbと依存関係にあったpostfixも一緒に削除されていますが、今後使用するデータベースはmysqlなので必要であればmysqlをインストール後に再インストールする事で元の状態(今度はmysqlライブラリーに依存しますが)に戻ります。

パッケージインストール

MySQL公式yumレポジトリ追加

※リポジトリについては【VirtualBox】開発環境を作る – Apache編 【CentOS】のパッケージインストールとはに関連情報があります。

yum コマンドで search しても mysql はヒットしません。
centos7 標準では mariadb(5.5.68) ならヒットします。
つまり、このままではパッケージインストールできないため、mysql の yum レポジトリ(公式)を追加します。

yum localinstall -y http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

以下のような感じで完了します。

/etc/yum.repos.d/ 以下にファイルが追加されています。

これで yum search mysql をサーチをかけるとヒットすると思います。
では以下のコマンドでバージョンを確認してみましょう。

yum info mysql-community-server

現時点で最新ですね。

インストールと起動設定

早速インストールします。

yum install -y mysql-community-server

以下の画像のような表示が出ると完了です。

ちなみに画像の様に完了する前にwarning(例えばuser、groupがdose not existなど)が出たら何かに躓いています。
その場合は一旦パッケージをアンインストールし、yum update でアップデートをかけた後に再度mysqlをインストールすると問題が解消することがあります。
ではパッケージがインストールされているか確認してみましょう。

rpm -qa | grep mysql

ちゃんとインストールされています。
では早速起動してみましょう。

systemctl start mysqld

このコマンド入力よるレスポンスの表示はありませんので以下のコマンドで起動確認します。

systemctl status

起動が確認できました。
パッケージインストールなので以下も追加されています。

  • /etc/my.cnf ファイル
  • /etc/group に mysql グループ
  • /etc/passwd に mysql ユーザー
  • /var/lib/mysql にDB情報などの関連ファイル
  • /var/log/mysqld.log ファイル

自動起動ですが、mysqlの場合はインストール後に登録され更に enabled になっていますので次回サーバ起動からは自動で立ち上がります。

初期設定

root ユーザーの初期パスワードを確認

インストール時に自動で設定されている root ユーザーの初期パスワードをログファイルから確認します。

cat /var/log/mysqld.log | grep password

以下の赤枠の部分(もちろん皆さん同じではありません)が root ユーザー初期パスワードになります。

後で変更するので控えておきましょう。

mysql_secure_installationコマンドの実行

mysql_secure_installationコマンドは初期設定での必要最低限でのセキュリティ設定を行ってくれるコマンドです。
もちろん、個別にコマンドを叩いてもいいですが、便利なのでこれを使います。
このコマンドで行えるのは以下の通りです。

  1. root ユーザーのパスワード変更
  2. VALIDATE PASSWORD プラグインのインストールするか?
  3. 2をyesにした場合、ポリシーに沿った root ユーザーパスワードの再設定
  4. 匿名(anonymous) ユーザーを削除するか?
  5. リモートホストから root ユーザーでログイン不可にするか?
  6. testデータベース(あれば)の削除 するか?
  7. privilege tablesをリロードして変更を反映するか?

本稿を書いている時点(2021-09-05)でパッケージインストール時に2は既にインストールされている様です。
(面倒ですね。2はインストールする予定ではありませんでした。)

最初の赤枠が控えていたroot初期パスワードの入力です。
 パスワードは8文字以上の大文字小文字混合の英字、数字、記号を入れたもので設定してください。(理由は後述します)
 既にインストールされているにもかかわらず、validate passwordのかかった状態でrootパスワードを再度設定するかと聞かれるので n にします。
③~⑦ 説明と同じなので全て y にします。

All done! と表示されれば完了です。
早速ログインしてみましょう。

mysql -uroot -pRoot.mysql2

-p 以降がこのたび僕が設定したパスワードになりますので各自で設定したパスワードを使用してください。

無事ログインする事ができました。
ちなみにログアウトする場合は exit や \q で行えます。

validate password の話

パスワードの設定、面倒じゃなかったですか?
本番運用サーバなら当然でも、個人開発環境で覚えれないパスワードほど無駄なものはありません。
ここではvalidate passwordの解説を行い、次の項目に繋げます。

mysql ログイン状態で次のコマンドを実行します。

SHOW VARIABLES LIKE 'validate_password%';

これが今のパスワード設定ルールになります。
validate_password_length が 8 でこれが8文字以上という設定です。
次に validate_password_policy が MEDIUM になっており、以下の通りです。

ポリシー説明
0 または LOW文字数(今回の場合8文字以上)
1 または MEDIUM文字数、数字、英字(小文字)、英字(大文字)、記号
2 または STRONG文字数、数字、英字(小文字)、英字(大文字)、記号
および、辞書ファイルの単語と一致する文字列を含まない

この設定が生きている限り、パスワード設定は複雑になります。
ポリシー設定自体を変更する事はもちろん可能ですが、次項の設定で一旦無効にしたいと思います。

mysql設定ファイル(my.cnf)の設定

vi で /etc/my.cnf ファイルを編集します。

vi /etc/my.cnf

↓追加

character-set-server = utf8
default_password_lifetime = 0
validate-password=off

正確に言うと [mysqld] の範囲内なのですが、この度は初回なので一番下に追記して大丈夫です。

character-set-server
データベースで利用する文字コードに UTF-8 を指定。
default_password_lifetime
mysql5.7 からユーザーのパスワードの有効期限がデフォルトで360日となっており、定期的にパスワードの変更を促されます。
期限を超過するとログインできなくなるため、無効(0)にします。
パスワードを定期的に変更するしないは運用ポリシーによるため一概には言えませんが、運用ミスなどで期限を超過した場合、最悪はサービスが止まる事も考えられます。
validate-password
これが前項で説明したパスワードチェックの無効(off)化設定になります。
これを記載するだけで無効化されるため、わざわざmysqlのパラメーターを変更する必要はありません。

最後に mysql を再起動します。

systemctl restart mysqld

これで初期設定は完了です。

追加設定

root ユーザーのパスワード変更

2度目ですが、覚えられないパスワードは作業効率を落とす為、変更します。
ログインして set コマンドでも変更できますが、この度は mysqladmin コマンドで行います。

mysqladmin -uroot -pRoot.mysql2 password root.mysql

ログインした時と同じコマンドの後ろに password 新しいパスワード(今回の場合であればroot.mysql)を設定して実行します。
warning が出ますが、validate password はオフにしていますので、そのまま設定が完了します。

この様な感じで、新しいパスワードでログインができました。

接続ユーザー作成

root でもいいのですが、リモートホストからの接続などを不可にしたため新しくユーザーを作ります。
個人開発環境ですので、全ての権限を持っているユーザーを作成したいと思います。
ログインした状態で以下のコマンドを流します。

GRANT ALL ON *.* TO mysql@"localhost" IDENTIFIED BY "mysql";

mysql と言うユーザーが localhost からの接続に対して mysql と言うパスワードでログインできる全権所有のユーザーが作成されました。
「localhost からの接続」と言う事ですので、サーバ内からの接続=phpなどのサーバサイドスクリプトからの接続に対しての設定になります。

root ログインから一旦 exit で抜け、今作成したユーザーでログインする事ができました。

次に、先ほど作成した mysql ユーザーを localhost だけではなく外部(ここでは主にクライアントツール)からも接続できる様にしたいと思います。
クライアントツールは色々ありますが、僕は  A5:SQL Mk-2 が一番だと思っていて、本稿で紹介したいですがまた脱線してしまうのでこの度は割愛します。

この vm の IP アドレスは 192.168.56.102 ですので、192.168.56.~の IP であれば接続できるようにします。
(IP については 【VirtualBox】開発環境を作る – OS編 【CentOS】5 Virtual Boxの設定 に関連記事があります。)

もし、上記 mysql ユーザーでログインしているのであれば root ユーザーでログインし直し、下記を実行してください。

GRANT ALL ON *.* TO mysql@"192.168.56.%" IDENTIFIED BY "mysql";

これで 192.168.56~ のアクセスであれば mysql に接続できる様になりました。

サンプルDB作成

テストDBを作成し、簡単なテーブルを追加、データを投入してみます。
先ほど追加した mysql ユーザーでログインして以下を実行します。

create database test;

use test;

CREATE TABLE sample (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  contents varchar(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

INSERT INTO sample (id, contents) VALUES
(1, 'hello world!'),
(2, 'mysqlのデータが見えているでしょうか?');

create database コマンドで test データベースを作成しています。
use コマンドで test データベースに入りました。
create table コマンドで sample テーブルを作成し、SQL の insert 文で先ほど追加したテーブルにデータを投入しています。

最後に SQL の select 文で追加したデータを表示しています。

まとめ

本稿はここまでとなります。
パッケージインストールのみの投稿ですが、周辺情報を交えてもそこまで難しくない内容になっていると思って頂ければ嬉しいです。
ソースインストールはまた別の機会に投稿できればと思います。

次回は同じデータベースですがPostgreSQLについて記載して行きたいと思います。