コメントするTweet今回はMySQLのサーバーパラメータについて書いてみます。・・・書いている記事の順番がレベル的にも内容的にもてんでばらばらなのは、ひとえに私が書きたいことを書いてるからです。ゆるしてください笑いつか体系立ってまとめるかもしれません。サーバーパラメータは、原則my.cnfという設定ファイルに書きます。Windowsではmy.iniというらしいです。my.cnfは決められた場所に配置しておけば、MySQLの起動時に自動で読み込んでくれます。決められた場所とは、下記4つです。1./etc/my.cnf2./etc/mysql/my.cnf3./usr/etc/my.cnf4.~/.my.cnfこの情報は、mysqlコマンドの–helpオプションで確認できます。実際にdatadirの値は/data/mysqlとなります。残りの3つを使うと、混乱を招くことになるのであまりお勧めしません。ここで、1つ注意です。5.6では、有名なバグがあって、RPMパッケージ導入をした際などに、basedirの配下にmy.cnfを作ってしまいます。デフォルトではbasedirは/usrとなっているので、/usr/my.cnfのバグとして認識されています。この/usr/my.cnfにはsql_modeの指定が書かれており、sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESとなっています。–helpでは表示されないのに、です!)、さらに一番最後に読み込まれます(=1番優先度が高い)。このため、/etc/my.cnfでいくらsql_modeを指定しても、NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLESのままになってしまう、という悲劇がここに発生するわけです。頭の片隅に入れておいてください。(5.7では解消されているようです)話がそれましたね。ほかにもMySQLのサーバーパラメータを指定する方法はあります。・MySQL起動後に動的に変更する(変更できるパラメータのみ)・mysqldプロセス起動時に引数として与える。・mysqldプロセス起動時に–defaults-fileで設定ファイルを指定する。–defaults-fileによる指定は、検証環境などで複数のMySQLプロセスを利用する場合などに便利です。それでは肝心のパラメータにどんなものがあるか見ていきましょう。私の独断と偏見により重要度を3段階に分けました。参考にしてみてください。「ここに書いてあるなら重要なんだろう」という感じに眺めてください。ここでは5.6.26であることを前提に書いています。概ね5.6であれば変更は少ないと思いますが、メジャーバージョンが異なる場合は参考程度に見てください。【1.超重要!】MySQLに時間を割いている余裕はない!という方でも、チェックしておいてほしいパラメータです。障害が起こった時に取り返しのつかないことになる可能性が高くなったりします。datadirMySQLのデータをどこに保持するかを指定するパラメータ。RPMパッケージではデフォルトで/var/lib/mysqlが指定されているので、datadirのパラメータを知らなかった、という人はここにデータが格納されていることになります。一般的にデータはルートディスクと同じディスクには持たないため、ここを指定しない構成はかなり考えにくいです。log_bin_basenameバイナリログ関係のパラメータ。バイナリログを知らない方のために補足しておきますと、バイナリログとは、MySQLで実行した更新系クエリをそのまま書いてあるログのことです。ロールフォワードリカバリに使える点はOracleのアーカイブREDOログにそっくりですが、その他にも、MySQLのレプリケーションのベースになっています。MySQLのレプリケーションはMasterのバイナリログにあるクエリをSlaveで実行させることによってMasterとSlaveが同じデータを持つようにしているからです。log_binはバイナリログを出力するかどうか(ON/OFF)log_bin_basenameはバイナリログ名のベースです。(バイナリログは、log_bin_basename.XXXXXX(Xは連番)という名前です)expire_logs_daysはバイナリログを何日保管するかを指定します。定期的に削除しないと、あっというまにディスクを圧迫します。何らかの値を指定する必要があるでしょう。更新クエリの頻度、フルバックアップを取るタイミングなどによって変更すると良いと思います。log_errorエラーログを出力するディレクトリ、ファイルを指定します。なにかMySQLで問題が起こった時は真っ先に確認するファイルなので、これがどこにあるか分からないと障害発生時に非常に困ったことになります。innodb_buffer_pool_sizeものすごく雑に言えば、MySQLがどれだけのメモリを使うことを許可するか、です。Oracleで言えば、MEMORY_TARGETに近いです(自動メモリ管理などという高等機能はありませんが)。正確に言うと、InnoDB型のテーブル(ほとんどのテーブルはそうです)のデータやインデックスをキャッシュしておくメモリサイズです。MySQLに限らず、およそDBMSはいかにメモリを効率よく使うか、ということはデータベースの性能に直結します。詳細にチューニングをする気はなくても、この値をそれなりの値にしておかないと、性能は極めて低くなります。物理メモリの70%ほどを割り当てると良いのではないでしょうか。max_connectionsMySQLへの最大接続数を指定します。Refusedと言って接続をはねられてしまいます。システム障害につながりますので、アプリケーションからどのくらいの接続が最大であるのかを見積もって、それよりも大目の値を指定してください。デフォルトは151です。接続待機しているのにもわずかながらメモリは使用するらしいので、あまり極端に大きな値を指定しないことを勧めます。普通にMySQLを利用し、ある程度仕組みも理解しておきたい、と言う方はこのレベルまで理解して頂きたいです。このレベルまで分かっていれば、初歩的なミスは犯さないはずです。binlog_formatこの重要度レベルで抑えておく必要があるか微妙ですが、一応。バイナリログの記録のフォーマットを指定します。row、mixed、statementの3種類が指定できます。rowでは、実行したクエリによって変更された行を記録します。statementでは実行したクエリを記録します。mixedは、rowとstatementのいいとこどりです(後で説明します)。実行時刻によって結果が変わりますよね。これはレプリケーションをしている際には重要な問題で、statement形式にすると、実行したクエリをそのまま記載するので、マスターとスレーブで値が異なる可能性が出てきてしまいます。これに対してrow形式であればそんな心配は無用ですが、その代わり行全体を記録するので、バイナリログが膨大な大きさになります。mixedでは、statement形式では値が異なってしまう可能性のあるクエリについてはrow形式、そうでないクエリについてはstatement形式、とMySQL側で判断して記録してくれます。理由がなければmixedにするのがお勧めです。character_set_serverこれらはクライアントやサーバの文字コードを指定するパラメータです。sjis、EUC、UTF-8など、お好きな文字コードを指定してください。enforce_gtid_consistencyGTIDというバイナリログ記録方式を利用できるようMySQLの利用に制限をかけるパラメータです。GTIDレプリケーションではトランザクション制御ができる必要があるので、MyISAMストレージエンジンの利用を禁止する、などです。頭には入れておいたほうが良いと思います。general_log_file一般クエリログについてのパラメータです。わず、全ての実行されたクエリを記録するログです。実運用時にはOFFにしておくことを強く勧めます。general_logで一般クエリログのON/OFFを、general_log_fileで一般クエリログファイル名を指定します。gtid_modeGTIDモードでバイナリログを記載するかどうかを指定します。enforce_gtid_consistencyの項でも書いたとおり、GTIDを利用する機会は多いので、このパラメータの存在は知っておいて損はないです。license読んで字のごとく、ライセンスの種類です。GPL版(無料版)、commercial版(有料版)があります。log_slave_updatesMySQLサーバがレプリケーションのスレーブとして動作している際、マスターから伝播されてきて自分で実行したクエリをバイナリログに書くかどうかを指定します。多段レプリケーション(Master→SlaveかつMaster→Slaveのような構成)を組む際などには留意する必要があります。新マスターには過去のマスターで実行したクエリのバイナリログが存在しないことになるので、データの冗長性確保の要件がある場合などは注意が必要です。slow_query_log_fileスロークエリログファイル関係のパラメータ。スロークエリログは、実行に一定以上の時間がかかったクエリを自動記録するログで、クエリのチューニングなどに活かすことができます。slow_query_logでスロークエリログのON/OFFを、slow_query_log_fileでスロークエリログのファイル名を、long_query_timeでスロークエリログ出力の閾値(秒)を、それぞれ指定します。pid_fileMySQLのPIDファイルのパスを指定します。ここで指定したパスをOSのmysqlユーザがR/Wする権限を持っていないと、MySQLが起動できないのでご注意ください。read_only読んで字のごとくです。レプリケーションを行っている際のスレーブなどに指定し、スレーブへのデータ更新を禁止し、レプリケーションのデータ不整合を防ぐ、などの使い道があります。server_idレプリケーションをする際に、レプリケーション構成内でMySQLサーバを識別するためにつけるIDです。同一レプリケーション構成内で一意になっている必要があります。socketMySQLのソケットファイルのパスを指定します。Linuxのソケット通信を利用する場合、このファイルを介してMySQLに接続します。頭の片隅に入れておいてください。tx_isolationトランザクション分離レベルを指定します。トランザクション分離レベルを知らない!と言う方はWikipediaに説明があるので読んでみてください。他のRDBMSと異なり、デフォルトはREPEATABLE-READです。・・・書く気はあったんです。続きは次の記事、とさせてください。続きはまた近々書きます。======================================================続き、書きました。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。Ushio駆け出しのMySQLエンジニア。OSSを仕事で扱っています。themehall.com。