mySQL レコード挿入時にログ出力したい(TRIGGER)

一番したいのは開発時に標準出力で確認しながら…なんだけど、コッチは挫折

作成日:2024-05-08, 更新日:2024-05-08

トリガーの作成

# トリガー名の設定
CREATE TRIGGER after_insert_your_table

# 対象テーブルとイベントの設定: 「INSERT」以外だと「update」「delete」もOK / 「AFTER」以外だと「BEFORE」もOK
AFTER INSERT ON your_table

# アクション(出力先の設定)
FOR EACH ROW
BEGIN
  # insertしているけど、updateやdeleteなど他のクエリでもOK
  INSERT INTO audit_log (operation, table_name, record_id, record_data, timestamp)
  VALUES ('INSERT', 'your_table', NEW.id, NEW.some_column, NOW());
END;

※insertとupdateの両方を設定したいときは、個別に設定する必要があるっぽい

トリガーの確認

設定したトリガーを確認する場合、INFORMATION_SCHEMA.TRIGGERSを見れば良いらしい

テーブルを指定

SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_STATEMENT, ACTION_TIMING
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_NAME = 'after_insert_your_table';

データベース(スキーマ?)を指定

SELECT TRIGGER_NAME, EVENT_MANIPULATION, EVENT_OBJECT_TABLE, ACTION_STATEMENT, ACTION_TIMING
FROM INFORMATION_SCHEMA.TRIGGERS
WHERE TRIGGER_SCHEMA = 'your_database';

トリガーの変更・削除

トリガーの変更

変更はできないらしい。削除して、再度登録…という流れらしい

トリガーの削除

DROP TRIGGER IF EXISTS your_database.after_insert_your_table;

監視

一番やりたかったことは「tail -f xxx.log」とかでログを監視するようにDBでも監視したかった…
監視自体は可能だけど、いろいろな意味合いで面倒そうなので諦める

メモ: MySQL Binlog(バイナリログ)

以下、必要になったら再調査

「my.cnf」に追加 or 修正

[mysqld]
log-bin=mysql-bin

※「my.cnf」にもともとある記述を修正するのか、新規で追加するのかは不明

バイナリログの内容を標準出力

mysqlbinlog -R --stop-never mysql-bin.000001 | grep "INSERT INTO"

※「mysql-bin.000001」が固定なのか、どこかで設定しているのか、それとも任意の名称なのかは不明

メモ: python

▼コレで動くのか不明。必要なら中身は要確認

import pymysql
import time

def check_new_records():
    # MySQLへの接続
    conn = pymysql.connect(
        host='localhost',
        user='your_user',
        password='your_password',
        database='your_database'
    )

    try:
        with conn.cursor() as cursor:
            # 直近のレコードを取得するクエリ
            query = """
            SELECT record_data FROM audit_log
            WHERE timestamp >= NOW() - INTERVAL 10 SECOND
            """
            cursor.execute(query)
            results = cursor.fetchall()

            for result in results:
                print("New record:", result)
    finally:
        conn.close()

# 監視ループ
while True:
    check_new_records()
    time.sleep(10)

メモ: ログ監視ツール

「MySQL Enterprise Monitor」「Nagios」「Zabbix」「Prometheus」「Grafana」などがあるらしいが、未調査