本日はembulkでBigQueryからRDS(Aurora)に何回もrunしたら、
DBがフェイルオーバーしました。
原因としてはRDSのgeneral_logが有効になっていたため、
大量なログにより、I/O負荷になっていたというなんとも悲しい体験をしました。
そこで、今回はgeneral_logの無効化とログ削除方法をブログします。
■general_log
・general_logの有効確認
1 2 3 4 5 6 7 |
mysql> SELECT @@GLOBAL.general_log; +----------------------+ | @@GLOBAL.general_log | +----------------------+ | 1 | +----------------------+ 1 row in set (0.01 sec)``` |
・RDSコンソール(パラメーター)
0にしましょう!
・確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
mysql> SELECT @@GLOBAL.general_log; +----------------------+ | @@GLOBAL.general_log | +----------------------+ | 0 | +----------------------+ 1 row in set (0.00 sec) mysql> select count(*) from general_log; +----------+ | count(*) | +----------+ | 301603 | +----------+ 1 row in set (2.12 sec) |
これでログが増えないことを確認すればOKです
■general_log削除
・TRUNCATE TABLE
1 2 |
mysql> TRUNCATE TABLE mysql.general_log; ERROR 1044 (42000): Access denied for user 'lancers'@'%' to database 'mysql' |
上記のようにTRUNCATEを使ってテーブル内のすべての行を抹消することはできません。
・ストアドプロシージャ一(ストアド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
mysql> show create PROCEDURE rds_rotate_general_log\G *************************** 1. row *************************** Procedure: rds_rotate_general_log sql_mode: Create Procedure: CREATE DEFINER=`rdsadmin`@`localhost` PROCEDURE `rds_rotate_general_log`() READS SQL DATA DETERMINISTIC BEGIN DECLARE sql_logging BOOLEAN; select @@sql_log_bin into sql_logging; set @@sql_log_bin=off; CREATE TABLE IF NOT EXISTS mysql.general_log2 LIKE mysql.general_log; DROP TABLE IF EXISTS mysql.general_log_backup; RENAME TABLE mysql.general_log TO mysql.general_log_backup, mysql.general_log2 TO mysql.general_log; set @@sql_log_bin=sql_logging; END character_set_client: latin1 collation_connection: latin1_swedish_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec) |
もちろんRDSにもストアドが設定されており、
複数のSQL文をまとめて名前を付けて関数のように呼び出せるようにしています。
general_logをgeneral_log_backupに退避していることも分かりますな。
・ call rds_rotate_general_log
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
mysql> select count(*) from general_log; +----------+ | count(*) | +----------+ | 301603 | +----------+ 1 row in set (2.13 sec) mysql> call rds_rotate_general_log ; Query OK, 0 rows affected (0.02 sec) mysql> select count(*) from general_log; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec) mysql> select count(*) from general_log_backup; +----------+ | count(*) | +----------+ | 301603 | +----------+ 1 row in set (2.12 sec) mysql> call rds_rotate_general_log ; Query OK, 0 rows affected (0.05 sec) mysql> select count(*) from general_log_backup; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.01 sec) |
抹消!!!
負荷なし!!!
■まとめ
@kzm0211(いなむー)パイセンにサポートしてもらいましたが、
さすがに20000レコードでRDSシャットダウンはおかしい!!これは盲点!!!
参考
http://xoxo-infra.hatenablog.com/entry/2013/03/25/151338
0件のコメント