MySQL入門:DockerでMySQL環境を構築する -Vol.2-

スポンサーリンク
MySQL入門:DockerでMySQL環境を構築する -Vol.2- 環境構築
MySQL入門:DockerでMySQL環境を構築する -Vol.2-
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、DockerでMySQLの開発環境を構築する方法についてご紹介します。

スポンサーリンク

背景

MySQLの開発環境をDockerで構築する機会があったので、そのときの内容を備忘として残しています。

この記事のベースとなっている環境については、下記の記事を御覧ください。

各種ログの設定

下記の4つのログを設定していきます。本記事では、一般クエリの実行ログについて記載しています。それ以外のログ設定は、次回の記事以降に記載していきます。

・一般クエリの実行ログ(General query log)
・スロークエリの発生ログ(Slow query log)
・バイナリログ(Binary log)
・エラーログ(Error log)

一般クエリログ (General query log) は、MySQLサーバーに対するクライアントからの接続や接続解除の情報、そしてクライアントから実行されたすべてのSQLクエリを記録するログです。以下に、このログを設定する理由を説明します。

  1. トラブルシューティング:
    • クエリログは、エラーや問題が発生した際に、正確にどのSQLが実行されたかを把握するのに役立ちます。特定のエラーが発生した場合、該当するクエリを調査できます。
  2. パフォーマンスの最適化:
    • クエリログを分析することで、特定のクエリが遅い場合やリソースを消費している場合を特定できます。これにより、パフォーマンスの問題を特定し、最適化できます。
  3. セキュリティ:
    • クエリログは、不正なアクセスや攻撃を検出するためにも使用されます。例えば、不正なクエリが実行された場合、それをログで確認できます。
  4. 監査とコンプライアンス:
    • 一般クエリログは、データベースの操作履歴を記録するため、監査やコンプライアンス要件を満たすのに役立ちます。

一般クエリログは、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のコンテナイメージを拡張しています。以下に解説します。

  1. FROM mysql:8.1: この行はベースとなるMySQLの公式コンテナイメージを指定しています。バージョン8.1のMySQLイメージを使用しています。このイメージはDocker Hubから取得されます。
  2. ADD log.cnf /etc/mysql/conf.d/log.cnf: この行は、ホストマシンからコンテナ内の /etc/mysql/conf.d/ ディレクトリに log.cnf ファイルをコピーしています。このファイルはMySQLの設定ファイルであり、カスタムのログ設定を提供するために使用されます。
  3. 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のログ設定をカスタマイズしています。以下に解説します。

  1. [mysqld]: この行はMySQLの設定ファイル内で、mysqld セクションを指定しています。mysqld セクションはMySQLサーバーの設定を制御します。
  2. log_output=FILE: この行はログの出力方法を指定しています。FILE はファイルにログを書き込むことを意味します。つまり、MySQLはログをファイルに記録します。
  3. general_log=1: この行は一般的なクエリログを有効にしています。値 1 はログを有効にすることを示します。
  4. 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の開発環境を構築する方法についてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました