Homebrew の MySQL が 5.7 になったので 5.6 からアップグレードしてみました。インストール時に実行したコマンドと、5.7 対応した my.cnf を公開します。
動作確認環境
- MacBook Pro 2015 13 インチ
- Mac OS X El Capitan
目次
- MySQL をインストール
- MySQL を起動する
- mysql_secure_installation コマンドを実行する
- my.cnf サンプル
- エラーログを確認しよう
- インストール後、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
この回答で以下のように設定されます。
- VALIDATE PASSWORD plugin をインストール
- root のパスワードを 8 文字以上に変更
- 無名ユーザを削除
- root のログインをローカルからに制限
- test データベースを削除
- 権限の変更を更新
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 対応するにあたり、参考にさせていただいたサイトです。ありがとうございます。