こんにちは。よっしーです(^^)
今日は、DockerでMySQLの開発環境を構築する方法についてご紹介します。
背景
MySQLの開発環境をDockerで構築する機会があったので、そのときの内容を備忘として残しています。
この記事のベースとなっている環境については、下記の記事を御覧ください。
各種ログの設定
下記の4つのログを設定していきます。本記事では、一般クエリの実行ログについて記載しています。それ以外のログ設定は、次回の記事以降に記載していきます。
・一般クエリの実行ログ(General query log)
・スロークエリの発生ログ(Slow query log)
・バイナリログ(Binary log)
・エラーログ(Error log)
一般クエリログ (General query log) は、MySQLサーバーに対するクライアントからの接続や接続解除の情報、そしてクライアントから実行されたすべてのSQLクエリを記録するログです。以下に、このログを設定する理由を説明します。
- トラブルシューティング:
- クエリログは、エラーや問題が発生した際に、正確にどのSQLが実行されたかを把握するのに役立ちます。特定のエラーが発生した場合、該当するクエリを調査できます。
- パフォーマンスの最適化:
- クエリログを分析することで、特定のクエリが遅い場合やリソースを消費している場合を特定できます。これにより、パフォーマンスの問題を特定し、最適化できます。
- セキュリティ:
- クエリログは、不正なアクセスや攻撃を検出するためにも使用されます。例えば、不正なクエリが実行された場合、それをログで確認できます。
- 監査とコンプライアンス:
- 一般クエリログは、データベースの操作履歴を記録するため、監査やコンプライアンス要件を満たすのに役立ちます。
一般クエリログは、MySQLの初期設定では出力されないため、設定ファイル (my.cnfまたはmy.ini) で有効にする必要があります。
修正ファイル一覧
下記のファイルを作成、修正しました。ファイルの内容は次のセクションに記載しています。
modified: mysql_server/Dockerfile
new file: mysql_server/log.cnf
mysql_server/Dockerfile
FROM mysql:8.1
+ADD log.cnf /etc/mysql/conf.d/log.cnf
+RUN chmod 644 /etc/mysql/conf.d/log.cnf
このコードは Dockerfile 内でMySQLのコンテナイメージを拡張しています。以下に解説します。
FROM mysql:8.1
: この行はベースとなるMySQLの公式コンテナイメージを指定しています。バージョン8.1のMySQLイメージを使用しています。このイメージはDocker Hubから取得されます。ADD log.cnf /etc/mysql/conf.d/log.cnf
: この行は、ホストマシンからコンテナ内の/etc/mysql/conf.d/
ディレクトリにlog.cnf
ファイルをコピーしています。このファイルはMySQLの設定ファイルであり、カスタムのログ設定を提供するために使用されます。RUN chmod 644 /etc/mysql/conf.d/log.cnf
: この行は、コンテナ内のlog.cnf
ファイルのアクセス権を変更しています。具体的には、644のパーミッションを設定しています。これにより、ファイルは読み取り可能な状態になります。
簡潔に言えば、このコードはMySQLコンテナにカスタムのログ設定を追加しています。設定ファイル log.cnf
は /etc/mysql/conf.d/
ディレクトリに配置され、読み取り専用のアクセス権が付与されています。
mysql_server/log.cnf
[mysqld]
log_output=FILE
general_log=1
general_log_file=/var/log/mysql/general.log
この設定ファイルはMySQLのログ設定をカスタマイズしています。以下に解説します。
[mysqld]
: この行はMySQLの設定ファイル内で、mysqld
セクションを指定しています。mysqld
セクションはMySQLサーバーの設定を制御します。log_output=FILE
: この行はログの出力方法を指定しています。FILE
はファイルにログを書き込むことを意味します。つまり、MySQLはログをファイルに記録します。general_log=1
: この行は一般的なクエリログを有効にしています。値1
はログを有効にすることを示します。general_log_file=/var/log/mysql/general.log
: この行は一般的なクエリログのファイルパスを指定しています。ログは/var/log/mysql/general.log
ファイルに書き込まれます。
簡潔に言えば、この設定ファイルはMySQLサーバーのクエリログをファイルに記録するためのものです。
動作確認
下記のコマンドを実行します。
make build
make up
make login_mysql_server
mysql -uroot -p
Enter password: P@ssw0rd
show global variables like '%general_log%' ;
下記の結果が出力されていれば成功です。
mysql> show global variables like '%general_log%' ;
+------------------+----------------------------+
| Variable_name | Value |
+------------------+----------------------------+
| general_log | ON |
| general_log_file | /var/log/mysql/general.log |
+------------------+----------------------------+
下記のコマンドを実行して、先程入力したクエリーが出力されることを確認します。
mysql> \! tail /var/log/mysql/general.log
`END_LSN` BIGINT NOT NULL COMMENT 'LSN after the last block in the file.',
`SIZE_IN_BYTES` BIGINT NOT NULL COMMENT 'Size of the file (in bytes).',
`IS_FULL` TINYINT NOT NULL COMMENT '1 iff file has no free space inside.',
`CONSUMER_LEVEL` INT NOT NULL COMMENT 'All redo log consumers registered on smaller levels than this value, have already consumed this file.'
)engine = 'performance_schema'
2024-02-25T12:59:21.398263Z 8 Connect root@localhost on show global variables like '%general_log%' using Socket
2024-02-25T12:59:21.398329Z 8 Connect Access denied for user 'root'@'localhost' (using password: YES)
2024-02-25T12:59:40.434411Z 9 Connect root@localhost on using Socket
2024-02-25T12:59:40.435990Z 9 Query select @@version_comment limit 1
2024-02-25T12:59:45.696337Z 9 Query show global variables like '%general_log%'
mysql>
おわりに
今日は、DockerでMySQLの開発環境を構築する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント