ある日突然、EC2からRDSへのアクセスがブロックされるようになった。
error: 'Host 'hogehoge.compute.internal' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts''
どうやら、コネクションエラーが多数発生したため、当該インスタンスからの接続のみを拒否している模様。
unblock with 'mysqladmin flush-hosts''
と書いてあるので、以下のようなコマンドで復活しました。
mysqladmin -h hogehoge.rds.amazonaws.com -P 3306 -u username --password=hogehoge flush-hosts
一瞬はまったのはブロックされているインスタンスから flush-hosts を発行しても拒否されるということです。
(当然なのでしょうが。。。)
RDSに接続できる別のインスタンス(マシン)から flush-hosts を発行する必要があります。
また、コネクションエラーになった根本原因を取り除いておかないと再発の可能性があります。
- (void)viewDidAppear:(BOOL)animated
{
timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(someSelector) userInfo:nil repeats:YES] ;
}
といった感じでタイマーをセットしたが、viewが表示されても一向に someSelector が呼ばれない。
viewController の呼び出し場所によっては、同じコードでも呼ばれるときがある。
調べた結果以下のようにメインスレッドでタイマーをセットすると呼ばれるようになりました。
- (void)startTimer
{
timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(someSelector) userInfo:nil repeats:YES] ;
}
- (void)viewDidAppear:(BOOL)animated
{
[self performSelectorOnMainThread:@selector(startTimer) withObject:nil waitUntilDone:NO] ;
}