- 更新日: 2014年7月24日
- Vagrant & Chef
Chef で MySQL のインストールと設定
CentOS に MySQL をインストールする Chef Cookbook を作成しました。MySQL 5.5.38 を remi リポジトリからインストールします。MySQL 5.6 用の Cookbook も作成してたのですけど、そっちはなんかはまって上手くいかなかったのでとりあえず5.5バージョンで。
このエントリーは、CentOS サーバー設定用 Chef Cookbook/Recipe の目次 の一部です。
MySQL インストール用 Recipe
まずは、メインの MySQL をインストールする Recipe から。
site-cookbooks/app_mysql_cookbook/recipes/default.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# -------------------------------------------------- # set /etc/my.cnf # -------------------------------------------------- template '/etc/my.cnf' do owner 'root' group 'root' mode 644 notifies :restart, "service[mysqld]" end # -------------------------------------------------- # MySQL 5.5.38 installation # -------------------------------------------------- # dependencies %w[perl-DBD-MySQL perl-DBI].each do |pkg| package pkg do action :install end end # install mysql from remi repo %w[mysql mysql-server mysql-devel].each do |pkg| package pkg do action :install options "--enablerepo=remi --disablerepo=base,updates" end end #-------------------------------------------------- # log files #-------------------------------------------------- # create directories for mysql log files. mysql_log_dir = '/var/log/mysql' directory mysql_log_dir do owner "mysql" group "mysql" mode "0755" action :create end # touch log files %w[ error slow query ].each do |log_name| bash "create_#{log_name}_log" do log_file = "#{mysql_log_dir}/#{log_name}.log" code <<-EOC touch #{log_file} EOC creates log_file end end #-------------------------------------------------- # log rotation #-------------------------------------------------- # ref: /etc/logrotate.d/mysqld template '/root/.my.cnf' do owner "root" group "root" mode 0600 end # logrotate cookbook_file '/etc/logrotate.d/mysql-log-rotate' do owner "root" group "root" mode 0644 end #-------------------------------------------------- # set service #-------------------------------------------------- # chkconifig on and start service "mysqld" do supports :status => true, :restart => true, :reload => true action [ :enable , :start ] end #-------------------------------------------------- # mysql_secure_installation 5.5 #-------------------------------------------------- # 4. Set root password? [Y/n] Y # 1. Remove anonymous users? [Y/n] Y # 3. Disallow root login remotely? [Y/n] Y # 2. Remove test database and access to it? [Y/n] Y # 5. Reload privilege tables now? [Y/n] Y root_password = node.set['mysql_user']['root']['password'] bash "mysql_secure_installation" do code <<-EOC mysql -u root -e "DELETE FROM mysql.user WHERE User='';" mysql -u root -e "DROP DATABASE test;" mysql -u root -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';" mysql -u root -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');" mysql -u root -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('#{root_password}');" -D mysql mysql -u root -p#{root_password} -e "SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('#{root_password}');" -D mysql mysql -u root -p#{root_password} -e "SET PASSWORD FOR 'root'@'::1' = PASSWORD('#{root_password}');" -D mysql mysql -u root -p#{root_password} -e "FLUSH PRIVILEGES;" EOC only_if "mysql -u root -e 'show databases'" end |
上から順番に、/etc/my.cnf の設置、パッケージのインストール、ログファイルとログローテートの設定、サービスの設定と起動、mysql_secure_installation(対話型インストール)をシェルで実行、以上の一連の処理を行っています。
/etc/my.cnf 用テンプレート
続いて、MySQL の設定ファイル /etc/my.cnf 用のテンプレートです。設定するパラメータが膨大ですが、パフォーマンス・チューニングに必要となるのは、Network, Cache & Memory, InnoDB あたりのセクションのみです。テンプレート内では変数にしておいて、後述の Wrapper Cookbook で値を設定します。Wrapper Cookbook については、以下。
Chef Cookbook の管理方針、The Environment Cookbook Pattern について | EasyRamble
Chefでrbenvとruby-buildをインストール | EasyRamble
site-cookbooks/templates/default/my.cnf.erb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
[mysqld] # -------------------------------------------------- # Base # -------------------------------------------------- user = <%= node.set['mysql']['user'] %> port = <%= node.set['mysql']['port'] %> datadir = <%= node.set['mysql']['datadir'] %> socket = <%= node.set['mysql']['socket'] %> pid-file = <%= node.set['mysql']['pid-file'] %> symbolic-links = <%= node.set['mysql']['symbolic-links'] %> sql_mode = <%= node.set['mysql']['sql_mode'] %> default-storage-engine = <%= node.set['mysql']['default-storage-engine'] %> transaction-isolation = <%= node.set['mysql']['transaction-isolation'] %> character-set-server = <%= node.set['mysql']['character-set-server'] %> collation-server = <%= node.set['mysql']['collation-server'] %> <% if node.set['mysql']['skip-character-set-client-handshake']['flag'] %>skip-character-set-client-handshake<% end %> # -------------------------------------------------- # Replication # -------------------------------------------------- # not use Replication for now server-id = <%= node.set['mysql']['server-id'] %> log-bin = <%= node.set['mysql']['log-bin'] %> # -------------------------------------------------- # Network # -------------------------------------------------- # Global <% if node.set['mysql']['skip-networking']['flag'] %>skip-networking<% end %> <% if node.set['mysql']['skip-name-resolve']['flag'] %>skip-name-resolve<% end %> max_connections = <%= node.set['mysql']['max_connections'] %> max_connect_errors = <%= node.set['mysql']['max_connect_errors'] %> connect_timeout = <%= node.set['mysql']['connect_timeout'] %> max_allowed_packet = <%= node.set['mysql']['max_allowed_packet'] %> # Global, Session max_user_connections = <%= node.set['mysql']['max_user_connections'] %> wait_timeout = <%= node.set['mysql']['wait_timeout'] %> interactive_timeout = <%= node.set['mysql']['interactive_timeout'] %> # -------------------------------------------------- # Logging # -------------------------------------------------- log_output = <%= node.set['mysql']['log_output'] %> log_warnings = <%= node.set['mysql']['log_warnings'] %> general_log = <%= node.set['mysql']['general_log'] %> general_log_file = <%= node.set['mysql']['general_log_file'] %> log-slow-admin-statements = <%= node.set['mysql']['log-slow-admin-statements'] %> log-queries-not-using-indexes = <%= node.set['mysql']['log-queries-not-using-indexes'] %> slow_query_log = <%= node.set['mysql']['slow_query_log'] %> slow_query_log_file = <%= node.set['mysql']['slow_query_log_file'] %> long_query_time = <%= node.set['mysql']['long_query_time'] %> expire_logs_days = <%= node.set['mysql']['expire_logs_days'] %> # -------------------------------------------------- # Cache & Memory # -------------------------------------------------- # Global thread_cache_size = <%= node.set['mysql']['thread_cache_size'] %> table_open_cache = <%= node.set['mysql']['table_open_cache'] %> query_cache_size = <%= node.set['mysql']['query_cache_size'] %> query_cache_limit = <%= node.set['mysql']['query_cache_limit'] %> # Global, Session max_heap_table_size = <%= node.set['mysql']['max_heap_table_size'] %> tmp_table_size = <%= node.set['mysql']['tmp_table_size'] %> sort_buffer_size = <%= node.set['mysql']['sort_buffer_size'] %> read_buffer_size = <%= node.set['mysql']['read_buffer_size'] %> join_buffer_size = <%= node.set['mysql']['join_buffer_size'] %> read_rnd_buffer_size = <%= node.set['mysql']['read_rnd_buffer_size'] %> # -------------------------------------------------- # MyISAM # -------------------------------------------------- # Global <% if node.set['mysql']['skip-external-locking']['flag'] %>skip-external-locking<% end %> key_buffer_size = <%= node.set['mysql']['key_buffer_size'] %> myisam_max_sort_file_size = <%= node.set['mysql']['myisam_max_sort_file_size'] %> myisam_recover_options = <%= node.set['mysql']['myisam_recover_options'] %> # Global, Session bulk_insert_buffer_size = <%= node.set['mysql']['bulk_insert_buffer_size'] %> myisam_sort_buffer_size = <%= node.set['mysql']['myisam_sort_buffer_size'] %> # -------------------------------------------------------------------- # InnoDB behavior # -------------------------------------------------------------------- # Global innodb_file_format = <%= node.set['mysql']['innodb_file_format'] %> innodb_write_io_threads = <%= node.set['mysql']['innodb_write_io_threads'] %> innodb_read_io_threads = <%= node.set['mysql']['innodb_read_io_threads'] %> innodb_stats_on_metadata = <%= node.set['mysql']['innodb_stats_on_metadata'] %> innodb_max_dirty_pages_pct = <%= node.set['mysql']['innodb_max_dirty_pages_pct'] %> innodb_adaptive_hash_index = <%= node.set['mysql']['innodb_adaptive_hash_index'] %> innodb_adaptive_flushing = <%= node.set['mysql']['innodb_adaptive_flushing'] %> innodb_strict_mode = <%= node.set['mysql']['innodb_strict_mode'] %> innodb_io_capacity = <%= node.set['mysql']['innodb_io_capacity'] %> innodb_autoinc_lock_mode = <%= node.set['mysql']['innodb_autoinc_lock_mode'] %> innodb_change_buffering = <%= node.set['mysql']['innodb_change_buffering'] %> innodb_old_blocks_time = <%= node.set['mysql']['innodb_old_blocks_time'] %> # -------------------------------------------------------------------- # InnoDB base # -------------------------------------------------------------------- # Global innodb_buffer_pool_size = <%= node.set['mysql']['innodb_buffer_pool_size'] %> innodb_data_home_dir = <%= node.set['mysql']['innodb_data_home_dir'] %> innodb_data_file_path = <%= node.set['mysql']['innodb_data_file_path'] %> innodb_file_per_table = <%= node.set['mysql']['innodb_file_per_table'] %> innodb_autoextend_increment = <%= node.set['mysql']['innodb_autoextend_increment'] %> innodb_log_group_home_dir = <%= node.set['mysql']['innodb_log_group_home_dir'] %> innodb_fast_shutdown = <%= node.set['mysql']['innodb_fast_shutdown'] %> innodb_log_file_size = <%= node.set['mysql']['innodb_log_file_size'] %> innodb_log_files_in_group = <%= node.set['mysql']['innodb_log_files_in_group'] %> innodb_log_buffer_size = <%= node.set['mysql']['innodb_log_buffer_size'] %> innodb_additional_mem_pool_size = <%= node.set['mysql']['innodb_additional_mem_pool_size'] %> innodb_thread_concurrency = <%= node.set['mysql']['innodb_thread_concurrency'] %> innodb_flush_log_at_trx_commit = <%= node.set['mysql']['innodb_flush_log_at_trx_commit'] %> innodb_force_recovery = <%= node.set['mysql']['innodb_force_recovery'] %> innodb_doublewrite = <%= node.set['mysql']['innodb_doublewrite'] %> innodb_sync_spin_loops = <%= node.set['mysql']['innodb_sync_spin_loops'] %> innodb_thread_sleep_delay = <%= node.set['mysql']['innodb_thread_sleep_delay'] %> innodb_commit_concurrency = <%= node.set['mysql']['innodb_commit_concurrency'] %> innodb_concurrency_tickets = <%= node.set['mysql']['innodb_concurrency_tickets'] %> # Global, Session innodb_support_xa = <%= node.set['mysql']['innodb_support_xa'] %> innodb_lock_wait_timeout = <%= node.set['mysql']['innodb_lock_wait_timeout'] %> innodb_table_locks = <%= node.set['mysql']['innodb_table_locks'] %> [mysqldump] default-character-set = <%= node.set['mysql']['default-character-set'] %> <% if node.set['mysql']['quick']['flag'] %>quick<% end %> max_allowed_packet = <%= node.set['mysql']['max_allowed_packet'] %> [mysql] default-character-set = <%= node.set['mysql']['default-character-set'] %> <% if node.set['mysql']['no-auto-rehash']['flag'] %>no-auto-rehash<% end %> <% if node.set['mysql']['show-warnings']['flag'] %>show-warnings<% end %> [client] default-character-set = <%= node.set['mysql']['default-character-set'] %> port = <%= node.set['mysql']['port'] %> socket = <%= node.set['mysql']['socket'] %> [mysqld_safe] log-error = <%= node.set['mysql']['log-error'] %> |
ログローテーション用 MySQL root ユーザー設定のテンプレート
MySQL ログのローテートに必要な /root/.my.cnf 用のテンプレートです。詳細は、/etc/logrotate.d/mysqld に説明してありますが、/usr/bin/mysqladmin flush-logs を行うために、MySQLユーザーとそのパスワードの設定を行います。ここもパスワードは変数にしておいて、Wrapper Cookbook で指定。
site-cookbooks/templates/default/.my.cnf.erb
1 2 3 |
[mysqladmin] password = <%= node.set['mysql_user']['root']['password'] %> user= root |
ログローテート設定用のファイル
error.log(エラーログ)、slow.log(スロークエリログ)用のログローテートを設定するファイルです。このファイルは変数を使わないので、files/default 以下に格納しました。
site-cookbooks/files/default/mysql-log-rotate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/var/log/mysql/error.log /var/log/mysql/slow.log { create 640 mysql mysql notifempty daily rotate 14 missingok nocompress dateext sharedscripts postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && \ /usr/bin/mysqladmin ping &>/dev/null then /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs fi endscript } |
1 2 3 |
/usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs |
の行で、–defaults-extra-file=/root/.my.cnf と、MySQLユーザーとパスワードの情報が書かれている外部ファイル(/root/.my.cnf)を指定しています。
my.cnf.erb のパラメータ値の設定
Wrapper Cookbook で、site-cookbooks/templates/default/my.cnf.erb 内の変数に対する値を設定します。パフォーマンス・チューニングに必要となる、Network, Cache & Memory, InnoDB あたりのセクションは注意する。各々環境で理想値は異なると思いますので、そこはご留意下さい。調べたデフォルト値をコメントで記しています。
site-cookbooks/wrapper_project_cookbook/recipes/default.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# /* for mysql node.set['mysql_user']['root']['password'] = 'password' # /etc/my.cnf # [mysqld] # -------------------------------------------------- # Base # -------------------------------------------------- node.set['mysql']['user'] = 'mysql' node.set['mysql']['port'] = '3306' node.set['mysql']['datadir'] = '/var/lib/mysql' node.set['mysql']['socket'] = '/var/lib/mysql/mysql.sock' node.set['mysql']['pid-file'] = '/var/run/mysqld/mysqld.pid' node.set['mysql']['symbolic-links'] = '0' node.set['mysql']['sql_mode'] = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES' # Default: '' node.set['mysql']['default-storage-engine'] = 'InnoDB' # Default: MyISAM (<= 5.5.4) node.set['mysql']['transaction-isolation'] = 'REPEATABLE-READ' # Default: REPEATABLE-READ node.set['mysql']['character-set-server'] = 'utf8' node.set['mysql']['collation-server'] = 'utf8_general_ci' node.set['mysql']['skip-character-set-client-handshake']['flag'] = true # Default: false # -------------------------------------------------- # Replication # -------------------------------------------------- # not use Replication for now node.set['mysql']['server-id'] = '1' node.set['mysql']['log-bin'] = 'mysql-bin' # -------------------------------------------------- # Network # -------------------------------------------------- # Global node.set['mysql']['skip-networking']['flag'] = true node.set['mysql']['skip-name-resolve']['flag'] = true node.set['mysql']['max_connections'] = '100' # Default: 151 node.set['mysql']['max_connect_errors'] = '999999999' # Default: 10 (999999999: OFF) node.set['mysql']['connect_timeout'] = '10' # Default: 10 seconds node.set['mysql']['max_allowed_packet'] = '16M' # Default: 1048576 (1MB) # Global, Session node.set['mysql']['max_user_connections'] = '0' # Default: 0 (no limit) node.set['mysql']['wait_timeout'] = '600' # Default: 28800 seconds node.set['mysql']['interactive_timeout'] = '600' # Default: 28800 seconds # -------------------------------------------------- # Logging # -------------------------------------------------- node.set['mysql']['log_output'] = 'FILE' # Default: FILE node.set['mysql']['log_warnings'] = '1' # Default: 1 (enabled) node.set['mysql']['general_log'] = '0' # Default: 0 (OFF) node.set['mysql']['general_log_file'] = '/var/log/mysql/query.log' node.set['mysql']['log-slow-admin-statements'] = '1' node.set['mysql']['log-queries-not-using-indexes'] = '1' # Default: 0 (OFF) node.set['mysql']['slow_query_log'] = '1' # Default: 0 (OFF) node.set['mysql']['slow_query_log_file'] = '/var/log/mysql/slow.log' node.set['mysql']['long_query_time'] = '0.5' # Default: 10 node.set['mysql']['expire_logs_days'] = '14' # Default: 0 (no automatic removal) # -------------------------------------------------- # Cache & Memory # -------------------------------------------------- # Global node.set['mysql']['thread_cache_size'] = '30' # Default: 0 (1/3 of max_connections) node.set['mysql']['table_open_cache'] = '400' # Default: 400 node.set['mysql']['query_cache_size'] = '16M' # Default: 0 node.set['mysql']['query_cache_limit'] = '1M' # Default: 1048576 (1MB) # Global, Session node.set['mysql']['max_heap_table_size'] = '16M' # Default: 16777216 (16MB) node.set['mysql']['tmp_table_size'] = '16M' # Default: 16777216 (16MB) node.set['mysql']['sort_buffer_size'] = '2M' # Default: 2097144 (2MB) node.set['mysql']['read_buffer_size'] = '131072' # Default: 131072 node.set['mysql']['join_buffer_size'] = '131072' # Default: 131072 node.set['mysql']['read_rnd_buffer_size'] = '262144' # Default: 262144 # -------------------------------------------------- # MyISAM # -------------------------------------------------- # Global node.set['mysql']['skip-external-locking']['flag'] = true # Default: true (ON) node.set['mysql']['key_buffer_size'] = '8M' # Default: 8388608 (8MB) node.set['mysql']['myisam_max_sort_file_size'] = '2G' # Default: 2147483648 (2GB) node.set['mysql']['myisam_recover_options'] = 'DEFAULT' # Default: DEFAULT (0: OFF) # Global, Session node.set['mysql']['bulk_insert_buffer_size'] = '8M' # Default: 8388608 (8MB) node.set['mysql']['myisam_sort_buffer_size'] = '8M' # Default: 8388608 (8MB) # -------------------------------------------------- # InnoDB behavior # -------------------------------------------------- # Global node.set['mysql']['innodb_file_format'] = 'Barracuda' # Default: Barracuda (<= 5.5.6) node.set['mysql']['innodb_write_io_threads'] = '4' # Default: 4 node.set['mysql']['innodb_read_io_threads'] = '4' # Default: 4 node.set['mysql']['innodb_stats_on_metadata'] = '1' # Default: 1 (ON) node.set['mysql']['innodb_max_dirty_pages_pct'] = '90' # Default: 75 node.set['mysql']['innodb_adaptive_hash_index'] = '1' # Default: 1 (ON) node.set['mysql']['innodb_adaptive_flushing'] = '1' # Default: 1 (ON) node.set['mysql']['innodb_strict_mode'] = '1' # Default: 0 (OFF) node.set['mysql']['innodb_io_capacity'] = '200' # Default: 200 node.set['mysql']['innodb_autoinc_lock_mode'] = '1' # Default: 1 (consecutive) node.set['mysql']['innodb_change_buffering'] = 'inserts' # Default: inserts (<= 5.5.3) node.set['mysql']['innodb_old_blocks_time'] = '500' # Default: 0 seconds # -------------------------------------------------- # InnoDB base # -------------------------------------------------- # Global node.set['mysql']['innodb_buffer_pool_size'] = '256M' # 134217728 (128MB) node.set['mysql']['innodb_data_home_dir'] = '/var/lib/mysql' node.set['mysql']['innodb_data_file_path'] = 'ibdata1:1000M:autoextend' # Default: ibdata1:10M:autoextend node.set['mysql']['innodb_file_per_table'] = '1' # Default: 1 (ON) (<= 5.5.6) node.set['mysql']['innodb_autoextend_increment'] = '64M' # Default: 64 MB node.set['mysql']['innodb_log_group_home_dir'] = '/var/lib/mysql' node.set['mysql']['innodb_fast_shutdown'] = '0' # Default: 1 node.set['mysql']['innodb_log_file_size'] = '64M' # Default: 5242880 (5MB) node.set['mysql']['innodb_log_files_in_group'] = '2' # Default: 2 node.set['mysql']['innodb_log_buffer_size'] = '8M' # Default: 8388608 (8MB) node.set['mysql']['innodb_additional_mem_pool_size'] = '8M' # Default: 8388608 (8MB) node.set['mysql']['innodb_thread_concurrency'] = '8' # Default: 0 (上限なし) node.set['mysql']['innodb_flush_log_at_trx_commit'] = '1' # Default: 1 node.set['mysql']['innodb_force_recovery'] = '0' # Default: 0 node.set['mysql']['innodb_doublewrite'] = '1' # Default: 1 (ON) node.set['mysql']['innodb_sync_spin_loops'] = '20' # Default: 30 node.set['mysql']['innodb_thread_sleep_delay'] = '1000' # Default: 10000 node.set['mysql']['innodb_commit_concurrency'] = '0' # Default: 0 node.set['mysql']['innodb_concurrency_tickets'] = '500' # Default: 500 # Global, Session node.set['mysql']['innodb_support_xa'] = 'FALSE' # Default: TRUE node.set['mysql']['innodb_lock_wait_timeout'] = '50' # Default: 50 node.set['mysql']['innodb_table_locks'] = '1' # Default: 1 (TRUE) # [mysqldump] node.set['mysql']['default-character-set'] = 'utf8' node.set['mysql']['quick']['flag'] = true # [mysql] node.set['mysql']['no-auto-rehash']['flag'] = true node.set['mysql']['show-warnings']['flag'] = true # [mysqld_safe] node.set['mysql']['log-error'] = '/var/log/mysql/error.log' # end of settings for mysql /etc/my.cnf */ # include mysql recipe include_recipe 'app_mysql_cookbook::default' |
/etc/my.cnf のパラメータ値については以下参照。
MySQL :: MySQL 5.5 Reference Manual :: 5.1.4 Server System Variables
MySQL :: MySQL 5.5 Reference Manual :: 14.15 InnoDB Startup Options and System Variables
MySQLのmy.cnfファイルサンプル – 世界の一部
provision 後 mysql_secure_installation が成功しているか確認
mysql クエリーで、以下を確認します。
1. 匿名ユーザーが削除されていること。
2. リモートからの root ログインを拒否していること。
3. root ユーザーのパスワードが設定されていること。
4. test データベースが削除されていること。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
mysql> select Host, User, Password from mysql.user; +-----------+------+-------------------------------------------+ | Host | User | Password | +-----------+------+-------------------------------------------+ | localhost | root | ***************************************** | | 127.0.0.1 | root | ***************************************** | | ::1 | root | ***************************************** | +-----------+------+-------------------------------------------+ 3 rows in set (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec) mysql> select Db from mysql.db; Empty set (0.00 sec) |
以上のようになっていればOKです。
以降、少々解説です。
/etc/my.cnf を最初に作成する理由
recipes/default.rb では一番最初に、以下の /etc/my.cnf を設置する処理を行っています。
1 2 3 4 5 6 |
template '/etc/my.cnf' do owner 'root' group 'root' mode 644 notifies :restart, "service[mysqld]" end |
この template リソースを使って、/etc/my.cnf を作成する処理を一番最初に行っているのは以下の理由によります。
my.cnf の innodb_data_file_path, innodb_log_file_size 設定で MySQL が起動しなくなる場合の対処 | EasyRamble
mysql-server のインストールが完了した時点で mysql_install_db が自動実行され、/var/lib/mysql 以下に ibdata1, ib_logfile0, ib_logfile1 が作成される。これらのファイルが存在している状態で、/etc/my.cnf で innodb_data_file_path, innodb_log_file_size を設定しようとすると、mysqld の restart がエラーになってしまいます。なので、/etc/my.cnf を最初に設置した後に、mysql パッケージをインストールする順番の処理にしました。
ログファイルとログローテートの設定
#log files, #log rotation のコメント部の処理では、ログファイルの作成とログローテートの設定を行っています。以下のページを参考にしました。
MySQL ログのローテーション設定(logrotate)(flush-logs が cron で動かないときの対処を含む) – 彼女からは、おいちゃんと呼ばれています
error.log, slow.log, query.log の3つのログファイルを作成していますが、my.cnf で general_log = 0 に設定しているので、有効になるのは error.log, slow.log のみです。query.log は全てのクエリを記録して膨大になるので、有効にするのはデバッグ時などに限ったほうが良いかと思います。したがって、ログローテーションの設定も、error.log, slow.log の2つのみを対象にしています。
mysql_secure_installation(対話型インストール)をシェルで実行
最後の mysql_secure_installation では、通常のコンソールからの mysql インストール時で行われる対話型によるインストール処理をシェルで実行しています。
Chefのレシピでmysql_secure_installation(bashリソース利用) – Qiita
chefでmysql-5.6インストールしようとしたら苦労した話 – blog.youyo.info
上記リンクの参考のままでは動かず、ここも設定に工夫が必要でした。mysql -u root -p#{root_password} を mysql -u root -p #{root_password} と -p と パスワードの間にスペースを入れると、対話型でパスワードが聞かれて、最初エラーになりました。スペース無しにすると、そのまま実行してくれる。
以上で、MySQL 5.5.38 の Chef Cookbook は完了です。/etc/my.cnf を最初に作成しないといけない部分と、mysql_secure_installation の箇所がはまりどころでした。
MySQL(/etc/my.cnf)のオプション設定値を考えるのも結構大変でしたが、苦手だった MySQL のパラメータのチューニングについて学べて良かったです。スコープがグローバルとスレッドの2種類のパラメータがあるのに注意するのがポイントのようです。かなり奥が深そう。
- Vagrant & Chef の関連記事
- Vagrantで使うVirtualBoxのVM(仮想マシン)を外付けHDDに移動
- Chefで/etc/sysctl.confのkernel.panicを設定
- Chefでtelnetをインストール
- Chefでyumリポジトリを追加する設定
- Chef で iptables の設定
- ChefでSSH接続用の公開鍵をサーバーに設置
- nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- Chef Recipe でユーザー・グループを作成
- Chef Recipe で CentOS のネットワーク・ホストを設定
- NetworkManager 他不要なパッケージを削除する Chef Recipe
Leave Your Message!