読者です 読者をやめる 読者になる 読者になる

さくらサーバでRuby::DBIからエラーがでるようになった

tech

9/1に僕がさくらサーバを使って運営しているTooxが動かなくなってました。会社から帰ってきて調査してみたところ、どうやらRuby::DBIが使えなくなってるもよう。

  • test.rb
#!/usr/local/bin/ruby

require "dbi"
  • test.rb実行結果
/usr/local/lib/ruby/site_ruby/1.8/dbi/utils/date.rb:57: undefined method `deprecate' for DBI::Date:Class (NoMethodError)
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/dbi/utils.rb:56
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/dbi.rb:50
	from ./test.rb:3:in `require'
	from ./test.rb:3


おいおい。。。これ完全にさくらサーバの問題ですよね。というわけで、怒りを抑えつつもも調査続行。

dbi/utils/date.rbでdeprecateメソッドを使っているけど、それがないみたい。で、deprecateメソッドはdbi/columninfo.rbで[require "deprecated"]していました。
/usr/local/lib/ruby/gems/1.8/gems/deprecated-3.0.0/lib/deprecated.rbのUsageを見てみると、、、

# Usage is simple:
#
#     class Foo
#       include Deprecated
#
#       def moo
#         "cow"
#       end
#
#       deprecated :moo
#
#       def sheep
#         "baaa"
#       end
#
#       deprecated :sheep, "Sounds#baa"
#
#       protected
#
#       def bar
#         true
#       end
#
#       deprecated :bar
#     end

おい![include Deprecated]で使うってかいてあるじゃないかYO!これはおかしいと思って手元のUbuntuのdeprecated.rbを見てみることに。

  • さくらサーバ : deprecated-3.0.0
  • Ubuntu10.04 : deprecated-2.0.1

メジャーバージョンアップしてる。\(^o^)/オワタ。
(さくらサーバのdeprecated.rbの日付をみると8/30に更新されてる)


泣きそうになりながらGoogle先生に聞いてみたり、DBI::Dateをいじってみたりとしてみましたが、だめぽ。。。


そんな時、ピコーンと閃きました。
自分でDBI入れ直そうと。ということでgemを使ってホーム以下に入れました。

#dbiを入れるとdeprecatedも一緒に入る
gem install dbi --install-dir /home/hoge/gems/


[require "dbi"]したときに自分が入れたdbiとdeprecatedをロードするようにロードパスを変更しておく必要があります。

#!/usr/local/bin/ruby

$:.insert(0 , "/home/hoge/gems/gems/deprecated-2.0.1/lib" , "/home/hoge/gems/gems/dbi-0.4.5/lib")

require "dbi"


これで何とか復旧しました。


他にも誰か困っていないのかなーと思ったらこんなツイートを見つけました。


deprecated.rbを使ってるところ全体に影響でてるんだろうな。。。
さくらさん、せめて障害情報に載せてくれよ。