通常バイナリログでは、now() 等は、実行時の時間を返す(POSITION毎に set timestamp=xxxxx; で設定されている)
しかしMySQL 5.0.13 以上では、sysdate() が返す値が、現在の時間になっている。
manual
(set timestamp で設定された値ではない)
この点を使用して、以下の遅延測定用表とトリガーで遅延時間を測定できる。
・マスタDBにて
# repl_delay表 作成
create table repl_delay(master_date timestamp, diff integer,id varchar(20));
insert into repl_delay values(null,0,'');
# トリガ作成
delimiter //
create trigger tr_repl_delay before update on repl_delay
for each row
begin
if NEW.master_date 0 then
set NEW.diff = sysdate() - NEW.master_date;
end if;
end//
delimiter ;
・あとは、マスタ側で測定したいタイミングで以下の SQL 文を実行するだけ。
update repl_delay set master_date = now(), diff=0,id='CP001';
・スレーブ側で見ると以下のように見える。
もし、大幅遅延で SQLが実行すらされていない場合は ID カラムの値でチェック可能。
mysql> select * from repl_delay;
+---------------------+------+-------+
| master_date | diff | id |
+---------------------+------+-------+
| 2007-03-20 12:51:47 | 2 | CP001 |
+---------------------+------+-------+
1 row in set (0.01 sec)
注意:
マスタ側で sysdate() の使用を禁じておかないと、マスタとスレーブでデータの同期が
取れなくなる可能性があるので、注意が必要。
–sysdate-is-now が設定されていると、sysdate() が now() と同じ挙動になるので、
データの不整合は防げるが、上記の方法でレプリケーションの遅延は測定できない。