[groonga-dev,03489] Re: Mroonga の timestamp 型の範囲について

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 9月 10日 (木) 00:14:50 JST


須藤です。

In <20150****@domai*****>
  "[groonga-dev,03479] Re: Mroonga の timestamp 型の範囲について" on Mon, 07 Sep 2015 17:14:26 +0900,
  各務 洋 <kagam****@outwa*****> wrote:

>>> * TIMESTAMP: '1970-01-01 00:00:01' UTC から '2038-01-19 03:14:07' UTC と '0000-00-00 00:00:00'
>>> * DATETIME: '0000-01-01 00:00:00' から '9999-12-31 23:59:59'
>>> * DATE: '0000-01-01' から '9999-12-31'
>>> ※ 64bit版
> 
> -- Snip
> 
>>   https://github.com/mroonga/mroonga/edit/master/doc/source/reference/limitations.rst
>> 
>> で修正してpull requestにしてみませんか!?
>> 
>> (ムリそうなら後で私がやっておきます。)
> 
> 今回はお願いしたいです。次の機会にやってみたいと思います。

ありがとうございます。大変助かります。

今回の件について整理してみたんですが、追記する必要はないなぁ
と思いました。

というのは、システムがサポートしていれば(例えば64bitなLinux
なら)、Mroongaの方がMySQLよりも値の範囲が広いので、Mroonga
での制限より前にMySQLの制限に引っかかり、他のストレージエン
ジンと同じ値を扱えるからです。

もちろん、「0月」や「0日」といった不正な日付を扱えない、NULL
を扱えないという制限はあるのですが、それはすでに該当ドキュメ
ントに書いてあります。

なので、特に追記する必要はないと思いました。

>>> * TIMESTAMP: '1970-01-01 00:00:01' UTC から '2038-01-19 03:14:07' UTC と '0000-00-00 00:00:00'
>>> * DATETIME: '0000-01-01 00:00:00' から '9999-12-31 23:59:59'
>>> * DATE: '0000-01-01' から '9999-12-31'

ちなみに、MySQLの値の範囲は、

http://dev.mysql.com/doc/refman/5.6/ja/datetime.html

にある通り、

  * DATETIME: '1000-01-01 00:00:00' から '9999-12-31 23:59:59'
  * DATE: '1000-01-01' から '9999-12-31'

で、(システムがサポートしてれば)Mroongaはもっと広い範囲を
扱えます。

ただし、Groongaに「1900年より前はエラーにする」コードが入っ
ていたので今リリースされているGroongaでは1900年より前は扱え
ません。

が、そのチェックはいらないので削除しておきました。なので、次
のリリースのGroongaからは1000-01-01も扱えるようになります。

> あと、可能であれば他の環境についても記述があると良いと思いました。

いいとは思いますが、環境がたくさんあるので私が全部書くのは現
実的ではないです。。。
その環境で使っている人が実際に動かして確認した内容をまとめる
ならできなくはないですが。。。

> FreeBSD 版は以前の redmine に気になる点が書いてありましたので。
> 32bit版は……使うのにだいぶ覚悟が必要だと思いますが、64bit版と差がある
> ようでしたらあった方が好ましいと思います。
> 
> どうでしょうか?

どうでしょうねぇ。
32bit版を使っている人はそんなに変な値を使わないような気がす
るので必要ないような気が私はしてしまうんですけど。。。

必要な人が(私には)見えないのと、32bit環境はじきに駆逐され
ていくことを考えると(私には)そんなに頑張る必要があるように
は感じないんですよねぇ。だれかが書いてくれたなら取り込むのに
はやぶさかではないですが。。。

>> そうですね。インデックスが壊れている状況では正しい結果が返っ
>> てこなくても不思議ではありません。
> 
> これ、検知して自動修復する。というのは難しいでしょうか?
> 他にも発生するのではないかと、結構ドキドキしています。

基本的にクラッシュしてインデックスが壊れたときはロックが残留
しています。必ずロックがかかっていないはずなのにロックがかかっ
ているなら壊れている可能性があります。たとえば、MySQLを起動
していないのでロックがかかっていたら壊れている可能性がありま
す。

で、実は、grndbというツールがあって、それでインデックスが壊
れているかどうかとインデックスの復旧をできます。
  http://groonga.org/ja/docs/reference/executables/grndb.html

MySQLを起動する前に↑でチェックして必要なら復旧するというス
クリプトを仕込んでおくと自動化できます。

なお、インデックスは(元データがあるので)復旧できますが、デー
タが壊れていた場合は(元データがないので)復旧できません。バッ
クアップなどからリストアする必要があります。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




groonga-dev メーリングリストの案内
Back to archive index