作成日: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」などがあるらしいが、未調査