ラベル oracle の投稿を表示しています。 すべての投稿を表示
ラベル oracle の投稿を表示しています。 すべての投稿を表示

2012年9月29日土曜日

Amazon EC2でOracle-XEを動かす時の注意点

先日諸般の事情で、Amazon EC2にOracle11gXEをインストールして利用する必要があったのですが、一つ困った事があったのでメモ。

■問題
インストールも簡単にでき重宝していたのですが、EC2インスタンスをStop -> Startすると外部から接続できなくなりました。

FWとかSecurity Groupとか確認したのですが問題を発見できず。
サーバにログインしておもむろにプロセスを確認すると、何と ”リスナー” が起動していないのです!

■原因&対処方法
EC2インスタンスをStop -> StartするとIPおよびホスト名が変わります。ところがOracle11gXEをインストールすると、listener.ora内にインストール時点のホスト名が埋まってしまいます。よって再起動後は前のホスト名に対してリスナーを起動しようとする為、上手くいかなります。

ホスト名を変更し、/etc/init.d/oracle-xe stop / startすると、めでたく起動できました!

■追記
↑な事をtwitterでぼやいていたら、Rails contributor仲間のyahondaさんより、「Host名を空にする」という方法を教えて頂きました。これだとインスタンス起動毎に変更しなくてよいので楽ちんです。

2012年6月24日日曜日

ActiveRecord自体のテストケースをOracleで動かす

■概要

ActiveRecord自体のテストケースは通常sqlite3/mysql/postgresqlで実行しますが、oracleで実行したくなり調べましたが少し手こずりました。手順を残しておきます。

■oracle-xeインストール準備

・swap領域が足りないので追加
# dd if=/dev/zero of=/swap.extended bs=1M count=1024
# mkswap /swap.extended
# swapon /swap.extended

# cat /proc/swaps # 確認
Filename                        Type            Size    Used    Priority
/dev/vda2                               partition       2096472 19024   -1
/swap.extended                          file            1048568 0       -2

# vim /etc/fstab # 再起動時のおまじない
...
/swap.extended          swap                    swap    defaults        0 0

■oracle関係インストール

・ここからoracle11g xeをダウンロード
  http://www.oracle.com/technetwork/database/enterprise-edition/overview/index.html

・oracle-xeインストール
# unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
# cd Disk1
# rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
# /etc/init.d/oracle-xe configure
入力は、9080(8080は他の用途で利用している...) => 1521 => パスワード => y
# /etc/init.d/oracle-xe status
・oracle clientインストール
  http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html
# rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.2.0.x86_64.rpm
■ユーザ設定
・環境変数を設定
$ vim ~/.bash_profile
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib/:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/11.2/client64/bin/:$PATH
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
$ source ~/.bash_profile
・テスト用ユーザ作成
$ sqlplus system/パスワード@localhost:1521/XE
SQL> create user arunit identified by arunit default tablespace USERS temporary tablespace TEMP;
SQL> create user arunit2 identified by arunit2 default tablespace USERS temporary tablespace TEMP;
SQL> grant connect,resource to arunit;
SQL> grant create session to arunit;
SQL> grant create synonym to arunit;
SQL> grant connect,resource to arunit2;
SQL> grant create session to arunit2;
SQL> grant create synonym to arunit2;

■gem準備

$ gem install ruby-oci8
$ git clone git://github.com/rsim/oracle-enhanced.git
$ git checkout -b rails4 origin/rails4
$ cd /home/kennyj/rails/activerecord
$ ORACLE_ENHANCED_PATH=/home/kennyj/oracle-enhanced bundle update

■テスト実行

$ ARUNIT_DB_NAME=localhost:1521/XE ARCONN=oracle \
  ORACLE_ENHANCED_PATH=/home/kennyj/oracle-enhanced \
  ruby -Itest:lib test/cases/schema_dumper_test.rb

2011年7月6日水曜日

rails on oracle (oracleで接続する手順) その2

■概要

rails on oracle でいくつかのテーマで検証してみます

●fetchループ

module FetchTest
  SQL = "select p1.* from posts p1 cross join posts p2"
  def self.run
    Post.delete_all
    200.times do |i|
      Post.create(:title => "title_#{i}", :body => "body_#{i}")
    end
    open("test.txt", "w") do |f|
      # ① Post.find_by_sql(SQL).each { |r| f.write "#{r}\r\n" }
      # ② Post.connection.raw_connection.exec(SQL) { |r| f.write "#{r}\r\n" }
    end
  end
end

FetchTest.run

上記の場合①は通常の検索処理。sqlの実行結果を全てメモリ上に展開します。
②の場合、fetchループで繰り返し処理が発生する為、"同時に必要となるメモリ"は少なくてすみます。

# それぞれ実行しながら、topコマンド等でメモリ利用状況を確認しましょう。

よって大量のcsv出力する場合は必ず②のようにする必要があります。

●DROP

railsで実装する場合、割と頻繁にDBスキーマの全削除、再作成をするかと思います(うちだけ?)。その際の機能は充実してきており、adapter内で多数のDROP文が実装されています。

但し適宜 purge recyclebin してあげないとゴミがたまりそうです。

●indexの表領域

性能向上の為、データ/インデックスを別HDDに保存する場合、データ/インデックスで表領域を分ける必要があります。oracle_enhanced_adapterは成長しており、migrationで

add_index :posts, :title, :tablespace => 'foo'

のように指定できます。

●varchar2問題

oracleのvarchar2/char2は歴史的な経緯で、"バイト単位"での長さ指定になります。
よってrailsからスキーマ作成する際は、string => nvarchar2へのマッピングを以前はしていたのですが、最近のoracle enhanced adapterは進化しています!

lib/active_record/connection_adapters/oracle_enhanced_adapter.rb によれば、nls_length_semantics というオプションがデフォルトで'CHAR'となっており、このオプションを指定する事によってvarchar2/char2を文字数単位で長さ指定出来る様になります。

よって何も考えなくても、mysql等と同じように指定できる様になりました。
実際下記の用にスキーマが出来ています。
SQL> desc posts;
 名前                     NULL?    型
 -------------------------- -------- ----------------------------
 ID                         NOT NULL NUMBER(38)
 TITLE                               VARCHAR2(255 CHAR) <= CHARで255
 BODY                                CLOB
 CREATED_AT                          DATE
 UPDATED_AT                          DATE
●oracle enhanced adapter独自項目の設定 oracle enhanced adapterには独自の設定項目があり...と思ったら良いページがありました。一部ソースを読んだ結果下記の様です。
# config/initializers/oracle.rb 等に下記内容を設置
ActiveSupport.on_load(:active_record) do
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
    # NUMBER(1)をbooleanにマッピングするか
    self.emulate_booleans = true
    # DATE型を(rubyの)Date型にマッピングするか
    self.emulate_dates = false
    # カラム名が(^|_)date(_|$)とマッチする場合Date型にマッピングするか
    self.emulate_dates_by_column_name = false
    # カラム名が(^|_)idとマッチする場合Integer型にマッピングするか
    self.emulate_integers_by_column_name = true
    # CHAR(1)かVARCHAR(1)、またはカラム名が_FLAG/_YNで終了する場合Booleanにマッピングするか
    self.emulate_booleans_from_strings = true
    # シーケンサー作成する際のオプションを指定する
    self.default_sequence_start_value = "1 NOCACHE INCREMENT BY 1"
  end
end
●雑感
ソース見て思ったのですが、oracle enhanced adapter マジで進化してます!
かなりきっちりしてる感じです(識別子30文字制限問題、in句の1000上限問題 ...etc)

2011年6月28日火曜日

rails on oracle (oracleで接続する手順) その1

■概要

railsをoracleで接続したい人はあまり多くないと聞いた & 最近の情報があまり見当たらないので、ニッチな人向けに纏めておこうと思います。

■Oracle XEのインストール

まずはサーバ側。既に何らかのOracleが存在する場合はここはパスして下さい。

・http://www.oracle.com/technetwork/database/express-edition/downloads/102xelinsoft-102048.html
ここからoracle-xe-univ-10.2.0.1-1.0.i386.rpm をダウンロード

※アカウントが必要なので先に登録して下さい。
※今日(2011/06/28)調べたらOracle XE 11.2 betaなる文字が!!

・↑をインストール

$ sudo rpm -ivh oracle-xe-univ-10.2.0.1-1.0.i386.rpm
$ sudo /etc/init.d/oracle-xe configure

↓管理アプリのポートを聞かれてます。他とバッティングする場合は変えましょう(例 9080)。
Specify the HTTP port that will be used for Oracle Application Express [8080]:

↓Oracleの待ち受けポートです。通常はdefaultのままで良いでしょう。
Specify a port that will be used for the database listener [1521]:

↓SYSとSYSTEMのパスワードをきかれてるので適当な物にしましょう。
Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:

↓OS起動時に起動するかと言われてるので、通常稼動環境ではyです。
Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:

・確認

$ sudo /etc/init.d/oracle-xe status

■Oracle Instance Clientのインストール

続いては接続側。できるだけ接続側は綺麗にしておきたいので、Oracle Instance Clientから接続しようと思います。

・http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html より対応するバージョンをダウンロード
oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.1.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.1.0-1.x86_64.rpm
をダウンロードしてみました。

・↑をインストール

$ sudo rpm -ivh oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient11.2-devel-11.2.0.1.0-1.x86_64.rpm
$ sudo rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.1.0-1.x86_64.rpm

・環境変数に下記を設定

$ vim ~/.bash_profile
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib/:$LD_LIBRARY_PATH
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
export PATH=/usr/lib/oracle/11.2/client64/bin/:$PATH

$ source ~/.bash_profile

・接続確認

$ sqlplus system/パスワード@サーバのIP:1521/XE

■railsから接続

・ruby-oci8のインストール

$ gem install ruby-oci8 -v2.0.6
(Oracle Instance Clientの場合は、LD_LIBRARY_PATHを設定しておけばコンパイルに支障が無いようです)

・rails試しに作成

$ rails new oracle_test -d oracle
$ cd oracle_test
$ vim Gemfile
ruby-oci8の辺りを↓のように記載
gem 'ruby-oci8', '~> 2.0.6'
# gem 'activerecord-oracle_enhanced-adapter', '~> 1.3.2'
gem 'activerecord-oracle_enhanced-adapter', '~> 1.3.2', :git => 'git://github.com/rsim/oracle-enhanced.git' (1.3.2以降にユーザー作成機能が追加されていますので以後はそれで実行しています)

$ bundle install
$ vim config/database.yml
development:
adapter: oracle_enhanced
database: //サーバのIP:1521/XE
username: kennyj_development
password: xxxxx

test:
adapter: oracle_enhanced
database: //サーバのIP:1521/XE
username: kennyj_test
password: xxxxx

production:
adapter: oracle_enhanced
database: //サーバのIP:1521/XE
username: kennyj_production
password: xxxxx

$ rake db:create:all (userまで作ってくれます!)
Please provide the SYSTEM password for your oracle installation
>xxxxx (development)
Please provide the SYSTEM password for your oracle installation
>xxxxx (test)
Please provide the SYSTEM password for your oracle installation
>xxxxx (production)

$ rails g scaffold Post title:string body:text (いつもの奴生成)
$ rake db:migrate
== CreatePosts: migrating ====================================================
-- create_table(:posts)
-> 0.0349s
== CreatePosts: migrated (0.0350s) ===========================================

$ rake test (test実行)

$ rails s
(ブラウザで確認)
http://localhost:3000/posts

■さらに使いやすく...

次回はもう少し濃い話題(fetchループ, nvarchar, 表領域, oracle_enhanced特有の初期設定...etc)を書ければと思います。

■雑感

oracle_enhanced異様に進化している気がする...