サクッと終わらせるつもりが、結構時間を食われたので忘れないようにメモ?。
事の発端は MySQL レプリケーションのスレーブ側が、上手くデータを更新できなかった場合に直ぐメールを携帯に飛ばして対応できるようにしたかった。毎日スレーブ側で show slave status\G を叩くのも面倒なんで。
で、show slave status を叩いた結果で欲しい情報が以下。
- Slave_IO_State
- Slave_IO_Running
- Slave_SQL_Running
- Last_Errno
- Last_Error
まぁ、普通に外部から MySQL へアクセスして必要なデータを抜いて、指定メールアドレスへメールを送信するだけの簡単なお仕事のプログラムを作って、ローカルでもデバッグ&テスト完了。いざサーバーへ実装&動作テストをしてみたら変な現象が。
◇ホスト1
Slave_IO_State: System.Byte[]
Slave_IO_Running: System.Byte[]
Slave_SQL_Running: System.Byte[]
Last_Errno: 0
Last_Error: System.Byte[]
◇ホスト2
Slave_IO_State: System.Byte[]
Slave_IO_Running: System.Byte[]
Slave_SQL_Running: System.Byte[]
Last_Errno: 1064
Last_Error: System.Byte[]
バイト配列が帰ってくるなら仕方ない。バイト配列をキャラクター配列に変換してーって、ローカルじゃ正常動作するからデバッグが出来ない?!いや、出来るけど肝心の部分がブラックボックスっぽくなっているのでイマイチ。
肝心の部分はというと、こんなカンジ。
(一部抜粋でもソース貼り付けって恥ずかしいのね)
string slaveIORunning = reader["Slave_IO_Running"].ToString();
string slaveSQLRunning = reader["Slave_SQL_Running"].ToString();
string lastErrNo = reader["Last_Errno"].ToString();
string lastError = reader["Last_Error"].ToString();
対象のサーバー
- RedHat EL 5
- MySQL 5.0.45
に対して、
四苦八苦しても直らない。他プログラムではどうってことないのだけども。
あえて違うというと、DB User の権限?SUPER, REPLICATION CLIENT しか権限を与えていない。あとは、接続時の Database を指定していない。
で、結局のところ以下のようにソースを修正したら直った。
string slaveIORunning = reader.GetString(10);
string slaveSQLRunning = reader.GetString(11);
string lastErrNo = reader.GetString(18);
string lastError = reader.GetString(19);
期待値のメール内容はこんなカンジ。
◇ホスト1
Slave_IO_State:
Slave_IO_Running: No
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
◇ホスト2
Slave_IO_State:
Slave_IO_Running: No
Slave_SQL_Running: No
Last_Errno: 1064
Last_Error: Error ‘You have an error in your SQL syntax; ‘ (略
DNS じゃないけど、名前解決的なことができていなかったっぽい。
取り急ぎソース修正で対応できたけども……。危険な気がする。