こんにちは。よっしーです(^^)
今日は、DockerでMySQLの開発環境を構築する方法についてご紹介します。
背景
MySQLの開発環境をDockerで構築する機会があったので、そのときの内容を備忘として残しています。
この記事のベースとなっている環境については、下記の記事を御覧ください。
各種ログの設定
下記の4つのログを設定していきます。本記事では、スロークエリの発生ログについて記載しています。それ以外のログ設定は、次回の記事以降に記載していきます。
・一般クエリの実行ログ(General query log)
・スロークエリの発生ログ(Slow query log)
・バイナリログ(Binary log)
・エラーログ(Error log)
スロークエリーログ (Slow Query Log) は、MySQLサーバーにおいて実行に長い時間がかかるクエリを記録する機能です。以下に、スロークエリーログを設定する理由を説明します。
- パフォーマンスの最適化:
- スロークエリーログは、実行に時間がかかっているクエリを特定するために使用されます。これにより、パフォーマンスの低下を引き起こすクエリを特定し、最適化できます。
- 問題のトラブルシューティング:
- クエリが遅い場合、スロークエリーログは問題の特定に役立ちます。エラーやパフォーマンスの低下が発生した際に、どのクエリが原因であるかを特定できます。
- 監査とセキュリティ:
- スロークエリーログは、不正なアクセスや攻撃を検出するためにも使用されます。不審なクエリが実行された場合、ログで確認できます。
- 最適化の候補の特定:
- スロークエリーログを確認することで、最適化の候補となるクエリを見つけることができます。長時間かかっているクエリは、改善の余地がある可能性が高いです。
スロークエリーログは、デフォルトでは無効になっているため、必要に応じて有効化してください。
修正ファイル一覧
下記のファイルを作成、修正しました。ファイルの内容は次のセクションに記載しています。
new file: mysql_server/log.cnf
mysql_server/log.cnf
[mysqld]
log_output=FILE
general_log=1
general_log_file=/var/log/mysql/general.log
+ # スローログ
+ slow_query_log=1
+ slow_query_log_file=/var/log/mysql/slow_query.log
+ long_query_time=1
この設定はMySQLの スロークエリーログ (Slow Query Log) を有効にしています。以下に解説します。
- スロークエリーログとは:
- スロークエリーログは、設定された閾値を超える時間がかかってしまった遅いクエリを記録する機能です。
- 実行に長い時間がかかっている最適化の候補となるクエリを見つけるために使用されます。
- 有効化の準備:
- デフォルトではスロークエリーログは無効になっているため、ログが出力されません。
- 有効化するにはMySQLのグローバル変数
slow_query_log
をONに変更します。 - 以下のコマンドで有効化できます:
mysql> SET GLOBAL slow_query_log = 'ON'; mysql> SHOW GLOBAL variables LIKE 'slow_query_log';
- 上記のコマンドで
slow_query_log
の値がON
になっていることを確認できます。
- その他のパラメータ:
- スロークエリーログに関連する他のパラメータもあります。以下はよく使用されるものです:
long_query_time
: スロークエリーログに出力する時間の閾値を指定します。min_examined_row_limit
: スロークエリーログに出力するクエリが検査した最低行数を指定します。slow_query_log_file
: スロークエリーログが吐き出されるファイルを指定します。log_slow_admin_statements
: 管理ステートメントをログに記録するかどうかを指定します。log_queries_not_using_indexes
: インデックスを使用していないクエリを記録するかどうかを指定します。
- スロークエリーログに関連する他のパラメータもあります。以下はよく使用されるものです:
- ログの出力と確認:
- スロークエリーログが有効になった後、実行に時間がかかるクエリを実行してログを確認できます。
- ログファイルにはクエリの実行時間やテーブルをロックした時間などが記録されます。
以上の設定により、スロークエリーログが有効になり、パフォーマンスの問題を特定するのに役立ちます。
動作確認
下記のコマンドを実行します。
make build
make up
make login_mysql_server
mysql -uroot -p
Enter password: P@ssw0rd
show global variables like '%slow%' ;
下記の結果が出力されていれば成功です。
mysql> show global variables like '%slow%' ;
+-----------------------------+-------------------------------+
| Variable_name | Value |
+-----------------------------+-------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_extra | OFF |
| log_slow_replica_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /var/log/mysql/slow_query.log |
+-----------------------------+-------------------------------+
7 rows in set (0.01 sec)
下記のコマンドを実行して、先程入力したクエリーが出力されることを確認します。
-- データベースの選択
use sample;
-- テーブルの作成
CREATE TABLE `poc_slow_log` (`column` text NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 大量データの元となるデータの登録
INSERT INTO `poc_slow_log` (`column`) VALUES ('xxx'), ('xxx'), ('xxx'), ('xxx'), ('xxx'), ('xxx'), ('xxx'), ('xxx'), ('xxx'), ('xxx');
-- 大量データの登録件数の確認
SELECT COUNT(*) FROM `poc_slow_log` t1, `poc_slow_log` t2, `poc_slow_log` t3, `poc_slow_log` t4, `poc_slow_log` t5, `poc_slow_log` t6;
-- 大量データの登録
INSERT INTO `poc_slow_log` (`column`) SELECT `t1`.`column` FROM `poc_slow_log` t1, `poc_slow_log` t2, `poc_slow_log` t3, `poc_slow_log` t4, `poc_slow_log` t5, `poc_slow_log` t6;
-- スロークエリとしてログに出力されていることを確認
\! tail /var/log/mysql/slow_query.log
下記のような出力になっていれば成功です。
mysql> \! tail /var/log/mysql/slow_query.log
Time Id Command Argument
/usr/sbin/mysqld, Version: 8.1.0 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
# Time: 2024-02-25T14:21:51.107907Z
# User@Host: root[root] @ localhost [] Id: 9
# Query_time: 2.453270 Lock_time: 0.000010 Rows_sent: 0 Rows_examined: 60
use sample;
SET timestamp=1708870908;
INSERT INTO `poc_slow_log` (`column`) SELECT `t1`.`column` FROM `poc_slow_log` t1, `poc_slow_log` t2, `poc_slow_log` t3, `poc_slow_log` t4, `poc_slow_log` t5, `poc_slow_log` t6;
mysql>
おわりに
今日は、DockerでMySQLの開発環境を構築する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント