2017年4月8日土曜日

ubuntu 上の oracle 12cにjava で接続確認

ubuntu 上のoracle12c へ java プログラムから接続確認する。




1.サンプルプログラム
import java.sql.*;

class sample01 {
  public void tblslt() throws Exception {
    String user = "scott";
    String pass = "tiger";
    String server = "localhost";
    String sid = "orcl";

    Connection conn = null;
    Statement  stmt = null;
    ResultSet  rset = null;

    Class.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManager.getConnection(
           "jdbc:oracle:thin:@" + server + ":1521:" + sid,user,pass);
    stmt = conn.createStatement();
    rset = stmt.executeQuery("select deptno,dname,loc from dept");
    while(rset.next()) {
      System.out.printf("deptno = [%s]\n",rset.getString(1));
      System.out.printf("dname  = [%s]\n",rset.getString(2));
      System.out.printf("loc    = [%s]\n",rset.getString(3));
    }
    conn.close();
  }

  public static void main(String args[]) throws Exception {
    sample01 obj = new sample01();
    obj.tblslt();
  }
}
2.コンパイルと実行
$ ls -l
合計 8
-rw-rw-r-- 1 inst12c inst12c 902  3月 29 16:03 sample01.java
$ javac sample01.java 
$ ls -l
合計 16
-rw-r--r-- 1 inst12c ibst12c 1763  3月 29 16:04 sample01.class
-rw-rw-r-- 1 ibst12c ibst12c  902  3月 29 16:03 sample01.java
$ java -classpath $ORACLE_HOME/jdbc/lib/ojdbc6.jar:. sample01
deptno = [10]
dname  = [ACCOUNTING]
loc    = [NEW YORK]
deptno = [20]
dname  = [RESEARCH]
loc    = [DALLAS]
deptno = [30]
dname  = [SALES]
loc    = [CHICAGO]
deptno = [40]
dname  = [OPERATIONS]
loc    = [BOSTON]

ubuntu 上の oracle 12cで Pro*c コンパイル

ubuntuにoracle をインストールした直後の状態から Pro*c のコンパイルを通すには幾つか設定が必要である。




1.動作確認のために使用したPrco*Cプログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlca.h>
/*
SQL> desc dept
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                    NOT NULL NUMBER(2)
 DNAME                                              VARCHAR2(14)
 LOC                                                VARCHAR2(13)
*/
struct {
  char deptno[2+1];
  char dname[14+1];
  char loc[13+1];
} rec;

void
main(argc,argv)
int argc;
char *argv[];
{
  char *sp_uid = "scott/tiger";

  EXEC SQL CONNECT :sp_uid;

  EXEC SQL DECLARE CUR_SCOTT CURSOR FOR
  SELECT DEPTNO,DNAME,LOC FROM DEPT;
  EXEC SQL OPEN CUR_SCOTT;

  while(1) {
    EXEC SQL FETCH CUR_SCOTT INTO :rec;

    if (sqlca.sqlcode == 1403) {
      break;
    }

    printf("DEPTNO = [%s]\n",rec.deptno);
    printf("DNAME  = [%s]\n",rec.dname);
    printf("LOC    = [%s]\n",rec.loc);
  }
}

2.$ORACLE_HOME/precomp/admin/pcscfg.cfg を環境に合わせて調整
  
$ vi $ORACLE_HOME/precomp/admin/pcscfg.cfg
=======================================================================
diff pcscfg.cfg.org pcscfg.cfg
1c1
< sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc-lib/x86_64-redhat-linux/3.2.3/include,/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include,/usr/lib64/gcc/x86_64-suse-linux/4.1.0/include,/usr/lib64/gcc/x86_64-suse-linux/4.3/include)
---
> sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/include/x86_64-linux-gnu,/usr/lib/gcc/x86_64-linux-gnu/6.2.0/include)
=======================================================================

3.LD_LIBRARY_PATHを設定
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
  • $ORACLE_HOME/lib配下には、ubuntu のデフォルトライブラリと重複するライブラリがあるため、 ウインドウマネージャを使用するアカウントや、ライブラリ更新などを行うアカウントの .profile などに登録すると干渉起こす場合がある。オラクル関連のアプリをコンパイル、起動する際に 設定するか、専用のアカウントで使用するのがよいと思われる。

4.コンパイル用Makefile (procオプションのコード生成は"ANSI_C"とする)
PROGRAM = sample01
OBJS    = sample01.o
CC      = gcc
PROC    = proc
PFLAGS  = include=$(ORACLE_HOME)/precomp/public
PFLAGS += include=$(ORACLE_HOME)/rdbms/public
PFLAGS += include=.
PFLAGS += CODE=ANSI_C
#PFLAGS += CODE=CPP

CFLAGS  = -O3 -trigraphs -fPIC -DPRECOMP
CFLAGS += -I$(ORACLE_HOME)/precomp/public
CFLAGS += -I$(ORACLE_HOME)/rdbms/public
CFLAGS += -I$(ORACLE_HOME)/plsql/public
CFLAGS += -I$(ORACLE_HOME)/network/public
CFLAGS += -I.
CFLAGS += -DLINUX -DORAX86_64 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1
CFLAGS += -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT
CFLAGS += -DNS_THREADS -DLONG_IS_64 -DSS_64BIT_SERVER -DLDAP_CM -m64
LDFLAGS = -L$(ORACLE_HOME)/lib -lclntsh -lsql12 -L $(ORACLE_HOME)/precomp/lib -lproc2 -lm

.SUFFIXES: .c .o
.SUFFIXES: .pc .c

$(PROGRAM):$(OBJS)
 $(CC) $^ -o $@ $(LDFLAGS)

.c.o:
 $(CC) $(CFLAGS) -c $<

.pc.c:
 $(PROC) iname=$* $(PFLAGS)

clean:

5.コンパイルと実行
$ ls -l
合計 16
-rw-r--r-- 1 naoki naoki 904  3月 29 15:24 Makefile
-rw-r--r-- 1 naoki naoki 854  3月 29 15:24 sample01.pc
$ make
proc iname=sample01 include=/u01/app/oracle/product/11.2.0/dbhome_1/precomp/public include=/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/public include=. CODE=ANSI_C

Pro*C/C++: Release 11.2.0.1.0 - Production on 水 3月 29 15:33:04 2017

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

システムのデフォルト・オプション値: /u01/app/oracle/product/11.2.0/dbhome_1/precomp/admin/pcscfg.cfg

gcc -O3 -trigraphs -fPIC -DPRECOMP -I/u01/app/oracle/product/11.2.0/dbhome_1/precomp/public -I/u01/app/oracle/product/11.2.0/dbhome_1/rdbms/public -I/u01/app/oracle/product/11.2.0/dbhome_1/plsql/public -I/u01/app/oracle/product/11.2.0/dbhome_1/network/public -I. -DLINUX -DORAX86_64 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -DSLTS_ENABLE -DSLMXMX_ENABLE -D_REENTRANT -DNS_THREADS -DLONG_IS_64 -DSS_64BIT_SERVER -DLDAP_CM -m64 -c sample01.c
gcc sample01.o -o sample01 -L/u01/app/oracle/product/11.2.0/dbhome_1/lib -lclntsh -lsql11 -L /u01/app/oracle/product/11.2.0/dbhome_1/precomp/lib -lproc2 -lm
rm sample01.c
$ ls -l
合計 48
-rw-r--r-- 1 inst12c inst12c   904  3月 29 15:24 Makefile
-rwxr-xr-x 1 inst12c inst12c 12928  3月 29 15:33 sample01
-rw-r--r-- 1 inst12c inst12c     0  3月 29 15:33 sample01.lis
-rw-r--r-- 1 inst12c inst12c  4552  3月 29 15:33 sample01.o
-rw-r--r-- 1 inst12c inst12c   854  3月 29 15:24 sample01.pc
$ sample01
DEPTNO = [10]
DNAME  = [ACCOUNTING    ]
LOC    = [NEW YORK     ]
DEPTNO = [20]
DNAME  = [RESEARCH      ]
LOC    = [DALLAS       ]
DEPTNO = [30]
DNAME  = [SALES         ]
LOC    = [CHICAGO      ]
DEPTNO = [40]
DNAME  = [OPERATIONS    ]
LOC    = [BOSTON       ]

oracle 12c が要求する各種設定を一括設定

ubuntu16.10 にoracle12cをインストールするのに必要な各種設定を纏めたスクリプト(12.1.0.2.0、12.2.0.1.0共用)である。
※インストール手順については 「ubuntuにoracle12c(12.2.0.1.0) をインストール」 を参照



#! /bin/sh

# 
PKG="libaio1"
PKG="$PKG libaio-dev"
PKG="$PKG sysstat"

# PKG="gawk"
# PKG="$PKG rpm"
# PKG="$PKG libtool"
# PKG="$PKG expat"
# PKG="$PKG alien"
# PKG="$PKG ksh"
# PKG="$PKG unixodbc"
# PKG="$PKG unixodbc-dev"
# PKG="$PKG elfutils"
# PKG="$PKG libelf-dev"
# PKG="$PKG default-jre"
 
#
apt-get install $PKG

#
ln -sf /bin/bash /bin/sh
ln -s  /usr/bin/awk /bin/awk
ln -s  /usr/lib/x86_64-linux-gnu /usr/lib64
ln -s  /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib64

# ln -s  /usr/bin/rpm /bin/rpm
# ln -s  /usr/bin/basename /bin/basename

#
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
groupadd -g 54327 racdba
useradd -u 1200                                  \
        -g oinstall                              \
        -G dba,oper,backupdba,dgdba,kmdba,racdba \
        -d /home/oracle                          \
        -m oracle

#
mkdir -p /u01/app/oracle
chown -R oracle:oinstall /u01/app
chmod -R 775 /u01

#
cat <<EOF >> /etc/security/limits.conf
#
oracle soft nproc   2047
oracle hard nproc  16384
oracle soft nofile  1024
oracle hard nofile 65536
oracle soft stack  10240
EOF

#
cat <<EOF >> /etc/sysctl.conf
#
fs.aio-max-nr=1048576
fs.file-max=6815744
kernel.shmall=2097152
kernel.shmmni=4096
kernel.sem=250 32000 100 128
net.ipv4.ip_local_port_range=9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048586
kernel.shmmax=1073741824
EOF

#
sysctl -p

ubuntuの oracle 12c (12.2.0.1.0) DB作成

ubuntu16.10 上の oracle12c(12.2.0.1.0) におけるDB作成は、oracle12cダウンロードサイトのDB作成ドキュメントに従い、PDBにサンプルスキーマ(scott)の作成した。
※インストール前準備などは 「ubuntuにoracle12c(12.2.0.1.0) をインストール」を参照



1.DB作成

url: http://www.oracle.com/technetwork/jp/database/enterprise-edition/documentation/index.html



2.サンプルスキーマ(scott)を作成

DB作成手順の最後に作成した PDB 用のNet サービス名で接続してサンプルスキーマを作成。

$ cd $ORACLE_HOME/rdbms/admin
$ vi utlsampl.sql
================================================
36c36
< CONNECT SCOTT/tiger
---
> CONNECT SCOTT/tiger@srv_pdb
================================================
$ sqlplus system/passwd@srv_pdb
SQL> @?/rdbms/admin/utlsampl.sql
$ sqlplus scott/tiger@srv_pdb
SQL> select table_name from user_tables;

TABLE_NAME
--------------------------------------------------------------------------------
DEPT
EMP
BONUS
SALGRADE

SQL> quit

ubuntuに oracle 12c (12.2.0.1.0) をインストール

oracle12c(12.2.0.1.0)は、12.1.0.2.0 のインストール時に発生していた各種エラーが解消され、ほとんどそのままインストールできるようである。

ubuntu18.04 では、暫くの間 libpthread_nonshared.a が配布されず動かせなかったが、18.04.2からは配布されるようになりインストール可能になっている。しかし、18.04.2 では$ORACLE_HOME/bin/oracleが起動しないため、$ORACLE_HOME/lib/stubs 配下のライブラリを消去後 relink して再作成すると動作している。

18.10、19.04 では、libpthread_nonshared.a が配布されていない。



1.事前準備として以下の構成のディレクトリを作成
 /mnt/vbox/share/oracle12c 
 |-- database : linuxx64_12201_database.zip を展開
 `-- inst12c : inst12c.tar.gz を展開

2.oracle12c が要求する各種設定を適用
$ sudo -s
# cd /mnt/vbox/share/oracle12c/inst12c
# ./inst12c.sh

※inst12c.sh の内容は、 「oracle12c が要求する各種設定を一括設定」 を参照

3.oracle12c のインストール
# cd /mnt/vbox/share/oracle12c/database/install
# cp /usr/bin/unzip .
# passwd oracle
Changing password for user oracle.
New UNIX password: <oracle ユーザーパスワード>
Retype new UNIX password: <oracle ユーザーパスワード>
passwd: all authentication tokens updated successfully.  
# xhost +
# su - oracle
$ cd /mnt/vbox/share/oracle12c/database
$ ./runInstaller
$ exit
# /u01/app/oraInventory/orainstRoot.sh
# /u01/app/oracle/product12.2.0/dbhome_1/root.sh
# su - oracle

5.リスナとデータベース作成の前準備
 $HOME/.profile に以下の行を追記
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=JAPANESE_JAPAN.UTF8

6.リスナの作成
$ source .profile
$ netca

7.データベースの作成(サンプルスキーマ作成を含む)
==== ubuntu 18.04 では以下の手順が必要 ====
$ cd $ORACLE_HOME/lib/stubs
$ rm libc*
$ cd ../../bin
$ relink all
$ dbca
===========================================

 ※上記実行時のメニュー選択は 「ubuntuのoracle12c(12.2.0.1.0) DB作成」 を参照

8.データベース、リスナの起動、終了

 ※作成中

9.オラクルクライアントのインストール

 ※「ubuntu に oracle client をインストール」を参照

10.プログラムからのデータベース接続

ubuntuに oracle 12c (12.1.0.2.0) をインストール

サポート対象外ではあるが、ubuntu16.10 に oracle12c(12.1.0.2.0) をインストールする際、以下のようなエラーが発生する。
/usr/bin/ld: /u01/app/oracle/product/12.1.0/dbhome_1/lib//libpls12.a(plzsql.o): relocation R_X86_64_32 against`.rodata.str1.4' can not be used when making a shared object。 -fPIC を付けて再コンパイルしてください。
/usr/bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません

このエラーには、該当箇所に -no-pie オプションを付与することで解決した。
※このエラーについては、「Ubuntu 16 で Stack + GHC がライブラリのリンクに失敗する場合の対処法」 を参照させて頂いた。

省力化のため、この問題も含めインストール中に出るエラーの対策をまとめた patch と oracle12c(12.1.0.2.0) をインストールする前準備のシェルを作成した。 なお、この手順は VirtualBox に ubuntu16.10 をインストールし、2017/03/19日時点までの update を当てておこなった。



1.事前準備として以下の構成のディレクトリを作成
 /mnt/vbox/share/oracle12c 
 |-- database : linuxamd64_12102_database_[12]of2.zip を展開
 `-- inst12c : inst12c.tar.gz を展開

2.oracle12c が要求する各種設定を適用
$ sudo -s
# cd /mnt/vbox/share/oracle12c/inst12c
# ./inst12c.sh

※inst12c.sh の内容は、 「oracle12c が要求する各種設定を一括設定」 を参照

3.oracle12c のインストール
# cd /mnt/vbox/share/oracle12c/database/install
# cp /usr/bin/unzip .
# passwd oracle
Changing password for user oracle.
New UNIX password: <oracle ユーザーパスワード>
Retype new UNIX password: <oracle ユーザーパスワード>
passwd: all authentication tokens updated successfully.  
# xhost +
# su - oracle
$ cd /mnt/vbox/share/oracle12c/database
$ ./runInstaller -jreloc /usr/lib/jvm/default-java
4.エラーが発生したら patch を適用
$ cd /u01/app/oracle/product/12.1.0/dbhome_1
$ patch -p1 -d . < /mnt/vbox/share/oracle12c/inst12c/ora12c_12.1.0.2.0-ubuntu.patch
<再施行>
$ exit
# /u01/app/oraInventory/orainstRoot.sh
# /u01/app/oracle/product12.1.0/dbhome_1/root.sh
# su - oracle



5.リスナとデータベース作成の前準備
 $HOME/.profile に以下の行を追記
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=JAPANESE_JAPAN.UTF8

6.リスナの作成
$ vi `which netca`
===========================================================
diff bin.org/netca bin/netca
95c95,96
< JRE_DIR=/u01/app/oracle/product/12.1.0/dbhome_1/jdk/jre
---
> #JRE_DIR=/u01/app/oracle/product/12.1.0/dbhome_1/jdk/jre
> JRE_DIR=/usr/lib/jvm/default-java
===========================================================
$ netca
 ※リスナー作成時のメニュー選択は1521ポートを使用するのであれば全てリターンで作成可

7.データベースの作成
$ vi `which dbca`
===========================================================
diff bin.org/dbca bin/dbca
70c70,71
< JRE_DIR=/u01/app/oracle/product/12.1.0/dbhome_1/jdk/jre
---
> #JRE_DIR=/u01/app/oracle/product/12.1.0/dbhome_1/jdk/jre
> JRE_DIR=/usr/lib/jvm/default-java
===========================================================
$ dbca

8.データベース、リスナの起動、終了

 ※作成中


9.オラクルクライアントのインストール

 ※「ubuntu に oracle client をインストール」を参照

10.プログラムからのデータベース接続

2017年4月7日金曜日

oracle 11g が要求する各種設定を一括設定

ubuntu16.10 にoracle11gをインストールするのに必要な各種設定を纏めたスクリプトである。(ubuntu16.04でも同様にンストール可能であった)
※インストール手順については 「ubuntuに oracle11g をインストール」 を参照



1.rootユーザにて以下のシェル実行
#! /bin/sh

#
apt-get install gawk rpm libaio1 libaio-dev libtool expat alien ksh unixodbc unixodbc-dev sysstat elfutils libelf-dev default-jre # libstdc++5

ln -sf /bin/bash /bin/sh
ln -s /usr/bin/awk /bin/awk
ln -s /usr/bin/rpm /bin/rpm
ln -s /usr/bin/basename /bin/basename
ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
ln -s /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib64

# add ubuntu16.10
ln -s /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a /usr/lib64
ln -s /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64

#
mkdir /etc/rc.d
ln -s /etc/rc0.d /etc/rc.d/rc0.d
ln -s /etc/rc1.d /etc/rc.d/rc1.d
ln -s /etc/rc2.d /etc/rc.d/rc2.d
ln -s /etc/rc3.d /etc/rc.d/rc3.d
ln -s /etc/rc4.d /etc/rc.d/rc4.d
ln -s /etc/rc5.d /etc/rc.d/rc5.d
ln -s /etc/rc6.d /etc/rc.d/rc6.d
ln -s /etc/rcS.d /etc/rc.d/rcS.d

#
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
useradd -u 1200                           \
        -g oinstall                       \
        -G dba,oper,backupdba,dgdba,kmdba \
        -d /home/oracle                   \
        -m oracle

sudo mkdir -p /u01/app
sudo chown -R oracle:oinstall /u01/app
sudo chmod -R 775 /u01/app

#
REL_FILE=/etc/redhat-release
echo "Red Hat Linux release 5" > $REL_FILE

#
cat <<EOF >> /etc/security/limits.conf
#
oracle soft nproc  2047
oracle hard nproc  16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack  10240
EOF

#
cat <<EOF >> /etc/sysctl.conf
#
fs.aio-max-nr=1048576
fs.file-max=6815744
kernel.shmall=2097152
kernel.shmmni=4096
kernel.sem=250 32000 100 128
net.ipv4.ip_local_port_range=9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048586
kernel.shmmax=1073741824
EOF

#
sysctl -p

#
mv $REL_FILE $REL_FILE.bk