モノノフ日記

普通の日記です

MySQL ユーザコンファレンス 2008 - MySQL トラブルシューティング概要

本日、MySQL ユーザコンファレンス 2008に参加してきました。
13:00〜13:50のJ-1セッション「MySQL トラブルシューティング概要」のまとめです。
スライド進むペースがめちゃ速かったのでメモ書き風になってます。

開発目標

  1. 安定性
  2. パフォーマンス

トラブルシューティング3種の神器

  • エラーログ
    • 標準出力のリダイレクト
    • /datadir/hostname.err
  • 各種SHOWコマンド
  • perror
    • OSエラーの意味を表示する
それ以外のツール
  • 各種ログ
    • スロークエリログ、バイナリログ、OSのログ
  • デバッガ
  • DTrace
    • 動作確認
  • xVM/VMware
  • gcc

レプリケーション

  • I/OスレッドとSQLスレッドは非同期
SQLスレッドが停止の原因
  • メモリ不足
    • 各種バッファに割り当てるメモリが足りてない
  • スレーブ上のテーブルを更新
  • バイナリログ欠損
    • マスター上で失われた情報はどこにもない
    • 全て再セットアップ
    • 対象のテーブルが分かればマスター上でdump/restore
  • その他の一時的なエラー
SET GLOBALSQL_SLAVE_SKIP_COUNTER = N;
START SLAVE;
I/Oスレッドが停止
  • ネットワークエラー
    • max_allowed_packetを増やす
    • マスターとスレーブで値を合わせる
  • ユーザがログインできない
    • エラーログを調査
  • server_idが被ってないか?
スレーブの遅延
  • 長時間かかるクエリはないか?
    • クエリ完了時にバイナリログに記録
  • スレーブの負荷チェック
  • ネットワーク帯域
レプリケーショントラブル対策
  • バイナリログの欠損を防ぐ
sync_binlog = 1
  • I/Oのオーバーヘッドが増えるので速度が犠牲になる
  • マスターは安定重視の設定がおすすめ
innodb_flush_logs_at_trx_commit = 1
  • テンポラリテーブルは使わない
    • tmpテーブル作成後にSQLスレッドが停止すると、再セットアップが必要
  • マスターとスレーブ間でコネクションバッファは同じ程度に設定
  • スレーブは複数用意する
    • バイナリログを有効に
log_slave_updates = on

クラッシュ

  • SIGSEGVが起こるケース
    • MySQLのバグ
      • 特定のクエリで発生するパターンも
    • OSのバグ
    • ハードウェアの故障
  • Linuxの場合はスタックトレースが表示
  • コアファイル
    • core-fileオプションが必要

MySQLサーバが起動しない

  • 情報源はエラーログ
    • 繰り返しクラッシュが発生していないか?
    • InnoDBのリカバリが完了しているか?
    • ファイルシステムがFULLではないか?
    • 設定のチェック
      • typoが一番多い

テーブルコラプション - MyISAM

なぜ起こる?
復旧手順
  1. CHECK TABLE / REPAIR TABLE
  2. mysqlcheck
  3. myisamcheck
    • MySQLが稼働してないときに
  4. テーブルの再作成
予防策は?
  • ない
    • だからバックアップ運用をしましょう

テーブルコラプション - InnoDB

  • 修復する機能はない
    • テーブルスペースとログファイルの不整合が起こる場合が多い
復旧方法
  1. innodb_force_recovery = 4 or 6
  2. mysqldump
  3. DROP
  4. option解除
  5. restore
対策
innodb_flush_log_at_trx_commit = 1
innodb_doublewrite

デッドロック

Out of Memory

  • 32bitバージョンのプログラムはもう使わない
    • 論理アドレス枯渇によってよく起こる
    • RSSが1GBでも起こる
    • Linuxでは3GBまで、Windowsでは2GBまで
  • バッファ割り当て過ぎ

Sort Aborted

  • ソートバッファを割り当てるためのメモリが足りない

Aborted Connections

  • クライアント終了前にmysql_close()を忘れてる
  • クライアントのタイムアウト
  • ネットワーク周りの問題

Table is full

  • ストレージエンジンごとに対応が異なる
MyISAM
  • 内部ポインタサイズが小さすぎるとき
InnoDB
  • テーブルスペースを使い切り

ログインできない

  • そもそもパスワードが違う
    • --skip-grant-tablesでrootパスワードもリセット可

文字化け

リストア

  • Bug #33057
  • 移行元と移行先で設定が違いすぎないように
  • 時間の見積もり
    • リストアはバックアップより時間がかかる
  • それでもなんとか早く
    • バイナリログの無効化
skip_doublewrite = 0
innodb_flush_log_at_trx_commit = 0

MySQL Enterprise Monitor

MySQL Clusterのトラブル

データノードのクラッシュ
  • ノードの再起動
    • initial restart

ワンポイントアドバイス

  • 仕様を理解する
  • 自分でやってみる
  • ソースコードを読む
  • OSに詳しくなる