MySQL/MariaDBのGeneral Log: ファイルサイズを制限して、サーバーをスリムに保つ

2024-07-27

MySQL/MariaDB の general_log ファイルサイズ制限方法

そこで、本記事では、general_log ファイルサイズを制限する方法について、2 つの方法に分けて詳しく解説します。

方法 1: log_queries_on_slave 設定を使用する

この方法は、MySQL/MariaDB レプリケーション環境で有効です。レプリケーションスレーブサーバー上で general_log を有効にしつつ、ファイルサイズを制限することができます。

以下の手順に従って設定を行います。

  1. レプリケーションスレーブサーバーの設定ファイル (/etc/my.cnf など) を編集します。
  2. 以下の行を追加します。
log_queries_on_slave=LIMIT,<サイズ>

<サイズ> には、ログファイルの最大サイズをバイト単位で指定します。例えば、100MB のログファイルに制限したい場合は、104857600 と指定します。

  1. MySQL/MariaDBサーバーを再起動します。

この設定を行うと、レプリケーションスレーブサーバーは、ログファイルのサイズが <サイズ> に達すると、古いログを削除して新しいログを記録し始めます。

方法 2: log_rotate 設定を使用する

この方法は、レプリケーション環境に関わらず、すべての MySQL/MariaDBサーバーで利用できます。ログファイルを定期的に圧縮し、古いログファイルを削除することで、ファイルサイズを制限することができます。

log_rotate
log_rotate_engine=InnoDB
log_rotate_schedule=DAILY
log_rotate_size=100M
  • log_rotate_size=100M: ログファイルのサイズが 100MB に達すると、ローテートすることを示します。
  • log_rotate_schedule=DAILY: ログファイルを毎日ローテートすることを示します。
  • log_rotate_engine=InnoDB: ログファイルのエンジンを InnoDB に指定します。
  • log_rotate: この設定を有効にすることを示します。

上記以外にも、以下のオプションを設定することができます。

  • log_rotate_compress_cmd: ログファイルの圧縮に使用するコマンドを指定します。
  • log_rotate_compress: ログファイルを圧縮します。
  • log_rotate_days: 保持するログファイルの日数を指定します。

この設定を行うと、MySQL/MariaDBサーバーは、ログファイルのサイズが log_rotate_size に達すると、新しいログファイルを作成し、古いログファイルを圧縮して log_archive_dir ディレクトリに移動します。

  • ログファイルは、問題の診断やデバッグに役立ちます。ログファイルを定期的に確認することをお勧めします。
  • ログファイルを圧縮すると、ディスク容量を節約できますが、圧縮と解凍に時間がかかる場合があります。
  • ログファイルのサイズは、データベースの活動量によって異なります。必要に応じて、log_rotate_size の値を調整してください。



log_rotate
log_rotate_engine=InnoDB
log_rotate_schedule=DAILY
log_rotate_size=100M
log_rotate_days=7
log_rotate_compress
log_rotate_compress_cmd="gzip"
log_archive_dir=/var/log/mysql

このコードでは、以下の設定が行われています。

  • 圧縮されたログファイルを /var/log/mysql ディレクトリに移動します。
  • 圧縮に gzip コマンドを使用します。
  • ログファイルを圧縮します。
  • 古いログファイルを 7 日間保持します。
  • ログファイルのサイズは 100MB に達すると、ローテートします。
  • ログファイルを毎日ローテートします。

上記の設定はあくまでも例であり、必要に応じて変更することができます。

注:

  • ログファイルのローテート機能は、オペレーティングシステムによって異なる場合があります。詳細については、オペレーティングシステムのマニュアルを参照してください。
  • このコードは、MySQL/MariaDB 5.7 以降で使用できます。



この方法は、MySQL 8.0以降で使用できます。purge_old_logs パラメータを使用すると、自動的に古いログファイルを削除することができます。

purge_old_logs=ENABLE

この設定を行うと、MySQL/MariaDBサーバーは、ログファイルのサイズが max_old_log_files パラメータで指定された値に達すると、古いログファイルを削除し始めます。

方法 4: スクリプトを使用する

この方法は、より柔軟な制御が必要な場合に役立ちます。シェルスクリプトを作成して、定期的にログファイルを圧縮したり削除したりすることができます。

以下の例は、bash スクリプトを使用して、100MB 以上のログファイルを圧縮し、古いログファイルを削除する例です。

#!/bin/bash

# ログファイルのディレクトリ
log_dir=/var/log/mysql

# 圧縮するログファイルの最小サイズ (バイト)
min_size=104857600

# 古いログファイルを保持する日数
max_days=7

# 現在の時刻を取得
current_date=$(date +%Y-%m-%d)

# ログファイルのリストを取得
log_files=$(find $log_dir -type f -name "general_log.YYYY-MM-DD" | sort)

# 各ログファイルに対して処理を行う
for log_file in $log_files; do
    # ログファイルのサイズを取得
    file_size=$(stat -c%s "$log_file")

    # ログファイルのサイズが `min_size` 以上の場合は圧縮する
    if [ $file_size -ge $min_size ]; then
        # ログファイルの名前を変更する
        new_log_file="$log_file.gz"
        mv "$log_file" "$new_log_file"

        # ログファイルを圧縮する
        gzip "$new_log_file"
    fi

    # ログファイルの作成日が `max_days` 日以上前の場合は削除する
    file_date=$(basename "$log_file" | cut -d . -f 2-4)
    file_age=$(( $(date +%s -d "$current_date") - $(date +%s -d "$file_date") ))
    if [ $file_age -ge $(($max_days * 24 * 60 * 60)) ]; then
        rm "$log_file"
    fi
done

このスクリプトを定期的に実行するように、cron ジョブを設定することができます。

注意点

  • スクリプトを実行する前に、ログファイルのバックアップを取っておくことをお勧めします。

MySQL/MariaDBのgeneral_logファイルサイズを制限するには、様々な方法があります。

  • より柔軟な制御が必要な場合に役立つ方法 4: スクリプト
  • MySQL 8.0以降で使用可能な方法 3: purge_old_logs パラメータ
  • すべてのMySQL/MariaDBサーバーで利用可能な方法 2: log_rotate 設定
  • レプリケーション環境で利用可能な方法 1: log_queries_on_slave 設定

mysql mariadb



Liquibase、MySQLイベント通知、バージョン管理... あなたのプロジェクトに最適なDB スキーマ変更追跡ツールは?

データベーススキーマは、時間の経過とともに変更されることがよくあります。新しい機能を追加したり、既存の機能を改善したり、パフォーマンスを向上させたりするために、テーブルの追加、削除、変更が必要になる場合があります。このようなスキーマ変更を追跡することは、データベースの整合性と開発者の生産性を維持するために重要です。...


MySQL自動ダイアグラム生成について

MySQLの自動データベースダイアグラム生成は、MySQLデータベースの構造を視覚的に表現するためのツールや方法です。これにより、データベース設計の理解、分析、修正が容易になります。MySQL Workbench: MySQLの公式GUIツールであり、データベース設計、管理、開発に幅広く利用されます。 データベース逆エンジニアリング機能により、既存のMySQLデータベースから自動的にダイアグラムを生成できます。 関係性、データ型、制約条件などの情報を視覚化します。...


MySQL複数更新解説

MySQLでは、一つのクエリで複数の行を更新することが可能です。これを 複数更新 (Multiple Updates) と呼びます。WHERE condition: 更新する行を指定する条件式です。value1, value2, ...: 各列に設定したい新しい値です。...


MySQL ログイン情報確認方法

MySQLのユーザー名とパスワードは、データベースシステムへのアクセス権限を管理するために使用されます。これらの情報が失われた場合、データベースへのアクセスが不可能になります。一般的な方法:MySQL Workbenchの使用:MySQL Workbenchを起動します。"Admin"メニューから"Manage Connections"を選択します。接続プロファイルを選択し、プロパティをクリックします。"User"タブでユーザー名とパスワードを確認できます。...


データベース管理を賢く!開発、テスト、本番環境に合わせたMySQLとSVNの活用術

開発環境データベーススキーマのバージョン管理: SVNリポジトリにスキーマ定義ファイル(DDL)を格納し、バージョン管理を行います。変更履歴を把握し、必要に応じてロールバックすることができます。ダンプファイルによるデータ管理: 開発中のデータは、定期的にダンプファイルとしてバックアップし、SVNリポジトリとは別に管理します。ダンプファイルを用いることで、データベースの状態を特定の時点に復元することができます。...



SQL SQL SQL Amazon で見る



ストアドプロシージャ、ライブラリ、フレームワーク...MySQLでバイナリデータを扱うためのツール

TEXT:可変長の文字列型。最大65, 535バイトから4GBまで保存できます。バイナリデータだけでなく、文字列も保存できます。BLOB:可変長のバイナリデータ型。最大65, 535バイトから4GBまで保存できます。VARBINARY:可変長のバイナリデータ型。最大65


アプリケーションロジックでテーブル更新を制御する方法

MySQLトリガーは、特定のデータベース操作に対して自動的に実行されるコードです。トリガーを使用して、テーブル更新を防止するエラーをスローすることができます。例:以下の例は、usersテーブルのage列が18歳未満の場合に更新を防止するトリガーです。


データ移行ツール、クラウドサービス、オープンソースツールを使って SQL Server 2005 から MySQL へデータを移行する

このチュートリアルでは、SQL Server 2005 から MySQL へデータを移行する方法について 3 つの方法を説明します。方法 1: SQL Server Management Studio を使用方法 2: bcp コマンドを使用


INSERT INTOステートメントのIGNOREオプションでMySQL REPLACE INTOを代替

MySQLのREPLACE INTOコマンドは、SQL Server 2005では完全に同じように実装されていません。しかし、いくつかの代替方法を用いることで、同様の動作を実現することができます。REPLACE INTO とはREPLACE INTOは、INSERT INTOと似ていますが、以下の点が異なります。


MySQL データベースの性能低下

MySQL データベースのサイズが大きくなるにつれて、パフォーマンスが低下することがあります。この現象の主な原因は、以下の要因に起因します:インデックス: インデックスは、データの検索を高速化しますが、大きなデータベースではインデックスの更新も頻繁に行われ、ディスク I/O の負荷が増加します。