2013/05/10

CentOS6にOracle 11g XEを入れてPerlで繋いだ覚書き

久しぶりにOracleを触る機会というか仕事があり、前にいれた10g XE使うかと思ったら、そのサーバを解約した時にOracleXEは移転させていなかったので、結局11g XEを新たに入れ直す事にしました。Oracleは頻繁に触れる事がないので、だいたい10g XEと同じような感じかなぁと思いながらもあれこれ試行錯誤しながらやったことの覚書きを作っておく事にしました。

ちなみに、Oracle Databaseはたとえ法人であっても気楽に買える値段ではないのですが、XE(Express Edition)なら、いくつかの機能的制限があるだけで無償で使えます。

ダウンロード

Oracle Database 11g XE他関連ツールやライブラリをダウンロードするには、Oracleのアカウントを作ってログインする必要があるので予め作っておきます。

今回はCentOS6(64ビット)に入れる事にしました。

いるもの

ドキュメントにも書いていますが、追加でglibc, libaio, gcc, binutilsを入れる必要があります。僕が試した時はbcも必要でした。あとswapが2GB必要なので、swapのないVPSではインストールは出来ません。あと、64ビット環境でないとやはりインストールはできません。
# rpm -hiv oracle-xe-11.2.0-1.0.x86_64.rpm  ⏎
Preparing...                ########################################### [100%]
package oracle-xe-11.2.0-1.0.x86_64 is intended for a x86_64 architecture
パッケージ名がx86_64とあるので、当然と言えば当然ですが、32ビット版は提供されていないようですので、64ビットOSを用意せんとあきません。

インストール

ダウンロードしたZipを開けるとrpmが入っているので、インストールは簡単です。
# cd /usr/local/src ⏎
# unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip ⏎
Archive:  oracle-xe-11.2.0-1.0.x86_64.rpm.zip
   creating: Disk1/
   creating: Disk1/upgrade/
  inflating: Disk1/upgrade/gen_inst.sql  
   creating: Disk1/response/
  inflating: Disk1/response/xe.rsp   
  inflating: Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm  
# cd Disk1/ ⏎
# rpm -hiv oracle-xe-11.2.0-1.0.x86_64.rpm ⏎
Preparing...                ########################################### [100%]
   1:oracle-xe              ########################################### [100%]
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.
出てきたメッセージの最後にconfigureやれって書いてますので、その通りに実行します。 この操作によって、/etc/sysconfig/oracle-xeというファイルが作られます。Redhat系Linuxの文化に従った位置に入ったので安心です。
# /etc/init.d/oracle-xe configure ⏎
Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express 
Edition.  The following questions will determine whether the database should 
be starting upon system boot, the ports it will use, and the passwords that 
will be used for database accounts.  Press  to accept the defaults. 
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:Specify a port that will be used for the database listener [1521]: ⏎

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: パスワードを入れるConfirm the password: パスワードを入れる(再)Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]: ⏎

Starting Oracle Net Listener...Done
Configuring database...Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.
インストールと設定(configure)が終わったら、Oracle XEが起動します。プロセスをみるとこんな感じです。
# ps axuw |grep oracle ⏎
oracle    1739  0.0  1.3 217376 13424 ?        Ssl  15:48   0:00 /u01/app/oracle/product/11.2.0/xe/bin/tnslsnr LISTENER -inherit
oracle    2041  0.0  2.0 624876 21388 ?        Ss   15:50   0:00 xe_pmon_XE
oracle    2043  0.0  1.4 622600 14320 ?        Ss   15:50   0:00 xe_psp0_XE
...沢山、20個ぐらい。
oracle    2121  0.0  2.3 624140 23976 ?        Ss   15:50   0:00 xe_qmnc_XE
oracle    2135  0.2  4.4 629328 45792 ?        Ss   15:50   0:00 xe_cjq0_XE
oracle    2169  0.0  3.5 624216 36108 ?        Ss   15:50   0:00 xe_q000_XE
oracle    2171  0.0  1.6 622604 17264 ?        Ss   15:50   0:00 xe_q001_XE
root      2173  0.0  0.0 103232   828 pts/0    R+   15:52   0:00 grep oracle
プロセスをみてわかりますが、インストール先が/u01/app/oracleoracle というユーザが作成されています。/u01ディレクトリのおかげで/u[TAB]で/usrが補完されなく なってなかなか忌忌しいところです。MySQL 5.6の設定ファイルが/usr/my.cnfに入るよりはマシですが、「俺だけは特別」という雰囲気が感じられるディレクトリです。
# du -sh /u01/ ⏎
1.7G /u01/
インストール先のディスク1.5GB以上と書いてあるので、やはりそれなりの容量です。

下準備

特にこれと言ってないのですが、oracleユーザに必要な環境変数をログインした時に設定されるよう、.bashrcを準備しておきます。
# su - oracle ⏎
$ pwd ⏎
/u01/app/oracle
$ cp /etc/skel/.bash_profile ./ ⏎
$ vi ./bashrc
Oracleで必要な環境変数は、oracleユーザの$HOME以下にあるproduct/11.2.0/xe/bin/oracle_env.shを実行すると設定されます。表示される文字のエンコード(NLS_LANG)は、実行した後でUTF8に設定しています。

sqlplusで繋いでみる

Oracle Databaseのコマンドラインクライアントであるsqlplusが$ORACLE_HOME/binに入っていますので、それを使って繋いでみます。
$ sqlplus / as sysdba ⏎
SQL*Plus: Release 11.2.0.2.0 Production on 火 5月 5 16:15:20 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。

SQL> 

ユーザを作ってみる

繋がったので、ユーザ作ったり、テーブル作ったり、いろいろやります。
$ sqlplus / as sysdba ⏎
SQL*Plus: Release 11.2.0.2.0 Production on 火 5月 5 16:15:20 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。

SQL> CREATE USER shironeko IDENTIFIED BY whitecat; ⏎
ユーザーが作成されました。

SQL> 
SQL> SELECT username, default_tablespace FROM dba_users; ⏎

USERNAME                       DEFAULT_TABLESPACE
------------------------------ ------------------------------
SYS                            SYSTEM
SYSTEM                         SYSTEM
ANONYMOUS                      SYSAUX
SHIRONEKO                      USERS
APEX_PUBLIC_USER               SYSTEM
APEX_040000                    SYSAUX
...

SQL> GRANT connect, resource TO shironeko;
ユーザ名shironekoでパスワードがwhitecatでユーザ作ってみました。 そのあとGRANTで白猫に権限を与えています。 で、今作った白猫で接続してみます。
$ sqlplus shironeko/whitecat ⏎
...
ホスト名とか省略しないで繋いでみる
$ sqlplus shironeko/whitecat@127.0.0.1:1521/XE ⏎

SQL> 
Oracleデータベースのリスナーが1521番ポートでListenしていて、データベース名はXEです。

Oracle XEの制限事項に、1サーバ1データベースまでというのがあります。細かくは試してないのですが、データベースもXEという名前で固定っぽいです。また何個CPUが乗っているサーバであっても1個しか使われないそうです。

テーブルも作る

猫のデータを格納するテーブルを作ります。
SQL> CREATE TABLE CATS ( ⏎
  2  CATID      NUMBER NOT NULL UNIQUE, ⏎
  3  NAME       VARCHAR2(127) DEFAULT 'mi-chan', ⏎
  4  KIND       VARCHAR2(127), ⏎
  5  COLOR      VARCHAR2(63), ⏎
  6  BIRTHDAY   DATE ); ⏎

表が作成されました。

SQL> DESC CATS; ⏎
 名前                     NULL?    型
 ----------------------- -------- ----------------------------
 CATID                   NOT NULL NUMBER
 NAME                             VARCHAR2(127)
 KIND                             VARCHAR2(127)
 COLOR                            VARCHAR2(63)
 BIRTHDAY                         DATE

SQL> INSERT INTO CATS VALUES(1,'Hikonyan','Yoi-nyanko','White','2006/01/01' ); ⏎
1行が作成されました。

SQL> INSERT INTO CATS VALUES(2,'Mi-chan','Mikeneko','White,Black,Red','2009/04/09' ); ⏎
1行が作成されました。

sqlplusの表示は(10gの時もそうでしたが)、mysqlやpsqlのように表示幅をいい感じに調整してくれないっぽいので、 少しでも見やすくなるように幅を調整してからSELECTします。
SQL> set linesize 512 ⏎
SQL> column NAME format a12 ⏎
SQL> column KIND format a12 ⏎
SQL> column COLOR format a16 ⏎
SQL> SELECT * FROM CATS ⏎

     CATID NAME         KIND         COLOR            BIRTHDAY
---------- ------------ ------------ ---------------- ---------
         1 Hikonyan     Yoi-nyanko   White            06-01-01
         2 Mi-chan      Mikeneko     White,Black,Red  09-04-09

猫の誕生日をいれるBIRTHDAYカラムはDATE型で作っているのですが、その表示形式は NSL_DATE_FORMAT を変える事で調整できます。
SQL> set linesize 512 ⏎
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS'; ⏎
SQL> SELECT * FROM CATS ⏎
     CATID NAME         KIND         COLOR            BIRTHDAY
---------- ------------ ------------ ---------------- -------------------
         1 Hikonyan     Yoi-nyanko   White            2006/01/01 00:00:00
         2 Mi-chan      Mikeneko     White,Black,Red  2009/04/09 00:00:00

Perlモジュールを入れる

データベースを便利に使うにはPerlが必須です。なのでDBD::Oracleを入れてPerlから接続できるか どうか、そのあたりもやっておきます。
# source /u01/app/oracle/.bashrc ⏎
# /usr/local/bin/cpanm DBI DBD::Oracle ⏎
--> Working on DBI
Fetching http://www.cpan.org/authors/id/T/TI/TIMB/DBI-1.623.tar.gz ... OK
Configuring DBI-1.623 ... OK
Building and testing DBI-1.623 ... OK
Successfully installed DBI-1.623
--> Working on DBD::Oracle
Fetching http://www.cpan.org/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.56.tar.gz ... OK
Configuring DBD-Oracle-1.56 ... OK
Building and testing DBD-Oracle-1.56 ... OK
Successfully installed DBD-Oracle-1.56
2 distributions installed
ORACLE_HOMEとか必要な環境変数を読み込んで、cpanmで入れるだけです。DBD::Oracleがうまいこと入ったら、下記のようなスクリプトで 接続テストをしました。


# perl ./connect-oracle-xe.pl ⏎
$VAR1 = {
          'COLOR' => 'White',
          'NAME' => 'Hikonyan',
          'BIRTHDAY' => '2006/01/01 00:00:00',
          'KIND' => 'Yoi-nyanko',
          'CATID' => '1'
        };
$VAR1 = {
          'COLOR' => 'White,Black,Red',
          'NAME' => 'Mi-chan',
          'BIRTHDAY' => '2009/04/09 00:00:00',
          'KIND' => 'Mikeneko',
          'CATID' => '2'
        };

0 件のコメント:

コメントを投稿