ksaitoの日記

日々試したことの覚え書き

Ubuntu 11.10へのOracle 11gインストール

Ubuntu 11.10にOracle 11gをインストールしました。
OTNのフォーラムにインストール手順がありました。

必要なパッケージのインストール

Oracle 11gは、RPMパッケージで提供されています。Debian/Ubuntuで使うには、ailenコマンドでdebパッケージに変換擦る必要があります。
起動時の自動起動を設定するためにchkconfigコマンドが必要です。
libaio1とunixodbcは、Oracle 11gで必要となるライブラリです。

$ sudo apt-get install alien libaio1 unixodbc

スワップのサイズ確認

Oracle 11gは、2GBのスワップが必要になります。
スワップを確認するとデフォルトでスワップは1GBでした。

$ grep -i swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1048572 kB
SwapFree:        1048572 kB
$ 

1GBスワップを追加します。

$ sudo dd if=/dev/zero of=/home/swapfile bs=1024 count=1048576
1048576+0 記録始め
1048576+0 記録終わり
1073741824 バイト (1.1 GB) コピー終了, 5.83088 s, 184 MB/s
$ sudo mkswap /home/swapfile 
スワップ空間バージョン1を設定します、サイズ = 1048572 KiB
ラベルはありません, UUID=
$ sudo swapon /home/swapfile 
$ sudo swapon -a
$ grep -i swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:       2097144 kB
SwapFree:        2097144 kB
$ sudo bash -c "echo '/home/swapfile swap swap defaults 0 0' >> /etc/fstab"
$ 

カーネルパラメータの設定

Oracle 11gに必要なカーネルパラメータを設定します。

$ sudo bash -c "cat > /etc/sysctl.d/60-oracle.conf <<-EOF
> # Oracle 11g XE kernel parameters
> fs.file-max=6815744
> net.ipv4.ip_local_port_range=9000 65500
> kernel.sem=250 32000 100 128
> # kernel.shmmax=429496729
> kernel.shmmax=1073741823
> EOF"
$ 

設定したカーネルパラメータを反映して確認します。

$ sudo service procps start
procps stop/waiting
$ sudo sysctl -q fs.file-max
fs.file-max = 6815744
$ sudo sysctl -q kernel.shmmax
kernel.shmmax = 1073741823
$ sudo sysctl -q net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 9000     65500
$ sudo sysctl -q kernel.sem
kernel.sem = 250        32000   100     128
$

ext3パーティションの準備

インストール手順によるとUbuntu 11.10のデフォルトファイルシステムext4では、パフォーマンス問題が発生するそうです。
Oracleがインストールされる/u01に20GB程度のext3パーティションを作成してマウントすることで回避できるようです。

$ sudo fdisk /dev/sdb
デバイスは正常な DOS パーティションテーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x0344c41a で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4, 初期値 1): 1
最初 セクタ (2048-41943039, 初期値 2048): 
初期値 2048 を使います
Last セクタ, +セクタ数 or +size{K,M,G} (2048-41943039, 初期値 41943039): 
初期値 41943039 を使います

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

コマンド (m でヘルプ): q
$

ext3でフォーマットしマウントします。

$ sudo mkfs -t ext3 /dev/sdb1
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242624 blocks
262131 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
$ uuid=`sudo blkid | grep sdb1 | awk '{print$2}' | tr -d '\042'`
$ echo $uuid
UUID=9f4a0d24-7fbf-4514-99a0-c8ceb03a6c74
$ sudo bash -c "echo $uuid /u01 ext3 errors=remount-ro 0 1 >> /etc/fstab"
$

再起動後にext3がマウントされたことを確認します。

$ df -h /u01
Filesystem            Size  Used Avail Use% マウント位置
/dev/sdb1              20G  173M   19G   1% /u01
$ 

共有メモリの設定

Ubuntu 11.10でOracle 11gを動かすとORA-00845: MEMORY_TARGETが発生しデータベースが起動しません。
Oracle 11gは/dev/shmを必要としますが、Ubuntu 11.10は/run/shmとなっているのが原因らしいです。
回避するために、以下の設定が必要です。

$ sudo bash -c 'cat > /etc/init.d/oracle-shm <<-EOF
> #! /bin/sh
> # /etc/init.d/oracle-shm
> #
> #
> case "\$1" in
>   start)
>     echo "Starting script /etc/init.d/oracle-shm"
>     # Run only once at system startup
>     if [ -e /dev/shm/.oracle-shm ]; then
>       echo "/dev/shm is already mounted, nothing to do"
>     else
>       rm -f /dev/shm
>       mkdir /dev/shm
>       mount -B /run/shm /dev/shm
>       touch /dev/shm/.oracle-shm
>     fi
>     ;;
>   stop)
>     echo "Stopping script /etc/init.d/oracle-shm"
>     echo "Nothing to do"
>     ;;
>   *)
>     echo "Usage: /etc/init.d/oracle-shm {start|stop}"
>     exit 1
>     ;;
> esac
> #
> ### BEGIN INIT INFO
> # Provides:          oracle-shm
> # Required-Start:    $remote_fs $syslog
> # Required-Stop:     $remote_fs $syslog
> # Default-Start:     2 3 4 5
> # Default-Stop:      0 1 6 
> # Short-Description: Bind /run/shm to /dev/shm at system startup.
> # Description:       Fix to allow Oracle 11g use AMM.
> ### END INIT INFO
> EOF'
$ sudo chmod 755 /etc/init.d/oracle-shm 
$ sudo update-rc.d oracle-shm defaults 01 99
 Adding system startup for /etc/init.d/oracle-shm ...
   /etc/rc0.d/K99oracle-shm -> ../init.d/oracle-shm
   /etc/rc1.d/K99oracle-shm -> ../init.d/oracle-shm
   /etc/rc6.d/K99oracle-shm -> ../init.d/oracle-shm
   /etc/rc2.d/S01oracle-shm -> ../init.d/oracle-shm
   /etc/rc3.d/S01oracle-shm -> ../init.d/oracle-shm
   /etc/rc4.d/S01oracle-shm -> ../init.d/oracle-shm
   /etc/rc5.d/S01oracle-shm -> ../init.d/oracle-shm
$ 

再起動後に/dev/shmがあるとこを確認します。

$ sudo cat /etc/mtab | grep shm
none /run/shm tmpfs rw,nosuid,nodev 0 0
/run/shm /dev/shm none rw,bind 0 0
$ sudo df -h /run/shm
Filesystem            Size  Used Avail Use% マウント位置
none                  499M     0  499M   0% /run/shm
$

/run/shmは、デフォルトで物理メモリの50%のサイズになります。

Oracle 11gのRPMパッケージをdebパッケージに変換する

alienコマンドを使ってdebパッケージに変換します。

$ ls 
oracle-xe-11.2.0-1.0.x86_64.rpm.zip
$ 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  
$ ls 
Disk1  oracle-xe-11.2.0-1.0.x86_64.rpm.zip
$ cd Disk1
$ ls
oracle-xe-11.2.0-1.0.x86_64.rpm  response  upgrade
$ fakeroot alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm 
oracle-xe_11.2.0-2_amd64.deb generated
$ 

インストール

RPMパッケージで前提となっているパスが違うため以下が必要です。
debパッケージに対応して欲しいものです。

$ sudo ln -s /usr/bin/awk /bin/awk
$ sudo mkdir /var/lock/subsys
$ 

パッケージをインストールします。

$ sudo dpkg -i oracle-xe_11.2.0-2_amd64.deb
... 中略
nsserv: Default-Start undefined, assuming empty start runlevel(s) for script `apport'
insserv: Default-Stop  undefined, assuming empty stop  runlevel(s) for script `apport'
oracle-xe                 0:off  1:off  2:on   3:on   4:on   5:on   6:off
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.

ureadahead のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
libc-bin のトリガを処理しています ...
ldconfig deferred processing now taking place
$

設定

Oracleの設定をします。
といってもポートとsystemアカウントのパスワード設定だけです。

$ sudo /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 <Enter> 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.
$ 

oracleユーザにOracle環境変数を設定して後処理をしたらインストール完了です。

$ sudo su - oracle
$ id oracle
uid=1001(oracle) gid=1001(dba) 所属グループ=1001(dba)
$ pwd
/u01/app/oracle
$ cp /etc/skel/.bash_logout .
$ cp /etc/skel/.bashrc .
$ cp /etc/skel/.profile .
$ echo "" >> .profile 
$ echo '. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh' >> .profile 
$ ログアウト
$ sudo su - oracle
$

ユーザの設定

Oracle 11gを使うユーザは、以下の設定をします。

$ echo '. /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh' >> ~/.profile

一度ログアウトして接続を確認します。

$ sqlplus system/***@xe

SQL*Plus: Release 11.2.0.2.0 Production on 日 12月 4 15:12:25 2011

Copyright (c) 1982, 2011, Oracle.  All rights reserved.



Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> show sga

Total System Global Area  417546240 bytes
Fixed Size                  2227080 bytes
Variable Size             285213816 bytes
Database Buffers          125829120 bytes
Redo Buffers                4276224 bytes
SQL> 
$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on 日 12月 4 14:59:45 2011

Copyright (c) 1982, 2011, Oracle.  All rights reserved.



Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionに接続されました。
SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

PL/SQLプロシージャが正常に完了しました。

SQL> exit
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionとの接続が切断されました。
$