まとまりのないブログ

something which something is something

mysql

mysqlの運用時のトラブルと試行錯誤のメモ

投稿日:

条件

  • 1分間にクエリの実行が30回〜60回程度発生する。
  • 結果のテーブルは7フィールドの数千〜10万件レコード程度のテーブル
  • mysqlのスペックはCPUがcore2duo,メモリが8GB,他のサービスとしては主にapacheやphp,tomcatなどを同時稼働

結果

  • クエリの結果が表示されない。(メモリが足らない?または、クエリのキャッシュが不具合?)
  • mysqlのサービスは落ちていない。

考察

クエリの実行回数が少ない時は発生しなかったが、高負荷時にはクエリの実行結果が正しく表示されないという現象が頻発するようになった。サービスが落ちてはいないことからキャッシュ関係の設定(table_cache, query_cache_size, max_connections, thread_cache)を見直しながら試行錯誤してみたものの改善せずまた原因もわからず。

メモリを増やせば解決する問題のような、そうでもないような・・・。今で限界の8GB積んでいるから、増やすとなると次は・・・16GB?ECC機能付きのメモリは今の相場だと厳しい値段がついているような予感。それも4GB×4枚だとちょっと。

今のところは応急処置として、定期的にキャッシュクリアをすればなんとか正常にクエリ結果を返すことはわかった。しばらくはそれでもたせて、何か他に見落とした設定があるかもしれないので引き続き調査を続行。

追記

  • キャッシュクリアでは効果があまりない模様。仕方が無いので定期的にmysqlのデーモンをリスタートさせることでさらに応急処置。
  • mysqlの起動スクリプトで簡単にリスタートできることを今更ながら発見。スクリプトの場所は標準なら code>/usr/local/mysql/share/mysql/mysql.server にある。起動スクリプトの使い方は,半角スペースを空けてrestartと入力するばいい。(例:/usr/local/mysql/share/mysql/mysql.server restart)
  • このときオプションもついでに使うことができる模様。オプションを指定して起動スクリプトを実行すると設定ファイルより優先される。(例:/usr/local/mysql/share/mysql/mysql.server restart --skip-slave-start)

追記2

事態が好転しないのでmysqlの設定をもう一度見直し。

  • table_cacheの値を100→1024に大幅に増加して設定してみる。
  • key_bufferの値は控えめに1024MB→256MBに設定してみる。
  • max_connectionsも100→50に減らしてみる。
  • query_cache_sizeの値も16MB→8MBに減らす。

このあたりの設定変更をして様子をみてみる。というか,根本的に何か間違っている予感・・・。

追記3

さらに設定見直し。今度はプログラムの方にも修正を入れることにした。雑に書いていたコード部分を整備して,変数宣言など余計なものをチェックして修正することで少しでもメモリの浪費を抑える。

で,今のところはかろうじて安定してきた。

-mysql

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

関連記事

no image

Incorrect key file for table ‘./my/table.MYI’; try to repair it

MySQLのテーブルが壊れた。Incorrect keyとかCorruptとかエラーメッセージが出たのでrepairテーブルとかmyisamchkとか色々修復するべく試したがどうやっても直ってくれない …

no image

Table 'テーブル' is marked as crashed and should be repaired

データベースへ接続してsqlを実行したときに Table ‘テーブル’ is marked as crashed and should be repaired というエラーが返ってきた。エラーの内容は …

no image

ECC機能付きメモリとECC機能付きではないメモリの違い

メモリには様々な規格があるが、ECC機能が有るか無いかという違いもある。メモリのECC機能とは簡単に言うとデータのエラーをチェック・修正をする機能のことで、サーバなどの稼動に信頼性が求められるマシンに …

no image

mysqlのデータベースのテーブルから不要なフィールド(列)を削除

テーブルを再設計するために不要なフィールドを削除してみる。たしか前にフィールドを削除したときは、フィールドにインデックスが作成されている場合はフィールド削除の前にインデックスを削除しておかないとエラー …

no image

mariadbのポートを変更する

mariadbのコンフィグファイルであるmy.cnfにポートの設定を追加する。mysqldセクションとportを下記のように追加して再起動する。そしてmysqlにログインして show variabl …