my.cnfの設定例
my.cnfの設定例について。以下、重要と思われる箇所をピックアップしてみた。
特に指定がない限り[mysqld]セクションの記述。値はあくまで例。
基本的なパラメータ
[mysqld]
user = mysql ←MySQLインスタンスの実行OSユーザがmysqlになる。
basedir = /usr/mysql ←MySQLバイナリのインストールディレクトリ。
datadir = /data/mysql ←DB領域のトップディレクトリ。新規DBが置かれる。
port = 3306 ←インスタンス起動時TCP/IP接続の受付ポート。
socket = /data/mysql/mysql.sock ←ローカルからの接続時に使用するソケットファイルの指定。
基本的にMySQLインスタンスの起動はrootかユーザmysqlで行う。
どちらにしてもプロセスオーナーはmysqlとなる。
datadir、socketなどはユーザmysqlが書き込みを行える場所を設定する。
またディレクトリを明示的に指定した場合、そのディレクトリはOS上であらかじめ作成しておく。
文学コード関連
default-character-set = utf8 ←[mysql]セクションにも同様に記述。
skip-character-set-client-handshake ←クライアントの文字コードとサーバの文字コードを同様にセット
character-set-server = utf8 ←”skip-character-set-client-handshake”が参照する。
skip-character-set-client-handshakeは、MySQLが勝手に内部変換しないためのおまじない。
追記
MySQL server側でのdefault-character-set = utf8は5.5以降なくなった。
が、client側ではまだ存在する。なので、5.5以降は以下のようにしておく。ややこしいな〜…
[mysqld]
character-set-server = utf8
skip-character-set-client-handshake
[mysql]
default-character-set = utf8
InnoDB用のパラメータ例
innodb_data_home_dir = /var/lib/mysql/
innodb_data_file_path = ibdata1:1000M:autoextend
innodb_log_group_home_dir = /var/lib/mysql/
innodb_buffer_pool_size = 900M ←InnoDBのデータやインデックスをキャッシュするための領域
innodb_additional_mem_pool_size = 30M ←InnoDBの内部データなどを保持するための領域
innodb_log_file_size = 300M ←InnoDBの更新ログを記録するディスク上のファイル
innodb_log_buffer_size = 8M ←InnoDBの更新ログを記録する領域
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_thread_concurrency=8 ←CPUのコア数とディスク性能から設定値を求めるのがベター
skip-innodb-doublewrite ←二重書き込みは必須ではないため、場合によってはスキップ
innodb_buffer_pool_sizeは搭載メモリの80%くらいでもよいと言われることが多いが.一方、MySQL全体で使うメモリ容量をマシンの8割ほどに見積もるという思想もある。
innodb_thread_concurrencyは、CPUスケーラビリティ上で関係するパラメーター。「InnoDBが内部で処理する同時スレッド数」と言われるので、いわゆる同時接続処理の問題と混同しそうになるが、、、
InnoDBは、OSのスレッド数をこのパラメータによって与えられた制限と同じまたは少ない数に保とうとします。
引用
http://www.limy.org/program/db/mysql/mysql_option.html
・・・ということなので、本質が違う。
やたらと値を大きくすればいいというものではなく、”A recommended value is 2 times the number of CPUs plus the number of disks.”(公式サイト)ってことだ。
「それなりのスペックがあるマシンでMySQL 5.0.8 以上なら、初期値の20でほぼ問題ない」あたりが一般的な指標の様子。、、、が、これが5.5から初期値が0になる。
The range of this variable is 0 to 1000. A value of 0 (the default) is interpreted as infinite concurrency (no concurrency checking). Disabling thread concurrency checking enables InnoDB to create as many threads as it needs.
初期値は並列性をチェックしない、ことになる。初期値はバージョンの違いに注意。5.5以降あまり重要なパラメータではないという意見もチラホラ。
参考
http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html
http://www.inter-office.co.jp/contents/122/
http://yumewaza.yumemi.co.jp/2010/06/mysql_show_engine_innodb_statu.html
こちらは相当しっかり検証されてます
レプリケーション周り
レプリケーションを実装する場合に必要な例を書いておく。
server-id = 1 ←DBサーバごとにユニークな値を指定する。
log-bin = /data/mysql/blog/mysql-bin ←バイナリログの有効化及びそのファイル名。
log-bin-index = /data/mysql/blog/mysql-bin ←バイナリログ一覧のファイル名指定。
sync_binlog = 1 ←バイナリログがトランザクションコミット時に同期書き込みされる。
relay-log = /data/mysql/blog/relay-bin ←リレーログの有効化及びそのファイル名。
relay-log-index = /data/mysql/blog/relay-bin ←リレーログ一覧のファイル名指定。
log-slave-updates ←スレーブでもバイナリログを出力させる指定。
server-idは、スレーブ側のmy.cnfでは別の値を指定する。
上記のsync_binlog = 1はバイナリログとInnoDBテーブルの値がずれることが
ないように指示するが(と、思われる)、レプリケーションマスターの書き込みが
遅くなるという問題があるようだ。
「1回バイナリログへ更新を行うことでディスクへのフラッシュを行うことを表す
オプションであるため、ディスクへの負荷が高くなる」らしい。
(参考 http://nippondanji.blogspot.com/2009/03/mysql10.html)
これについては様々に意見が別れるようで、これが正解というものはなさそうだ。
パフォーマンスを重視するなら0にする、という考えもあるが基本的には1でいいかもしれない。
また、このオプションと同時にinnodb_support_xa=OFFを指定しないこと。
レプリケーション周り・スレーブ側のパラメータ
スレーブ側のmy.cnfで必要な設定。マスターの情報を明示的に指定しておく。
server-id = 2
master-host = hostname ←マスターのホスト名かIPアドレス
master-user = username ←レプリケーション用のユーザ名
master-password = password ←レプリケーション用ユーザ名のパスワード
master-port = 3306 ←マスター上のMySQLが使用するポート
read_only
skip-slave-start
master-userとmaster-passwordは、マスター上でレプリケーション専用ユーザを
作成した際の値を指定。read_onlyはスレーブ固有のパラメータ。
これにより一般ユーザからの更新処理が一切できなくなり、スレーブに対して不用意に
更新が実施されマスター/スレーブ間で不整合が発生するのを防げる。skip-slave-startはMySQL起動と同時にレプリケーションが開始されるのを抑止したい場合に。
追記
※master-host、master-portその他の情報はCHANGE MASTER TO文でレプリケーションの設定をする際に指定するとmaster.infoファイルに書き込まれる。master.infoがあればmy.cnfの記述は無視されるらしいので、基本的に設定は不要である。
パフォーマンスチューニング
以下、パフォーマンスに関る設定について。
細かく見て行くと実際はもっといろいろと出てくるとは思うが。。
key_buffer = 256M ←検索に使われるインデックスをバッファに保存する際のメモリサイズ
join_buffer_size = 1M ←インデックスを用いないテーブル結合のときに使われるメモリ上の領域
sort_buffer_size = 1M ←ORDER BYやGROUP BYのときに使われるメモリ上の領域
read_buffer_size = 1M ←インデックスを用いないテーブルスキャンのときに使われるメモリ上の領域
thread_cache = 8 ←スレッド生成のキャッシュサイズ
thread_concurrency = 8 ←同時に実行するスレッド数
thread_cashe_size = 30 ←max_connectionsの3分の1程度が推奨されている。
query_cache_size = 32M ←クエリキャッシュのサイズを32Mで指定。
max_connections = 100 ←インスタンスに同時接続可能なセッションの上限値。
table_cache = 256 ←頻繁なアクセスに対して使うデータキャッシュ
max_allowed_packet = 1M ←入力データ保持の最大バッファサイズ
key_bufferはメモリに余裕がある場合は多めに設定してよいそうだ。
join_buffer_sizeは、インデックスが使用できない場合に有効。
割り当てる値はこれより小さくても良さそう。
query_cache_sizeは、SELECT文の実行結果をメモリ内にキャッシュしておき、
次回以降におなじが送られてきた場合にはこのキャッシュを返すための機能。
これによりSELECT文が自動的にキャッシュされる。
max_connections。MySQLは接続確立のための負荷は軽いが接続数が増えると
メモリ使用量が多くなるため、この値は100-200程度に抑えておくのが望ましい、そうだ。
追記(2012/03/21)
アプリ要件によって100じゃ足りないということもある。要件によっては300、500とか全然あり。
thread_cashe_sizeは切断したコネクションをキャッシュして次回以降の接続の
際の負荷を軽減するための設定。
table_cacheは、5.1以降table_open_cacheに名称変更になったかもしれない。
以下の設定は巨大なクエリを実施するケースにおいてパフォーマンスの向上が望めるかも?しれない。
net_buffer_length = 65536
query_prealloc_size = 65536
メモリ周りのチューニングにおいては、グローバル/スレッドの違いに気をつけるようにする。
以下サイトは参考になる。
↓ ↓ ↓
http://dsas.blog.klab.org/archives/50860867.html
参考URL
http://www.thinkit.co.jp/cert/article/0707/5/2/2.htm
http://nippondanji.blogspot.com/2009/03/mysql10.html
http://dsas.blog.klab.org/archives/50860867.html
http://vine-linux.ddo.jp/linux/sql/mycnf.php