PostgreSQLのレプリケーション時のCURRENT_TIMESTAMPの挙動について教えてください。


http://www.kunitake.org/chalow/2008-09-11-1.html
上の記事によると、MySQLではnow()はレプリケーションセーフであるがsysdate()はレプリケーションセーフでないと書かれてします。

PostgreSQLではどうなのでしょうか?
知りたいのは、now()やCURRENT_TIMESTAMPが、マスタとレプリケーションで必ず同じ値になるかどうかです。
よろしくお願いします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2012/02/09 12:25:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント100pt

同じ値になるという理解で合ってると思います。
PostgreSQLのレプリケーションはSQLより低レベルなWALと呼ばれる書き込みログベースでのレプリケーションなので異なったデータが入ることは無いはずです。

SQLのクエリレベルでのレプリケーションだとスレーブ側で評価が行われて値が異なってしまう危険性がありますが、PostgreSQLのレプリケーションではnow()やCURRENT_TIMESTAMPの値解決はマスタ側で行われて、その結果の静的な値が書き込まれるというログがレプリケーションされ、スレーブ側でその書き込みログを再生してデータ同期するイメージです。

http://www.postgresql.jp/document/current/html/wal.html

他5件のコメントを見る
id:DQNEO

ご丁寧にありがとうございます。
WALベースだとTimeStampが同値になるかという点について、マニュアルのどこを見ても明示的には書かれていなかったのですが、もしかして常識(もしくは、WALの仕組みからして当然のことと帰結される)なのでしょうか。。。

だとしたら私の勉強不足ですね。

2012/02/03 23:20:56
id:DQNEO

たしかに、もしWALのtimestampがログ読み取り時に評価されるとしたら、クラッシュ後のリカバリしたときにtimestampがリカバリ時の時間になってしまい、リカバリにならないですね。
よってWALには時間の直値がかかれてある、としか考えようがないですね。

2012/02/03 23:27:27
  • id:DQNEO
    http://suzuki.tdiary.net/20110813.html
    こちらを見ると、 now()はレプリケーションセーフであるように読み取れます。

    しかし、公式マニュアルには記載がないような気がします。
  • id:DQNEO
    MySQLのマニュアルでは明示的に書かれてありますね。

    http://dev.mysql.com/doc/refman/5.1/ja/replication-features-functions.html

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません