web-dev-qa-db-ja.com

AWS RDS MySQL /スロークエリログ

システムでスロークエリを分析しようとしていますが、「スロークエリログ」を有効にする必要があると読みました。AmazonWeb ServiceのRDSでホストされているMySQLのインスタンスを使用しているときに、このログをどのように表示できるのか知りたいです。

7
Philip Isaacs

遅いログテーブルがあることをご存知ですか?それは_mysql.slow_log_と呼ばれます:

_mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
       Table: slow_log
Create Table: CREATE TABLE `slow_log` (
  `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `user_Host` mediumtext NOT NULL,
  `query_time` time NOT NULL,
  `lock_time` time NOT NULL,
  `rows_sent` int(11) NOT NULL,
  `rows_examined` int(11) NOT NULL,
  `db` varchar(512) NOT NULL,
  `last_insert_id` int(11) NOT NULL,
  `insert_id` int(11) NOT NULL,
  `server_id` int(10) unsigned NOT NULL,
  `sql_text` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.01 sec)

mysql>
_

Mysql.slow_logで遅いクエリの記録を開始するには、アクティブ化する必要がある2つの変数があります。

ここに状況があります

_mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | TABLE |
+---------------+-------+
1 row in set (0.01 sec)

mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
1 row in set (0.01 sec)

mysql>
_

log_output はすでにデフォルトでTABLEになっています。 slow_query_log を有効にする必要があります。これはあなたがしなければならないことです:

RDSインスタンスにDBパラメータグループがない場合...

  1. DBパラメータグループを使用するAmazonRDS MySQLインスタンスを起動します。
  2. Slow_query_logを1に設定して、DBパラメータグループを編集します。
  3. DBインスタンスを再起動します

RDSインスタンスにDBパラメータグループがある場合...

  1. Slow_query_logを1に設定して、DBパラメータグループを編集します。
  2. DBインスタンスを再起動します

インスタンスが再起動したら、mysqlにログインしてこのクエリを実行します

_mysql> SELECT SLEEP(15);
_

long_query_time のデフォルトは10秒なので、クエリSELECT SLEEP(15);は_mysql.slow_log_に表示されます。 RDSのドキュメントを読んで、表に制限があるかどうかを確認してください。

警告

これは公平な警告です。 _mysql.slow_log_はCSVファイルです。テーブルにはキーがありません。テーブルにクエリを実行できますが、テーブル全体のスキャンを実行します。次のことができると便利です。

_ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
_

次に、日付と時刻の範囲を非常に高速に照会できます。私はこれを実行しようとしました、そして私はこれを得ます:

_mysql> ALTER TABLE mysql.slow_log ENGINE=MyISAM;
ERROR 1044 (42000): Access denied for user 'lwdba'@'%' to database 'mysql'
mysql>
_

RDSドキュメントをチェックして、Amazonがこれを実行できるかどうかを確認してください。

試してみる !!!

10
RolandoMySQLDBA

テーブルを別のdbの新しいテーブルにコピーして、新しいものをMyISAMにすることもできます。

create table my_slow_logs as select * from mysql.slow_log;
alter table my_slow_logs engine=MyISAM;

(その後select from my_slow_logs...

Amazon RDSでは、MySQLデータベースの外部でこれを行う限り、これを許可します。

1
tom