バイナリログにデータを書き込まずに、トリガまたはストアドプロシージャを使用してテーブルにローを挿入しようとしています。これは可能ですか?通常の接続では、接続のバイナリロギングを無効にするようにSQL_LOG_BIN=0
を設定できますが、そのトリガで動作するようにはできませんでした。フェデレーションエンジンのテーブルでこれを行う方法があれば、それもOKです。バイナリログに書き込むことなくトリガを実行
編集:私は、MySQLプロンプトからプロシージャを呼び出すことでレコードを挿入
CREATE PROCEDURE nolog_insert(`id` INT, `data` blob)
BEGIN
SET SESSION SQL_LOG_BIN = 0;
INSERT INTO `table` (`id`, `data`) VALUES (id, data);
SET SESSION SQL_LOG_BIN = 1;
END
:
私はほとんどのストアドプロシージャを経由して、これを達成することができます
call nolog_insert(50, 'notlogged');
として、レコード(50, 'notlogged')
はtable
に挿入されますが、バイナリには書き込まれませんログ。
ただし、この手順をトリガーから実行したいとします。トリガを使用する場合、以下のように:
create trigger my_trigger before insert on blackhole_table for each row call nolog_insert(new.id, new.data);
データの両方table
に挿入され、バイナリログに書き込まれます。
ほとんどのDBMSは、トランザクションがロールバックされた場合の変更を追跡するためにログを使用し、ログに書き込まずに何かが失敗した場合、そのロールバック機能が壊れています。私はこれがMySQLに当てはまるかどうかはわかりませんが、それはIMOを気にするものです。 –
ええ、私はその意味を認識しています。それはMyISAMによってサポートされ、トランザクションはとにかく使用されません。インサートは決して失敗しないはずです。 (ストアドプロシージャは、MySQLレプリケーションの制限を回避するために、システムの一部として使用されています。) – alberge
挿入に失敗しただけではなく、問題です。これは、トランザクション中の挿入(IOW、トランザクションの整合性が損なわれているため、トランザクションの開始から失敗のポイントまでの間の何かを元に戻すことはできません)の間の操作です。あなたは現在トランザクションを使用していないかもしれませんが、将来そのトランザクションが変更され、トリガーの変更が間に合わない場合はどうなりますか? –