【問題】 Oracle 8.1.7 for Linuxが Redhat Enterprise Linux 3 にインストールできない。 【解決策と解説】 (1) http://rpm.pbone.net/ から compat-glibc-6.2-2.1.3.2.i386.rpm をダウンロードし、 root> rpm -ivh compat-glibc-6.2-2.1.3.2.i386.rpm でインストールする。 http://rpm.pbone.net/ から compat-gcc-7.3-2.96.122.i386.rpm をダウンロードし、 root> rpm -ivh compat-gcc-7.3-2.96.110.i386.rpm でインストールする。 (解説) Oracle for Linuxはインストール時に、オブジェクトのリンクを行います。 Oracleでコンパイルされたオブジェクトは、 glibc2.1以下のランタイム、gcc2.96以下のランタイムをリンクしようとしますが、 Redhat Enterprise Linux 3の glibcは 2.3.2、gccは 3.2.3で、 互換性がないので、インストール時にエラーになります そこで、glibc2.1とgcc2.96の下位互換パッケージが必要になります。 (2) compat-glibc-6.2-2.1.3.2.i386.rpmをインストールすると、 /usr/i386-glibc21-linuxというディレクトリができるが以下の操作をする。 root> mkdir /usr/i386-glibc21-linux/lib/gcc-lib root> cd /usr/lib/gcc-lib root> cp -r -p i386-redhat-linux7 /usr/i386-glibc21-linux/lib/gcc-lib root> mv i386-redhat-linux7 i386-redhat-linux7.bak root> ln -s /usr/i386-glibc21-linux/lib/gcc-lib/i386-redhat-linux7 i386-redhat-linux7 (解説) 下位互換パッケージを使っても 以下のランタイムオブジェクトをリンクしようとします。 /usr/lib/gcc-lib/i386-redhat-linux7/2.96/../../../crt1.o 下位互換パッケージを入れた状態では、これは、/usr/lib/crt1.o となり、 下位互換パッケージの crt1.o でなく、Enterprise Linux 3の crt1.o となり、 エラーになってしまいます。上記操作を行うと、 /usr/lib/gcc-lib/i386-redhat-linux7/2.96/../../../crt1.o が下位互換パッケージの crt1.o を参照するようになります。 (3) 以下でOracle用のグループとユーザーと作成します。 root> groupadd oinstall root> groupadd dba root> useradd oracle -g oinstall -G dba root> passwd orace New password: ******** Retype new password: ******** Oracleインストールユーザー用の環境変数を設定します。 oracle> vi .bash_profile ORACLE_HOME=/home/oracle/OraHome1 NLS_LANG=japanese_japan.ja16euc ORACLE_SID=ORCL export ORACLE_HOME export NLS_LANG export ORACLE_SID LD_LIBRARY_PATH=$ORACLE_HOME/lib PATH=$HOME/bin:$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH export PATH LD_ASSUME_KERNEL=2.2.5 export LD_ASSUME_KERNEL (解説) Oracle 8.1.7のインストーラーは、jre1.1.8を使っていて、 このjreが glibc21以下のランタイムを要求しますが、 Enterprise Linux 3のデフォルトではこれがロードできなくてエラーになります。 LD_ASSUME_KERNEL=2.2.5 の設定があると、glibc21以下のランタイムが使えるようになります。 (4) oracle> mkdir bin oracle> cd bin oracle> ln -s /usr/bin/gcc296 gcc oracle> vi ld echo /usr/bin/ld -m elf_i386 -L/usr/i386-glibc21-linux/lib $* /usr/bin/ld -m elf_i386 -L/usr/i386-glibc21-linux/lib $* oracle> chmod ugo+x ld (解説) Oracleのインストーラーは、オブジェクトのリンク時に、 gccコマンド、ldコマンドを使いますが、 Enterprise Linux 3のデフォルトでは上位互換がなくてエラーになります。 そこで PATH=$HOME/bin:$ORACLE_HOME/bin:$PATH として $HOME/binが優先されるようにし、 上記操作で、ほとんどの場合、下位互換 gccコマンド、下位互換 ldコマンドが 実行されるようになります。 (5) oracle> export LANG=C oracle> cd /mnt/cdrom/install/linux oracle> ./runInstaller (解説) Linuxが日本語環境だと、 Oracleのインストーラーが特定の日本語フォントを要求しますが、 Enterprise Linux 3のデフォルトではこれが見つからなくてエラーになります。 LANG=C の設定があると、Oracleのインストーラーが正常に立ち上がるようになります。 (6) インストール中、 UNIX Groupには dba を入れる。 途中、rootで $ORACLE_HOME/orainstRoot.sh の実行を要求されるので実行する。 root> cd $ORACLE_HOME root> ./orainstRoot.sh 言語選択で Japanese を追加する。 Databaseを作成: No (解説) Database作成を Yesにすると、インストール中にDatabaseを作成しようとしますが、 このプロセスが何時までたっても終了しません。Oracleのバグだそうです。 そこでDatabase作成を Noにして、インストール後に Databaseを作成するようにします。 (7) インストールの途中、リンク失敗のエラーダイアログが出ます。 $ORACLE_HOME/install/make.logを見ると原因が分かります。 /usr/bin/make -f ins_net_client.mk client_sharedlib ORACLE_HOME=/home/oracle/OraHome1 /home/oracle/OraHome1/bin/genclntsh : undefined reference to ... /usr/bin/make -f ins_sqlplus.mk install ORACLE_HOME=/home/oracle/OraHome1 /usr/bin/ld: cannot find -lclntsh (「libclntsh.so」が古い glibc をリンクしていてシンボル未解決で作成出来ず、 「libclntsh.so」をリンクしている「sqlplus」が作成できない。) 以下の編集と操作を行います。 oracle> vi $ORACLE_HOME/bin/genclntsh 修正前 LD="ld -shared -L${ORACLE_HOME}/lib" # shared library link command 修正後 LD="ld -shared -m elf_i386 -L/usr/i386-glibc21-linux/lib -L${ORACLE_HOME}/lib" # shared library link command oracle> cd $ORACLE_HOME/network/lib oracle> make -f ins_net_client.mk client_sharedlib $ORACLE_HOME/lib/libclntsh.so.8.0 が出来る。 リンク失敗のエラーダイアログで「Retry」を押す。 途中、rootで $ORACLE_HOME/root.sh の実行を要求されるので実行する。 root> cd $ORACLE_HOME root> ./root.sh Oracle Universal Installerでのインストールはここで終了。 (解説) インストール中、クライアントライブラリを、 genclntshというシェルスクリプトで作成しますが、 そのままだと、下位互換ライブラリが使われず、エラーになります。 genclntshを編集し、makeコマンドを使うと、 genclntshがクライアントライブラリを正しく作ることができます。 (8) 以下の要領でDatabaseを作成します。 oracle> dbassist グローバルデータベース名:ORCL SID: ORCL sysアカウントのパスワード: change_on_install systemアカウントのパスワード: manager 以下の要領で Oracleサーバーを起動します。 oracle> svrmgrl SVRNGR> connect internal 接続されました。 SVRMGR> startup Oracleインスタンスが起動しました。 システム・グローバル領域合計 ......バイト Fixed Size ......バイト Variable Size ......バイト Database Buffers ......バイト Redo Buffers ......バイト データベースがマウントされました。 データベースがオープンされました。 SVRMGR> exit Server Managerを終了しました。 oracle> 以下の要領でOracle Net8サービスを起動します。 oracle> lsnrctl LSNRCTL> start /home/oracle/OraHome1/bin/tnslsnrを起動しています。お待ちください... TNSLSNR for Linux: Version 8.1.7.0.0 - Production システム・パラメータ・ファイルは/home/oracle/OraHome1/network/admin/listener.oraです。 ログ・メッセージを/home/oracle/OraHome1/network/log/listener.logに書き込みました。 リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=altair)(PORT=1521))) リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC))) (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=altair)(PORT=1521)))に接続しています。 リスナーのステータス ------------------------ 別名 LISTENER バージョン TNSLSNR for Linux: Version 8.1.7.0.0 - Production 開始日 xx-xx-2005 xx:xx:xx アップ時間 0 日 0 時 0 分 0 秒 トレース・レベル off セキュリティ OFF SNMP OFF パラメータ・ファイル /home/oracle/OraHome1/network/admin/listener.ora ログ・ファイル /home/oracle/OraHome1/network/log/listener.log サービスのサマリー... ORCL には、1件のサービス・ハンドラがあります。 PLSExtProc には、1件のサービス・ハンドラがあります。 コマンドは正常に終了しました。 LSNRCTL> exit oracle> Sqlplusから接続できるか、以下の要領で確かめます。 oracle> sqlplus scott/tiger@ORCL SQL> select table_name from all_tables where owner='SCOTT'; TABLE_NAME ------------------------------------------------------------ BONUS DEPT EMP SALGRADE SQL> exit oracle> (解説) Database作成用のコマンド dbassistは使えるようですが、 Net8コンフィグレーション用コマンド netasstは使えないようです。 何時までたっても正しく起動しません。環境変数に ORACLE_SID=ORCL があると、Net8用の設定をしてくれるようなので、困りはしません。 (9) OCIサンプル rdbms/demo/*のビルドをします。 oracle> cd $ORACLE_HOME/rdbms/demo oracle> make -f demo_rdbms.mk demos そのままではエラーがでます。 以下の操作を行います。 oracle> cd ~/bin oracle> ln -s /usr/bin/gcc296 cc oracle> cd $ORACLE_HOME/rdbms/demo oracle> vi demo_rdbms.mk 修正前 LDFLAGS=-L$(LIBHOME) -L$(RDBMSLIB) INCLUDE= $(I_SYM)$(ORACLE_HOME)/rdbms/demo $(I_SYM)$(ORACLE_HOME)/rdbms/public $(I_SYM)$(ORACLE_HOME)/plsql/public $(I_SYM)$(ORACLE_HOME)/network/public 修正後 LDFLAGS=-m elf_i386 -L/usr/i386-glibc21-linux/lib -L$(LIBHOME) -L$(RDBMSLIB) INCLUDE= -I/usr/i386-glibc21-linux/include $(I_SYM)$(ORACLE_HOME)/rdbms/demo $(I_SYM)$(ORACLE_HOME)/rdbms/public $(I_SYM)$(ORACLE_HOME)/plsql/public $(I_SYM)$(ORACLE_HOME)/network/public oracle> make -f demo_rdbms.mk demos (解説) Oracleのランタイムが、 glibc2.1以下のランタイム、gcc2.96以下のランタイムをリンクするので、 サンプルもこれらのランタイムをリンクする必要があります。 demo_rdbms.mkは、gccコマンド、ldコマンド以外に ccコマンドも使用するので、 ln -s /usr/bin/gcc296 cc でccが 下位互換ライブラリのgccを使うようにします。 demo_rdbms.mkの環境変数に INCLUDE、LDFLAGSがありますが、 ここを、上記のように下位互換ライブラリを使うように修正し、makeします。 以上