MariaDB データベースのログファイル - Amazon Relational Database Service

MariaDB データベースのログファイル

MariaDB エラーログ、スロークエリログ、一般ログをモニタリングできます。デフォルトで、MariaDB のエラーログは生成されます。DB パラメータグループにパラメータを設定することで、スロークエリログと一般ログを生成できます。Amazon RDS はすべての MariaDB ログファイルをローテーションします。各タイプの間隔は以下のとおりです。

MariaDB ログは、Amazon RDS コンソール、Amazon RDS API、Amazon RDS CLI、または AWS SDK を通じて直接モニタリングできます。また、ログをメインデータベースのデータベーステーブルに書き込み、そのテーブルに対してクエリを実行することで、MariaDB ログにアクセスできます。mysqlbinlog ユーティリティを使用して、バイナリログをダウンロードできます。

ファイルベースのデータベースログの表示、ダウンロード、モニタリングの詳細については、「Amazon RDS ログファイルのモニタリング」を参照してください。

MariaDB エラーログにアクセスする

MariaDB エラーログは <host-name>.err ファイルに書き込まれます。Amazon RDS コンソールを使用して、このファイルを表示できます。Amazon RDS API、Amazon RDS CLI、または AWS SDK を使用してログを取得することもできます。<host-name>.err ファイルは 5 分ごとにフラッシュされ、その内容は mysql-error-running.log に追加されます。その後、mysql-error-running.log ファイルは 1 時間ごとにローテーションされ、直前 24 時間内に 1 時間ごとに生成されたファイルが保持されます。各ログファイルには、それぞれ生成された時間 (UTC) がファイル名に付加されます。ログファイルには、タイムスタンプも付加され、ログエントリがいつ書き込まれたかを調べるために役立ちます。

MariaDB では、スタートアップ時、シャットダウン時、エラー検出時にのみエラーログへの書き込みが行われます。DB インスタンスでは、新しいエントリがエラーログに書き込まれないまま、数時間または数日が経過することがあります。最近のエントリがない場合、それは、サーバーにログエントリになるエラーが発生しなかったためです。

MariaDB のスロークエリと一般ログにアクセスする

MariaDB のスロークエリログと一般ログは、DB パラメータグループのパラメータを設定することで、ファイルまたはデータベーステーブルに書き込むことができます。DB パラメータグループの作成と変更の詳細については、「「パラメータグループを使用する」 」を参照してください。Amazon RDS コンソール、Amazon RDS API、AWS CLI、または AWS SDK を使用して、スロークエリログまたは一般ログを表示する前に、以下のパラメータを設定する必要があります。

以下のリストに示すパラメータを使用して MariaDB のログ記録を制御できます。

  • slow_query_log または log_slow_query: スロークエリログを作成するには、1 に設定します。デフォルトは 0 です。

  • general_log: 一般ログを作成するには、1 に設定します。デフォルトは 0 です。

  • long_query_time または log_slow_query_time: 高速で実行されるクエリがスロークエリログに記録されないようにするために、ログに記録されるクエリの最短実行時間の値を秒単位で指定します。デフォルトは 10 秒で、最小値は 0 です。log_output = FILE の場合は、マイクロ秒の精度になるように、浮動小数点値を指定できます。log_output = TABLE の場合は、秒の精度になるように、整数値を指定する必要があります。実行時間が long_query_time または log_slow_query_time の値を超えたクエリのみがログに記録されます。例えば、long_query_time または log_slow_query_time を 0.1 に設定すると、実行時間が 100 ミリ秒未満のすべてのクエリはログに記録されなくなります。

  • log_queries_not_using_indexes: インデックスを使用しないすべてのクエリをスロークエリログに記録するには、このパラメータを 1 に設定します。デフォルトは 0 です。インデックスを使用しないクエリは、その実行時間が long_query_time パラメータの値未満であってもログに記録されます。

  • log_output option: log_output パラメータに指定できるオプションは、次のとおりです。

    • TABLE (デフォルト) - 一般クエリを mysql.general_log テーブルに、スロークエリを mysql.slow_log テーブルに書き込みます。

    • FILE - 一般クエリログとスロークエリログの両方をファイルシステムに書き込みます。ログファイルは 1 時間ごとにローテーションされます。

    • NONE - ログ記録を無効にします。

ログ記録が有効になっている場合、Amazon RDS は、テーブルログのローテーションまたはログファイルの削除を定期的に実行します。これは、ログファイルが大きくなることでデータベースが使用できなくなったりパフォーマンスに影響する可能性を低く抑えるための予防措置です。ログ記録の FILE オプションと TABLE オプションでは、ローテーションと削除が次のように行われます。

  • FILE ログ記録が有効になっている場合、ログファイルの検査が 1 時間ごとに実行され、作成後 24 時間を超えた古いログファイルは削除されます。場合によっては、削除後の残りのログファイルの合計サイズが、DB インスタンスに割り当てられた領域のしきい値である 2 % を超えることがあります。この場合、ログファイルのサイズがしきい値以下になるまで、最も大きいログファイルから順に削除されます。

  • TABLE ロギングを有効化すると、24 時間ごとにログテーブルのローテーションが実行される場合があります。このログテーブルのローテーションは、テーブルログに使用されている領域が、割り当てられたストレージ領域の 20 % を超えると、実行されます。結合されたすべてのログのサイズが 10 GB を超える場合にも発生します。DB インスタンスに使用されている領域が、DB インスタンスに割り当てられたストレージ領域の 90% を超えている場合は、ログのローテーションを実行するためのしきい値が小さくなります。テーブルログに使用されている領域が、割り当てられたストレージ領域の 10% を超えると、ログテーブルのローテーションが実行されます。結合されたすべてのログのサイズが 5 GB を超えると、ログはローテーションされます。

    ログテーブルのローテーションが実行されると、現在のログテーブルがバックアップのログテーブルにコピーされ、現在のログテーブル内にあるエントリは削除されます。バックアップのログテーブルが既に存在する場合は、現在のログテーブルをバックアップにコピーする前に、削除されます。バックアップのログテーブルは、必要に応じて照会することができます。mysql.general_log テーブルに対するバックアップのログテーブルは、mysql.general_log_backup という名前になります。mysql.slow_log テーブルに対するバックアップのログテーブルは、mysql.slow_log_backup という名前になります。

    mysql.general_log テーブルのローテーションは、mysql.rds_rotate_general_log プロシージャを呼び出すことで実行できます。mysql.slow_log テーブルのローテーションは、mysql.rds_rotate_slow_log プロシージャを呼び出すことで実行できます。

    データベースバージョンのアップグレード時にも、テーブルログのローテーションが実行されます。

Amazon RDS では、TABLE ログおよび FILE ログのローテーションが Amazon RDS イベントで記録され、ユーザーに通知が送信されます。

Amazon RDS コンソール、Amazon RDS API、Amazon RDS CLI、または AWS SDK からログを使用するには、log_output パラメータを FILE に設定します。MariaDB エラーログと同様、これらのログファイルは 1 時間ごとにローテーションされます。直前 24 時間以内に生成されたログファイルが保持されます。

スロークエリと一般ログの詳細については、MariaDB のドキュメントの以下のトピックを参照してください。

MariaDB ログを Amazon CloudWatch Logs に発行する

MariaDB DB インスタンスを設定して、ログデータを Amazon CloudWatch Logs のロググループに発行することができます。CloudWatch Logs を使用すると、ログデータのリアルタイム分析や、CloudWatch を使用したアラームの作成、メトリクスの表示を行うことができます。CloudWatch Logs を使用して、耐久性の高いストレージにログレコードを格納できます。

Amazon RDS は、各 MariaDB データベースログを、ロググループの別個のデータストリーミングとして発行します。例えば、エクスポート関数を設定して、スロークエリログを含んでいるとします。次に、スロークエリデータは、/aws/rds/instance/my_instance/slowquery ロググループのスロークエリログストリームに保存されます。

エラーログはデフォルトで有効になります。他の MariaDB ログの要件の概要を次の表に示します。

ログ 要件

監査ログ

DB インスタンスは、MARIADB_AUDIT_PLUGIN オプションを指定したカスタムオプショングループを使用する必要があります。

全般ログ

DB インスタンスは、パラメータ設定 general_log = 1 を指定して一般ログを有効にしたカスタムパラメータグループを使用する必要があります。

スロークエリログ

DB インスタンスは、パラメータ設定 slow_query_log = 1 または log_slow_query = 1 を指定してスロークエリログを有効にしたカスタムパラメータグループを使用する必要があります。

ログ出力

DB インスタンスは、パラメータ設定 log_output = FILE を指定してログをファイルシステムに書き込み、CloudWatch Logs に発行するカスタムパラメータグループを使用する必要があります。

コンソールから CloudWatch Logs に MariaDB ログを発行するには
  1. Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、[データベース] を選択し、変更する DB インスタンスを選択します。

  3. [Modify] を選択します。

  4. [ログのエクスポート] セクションで、CloudWatch Logs に公開するログを選択します。

  5. [続行] を選択し、概要ページで [Modify DB Instance] (DB インスタンスの変更) を選択します。

MariaDB ログは、AWS CLI を使用して発行することができます。以下のパラメータを使用して、modify-db-instance コマンドを呼び出せます。

  • --db-instance-identifier

  • --cloudwatch-logs-export-configuration

注記

--cloudwatch-logs-export-configuration オプションへの変更は常に DB インスタンスに即時適用されます。それで、--apply-immediately--no-apply-immediately オプションは効果がありません。

以下の AWS CLI コマンドを呼び出すことで MariaDB ログを発行することもできます。

以下のオプションを使用して、この AWS CLI コマンドの 1 つを実行します。

  • --db-instance-identifier

  • --enable-cloudwatch-logs-exports

  • --db-instance-class

  • --engine

実行する AWS CLI コマンドに応じて、他のオプションが必要となる場合があります。

次の例では、ログファイルが CloudWatch Logs に発行されるよう既存の MariaDB DB インスタンスを変更します。--cloudwatch-logs-export-configuration 値は JSON オブジェクトです。このオブジェクトのキーは EnableLogTypes であり、値は auditerrorgeneral、および slowquery を任意に組み合わせた文字列の配列です。

Linux、macOS、Unix の場合:

aws rds modify-db-instance \ --db-instance-identifier mydbinstance \ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["audit","error","general","slowquery"]}'

Windows の場合:

aws rds modify-db-instance ^ --db-instance-identifier mydbinstance ^ --cloudwatch-logs-export-configuration '{"EnableLogTypes":["audit","error","general","slowquery"]}'

次のコマンドでは、MariaDB DB インスタンスを作成してログファイルを CloudWatch Logs に発行します。--enable-cloudwatch-logs-exports 値は、JSON 形式の文字列の配列です。この文字列は auditerrorgeneral および slowquery の任意の組み合わせです。

Linux、macOS、Unix の場合:

aws rds create-db-instance \ --db-instance-identifier mydbinstance \ --enable-cloudwatch-logs-exports '["audit","error","general","slowquery"]' \ --db-instance-class db.m4.large \ --engine mariadb

Windows の場合:

aws rds create-db-instance ^ --db-instance-identifier mydbinstance ^ --enable-cloudwatch-logs-exports '["audit","error","general","slowquery"]' ^ --db-instance-class db.m4.large ^ --engine mariadb

MariaDB ログは、RDS API を使用して発行することができます。以下のパラメータを指定して ModifyDBInstance オペレーションを呼び出します。

  • DBInstanceIdentifier

  • CloudwatchLogsExportConfiguration

注記

CloudwatchLogsExportConfiguration パラメータへの変更は常に DB インスタンスに即時適用されます。それで、ApplyImmediately パラメータは効果がありません。

以下の RDS API オペレーションを呼び出すことで MariaDB ログを発行することもできます。

以下のパラメータでこの RDS API オペレーションの 1 つを実行します。

  • DBInstanceIdentifier

  • EnableCloudwatchLogsExports

  • Engine

  • DBInstanceClass

実行する AWS CLI コマンドに応じて、他のパラメータが必要となる場合があります。

ログファイルのサイズ

MariaDB のスロークエリログ、エラーログ、一般ログファイルのサイズは、DB インスタンスに割り当てられたストレージ領域の 2 パーセント以下に制約されます。このしきい値を維持するために、ログは 1 時間ごとに自動的にローテーションされ、24 時間以上前の古いログファイルは削除されます。古いログファイルを削除した後、ログファイルの合計サイズがしきい値を超えている場合、ログファイルのサイズがしきい値以下になるまで、最も大きいログファイルから順に削除されます。

テーブルベースの MariaDB ログを管理する

DB インスタンスのテーブルに一般ログとスロークエリログを移動できます。そのためには、DB パラメータグループを作成し、log_output サーバーパラメータを TABLE に設定します。その後、一般クエリは mysql.general_log テーブルに記録され、スロークエリは mysql.slow_log テーブルに記録されます。それらのテーブルに対してクエリを実行することでログの情報にアクセスできます。このログ記録を有効にすると、データベースに書き込まれるデータの量が増え、パフォーマンスが低下することがあります。

一般ログもスロークエリログもデフォルトで無効になっています。テーブルへのログ記録を有効にするには、以下のサーバーパラメータを 1 に設定する必要もあります。

  • general_log

  • slow_query_log、または log_slow_query

ログテーブルは、それぞれのログ記録アクティビティのパラメータを 0 にリセットしてログ記録をオフにするまで、拡大し続けます。大量のデータが長期にわたって蓄積されることがよくあり、割り当てストレージ領域の大部分を使い果たすことがあります。Amazon RDS では、ログテーブルを切り詰めることはできませんが、その内容を移動することはできます。テーブルのローテーションにより、その内容がバックアップテーブルに保存され、新しい空のログテーブルが作成されます。以下のコマンドラインプロシージャを使用して、ログテーブルを手動でローテーションされることができます。ここで表示されている PROMPT> はコマンドプロンプトです。

PROMPT> CALL mysql.rds_rotate_slow_log; PROMPT> CALL mysql.rds_rotate_general_log;

以前のデータを完全に削除し、ディスク領域を再利用するには、該当するプロシージャを 2 回連続で呼び出します。

バイナリログ記録形式

Amazon RDS の MariaDB は行ベースステートメントベース、および混合のバイナリログ記録形式をサポートしています。デフォルトのバイナリログ形式は混合です。さまざまな MariaDB のバイナリログ形式の詳細については、MariaDB ドキュメントの「バイナリログ形式」を参照してください。

レプリケーションを使用する予定の場合は、バイナリログ形式が重要です。これは、ソースに記録されてレプリケーションターゲットに送信されるデータ変更記録が決定されるからです。レプリケーションのさまざまなバイナリログ記録のメリットとデメリットについては、MySQL ドキュメントの「ステートメントベースおよび行ベースレプリケーションのメリットとデメリット」を参照してください。

重要

バイナリログ形式を行ベースに設定すると、バイナリログファイルが巨大になることがあります。巨大なバイナリログファイルにより、DB インスタンスの使用可能なストレージの量が減ります。また、DB インスタンスの復元オペレーションの実行にかかる時間が長くなることがあります。

ステートメントベースのレプリケーションは、ソース DB インスタンスとリードレプリカの間の不整合の原因になります。詳細については、MariaDB ドキュメントの「Unsafe Statements for Statement-based Replication」を参照してください。

MariaDB バイナリログ形式を設定するには
  1. AWS Management Console にサインインし、Amazon RDS コンソール (https://console.aws.amazon.com/rds/) を開きます。

  2. ナビゲーションペインで、[パラメータグループ] を選択します。

  3. 変更する DB インスタンスに使用されているパラメータグループを選択します。

    デフォルトのパラメータグループを変更することはできません。DB インスタンスがデフォルトのパラメータグループを使用している場合、新しいパラメータグループを作成し DB インスタンスと関連付けます。

    DB パラメータグループの詳細については、「「パラメータグループを使用する」 」を参照してください。

  4. [Parameter group actions (パラメータグループのアクション)] で、[編集] を選択します。

  5. binlog_format パラメータを、選択したバイナリログ記録形式 (ROWSTATEMENT、または MIXED) に設定します。

  6. [変更の保存] を選択して、更新を DB パラメータグループに保存します。

MariaDB バイナリログにアクセスする

mysqlbinlog ユーティリティを使用して、バイナリログをテキスト形式で MariaDB DB インスタンスからダウンロードできます。バイナリログは、お使いのコンピュータにダウンロードされます。mysqlbinlog ユーティリティの使用の詳細については、MariaDB ドキュメントの「mysqlbinlog を使用する」を参照してください。

Amazon RDS インスタンスに対して mysqlbinlog ユーティリティを実行するには、以下のオプションを使用します。

  • --read-from-remote-server オプションを指定します。

  • --host: インスタンスのエンドポイントからの DNS 名を指定します。

  • --port: インスタンスによって使用されるポートを指定します。

  • --user: レプリケーションスレーブアクセス許可を付与された MariaDB ユーザーを指定します。

  • --password: ユーザーのパスワードを指定するか、パスワード値を省略します。省略した場合、ユーティリティによってパスワードの入力を求められます。

  • --result-file: 出力を受け取るローカルファイルを指定します。

  • 1 つ以上のバイナリログファイルの名前を指定します。使用可能なログのリストを取得するには、SQL コマンド SHOW BINARY LOGS を使用します。

mysqlbinlog オプションの詳細については、MariaDB ドキュメントの「mysqlbinlog オプション」を参照してください。

以下に例を示します。

Linux、macOS、Unix の場合:

mysqlbinlog \ --read-from-remote-server \ --host=mariadbinstance1.1234abcd.region.rds.amazonaws.com \ --port=3306 \ --user ReplUser \ --password <password> \ --result-file=/tmp/binlog.txt

Windows の場合:

mysqlbinlog ^ --read-from-remote-server ^ --host=mariadbinstance1.1234abcd.region.rds.amazonaws.com ^ --port=3306 ^ --user ReplUser ^ --password <password> ^ --result-file=/tmp/binlog.txt

Amazon RDS では、通常、バイナリログはできる限り早く消去されます。ただし、バイナリログは、mysqlbinlog によってアクセスされるインスタンスで引き続き使用可能である必要があります。RDS がバイナリログを保持する時間数を指定するには、mysql.rds_set_configuration ストアドプロシージャを使用します。ログをダウンロードするのに十分な期間を指定してください。保持期間を設定したら、DB インスタンスのストレージ使用状況をモニタリングして、保持されたバイナリログに必要以上の容量が使用されないようにします。

以下の例では、保持期間を 1 日に設定しています。

call mysql.rds_set_configuration('binlog retention hours', 24);

現在の設定を表示するには、mysql.rds_show_configuration ストアドプロシージャを使用します。

call mysql.rds_show_configuration;

バイナリログの注釈

MariaDB DB インスタンスでは、Annotate_rows イベントを使用して列イベントを引き起こした SQL クエリのコピーで行イベントに注釈を追加できます。この方法では、RDS for MySQL DB インスタンスの binlog_rows_query_log_events パラメータを有効にするのと同様の機能を提供します。

カスタムパラメータグループを作成し binlog_annotate_row_events パラメータを 1 に設定することで、バイナリログの注釈をグローバルに有効にすることができます。SET SESSION binlog_annotate_row_events = 1 を呼び出すことで、セッションレベルで注釈を有効化することもできます。バイナリログがレプリカインスタンスで有効になっている場合は、replicate_annotate_row_events を使用してバイナリログの注釈をレプリカインスタンスにレプリケートします。これらの設定に特別な権限を使用する必要はありません。

次に MariaDB での行ベースの処理の例を示します。行ベースログの使用は、トランザクションの分離レベルをコミット済み読み取りに設定することで起動されます。

CREATE DATABASE IF NOT EXISTS test; USE test; CREATE TABLE square(x INT PRIMARY KEY, y INT NOT NULL) ENGINE = InnoDB; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; BEGIN INSERT INTO square(x, y) VALUES(5, 5 * 5); COMMIT;

注釈なしのトランザクションのバイナリログエントリは次のようになります。

BEGIN /*!*/; # at 1163 # at 1209 #150922 7:55:57 server id 1855786460 end_log_pos 1209 Table_map: `test`.`square` mapped to number 76 #150922 7:55:57 server id 1855786460 end_log_pos 1247 Write_rows: table id 76 flags: STMT_END_F ### INSERT INTO `test`.`square` ### SET ### @1=5 ### @2=25 # at 1247 #150922 7:56:01 server id 1855786460 end_log_pos 1274 Xid = 62 COMMIT/*!*/;

次のステートメントでは、同じのトランザクションのセッションレベルの注釈を有効にし、トランザクションをコミットした後に無効にしています。

CREATE DATABASE IF NOT EXISTS test; USE test; CREATE TABLE square(x INT PRIMARY KEY, y INT NOT NULL) ENGINE = InnoDB; SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SET SESSION binlog_annotate_row_events = 1; BEGIN; INSERT INTO square(x, y) VALUES(5, 5 * 5); COMMIT; SET SESSION binlog_annotate_row_events = 0;

注釈ありのトランザクションのバイナリログエントリは次のようになります。

BEGIN /*!*/; # at 423 # at 483 # at 529 #150922 8:04:24 server id 1855786460 end_log_pos 483 Annotate_rows: #Q> INSERT INTO square(x, y) VALUES(5, 5 * 5) #150922 8:04:24 server id 1855786460 end_log_pos 529 Table_map: `test`.`square` mapped to number 76 #150922 8:04:24 server id 1855786460 end_log_pos 567 Write_rows: table id 76 flags: STMT_END_F ### INSERT INTO `test`.`square` ### SET ### @1=5 ### @2=25 # at 567 #150922 8:04:26 server id 1855786460 end_log_pos 594 Xid = 88 COMMIT/*!*/;