MacにMySQL5.7をインストール。開発用my.cnfも公開

2015年12月15日

MySQL

Homebrew の MySQL が 5.7 になったので 5.6 からアップグレードしてみました。インストール時に実行したコマンドと、5.7 対応した my.cnf を公開します。

動作確認環境

  • MacBook Pro 2015 13 インチ
  • Mac OS X El Capitan

目次

  1. MySQL をインストール
  2. MySQL を起動する
  3. mysql_secure_installation コマンドを実行する
  4. my.cnf サンプル
  5. エラーログを確認しよう
  6. インストール後、MySQL を運用していく上で知っておくと良いコマンド

MySQL をインストール

Homebrew を最新版に更新

brew update コマンドで Homebrew を最新版に更新しておきます。

$ brew update

インストールされる MySQL のバージョンを確認

brew info コマンドでインストールされる MySQL のバージョンを確認します。

$ brew info mysql

mysql: stable 5.7.9 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/5.7/en/
Conflicts with: mariadb, mysql-cluster, mysql-connector-c, percona-server
/usr/local/Cellar/mysql/5.7.9 (12629 files, 464M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/mysql.rb
...
...

インストールオプションを確認する

brew options コマンドでインストールオプションを確認します。必要なオプションがあれば、この後インストール時に指定します。

$ brew options mysql

--universal
    Build a universal binary
--with-archive-storage-engine
    Compile with the ARCHIVE storage engine enabled
--with-blackhole-storage-engine
    Compile with the BLACKHOLE storage engine enabled
...
...

MySQL をインストールする

brew install コマンドで MySQL をインストールします。オプションが必要な場合はこの時入力します。

$ brew install mysql

インストール後に表示されるメッセージを確認する

インストール後に表示されるメッセージです。この後順番に対応します。

$ brew install mysql

We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation
To connect run:
    mysql -uroot
To have launchd start mysql at login:
  ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
  mysql.server start
==> Summary
  /usr/local/Cellar/mysql/5.7.9: 12629 files, 464M

MySQL を起動する

MySQL を起動します。

$ mysql.server start

mysql_secure_installation コマンドを実行する

mysql_secure_installation コマンドを実行してセキュリティを高めます。

$ mysql_secure_installation

途中の質問は以下のように回答しました。

Enter password for user root:
password

Would you like to setup VALIDATE PASSWORD plugin?
y

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
1

Change the password for root
n

Remove anonymous users?
y

Disallow root login remotely?
y

Remove test database and access to it?
y

Reload privilege tables now?
y

この回答で以下のように設定されます。

  1. VALIDATE PASSWORD plugin をインストール
  2. root のパスワードを 8 文字以上に変更
  3. 無名ユーザを削除
  4. root のログインをローカルからに制限
  5. test データベースを削除
  6. 権限の変更を更新

mysql_secure_installation の裏で general log を取ってみたらこんなクエリが流れてました。ansible などで自動化できそうですね。

Connect  root@localhost on  using Socket
Connect  Access denied for user 'root'@'localhost' (using password: NO)
Connect  root@localhost on  using Socket
Query    SELECT NAME FROM mysql.plugin WHERE NAME = 'validate_password'
Query    INSTALL PLUGIN validate_password SONAME 'validate_password.so'
Query    SET GLOBAL validate_password_policy = 'LOW'
Query    SELECT validate_password_strength('your root password')
Query    SELECT USER, HOST FROM mysql.user WHERE USER=''
Query    DROP DATABASE IF EXISTS test
Query    DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'
Query    FLUSH PRIVILEGES

my.cnf サンプル

恒例の my.cnf 公開。/usr/local/etc/my.cnf に置いています。この設定で MySQL のメモリ使用量は 150 〜 250 MB 付近で安定しています。

  • マシンは MacBook Pro 2015 CPU 2 コア
  • ローカル開発用なので接続は私一人
  • InnoDB メイン
  • データ量は少ない
  • MySQL へのメモリ割り当ては 500 MB くらいに抑えたい
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
show-warnings
#safe-updates
prompt = '[\d] mysql> '
[mysqld]
# basic
datadir = /usr/local/var/mysql
tmpdir = /tmp
port = 3306
socket = /tmp/mysql.sock
character-set-server = utf8
default-storage-engine = InnoDB
explicit_defaults_for_timestamp = 1
default_password_lifetime = 0
lower-case-table-names = 2
#secure-file-priv = /tmp
#sql_mode=NO_ENGINE_SUBSTITUTION
# max connections
max_connections = 64
# table_open_cache = (max_connections * tables used in one transaction) + alpha
table_open_cache = 800
# table_definition_cache = (all tables in mysql + max_connections) + alpha
table_definition_cache = 400
# open_files_limit = table_open_cache * 1.4
open_files_limit = 1120
# global buffer
key_buffer_size = 16M
query_cache_type = 0
# innodb_buffer_pool_size = RAM for Mysql * 0.7
innodb_buffer_pool_size = 256M
# thread buffer
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 256K
sort_buffer_size = 512K
# InnoDB
innodb_file_per_table
innodb_autoextend_increment = 64
innodb_log_files_in_group = 2
innodb_log_file_size = 64M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_flush_neighbors=0
#innodb_flush_method=O_DIRECT
innodb_thread_concurrency = 4
innodb_commit_concurrency = 4
# log
general_log = 0
general_log_file = /usr/local/var/mysql/general.log
slow_query_log = 0
[mysqldump]
#max_allowed_packet = 16M
quick
set-charset
single-transaction

エラーログを確認しよう

my.cnf を設定したらしばらくはエラーログを見て、Warning などが出ていないか確認しましょう。上記の設定の場合、デフォルトの /usr/local/var/mysql/マシン名.local.err にエラーログが出力されます。

インストール後、MySQL を運用していく上で知っておくと良いコマンド

MySQL を止めるコマンド

$ mysql.server stop

私は MySQL を常時起動せず、必要ない時は止めるようにしています。

MySQL が更新された時に実行するコマンド

$ mysql_upgrade -uroot -p

MySQL は日々更新されます。brew upgrade コマンドで MySQL を更新したら上記のコマンドを実行して MySQL の内部テーブルを更新します。

参考にさせていただいたサイト

my.cnf を 5.7 対応するにあたり、参考にさせていただいたサイトです。ありがとうございます。

-技術ブログ
-