2010年7月7日水曜日

第3回 AWS User Group - Japan 勉強会 で 発表します

本日開催の第3回 AWS User Group - Japan 勉強会で「AWSによるソーシャルアプリ運用事例」という題で、発表してきます。

gumiが運用しているソーシャルゲームの実際のサーバ構成やどうしてAWSを使うに至ったのかというような話をできればと思ってます。

2010年7月6日火曜日

Amazon RDS で肥大化したslow_logテーブルをクリアする方法

以前AmazonRDSでslow queryを出力するようにする方法にてRDSでslow_logを出力するように設定すると、mysqlデータベースのslow_logテーブルにログが保存されるようになるのですが、このテーブルに保存されたデータは、RDSで作成できるユーザーの権限では削除することができません。


mysql> delete from slow_log;
ERROR 1556 (HY000): You can't use locks with log tables.
mysql> truncate table slow_log;
ERROR 1044 (42000): Access denied for user 'xxxx'@'%' to database 'mysql'


このことはgeneral_logにも言えるのですが、
これに対して、Amazonから以下のストアドプロシージャが提供されています。


mysql.rds_rotate_general_log
mysql.rds_rotate_slow_log


この2つのストアドプロシージャは新規、既存のものを含めて全てのRDSインスタンスで使用可能で、以下のようにCALL文により実行できます。


CALL mysql.rds_rotate_general_log;
CALL mysql.rds_rotate_slow_log;


プロシージャの中身はこんな感じです。

mysql> show create procedure rds_rotate_slow_log \G
*************************** 1. row ***************************
Procedure: rds_rotate_slow_log
sql_mode:
Create Procedure: CREATE DEFINER=`rdsadmin`@`localhost` PROCEDURE `rds_rotate_slow_log`()
READS SQL DATA
DETERMINISTIC
BEGIN
CREATE TABLE IF NOT EXISTS mysql.slow_log2 LIKE mysql.slow_log;
DROP TABLE IF EXISTS mysql.slow_log_backup;
RENAME TABLE mysql.slow_log TO mysql.slow_log_backup, mysql.slow_log2 TO mysql.slow_log;
END
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: latin1_swedish_ci


slow_logと同じスキーマのテーブル、slow_log2を作成し、既存のslow_logテーブルをslow_log_backupに、slow_log2をslow_logにリネームするという作業を行っています。
この際、slow_log_backupテーブルがすでに存在していればDROPしているので、この関数を2回呼ぶと、1回目にバックアップしたデータはなくなってしまうので注意が必要です。

また上記の2つのプロシージャの他にKILL、KILL QUERYを実行できる以下の2つも用意されています。

mysql.rds_kill
mysql.rds_kill_query