Vagrant Tips#9 スクラップ＆ビルドできるmysql5.6環境を構築する(centos)

##[Vagrant Tipsのサマリページはこちら](http://qiita.com/yukimura1227/items/7e34bb12d36e8aa2e6c3)

# スクラップ＆ビルドできるmysql5.6を構築する(centos)
タイトルはちょっと釣りです。。。vagrant用の環境セットアップ用のスクリプトの紹介なので、基本的に他の「Vagrant Tips」含めてスクラップ＆ビルドできます(笑)
はてさて、皆様、MySQLはご存知でしょうか？この記事に来られるくらいなので当然聞いたことはあるんだと思います。
MySQLは、オープンソースのRDBMSで、世界で最も使われているRDBMSとのことです。([Wikipedia:MySQL](https://ja.wikipedia.org/wiki/MySQL)および、[http://db-engines.com/en/ranking](http://db-engines.com/en/ranking)参照)
以下の記事に、いろいろな事例が載っておりますが、facebookやtwitter(今はもう使っていないかもしれません)が有名どころかと思います。
[MySQL最新動向＆事例紹介(2012年の記事)](http://www.ospn.jp/osc2012-spring/PDF/osc2012spring_MySQLPorductUpdate_s.pdf)
MySQL自体も5.0系→5.1系→5.5系→5.6系と進化を遂げてきており、特に5.5系→5.6系はOracleに買収されてからのバージョンアップで、なんとなくOracleの培ったノウハウがたくさんつまっている気はします。
MySQL5.7系が出始めているので、今さら感はありますが、最近は悪い噂も聞かなくなってきていますので、5.6系はかなり安定しているのだと思います。
安定してくると、SIerなどの慎重派な人たちが手を出し始める頃だと思いますので、あえて5.6系の環境構築スクリプトを作ってみました。
設定などをいろいろいじりたい場合は、スクラップ＆ビルドできるのは大変便利なので、MySQL5.6を勉強中のインフラ屋さんなどにご活用いただけると幸いです。ローカル環境も汚れなくてすみますしね。(今さら感はありますが。。。)


まずは、VagrantFileから

```ruby:VagrantFile
Vagrant::Config.run do |config|
  config.vm.box = "centos64_6_5"
  config.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box"

  config.vm.define "for_mysql" do |for_mysql|
    Encoding.default_external = "UTF-8"
    for_mysql.vm.network "hostonly", "192.168.55.10"
    for_mysql.vm.provision "shell", path: "setup_mysql.sh"
  end

end
```

MySQLのデフォルトの文字コードをUTF-8にするような設定を明記したMySQLの設定ファイル(utf-8にしている部分以外は、デフォルトのまま)

```my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

character-set-server = utf8

[client]
default-character-set = utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
```

MySQLのインストールおよび、サンプルとしてtest_dbスキーマの作成および、admin権限を持ったユーザと、SQLの実行権限を持った通常ユーザの作成を実施。(ユーザは、どこからでもアクセスできるようにしているため、本番用DBを作り場合は参考にしないように注意してください。逆にこのような設定にしているためホストマシンから「IPアドレス：192.168.55.10」「ポート：3306」「ユーザ名：test_userまたはtest_admin_user」「パスワード：pass」「スキーマ：test_db」で接続してSQLを実行することが可能です。

また、テーブルとしては、適当にtest_table1とtest_table2を作って、適当なデータを入れています。

```bash:setup_mysql.sh
#!/bin/bash

yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

yum -y install mysql-community-server

cp -p /etc/my.cnf /etc/my.cnf.org
cp -p /vagrant/my.cnf /etc/my.cnf
chmod 664 /etc/my.cnf
service mysqld start

# set password for root
mysql -u root -e "UPDATE mysql.user SET Password=PASSWORD('root_pass') WHERE User='root';FLUSH PRIVILEGES;"

# delete anoymous user
mysql -uroot -proot_pass -e "DELETE FROM mysql.user WHERE User = '';FLUSH PRIVILEGES;"

# create sample admin user
mysql -uroot -proot_pass -e "CREATE USER 'test_admin_user'@'%' IDENTIFIED BY 'pass'"
mysql -uroot -proot_pass -e "GRANT ALL PRIVILEGES ON test_db.* TO 'test_admin_user'@'%'"

# create sample normal user
mysql -uroot -proot_pass -e "CREATE USER 'test_user'@'%' IDENTIFIED BY 'pass'"
mysql -uroot -proot_pass -e "GRANT SELECT,UPDATE,INSERT,DELETE ON test_db.* TO 'test_user'@'%'"

# create schema by sample admin user
mysql -utest_admin_user -ppass -e "CREATE DATABASE test_db"

# create sample tables
mysql -utest_admin_user -ppass test_db -e "create table test_table1(col1 int, col2 varchar(100))"
mysql -utest_admin_user -ppass test_db -e "create table test_table2(col1 int, col2 varchar(100))"

# insert sample data
mysql -utest_user -ppass test_db -e "insert into test_table1 values(1,'table1テスト')"
mysql -utest_user -ppass test_db -e "insert into test_table1 values(2,'table1テスト2')"
mysql -utest_user -ppass test_db -e "insert into test_table2 values(1,'table2テスト')"
mysql -utest_user -ppass test_db -e "insert into test_table2 values(2,'table2テスト2')"
```

MySQL5.6系の勉強をしているインフラ屋さんだったり、単体試験環境用のDBサーバを仮想化したい資材管理担当の方などに利用していただけると幸いです。
今回は、適当なユーザおよびスキーマ、適当なテーブルに適当なデータを登録するようにしましたが、DBの構築スクリプトをバージョン管理システムなどにコミットしておき、それを自動的に取得して全自動で単体試験環境を構築できるようにすると、コントローラブルな単体試験環境ができるので、結構オススメです。

ではでは～