K’s diary

プログラミング、ビジネスや時事ニュース、経営/人事、音楽や映画について書いていきます

MySQLの導入(Railsアプリ)とMySQLのディレクトリ構造

はじめに

以前に「clientlibrary5.0 but compile8.0」「Segmentfault[BUG]:000・・・」などのMySQL関連エラーを対処した(過去記事参照)

MYSQLのインストールのし直しをしたり、クライアントライブラリのシンボルリンクを張りなおしたり。

それに際して、MySQLについてあれこれを調べなおしたので記録したい。

今回調べたことは、MYSQLの導入方法、MySQのディレクトリ構造と各ファイルの役割などです。

実行環境

MySQLとは

MySQLとは、データベース管理システムの一種です。アプリケーションで使用するデータを保存・管理するために利用します。

<補足>

データベースとは、「複数で共有、利用できる」「検索、加工できる」ことを目的に整理されたデータの集まりのこと。

これらのデータ群を保管するためのサーバーを「データベースサーバー」と言い、MySQLはそれを管理するためのシステムです。

オープンソースなので非商用利用であれば無償で使用できます。

MySQLは「リレーショナルデータベース(RDBMS)」であり、以下のことができます。

  • SQL言語を持ちいたデータを操作(検索、追加、更新、削除)

  • データベースの、ハードウェアからの独立性


  • データベースの、アプリケーションからの独立性

  • データベースの整合性の確保(型やユニークキーなどの定義)


  • 複数ユーザで同一データを更新しても矛盾を起こさない

  • ユーザーごとにアクセス権限を制限できる

  • データのバックアップや復旧を行うシステムを提供する

  • データベースの分散化

これらの仕組みを提供するのがMySQLです。

MySQLのバージョンとサフィックスについて

MySQLのインストールファイルには、バージョン番号の他に「開発版」か「安定版」かを判断するための「サフィックス」というものがあり、ファイル名で確認できる。

例:ファイル名「mysql-5.0.12-beta」

意味:バージョン5.0.12のベータ版

説明:バージョン番号5.0.12でテスト済みだがバグを含む可能性のあるベータ版

サフィックスは以下の4通りがある。

サフィックス 内容
alpha 後継版検討用のバージョンで、新しい機能の追加があります
beta テスト済みだが、バグが含まれている可能性あり
rc リリース版、既知の致命的なバグは修正済み
なし 一定期間、バグの発生なく動作した安定版

安定版にこだわるなら「サフィックスなし」の安定版をおすすめしますが、アルファ版でも運営に支障をきたすことはほとんどありません。

MySQLの導入の手順

MySQLのインストール

Railsアプリ開発において、Homebrewを利用してMySQLをインストールする場合は、以下の手順でシンプルに実行できます。

ここでは例として「MySQL5.6」をインストールします。

$ brew update
$ brew search mysql@5.6
$ brew install mysql@5.6
$ brew info mysql

まずはbrew search mysql@5.6でHomebrewでMySQL5.6が提供されていることを確認します。brew updateも念の為。

確認ができたら、brew install mysql@5.6MySQL(バージョン5.6を指定)をインストールします。インストールの処理には少し時間がかかります。

brew infoコマンドでインストールが完了したかを確認しています。infoが表示されればオッケーです。また、表示された結果の中の==> Caveats以下に、インストール後に行うべき手順が書かれています。

==> Caveats
We've installed your MySQL database without a root password. To secure it run(rootパスワードなしなので以下を実行):
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default.To connect run(デフォはlocalhostからの接続のみです。接続するには以下を実行):
    mysql -uroot

To have launchd start mysql now and restart at login(「launche」でmysqlをログイン時再起動するなら以下を実行):
  brew services start mysql

Or, if you don't want/need a background service you can just run(もしくは、単に起動するだけなら以下を実行):
  mysql.server start

==> Analytics
install: ・・・(以下省略)

この後、いくつかの手順を踏んだ後に上記の内容も実行していきます。

パスを通す

次に、どのディレクトリからでもMySQLをコマンドで操作できるよう、以下のコマンドを実行してパスを設定します。

$ echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ which mysql
/usr/local/opt/mysql@5.6/bin/mysql  #これが出ればOK

<補足>

1〜2行目では環境変数にパスを記述し、mysqlのコマンドをどこからでも実行できるようにしています。

3行目でmysqlの実行ファイルへのパスを表示するコマンドwhich mysqlを実行し、パスが通っているかを確認しています。

MySQLバージョンの確認

ここまででMySQLのインストールと初期設定は完了しているはずなので、その確認のためにMySQLコマンドを入力してみます。

$ mysql -version

mysql  Ver 14.14 Distrib 5.6.43, for osx10.14 (x86_64) using  EditLine wrapper

上記のようにバージョンが表示されればオッケーです。

MySQL起動・接続の確認

次にMySQLに起動できるかを確認します。

$ mysql.server start

Starting MySQL
. SUCCESS! 

上記の表示がされれば起動できています。

次は接続の確認です。

$ mysql -uroot

Welcome to the MySQL
…省略…

mysql> exit   #「exit」コマンドで抜ける

$ mysql.server stop  #「MySQLサーバー停止コマンド」

上記の表示がされ入力待ち状態になれば接続できています。 mysql>プロントにexitと入力してエンターすると抜けられます。

<補足>

「-u」はユーザー名で、ここでは「root」ユーザーでログインしています。

MySQL自動起動の設定

次にMySQLを自動で起動するためのコマンドです。MySQLは、使用時に毎回起動する必要があります。しかし、PCの電源を落とすとMySQLも終了するため、P Cを起動する度に手動で起動する手間がかかります。これは面倒なので、PCを起動すると同時にMySQLも自動で起動する設定にしておくのがいいでしょう。

以下がそのコマンドです。

$ mkdir ~/Library/LaunchAgents 
$ ln -sfv /usr/local/opt/mysql\@5.6/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql\@5.6.plist

ここでは「Launchd」というツールを利用しています。「Launchd」とは、MacOSの裏側で動作するアプリケーションの起動/停止を管理するツールです。


<補足>

1行目の「mkdir(ディレクトリ作成)」で「LaunchAgents」ディレクトリを作成しています。

2行目の「ln -sfv」はリンクの作成(「sfv」は「シンボルリンクの作成」「同名ファイルの強制上書き」「経過表示」を表すオプション)です。「/usr/local/opt/mysql\@5.6/」にある「ファイル名.plist」へのリンクを「~/Library/LaunchAgents」という名前で作成しています。

3行目が自動起動の本体です。「launchctl load」コマンドで、自動で読み込むファイルを指定しています。「~/Library/LaunchAgents」は2行目で作成したシンボルリンクですね。その先にある「homebrew.mxcl.mysql\@5.6.plist」を自動で読み込む、という意味になります。

尚、「homebrew.mxcl.mysql@5.6.plist」ファイルはMySQLをhomebrewでインストールした際に作成されるファイルで、plistは「プロパティリスト」と読みます。ここにMySQLのプロパティが書き込まれており、これを読み込むことでMySQLが起動します。

サーバアクセスパーミッションの初期化

初めてMySQLをインストールした時のみ、以下のコマンドを実行します。

$ mysql_install_db

このコマンドにより、MySQLデータベース上に「user」「db」「host」「tables_priv」「columns_priv」テーブルを作成します。

MySQLでは「どのユーザーが」「どのデータベースに」などのように、データベースを操作する「権限」を設定します。これをサーバーアクセスパーミッションと言いますが、これの初期状態のテーブルを作成するコマンドです。

セキュリティの設定

brew info mysqlの表示結果にもあったように、初期設定ではrootユーザーはパスワードが設定されておらず、誰でもログインできる状態になっています。これではセキュリティ上問題があるので以下のコマンドを実行します。

$ mysql_secure_installation

以下のようにいくつかの質問がされるので『yes/no』で回答します。

Securing the MySQL server deployment.
 
Connecting to MySQL using a blank password.
 
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
 
Press y|Y for Yes, any other key for No: y 
#「VALIDATE PASSWORD plugin をインストールする?」
# yesの「y」を入力してenter
 
There are three levels of password validation policy:
 
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
 
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0 
# パスワードポリシーはローカル環境ならLOWでOK。
# 本番環境などでは必要に応じて強度の強いMEDIUM,STRONGを設定

Please set the password for root here.
 
New password: 
# パスワードを入力してenter 
# パスワードは忘れないように!!

Re-enter new password: 
# パスワードを再入力してenter
 
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y 
# パスワード登録を進めるために「y」を入力してenter

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
 
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y 
# 無名ユーザを削除するか?「y」を押してenter

Success.
 
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
 
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y 
# root のログインをローカルからに制限するか?「y」を押してenter

Success.
 
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
 
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y 
# test データベースを削除するか?「y」を押してenter

- Dropping test database...
Success.
 
- Removing privileges on test database...
Success.
 
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
 
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y 
# 権限の変更を更新するか?「y」を押してenter

Success.
 
All done!

セキュリティの設定ができたところで、ログインしてみましょう。

$ mysql  -uroot -p

<補足>

上で説明した通り「-uroot」は「root」ユーザーでログインの意です。

追加された「-p」は「パスワードを使ってログイン」という意味です。

パスワードを求められますので、上の「セキュリティの設定」で設定したパスワードを入力して下さい。

無事ログイン出来れば設定できています。exitで抜けましょう。

ここまで出来れば基本的な設定は完了です。

MySQLディレクトリ構造

MySQLを含め全てのプログラムは、それぞれが何らかの役割を持つファイルを集約したものです。ディレクトリ構造やファイルの役割を知ることは、MySQLの構造を理解することにつながります。

MySQLディレクトリ構造は、「バイナリ配布」か「ソース配布」かで若干異なります。

<補足>

「バイナリ配布」

コンパイル機械語への翻訳)済みのファイルを配布する形式。利用者は簡単にインストールして利用できるので楽だが、配布側は様々な環境で正常に動作することに責任が発生するため負担が大きい。

「ソース配布」

ソースコードを配布する形式。利用者は自らの利用環境に合わせてソースコードを書き換える自由度はある一方、自らアプリケーションに組み込む(ビルドする)必要がある。

「Homebrew」は後者の「ソース配布」を利用し、自動でビルド を行なってくれる便利ツールでした(詳細はこちら) ですので「ソース配布でのディレクトリ構造」となります。

/user/local/Cellar/mysql@5.6/5.6.43/ディレクト配下に、以下のディレクトを作成します(5.6.43はバージョンによって異なります)。

尚、「Cellar」ディレクトリは、Homebrewを通してインストールしたライブラリの本体が保管されるディレクトリです。

ディレクトリ名 説明(役割)
bin(バイナリ) クライアントプログラム(サーバとの接続/送受信など)
include/mysql インクルードファイル(プログラムコードの部品)
lib/mysql クライアントライブラリ(MySQLへの接続)
libexec MySQLサーバーへのアクセスファイル
scripts mysql_install_db(初期テーブル作成など)
share/mysql エラーメッセージファイル
sql-bench ベンチマーク(性能/パフォーマンス測定ツール)

「bin」クライアントプログラム

クライアント(操作側)PCにインストールするプログラムのことです。

MySQLのパッケージをインストールした際に、依存関係でいくつかのプログラムがインストールされます。例えば以下のようなものです。

  • mysqlmysqlコマンドを使えるよにするプログラム

  • 「mysqladmin」MySQLサーバー管理やサブコマンド(「create」「drop」など)を実行するプログラムです

  • 「mysqlslap」性能測定のプログラム

こういったサブプログラムが保管されています。

「include」インクルードファイル

インクルードファイル(ヘッダーファイル)とは、ソースコードの一部を抜き出しバラバラに分けた「プログラムの部品」のことです。

このファイルにはこれらのバラバラの部品が保存されており、コンパイル機械語への翻訳)する時に、ひとつなぎにまとめられます。

「lib」クライアントライブラリ

クライアント(操作側)PCにインストールし、MySQLサーバーへの接続許可の情報を送信し、サーバーに遠隔接続を受け入れさせる役割を持ちます。

「libexec」サーバーアクセスファイル

診断ツール「mysqlaccess」が保管されています。

「mysqlaccess」は「ホスト名」「ユーザー名」「データベース」の組み合わせに対するアクセス権限をチェックするツールです。

「scripts」mysql_install_db

MySQL データディレクトリを初期化し、システムテーブルを作成するための「mysql_install_db」の実行ファイルが保存されています。

本記事(MySQLの導入)内で、初めて導入する際には同名のコマンドを実行する旨を記載しておりますが、その際に実行されるプログラムの実態がここに書かれています。

「share」エラーメッセージファイル

MySQLのエラーメッセージファイルなどが保存されています。

sql-bench」ベンチマーク

MySQLの性能やパフォーマンスを測定するためのベンチマークツールが保存されています(測定時に呼び出すBENCHMARK関数などの実態が保存されています)

最後に

MySQLはそれだけで本になるくらい奥が深いです。ここに書いた内容は、まだまだやっと入り口の手前という感じですね。

またいずれ学んだことを、少しづつ書いていけたらと思います。

参考ページ

MySQL公式リファレンス

関連ページ

後ほど編集します