- PR -

MySQL 4.0 でのうるう秒(閏秒)の扱い

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/09/10
投稿数: 33
投稿日時: 2008-11-06 11:18
MySQL 4.0 の Timestamp, Datetime にうるう秒(2009/01/01 08:59:60)がセットされると何か問題が発生したりするものなのでしょうか?
もし、発生するのであれば、バージョンを上げるなどで対応できたりするものなのでしょうか?
もし、ご存知の方がいるようでしたら、ご教授ください。

以上です。

[ メッセージ編集済み 編集者: 未記入 編集日時 2008-11-06 15:29 ]
marun
常連さん
会議室デビュー日: 2007/07/19
投稿数: 22
投稿日時: 2008-11-06 14:28
※MySQLについては知識がないので回答ではないですが参考になればと思い投稿します
Timestamp, Datetimeはシステム時刻からアプリケーションが取ってきてますか?
かなり多くのOS環境では(乱暴な言い方ですが)、OS自体が
 うるう秒2009/01/01 08:59:60が到来しても
 NTPのうるう秒フラグ(これも乱暴な言い方ですが)を無視するため
 2009/01/01 09:00:00となります。
 すなわち標準時刻08:59:60にはアプリケーションがシステム時刻を
 取得すると2009/01/01 09:00:00が返ります。
 つまりOSのシステム時刻が実時刻より1秒進みますが
 08:59:60を意識する必要はミドルウェア含めアプリケーション側にはない状態です。
 ご利用の環境は本当に08:59:60を意識するべき環境か、確認されては
 いかがでしょうか。(確認済みだったら、ごめんなさい。)
 また前回のうるう秒は2006/01/01にも発生していますので
 前回経験されたはずの、あなたの周囲の方に質問することもお勧めします。
未記入
常連さん
会議室デビュー日: 2004/09/10
投稿数: 33
投稿日時: 2008-11-06 14:42
marun さん、返答ありがとうございます。

調査対象の環境は Windows, Solaris です。
で、調べてみますと、Windows はうるう秒に未対応なので気にする必要はないのですが、Solaris 8, 9, 10 は対応しているようなので、08:59:60 がセットされるのか、09:00:00 がセットされるのか気になった次第です。

ちなみに、INSERT INTO datatbl(time) VALUES ('2009-01-01 08:59:60'); (time は timestamp です。)とセットし、データを見ると 00000000000000 となりました。

未記入
常連さん
会議室デビュー日: 2004/09/10
投稿数: 33
投稿日時: 2008-11-06 17:03
Solaris などうるう秒に対応しているOSで MySQL の CURRENT_TIMESTAMP などを実行するとどうなるか分かりませんが、JDBC などを使用している場合には、クエリーに変換した時に 08:59:60 とさえ、なっていなければ問題ないようです。
marun
常連さん
会議室デビュー日: 2007/07/19
投稿数: 22
投稿日時: 2008-11-07 18:22
※直接の回答でなく蛇足になってしまいますがご容赦ください
もし、回避策がなければ
システム時刻が08:59:60となるSolaris側のntpクライアントを
当該時間帯は停止する運用にされてはいかがでしょうか。
不特定多数のSolarisが存在するシステムだと、無理かもしれませんが。
(私が担当するシステムだとサーバー数台×10顧客程度なんで
本番稼動後にそういった要件が判明したらそれで回避してしまうと思います(^^);)
未記入
常連さん
会議室デビュー日: 2004/09/10
投稿数: 33
投稿日時: 2008-11-07 19:25
marun さん、返答ありがとうございます。

>システム時刻が08:59:60となるSolaris側のntpクライアントを当該時間帯は停止する運用にされてはいかがでしょうか。

なるほど。回避策がないなら、そのような方法しかないですよね。
ただ、自分たちはシステムを運用する側ではないので、その方法だと提案するくらいしかできません。

結局、自分たちのアプリケーションの場合は、使用している JDBC ドライバから setTimestamp() でその時刻の Timestamp をセットしても、08:59:60 とはならず、09:00:00 となったので、大丈夫だろうと判断しました。ただ、今後、CURRENT_TIMESTAMP を使おうと思っていたので、CURRENT_TIMESTAMP が 08:59:60 を返すのかどうかを調べる必要はありますが。。。
1

スキルアップ/キャリアアップ(JOB@IT)