WindowsからRubyでLinux上のMySQLにアクセス

色々調べてアクセスに成功したのでメモ。

サーバー環境: Vine Linux 4.2、MySQL 5.0.27-0vl6
クライアント環境: WindwsXP SP3、Ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]

RubyはOne-Click Ruby Installerでインストールしたもの。

MySQLサーバーのアクセス設定

まず、Linuxにログインし、MySQLサーバーにアクセス権を設定しておく

$ mysql -u [MySQLユーザー名] -p
mysql> grant all privileges on [データベース名].* to [ユーザー名]@'192.168.0.xxx';
mysql> flush privileges;

[MySQLユーザー名]はMySQLの設定を変更する権限のあるユーザー名(rootとか)。[ユーザー名]はクライアントからアクセスするときにRuby-MySQLに渡すユーザー名。'192.168.0.xxx'にはクライアントのIPアドレス。

クライアントにRuby-MySQLライブラリをインストール

RubyMySQLサーバーに接続するために、MySQLライブラリを使う。
MySQLライブラリはGemでインストールできる。

C:\> gem install mysql

場合によっては複数の選択肢から選ばなければならないらしいが、自分の環境では選択肢は無く、しかもRDocの処理でエラーが出た。けど、さしあたり問題なく動作している。

クライアントにlibmysql.dllをインストール

libmysql.dllをRubyのパスの通った場所(\ruby\binなど)に置いておく必要がある。libmysql.dllはぐぐってダウンロードする。

アクセスしてみる

MySQLサーバーにアクセスしてテーブルの中身を全て表示するRubyスクリプトは次のようになる。

require 'mysql'

SERVER_IP = "[サーバーのIPアドレス]"
USER_NAME = "[ユーザー名]"  # <- MySQLにgrantでアクセスを許可したユーザー名
PASSWORD = "[データベースパスワード]"
DATABASE_NAME = "[データベース名]"
TABLE_NAME = "[テーブル名]"

begin
  # 接続
  my = Mysql::new(SERVER_IP, USER_NAME, PASSWORD, DATABASE_NAME)
  
  # 送信するSQL文の文字コードがShift-JISであることを知らせておく
  # これをしないと結果の文字コードが変になる
  my.query("set names sjis")

  # テーブルの要素を全て取得
  res = my.query("select * from #{TABLE_NAME}")
  
  # 結果を表示
  res.each do |col|
    col.each do |item|
      puts item
    end
  end
resucue
  puts $!     # エラーを表示
end


参考:
http://vm.selfip.com/20061127-1238_52.html
mysql4.02のサーバで外部からのアクセスを許可する設定の仕方を… - 人力検索はてな