2025年8月29日 (金)

x86 GuestOS on VirtualBox for Apple Silicon / ARM. Rebooted. :)

一年ぐらい前、ARM版 7.1 Betaがリリースされ、ARM版7.0のテストビルドで起動していたx86 GuestOS起動ができなくなった。。。という話のその後です。

7.0.9 for Apple Silicon / ARMで Intel版VirtualBoxから移行して、起動できた〜〜ニヤニヤしていた。。。
VirtualBox TestBuild 7.0.97r163779 (2024-07-04T18:53:02Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録

のですが、

7.1にアップデートしたら。。。。起動しなくなっちゃったんですよ....
VirtualBox TestBuild 7.1.0_BETA1r164292 (2024-08-07T18:27:07Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録


ずーーーーっと起動しなかったので、もうしばらく無理なのだろうかと、おもい、ARM64ネイティブなGuestOSで遊び始めたあと、
Oracle Database 23ai 23.8 (aarch64) on Oracle Linux 8u10 (aarch64) on VirtualBox 7.1 for Apple Silicon 始動 w


なにげに、とあるスレッドをだらだら読んでいると。。。。。なに!!!〜。もしかして、デフォで起動しない設定に戻されてしまったのか。。。
ということに気づいたわけです! はいw
Discuss the VirtualBox 7.1.0_BETA1 release here
https://forums.virtualbox.org/viewtopic.php?p=549283#p549283

上記スレッドで対処方法がコメントされていたことに全く気づかず、7.1以降使えなくなったままだったのかと思い込んでいただけでした。気づくの遅いw

ということで、Apple Silicon な VittualBoxで x86アーキテクチャのGuestOSのOracle Database/MySQL/PostgreSQLで遊ぶ環境が復活しました。

VBoxManage setextradata global "VBoxInternal2/EnableX86OnArm" 1

を設定しないといけないらしい、これを設定すると、”Dev Preview”マークがGUIに現れると!

結果から先に言っておくと、以下のリリース、7.2でも、x86_64のOracle Databaseは、ORA-3113で起動せず。
MySQL/PostgreSQLは起動しました。ちょっと先祖帰りした感じではありますね。とはいえ、x86 GuestOSも起動できる環境が復活できたので、起動確認もrebootさせることにしましたw

oracle@Mac-Studio ~ % . ./print_env.sh 

*** mac info. ***
ProductName: macOS
ProductVersion: 14.7.7
BuildVersion: 23H723

*** maxOS ver. ***
Model Name: Mac Studio
Chip: Apple M1 Ultra
Total Number of Cores: 20 (16 performance and 4 efficiency)
Memory: 64 GB

*** VirtualBox ver. ***
7.2.0r170228

oracle@Mac-Studio ~ % VBoxManage getextradata global "VBoxInternal2/EnableX86OnArm"
No value set!
oracle@Mac-Studio ~ %VBoxManage setextradata global "VBoxInternal2/EnableX86OnArm" 1

Virtualbox719_on_x86_test

MySQL/PostgreSQLをインストールしてあるx86 Guestが起動するか見てみます。おおおお、起動しましたね!!!!

oracle@Mac-Studio ~ % VBoxManage list -platform-arch=x86 vms | grep 'mysql8 postgrsql13'
"Oracle Linux 8 mysql8 postgrsql13" {a61fa92b-7849-459d-9bf4-ec075f5b983e}
oracle@Mac-Studio ~ % VBoxManage list runningvms
"Oracle Linux 8 mysql8 postgrsql13" {a61fa92b-7849-459d-9bf4-ec075f5b983e}


MySQLは無事に起動しているでしょうか。。。おお、大丈夫だ!

[master@localhost ~]$ sudo service mysqld status
Redirecting to /bin/systemctl status mysqld.service
● mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2025-08-28 06:42:56 EDT; 16min ago
Process: 1370 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
Process: 1086 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Process: 1040 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Main PID: 1123 (mysqld)
Status: "Server is operational"
Tasks: 37 (limit: 22947)
Memory: 450.0M
CGroup: /system.slice/mysqld.service
└─1123 /usr/libexec/mysqld --basedir=/usr

8月 28 06:42:37 localhost.localdomain systemd[1]: Starting MySQL 8.0 database server...
8月 28 06:42:56 localhost.localdomain systemd[1]: Started MySQL 8.0 database server.


続いて、PostgreSQLは?。。。。おお、こちらも起動してますね

[master@localhost ~]$ sudo service postgresql-16 status
Redirecting to /bin/systemctl status postgresql-16.service
● postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2025-08-28 06:43:01 EDT; 17min ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 1411 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 1425 (postgres)
Tasks: 7 (limit: 22947)
Memory: 31.8M
CGroup: /system.slice/postgresql-16.service
├─1425 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
├─1454 postgres: logger
├─1471 postgres: checkpointer
├─1472 postgres: background writer
├─1480 postgres: walwriter
├─1481 postgres: autovacuum launcher
└─1482 postgres: logical replication launcher

8月 28 06:42:58 localhost.localdomain systemd[1]: Starting PostgreSQL 16 database server...
8月 28 06:43:00 localhost.localdomain postgres[1425]: 2025-08-28 06:43:00.762 EDT [1425] LOG: redirecting log output to logging collector process
8月 28 06:43:00 localhost.localdomain postgres[1425]: 2025-08-28 06:43:00.762 EDT [1425] HINT: Future log output will appear in directory "log".
8月 28 06:43:01 localhost.localdomain systemd[1]: Started PostgreSQL 16 database server.


MySQLのバージョンは、以下の通り

[master@localhost ~]$ mysql -u scott -D perftestdb -p 
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.36 |
+-----------+
1 row in set (0.01 sec)

PostgreSQLのバージョンは以下のとおり。クエリーもとりあえず大丈夫そう。

[postgres@localhost ~]$ psql -d perftestdb -U discus -p 5432 -W -h localhost
パスワード:
psql (16.3)
"help"でヘルプを表示します。


perftestdb=> select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 16.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit
(1 行)


では最後に、Oracle DatabaseをインストールしてあるVMで。。。。。。ん〜〜〜惜しい、起動できず。。。。

[oracle@localhost ~]$ uname -rm
5.4.17-2102.201.3.el8uek.x86_64 x86_64
[oracle@localhost ~]$
[oracle@localhost ~]$
[oracle@localhost ~]$ lsnrctl start

LSNRCTL for Linux: Version 21.0.0.0.0 - Production on 28-8月 -2025 20:08:06

Copyright (c) 1991, 2021, Oracle. All rights reserved.

/opt/oracle/product/21c/dbhome_1/bin/tnslsnrを起動しています。お待ちください...

TNSLSNR for Linux: Version 21.0.0.0.0 - Production
システム・パラメータ・ファイルは/opt/oracle/homes/OraDBHome21cEE/network/admin/listener.oraです。
ログ・メッセージを/opt/oracle/diag/tnslsnr/localhost/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for Linux: Version 21.0.0.0.0 - Production
開始日 28-8月 -2025 20:08:08
稼働時間 0 日 0 時間 0 分 0 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /opt/oracle/homes/OraDBHome21cEE/network/admin/listener.ora
ログ・ファイル /opt/oracle/diag/tnslsnr/localhost/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 木 8月 28 20:08:18 2025
Version 21.3.0.0.0

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

アイドル・インスタンスに接続しました。

SYS@ORCLCDB> startup
ORA-03113: 通信チャネルでend-of-fileが検出されました
SYS@ORCLCDB>


とういことで、また、楽しみが一つ戻ってきた:)


まだまだ、蒸し暑すぎる東京の地より。
では、また。



関連エントリー
Oracle Linux 8 and MySQL 8.0.32 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160167
MySQL 8.0.32 , PostgreSQL 13.4 and Oracle Database 21c on Oracle Linux 8 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160702
ySQL 8.0.32 , PostgreSQL 13.6 and Oracle Database 21c on Oracle Linux 8.5 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r161342
MySQL 8.0.32 , PostgreSQL 13.6 and Oracle Database 21c on Oracle Linux 8.5 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r161709
MySQL 8.0.36 , PostgreSQL 13.14, Oracle Database 21c, Oracle Database 23ai on VirtualBox for Apple Silicon Test Build 7.0.97_BETA r162957
VirtualBox TestBuild for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録 / 7.0.97r162957(2024/4/26) / 7.0.97r163029(2024/5/3)
VirtualBox TestBuild 7.0.97r163376 (2024-05-28T15:08:56Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録
VirtualBox TestBuild 7.0.97r163425 (2024-06-05T13:13:46Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録
VirtualBox TestBuild 7.0.97r163606 (2024-06-21T11:55:16Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録
VirtualBox TestBuild 7.0.97r163779 (2024-07-04T18:53:02Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録
VirtualBox-7.1.0_BETA2-164697 (2024-09-06T20:27:41Z) for macOS/ARM64における現時点でのOracle Database 21cの起動、停止時間の記録 (VM起動せず)
Oracle Database 23ai 23.8 (aarch64) on Oracle Linux 8u10 (aarch64) on VirtualBox 7.1 for Apple Silicon 始動 w

| | | コメント (0)

2025年6月 3日 (火)

Oracle Database 23ai freeで試すVector Search - ONNXモデル準備編

Getting Started with Oracle Database 23ai AI Vector Search
https://blogs.oracle.com/database/post/getting-started-with-oracle-database-23ai-ai-vector-search

上記ブログを見て、これも実行計画はSQL文のレントゲン写真ネタにはなりそうだなぁ、と思い。いきなり準備を始めたw 今日はその準備(日本語対応してないモデル)

環境は以下の通り。
VirtualBOX向けPrebuild VMを利用(なお、Arm64ではなく、Intel Mac)
いずれ、Arm64のネタも書く予定ではいますがw それだと古ーーーーーい Oracleだとこんな結果に。。。みたいな差分比較ネタができないのでw とりあえず。X86_64環境にて。。。(Arm64ネイティブの環境はまだ作りかけなのでw)

クラウドではなくオフラインでも楽しめる環境(23ai Freeなのでリソース制限の範囲内で遊べる環境にします)を作ります。

*** mac info. ***
ProductName: macOS
ProductVersion: 12.7.6
BuildVersion: 21H1320

*** macOS ver. ***
Model Name: MacBook
Processor Name: Dual-Core Intel Core m5
Processor Speed: 1.2 GHz
Number of Processors: 1
Total Number of Cores: 2
Memory: 8 GB

*** VirtualBox ver. ***
7.0.10r158379
[oracle@localhost ~]$ cat /etc/oracle-release /etc/redhat-release
Oracle Linux Server release 8.9
Red Hat Enterprise Linux release 8.9 (Ootpa)
[oracle@localhost ~]$ uname -srpo
Linux 5.15.0-3.60.5.1.el8uek.x86_64 x86_64 GNU/Linux
SCOTT@localhost:1521/freepdb1> select banner_full from v$version;

BANNER_FULL
--------------------------------------------------------------------------------
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.4.0.24.05


12.2 ONNXモデルへの事前トレーニング済モデルの変換: エンドツーエンドの手順
https://docs.oracle.com/cd/G28130_01/2-23ai/mlpug/convert-pretrained-models-onnx-model-end-end-instructions.html

の手順に沿ってONNIXモデルの準備をします!。 

ドキュメント斜め読みしながら環境をつくっていたこともあり、インストールするOML4Pyのリリースが異なっていたりしてやり直したりしているログも含めているため読みずらいかもしれません。悪しからず m(_ _)m  
進める前に、必要なversionなど事前確認しておくとスムーズだと思います。。。。。(お前が言うか〜っw



初っ端からエラー!。なんだろ。(すんなり進むのかこれw)

Pythonのインストール

[oracle@localhost ~]$ sudo yum install libffi-devel openssl openssl-devel tk-devel xz-devel zlib-devel bzip2-devel readline-devel libuuid-devel ncurses-devel libaio
[sudo] oracle のパスワード:
Oracle Linux 8 BaseOS Latest (x86_64) 0.0 B/s | 0 B 08:00
Errors during downloading metadata for repository 'ol8_baseos_latest':
- Curl error (28): Timeout was reached for https://yum-us-phoenix-1.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64/repodata/repomd.xml
[Connection timed out after 120000 milliseconds]
エラー: repo 'ol8_baseos_latest' のメタデータのダウンロードに失敗しました : Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried


こんなの見つけた〜。多分これ。
yum update not working using Oracle Database 23ai Free Container Image Lite #2900
https://github.com/oracle/docker-images/issues/2900


間違いない! これが原因だ
書かれている対策をまんま適用して。。。。

[oracle@localhost ~]$ cd /etc/yum/vars/
[oracle@localhost vars]$ ll
合計 8
-rw-r--r--. 1 root root 11 5月 1 2024 ocidomain
-rw-r--r--. 1 root root 14 5月 1 2024 ociregion
[oracle@localhost vars]$ cat ociregion
-us-phoenix-1
[oracle@localhost vars]$ cat ocidomain
oracle.com

[oracle@localhost vars]$ sudo mv ociregion ociregion.org
[sudo] oracle のパスワード:
[oracle@localhost vars]$ sudo su -
[root@localhost ~]# sudo echo -n "" > /etc/yum/vars/ociregion
[root@localhost ~]# cat /etc/yum/vars/ociregion
[root@localhost ~]# exit
logout

気を取り直して、もう一度。

[oracle@localhost ~]$ sudo yum install libffi-devel openssl openssl-devel tk-devel xz-devel zlib-devel bzip2-devel readline-devel libuuid-devel ncurses-devel libaio

Oracle Linux 8 BaseOS Latest (x86_64) 5.0 MB/s | 97 MB 00:19
Oracle Linux 8 Application Stream (x86_64) 5.1 MB/s | 70 MB 00:13
Latest Unbreakable Enterprise Kernel Release 7 for Oracle Linux 8 (x86_64) 5.1 MB/s | 61 MB 00:12

...略...

パッケージ openssl-1:1.1.1k-12.el8_9.x86_64 は既にインストールされています。
パッケージ libaio-0.3.112-1.el8.x86_64 は既にインストールされています。
依存関係が解決しました。
===============================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
===============================================================================================================
インストール:
bzip2-devel x86_64 1.0.6-28.el8_10 ol8_baseos_latest 224 k

...略...

xorg-x11-proto-devel noarch 2020.1-3.el8 ol8_appstream 280 k

トランザクションの概要
===============================================================================================================
インストール 32 パッケージ
アップグレード 10 パッケージ

ダウンロードサイズの合計: 17 M
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
(1/42): bzip2-devel-1.0.6-28.el8_10.x86_64.rpm 1.5 MB/s | 224 kB 00:00

...略...

(42/42): util-linux-2.32.1-46.0.1.el8.x86_64.rpm 3.6 MB/s | 2.5 MB 00:00
-----------------------------------------------------------------------------------------------------------
合計 4.3 MB/s | 17 MB 00:03

...略...

トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
scriptletの実行中: libuuid-2.32.1-46.0.1.el8.x86_64 1/1
アップグレード中 : libuuid-2.32.1-46.0.1.el8.x86_64 1/52

...略...

xz-devel-5.2.4-4.el8_6.x86_64 zlib-devel-1.2.11-25.el8.x86_64

[oracle@localhost ~]$ mkdir -p $HOME/python
[oracle@localhost ~]$ wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz

--2025-05-13 02:48:50-- https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz

...略...

HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 27195214 (26M) [application/octet-stream]
`Python-3.12.0.tgz' に保存中

Python-3.12.0.tgz 100%[===================================>] 25.93M 4.79MB/s 時間 5.4s

2025-05-13 02:48:56 (4.80 MB/s) - `Python-3.12.0.tgz' へ保存完了 [27195214/27195214]

[oracle@localhost ~]$ tar -xvzf Python-3.12.0.tgz --strip-components=1 -C /home/$USER/python
Python-3.12.0/Grammar/
Python-3.12.0/Grammar/python.gram

...略...

Python-3.12.0/Objects/tupleobject.c
Python-3.12.0/install-sh

[oracle@localhost ~]$ cd $HOME/python
[oracle@localhost python]$ ./configure --prefix=$HOME/python

checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu

...略...

configure: creating Modules/Setup.local
configure: creating Makefile
configure:

If you want a release build with all stable optimizations active (PGO, etc),
please run ./configure --enable-optimizations

[oracle@localhost python]$ make clean; make

find . -depth -name '__pycache__' -exec rm -rf {} ';'
find . -name '*.py[co]' -exec rm -f {} ';'
find . -name '*.[oa]' -exec rm -f {} ';'

...略...

# Pristine binaries before BOLT optimization.
rm -f *.prebolt
# BOLT instrumented binaries.
rm -f *.bolt_inst
gcc -pthread -c -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall
-std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes
-Werror=implicit-function-declaration -fvisibility=hidden -I./Include/internal
-I. -I./Include -DPy_BUILD_CORE -o Programs/python.o ./Programs/python.c

...略...

LC_ALL=C sed -e 's,\$(\([A-Za-z0-9_]*\)),\$\{\1\},g' < Misc/python-config.sh >python-config
The following modules are *disabled* in configure script:
_sqlite3

The necessary bits to build these optional modules were not found:
_dbm _gdbm nis
To find the necessary bits, look in configure.ac and config.log.

Checked 111 modules (31 built-in, 75 shared, 1 n/a on linux-x86_64, 1 disabled, 3 missing, 0 failed on import)

[oracle@localhost python]$ make altinstall

Creating directory /home/oracle/python/bin
Creating directory /home/oracle/python/lib

...略...

The necessary bits to build these optional modules were not found:
_dbm _gdbm nis
To find the necessary bits, look in configure.ac and config.log.

Checked 111 modules (31 built-in, 75 shared, 1 n/a on linux-x86_64, 1 disabled, 3 missing, 0 failed on import)
Creating directory /home/oracle/python/lib/python3.12
Creating directory /home/oracle/python/lib/python3.12/asyncio

...略...

Looking in links: /tmp/tmp9k7fgbr3
Processing /tmp/tmp9k7fgbr3/pip-23.2.1-py3-none-any.whl
Installing collected packages: pip
WARNING: The script pip3.12 is installed in '/home/oracle/python/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-23.2.1

ここまでマニュアルの通り。想定外のエラーもなく順調ですね〜

変数PYTHONHOME、PATHおよび LD_LIBRARY_PATHを設定〜python3およびpip3のシンボリックリンクの作成など

[oracle@localhost python]$ export PYTHONHOME=$HOME/python
[oracle@localhost python]$ export PATH=$PYTHONHOME/bin:$PATH
[oracle@localhost python]$ export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH
[oracle@localhost python]$ cd $HOME/python/bin
[oracle@localhost bin]$ ln -s python3.12 python3
[oracle@localhost bin]$ ln -s pip3.12 pip3
[oracle@localhost bin]$ cd $HOME
[oracle@localhost ~]$ wget https://download.oracle.com/otn_software/linux/instantclient/2340000/instantclient-basic-linux.x64-23.4.0.24.05.zip

--2025-05-13 03:03:13-- https://download.oracle.com/otn_software/linux/instantclient/2340000/instantclient-basic-linux.x64-23.4.0.24.05.zip

...略...

HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 118377607 (113M) [application/zip]
`instantclient-basic-linux.x64-23.4.0.24.05.zip' に保存中

instantclient-basic-linux.x64-23.4.0.24.05.zip 100%[===========================>] 112.89M 5.83MB/s 時間 18s

2025-05-13 03:03:31 (6.38 MB/s) - `instantclient-basic-linux.x64-23.4.0.24.05.zip' へ保存完了 [118377607/118377607]

[oracle@localhost ~]$
[oracle@localhost ~]$ unzip instantclient-basic-linux.x64-23.4.0.24.05.zip
Archive: instantclient-basic-linux.x64-23.4.0.24.05.zip
replace META-INF/MANIFEST.MF? [y]es, [n]o, [A]ll, [N]one, [r]ename: A
inflating: META-INF/MANIFEST.MF

...略...

instantclient_23_4/libocci.so.21.1 -> libocci.so.23.1
instantclient_23_4/libocci.so.22.1 -> libocci.so.23.1
[oracle@localhost ~]$
[oracle@localhost ~]$ export LD_LIBRARY_PATH=$HOME/instantclient_23_4:$LD_LIBRARY_PATH




.bashrcにも以下環境変数を追加しておきます
export PYTHONHOME=$HOME/python
export PATH=$PYTHONHOME/bin:$PATH
export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH

[oracle@localhost ~]$ vi .bashrc
[oracle@localhost ~]$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

...略...

export TWO_TASK=FREEPDB1
fi


# Environment variables for Python

export PYTHONHOME=$HOME/python
export PATH=$PYTHONHOME/bin:$PATH
export LD_LIBRARY_PATH=$PYTHONHOME/lib:$LD_LIBRARY_PATH

# Note: If Python is used to load models to the database, set this environment variable for the Oracle Instant Client.

export LD_LIBRARY_PATH=$HOME/instantclient_23_4:$LD_LIBRARY_PATH


requirements.txtの作成

[oracle@localhost ~]$ vi requirements.txt
[oracle@localhost ~]$ cat requirements.txt
--extra-index-url https://download.pytorch.org/whl/cpu
pandas==2.1.1
setuptools==68.0.0
scipy==1.12.0
matplotlib==3.8.4
oracledb==2.2.0
scikit-learn==1.4.1post1
numpy==1.26.4
onnxruntime==1.17.0
onnxruntime-extensions==0.10.1
onnx==1.16.0
torch==2.2.0+cpu
transformers==4.38.1
sentencepiece==0.2.0

pip3のアップグレード

[oracle@localhost ~]$ pip3 install --upgrade pip

Requirement already satisfied: pip in ./python/lib/python3.12/site-packages (23.2.1)
Collecting pip
Obtaining dependency information for pip
from https://files.pythonhosted.org/packages/29/a2/d40fb2460e883eca5199c62cfc2463fd261f760556ae6290f88488c362c0/pip-25.1.1-py3-none-any.whl.metadata
Downloading pip-25.1.1-py3-none-any.whl.metadata (3.6 kB)
Downloading pip-25.1.1-py3-none-any.whl (1.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 6.3 MB/s eta 0:00:00
Installing collected packages: pip
Attempting uninstall: pip
Found existing installation: pip 23.2.1
Uninstalling pip-23.2.1:
Successfully uninstalled pip-23.2.1
Successfully installed pip-25.1.1

[oracle@localhost ~]$ pip3 install -r requirements.txt

Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cpu
Collecting pandas==2.1.1 (from -r requirements.txt (line 2))
Downloading pandas-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)
Collecting setuptools==68.0.0 (from -r requirements.txt (line 3))

...略...

Successfully installed MarkupSafe-3.0.2 certifi-2025.4.26 cffi-1.17.1 charset-normalizer-3.4.2 coloredlogs-15.0.1 contourpy-1.3.2
cryptography-44.0.3 cycler-0.12.1 filelock-3.18.0 flatbuffers-25.2.10 fonttools-4.58.0 fsspec-2025.3.2 hf-xet-1.1.1 huggingface-hub-0.31.1
humanfriendly-10.0 idna-3.10 jinja2-3.1.6 joblib-1.5.0 kiwisolver-1.4.8 matplotlib-3.8.4 mpmath-1.3.0 networkx-3.4.2 numpy-1.26.4 onnx-1.16.0
onnxruntime-1.17.0 onnxruntime-extensions-0.10.1 oracledb-2.2.0 packaging-25.0 pandas-2.1.1 pillow-11.2.1 protobuf-6.30.2 pycparser-2.22
pyparsing-3.2.3 python-dateutil-2.9.0.post0 pytz-2025.2 pyyaml-6.0.2 regex-2024.11.6 requests-2.32.3 safetensors-0.5.3 scikit-learn-1.4.1.post1
scipy-1.12.0 sentencepiece-0.2.0 setuptools-68.0.0 six-1.17.0 sympy-1.14.0 threadpoolctl-3.6.0 tokenizers-0.15.2 torch-2.2.0+cpu
tqdm-4.67.1 transformers-4.38.1 typing-extensions-4.13.2 tzdata-2025.2 urllib3-2.4.0


あ”!
oml-2.1をインストールしてしまっていたので、oml-2.0をインストールしなおし. (oml-2.1でやってもよかったけどw

Oracle Machine Learning for Python Downloads
https://www.oracle.com/database/technologies/oml4py-downloads.html

から、2.0をダウンロード(oml4py-client-linux-x86_64-2.0.zip)して、と。。。。

ということでreinstall

[oracle@localhost ~]$ unzip oml4py-client-linux-x86_64-2.0.zip
Archive: oml4py-client-linux-x86_64-2.0.zip
inflating: client/client.pl
inflating: client/OML4PInstallShared.pm
inflating: client/oml-2.0-cp312-cp312-linux_x86_64.whl
extracting: client/oml4py.ver

[oracle@localhost ~]$ pip3 install client/oml-2.0-cp312-cp312-linux_x86_64.whl
Processing ./client/oml-2.0-cp312-cp312-linux_x86_64.whl
Requirement already satisfied: numpy>=1.26.4 in ./python/lib/python3.12/site-packages (from oml==2.0) (2.2.5)

...略...

Requirement already satisfied: six>=1.5 in ./python/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib>=3.7.2->oml==2.0) (1.17.0)
Requirement already satisfied: joblib>=1.2.0 in ./python/lib/python3.12/site-packages (from scikit-learn>=1.2.1->oml==2.0) (1.5.0)
Requirement already satisfied: threadpoolctl>=3.1.0 in ./python/lib/python3.12/site-packages (from scikit-learn>=1.2.1->oml==2.0) (3.6.0)
Installing collected packages: oml
Attempting uninstall: oml
Found existing installation: oml 2.1
Uninstalling oml-2.1:
Successfully uninstalled oml-2.1
Successfully installed oml-2.0

なにか怒られてるな。なぜだ。。。。numpy 1.xが必要っぽい。。。

[oracle@localhost ~]$ python3
Python 3.12.0 (main, May 13 2025, 02:54:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20.0.3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import oml

A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.2.5 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.

Traceback (most recent call last): File "", line 1, in
File "/home/oracle/python/lib/python3.12/site-packages/oml/__init__.py", line 77, in
from oml.utils import *
File "/home/oracle/python/lib/python3.12/site-packages/oml/utils/__init__.py", line 23, in
from .embeddings import EmbeddingModelConfig,EmbeddingModel
File "/home/oracle/python/lib/python3.12/site-packages/oml/utils/_pipeline/__init__.py", line 22, in
from .PipelineBuilder import PipelineBuilder

...略...

/home/oracle/python/lib/python3.12/site-packages/torch/nn/modules/transformer.py:20: UserWarning:
Failed to initialize NumPy: _ARRAY_API not found (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:84.)
device: torch.device = torch.device(torch._C._get_default_device()), # torch.device('cpu'),

A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.2.5 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.

Traceback (most recent call last): File "", line 1, in
File "/home/oracle/python/lib/python3.12/site-packages/oml/__init__.py", line 77, in
from oml.utils import *

...略...

from onnxruntime.capi._pybind_state import ExecutionMode # noqa: F401
File "/home/oracle/python/lib/python3.12/site-packages/onnxruntime/capi/_pybind_state.py", line 32, in
from .onnxruntime_pybind11_state import * # noqa
AttributeError: _ARRAY_API not found
/home/oracle/python/lib/python3.12/site-packages/oml/__init__.py:80: UserWarning: oml.utils import failed
warn('oml.utils import failed')
>>>

ということで、 numpy 1.x にする。。。うまくいった

[oracle@localhost ~]$ pip3 install --upgrade numpy==1.26.4
Collecting numpy==1.26.4
Using cached numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
Using cached numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.0 MB)
Installing collected packages: numpy
Attempting uninstall: numpy
Found existing installation: numpy 2.2.5
Uninstalling numpy-2.2.5:
Successfully uninstalled numpy-2.2.5
Successfully installed numpy-1.26.4


やっふーーーーーーーー!

[oracle@localhost ~]$ python3
Python 3.12.0 (main, May 13 2025, 02:54:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20.0.3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import oml
>>>
>>> from oml.utils import EmbeddingModel, EmbeddingModelConfig
>>> EmbeddingModelConfig.show_preconfigured()
['sentence-transformers/all-mpnet-base-v2', 'sentence-transformers/all-MiniLM-L6-v2'
, 'sentence-transformers/multi-qa-MiniLM-L6-cos-v1', 'ProsusAI/finbert'
,'medicalai/ClinicalBERT', 'sentence-transformers/distiluse-base-multilingual-cased-v2'
, 'sentence-transformers/all-MiniLM-L12-v2', 'BAAI/bge-small-en-v1.5'
, 'BAAI/bge-base-en-v1.5', 'taylorAI/bge-micro-v2', 'intfloat/e5-small-v2', 'intfloat/e5-base-v2'
, 'prajjwal1/bert-tiny', 'thenlper/gte-base'
, 'thenlper/gte-small', 'TaylorAI/gte-tiny', 'infgrad/stella-base-en-v2'
, 'sentence-transformers/paraphrase-multilingual-mpnet-base-v2'
, 'intfloat/multilingual-e5-base', 'intfloat/multilingual-e5-small'
, 'sentence-transformers/stsb-xlm-r-multilingual']
>>>


DBMS_VECTOR.LOAD_ONNX_MODELを使用してデータベースに手動でアップロード可能な、ONNXファイルを生成
"事前構成済の埋込みモデルをローカル・ファイルにエクスポートします。oml.utilsからEmbeddingModelをインポートします。これにより、ONNX形式モデルがローカル・ファイル・システムにエクスポートされます。"

ディレクトリオプジェクト向けのディレクトリを先に作成し、そのディレクトリで行うと便利ですね。

[oracle@localhost ~]$ cd work4vector/
[oracle@localhost work4vector]$ pwd
/home/oracle/work4vector
[oracle@localhost work4vector]$ python3
Python 3.12.0 (main, May 13 2025, 02:54:53) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20.0.3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from oml.utils import EmbeddingModel
>>> em = EmbeddingModel(model_name="sentence-transformers/all-MiniLM-L6-v2")
>>> em.export2file("all-MiniLM-L6-v2", output_dir=".")
/home/oracle/python/lib/python3.12/site-packages/huggingface_hub/file_download.py:943: FutureWarning: `resume_download` is deprecated
and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
warnings.warn(
tokenizer_config.json: 100%|████████████████████████████████████████████████| 350/350 [00:00<00:00, 821kB/s]
vocab.txt: 100%|████████████████████████████████████████████████████████████| 232k/232k [00:00<00:00, 565kB/s]
special_tokens_map.json: 100%|██████████████████████████████████████████████| 112/112 [00:00<00:00, 463kB/s]
tokenizer.json: 100%|███████████████████████████████████████████████████████| 466k/466k [00:00<00:00, 1.47MB/s]
config.json: 100%|██████████████████████████████████████████████████████████| 612/612 [00:00<00:00, 3.88MB/s]
model.safetensors: 100%|████████████████████████████████████████████████████| 90.9M/90.9M [00:13<00:00, 6.72MB/s]
>>>

[oracle@localhost work4vector]$ ll all-MiniLM-L6-v2.onnx
-rw-rw-r--. 1 oracle oracle 90621438 5月 13 05:47 all-MiniLM-L6-v2.onnx

[oracle@localhost work4vector]$ sqlplus sys@localhost:1521/freepdb1 as sysdba

...略...

Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.4.0.24.05
に接続されました。
SYS@localhost:1521/freepdb1> create directory onnx_dir as '/home/oracle/work4vector';

ディレクトリが作成されました。

経過: 00:00:00.08
SYS@localhost:1521/freepdb1> !pwd
/home/oracle/work4vector

SYS@localhost:1521/freepdb1> grant read,write on directory onnx_dir to scott;

権限付与が成功しました。

経過: 00:00:00.05
SYS@localhost:1521/freepdb1> grant create mining model to scott;

権限付与が成功しました。

経過: 00:00:00.02

DBMS_VECTOR.LOAD_ONNX_MODELプロシージャを使用して、OMLユーザー・スキーマにモデルをロードする

コードは以下

BEGIN
DBMS_VECTOR.LOAD_ONNX_MODEL(
directory => 'ONNX_DIR',
file_name => 'all-MiniLM-L6-v2.onnx',
model_name => 'ALL_MINILM_L6');
END;
/

SCOTT@localhost:1521/freepdb1> l
1 BEGIN
2 DBMS_VECTOR.LOAD_ONNX_MODEL(
3 directory => 'ONNX_DIR',
4 file_name => 'all-MiniLM-L6-v2.onnx',
5 model_name => 'ALL_MINILM_L6');
6* END;
SCOTT@localhost:1521/freepdb1> /

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

経過: 00:00:08.93


SQLを使用してモデルを確認

SQL文は以下

SELECT
model_name
, algorithm
, mining_function
FROM
user_mining_models
WHERE
model_name = 'ALL_MINILM_L6'
/

SCOTT@localhost:1521/freepdb1> l
1 SELECT
2 model_name
3 , algorithm
4 , mining_function
5 FROM
6 user_mining_models
7 WHERE
8* model_name = 'ALL_MINILM_L6'
SCOTT@localhost:1521/freepdb1> /

MODEL_NAME ALGORITHM MINING_FUNCTION
------------------------------ ------------------------------ ------------------------------
ALL_MINILM_L6 ONNX EMBEDDING

経過: 00:00:00.01


ユーザーがアクセスできるモデルを確認するビューからも確認しておきます。

SQLはこんな感じ

SELECT
view_name
, view_type
FROM
user_mining_model_views
WHERE
model_name = 'ALL_MINILM_L6'
ORDER BY
view_name
/

SCOTT@localhost:1521/freepdb1> l
1 SELECT
2 view_name
3 , view_type
4 FROM
5 user_mining_model_views
6 WHERE
7 model_name = 'ALL_MINILM_L6'
8 ORDER BY
9* view_name
SCOTT@localhost:1521/freepdb1> /

VIEW_NAME VIEW_TYPE
------------------------------ ------------------------------
DM$VJALL_MINILM_L6 ONNX Metadata Information
DM$VMALL_MINILM_L6 ONNX Model Information
DM$VPALL_MINILM_L6 ONNX Parsing Information

経過: 00:00:00.01

上記ビューを問い合わせモデルの情報を確認:)

SCOTT@localhost:1521/freepdb1> SELECT * FROM dm$vmall_minilm_l6;

NAME VALUE
------------------------------ -----------------------------------------------
Producer Name onnx.compose.merge_models
Graph Name tokenizer_main_graph
Graph Description Graph combining tokenizer and main_graph
tokenizer
main_graph
Version 1
Input[0] input:string[?]
Output[0] embedding:float32[?,384]

6行が選択されました。

経過: 00:00:00.00

VECTOR_EMBEDDING SQLスコアリング関数を軽く試す!

SQL文はこんな感じ

SELECT VECTOR_EMBEDDING(ALL_MINILM_L6 USING 'RES' as DATA) AS embedding;

SCOTT@localhost:1521/freepdb1> r
1* SELECT VECTOR_EMBEDDING(ALL_MINILM_L6 USING 'RES' as DATA) AS embedding

EMBEDDING
----------------------------------------------------------------------------------------------------
[-1.16423056E-001,1.54331746E-002,-4.69262414E-002,7.16730766E-003,3.50234732E-002,-4.02988419E-002,
.08232533E-002,4.99225073E-002,-1.86311249E-002,-2.62796488E-002,-3.2601878E-002,5.22731952E-002,-9.

...略...

-003,6.00763485E-002,1.91014066E-001,7.64457136E-002,1.46513591E-002,3.13854888E-002]


経過: 00:00:00.36


関数しか実行していないので面白い実行計画は現れませんが一応、確認だけw

SCOTT@localhost:1521/freepdb1> set autot trace exp stat
SCOTT@localhost:1521/freepdb1> r
1* SELECT VECTOR_EMBEDDING(ALL_MINILM_L6 USING 'RES' as DATA) AS embedding

経過: 00:00:00.33

実行計画
----------------------------------------------------------
Plan hash value: 1388734953

-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------


統計
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
2261 bytes sent via SQL*Net to client
473 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


user_mining_models 、user_mining_model_attributesビューなんてのありますね。ふむふむ

SCOTT@localhost:1521/freepdb1> SELECT model_name, mining_function, algorithm, algorithm_type, model_size FROM user_mining_models;

MODEL_NAME MINING_FUNCTION ALGORITHM ALGORITHM_ MODEL_SIZE
------------------------------ ------------------------------ ------------------------------ ---------- ----------
ALL_MINILM_L6 EMBEDDING ONNX NATIVE 90621438

経過: 00:00:00.02

SCOTT@localhost:1521/freepdb1> l
1 SELECT model_name, attribute_name, attribute_type, data_type, vector_info
2* FROM user_mining_model_attributes
SCOTT@localhost:1521/freepdb1> /

MODEL_NAME ATTRIBUTE_NAME ATTRIBUTE_TY DATA_TYPE VECTOR_INFO
------------------------------ ------------------------------ ------------ ------------------------------ ------------------------------
ALL_MINILM_L6 ORA$ONNXTARGET VECTOR VECTOR VECTOR(384,FLOAT32)
ALL_MINILM_L6 DATA TEXT VARCHAR2

経過: 00:00:00.01


ONNX形式の埋込みモデルを使用して、ユーザーの入力テキスト文字列「hello」をベクトルに変換してみる。ベクトル眺めても意味わからないけども、とりあえず、できてるみたいw

SCOTT@localhost:1521/freepdb1> col EMBEDDING for a200
SCOTT@localhost:1521/freepdb1> SELECT TO_VECTOR(VECTOR_EMBEDDING(all_minilm_l6 USING 'hello' as data)) AS EMBEDDING;

EMBEDDING
-----------------------------------------------------------------------------------------------
[-6.27717897E-002,5.49588911E-002,5.21648414E-002,8.57899487E-002,-8.27489197E-002,-7.45729804E-
002,6.85546845E-002,1.83963589E-002,-8.20114315E-002,-3.73847559E-002,1.21248914E-002,3.51829384
E-003,-4.13423125E-003,-4.37844135E-002,2.18073577E-002,-5.10276016E-003,1.95467062E-002,-4.2348

...略...

-4.67414372E-002,-1.34112127E-002,6.51347339E-002,5.09059429E-002,5.1483497E-002,7.09215924E-003]


経過: 00:00:00.67

ということで、準備完了(このモデルだと日本語は対応してないみたいだけど、ひとまず、軽く遊べる小さなOracle Database 23ai Free on VirtualBOXの環境の準備完了!

SQL文もここまでくると、何やっているのか理解しながら進めないと、迷子になりそうな気がしないでもないw

次回へつづく。

| | | コメント (0)

2023年12月13日 (水)

MySQL 8.0.32 , PostgreSQL 13.4 and Oracle Database 21c on Oracle Linux 8 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160702



予定外ですが、Advent Calendarのシーズンついでなので、空いていた以下のアドベントカレンダー向けエントリーとなります。
Kernel/VM Advent Calendar 2023 / Day 13



macOS / ARM64 Beta development revision 160702
https://www.virtualbox.org/wiki/Testbuilds

以前、Oracle Linux 8 and MySQL 8.0.32 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160167で、MySQL 8.0.32が起動した!と言うことを書きましたが、その後のBETAリリースではOS起動中にクラッシュしていました。
で、今回は、development revision 160702をダメもとで試してみました。

結果から書くと、色々もっさりしているのは仕方ないかないところですが、このrevisionでは、MySQLに加えて、PostgreSQLも起動しました!!!

VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160702
GuestOS : Oracle Linux Server release 8.5
MySQL 8.0.32 - 起動した!
PostgreSQL 13.4 - 起動した!
Oracle database 21c - 起動せず!


試した内容は前回と同じですが、Oracleについては変えています。
1) Oracle Linux 8.5 に、PostgreSQL 13.4 と MySQL 8.0.32 を構成したVMをエクスポートして ova 作成
2) 1)のOracle Linux 8.5 に、Oracle Database 21cを構成したものを ova としてエクスポート。
それぞれをVirtualBoxへインポートして検証しました。

ちなみに、
Oracle Linux 7.6のPre-Built Developer VMs (for Oracle VM VirtualBox) および、Oracle Linux 8.6に構築したOracle 23c Freeは、OS起動にクラッシュしていたので、うまく起動した1)を利用して、OS起動後にOracleの挙動を確認する方法にしましたが、Oracleがコケたと言う結果となりました。

20231213-121328

20231213-120924

20231213-121535

20231213-121631

20231213-155006

Test Buildは、結構進んできているようで、今後が楽しみです ;)

では、また。



関連エントリー
Oracle Linux 8 and MySQL 8.0.32 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160167

| | | コメント (0)

2023年11月17日 (金)

Oracle Linux 8 and MySQL 8.0.32 on VirtualBox for Apple Silicon Test Build 7.0.97_BETA5r160167

ということで、ちょっと一休み的なネタです。

Apple Silicon対応はほぼ諦めていたVirtualBoxが 7.0でBETA版をリリースして大喜びしてたわけですが、
7.0.12でも正常に起動してくれないですよね。まだ。
ただ、表には出てこないですが、Test Buildでは結構進んでいるようで、嬉しいお知らせです。:)

まだ、Oracle Databaseとかは起動しないようですが、最新のTest Buildをダメ元で試してみたら、Oracle Linux 8とMySQL 8.0.32の組み合わせならDBのお遊びに使えそうな状況(次のBuild ではどうなるかわかりませんが)であることに気づきました。確実に進捗してそうで一安心。

新規VM作成ではなく、以下の手順で簡易に確認してみました。

macOS/Intel MBAのVirtualBoxにて、以下、2つのovaを作成し、M2 MBAのTest Build最新版のVirtualBoxへインポートして動作するかどうかを確認

1) Oracle Linux 8 に、PostgreSQL 13.4 と MySQL 8.0.32 を構成したVMをエクスポートして ova 作成
2) Oracle Linux 8 に、Oracle 23c Free Developer Editionを構成していたVMをエクスポートして ova 作成

結果は、
1)のMySQLは起動成功
1)のMySQLは起動成功
PostgreSQLは起動できず。
2)はOSは起動したがOracle起動中にエラーでVM停止

という状況。

でも、MySQL 8.0.32が、M2 MBAのVirtualBoxで使えるようになっているのはかなりの進捗なのではないかと思います。そもそもApple SiliconでVirtualBoxインストールできなくなったりしていた悲しい時期から比べれば。
いずれ、Oracleが起動するようになってくれることを期待しつつ。。Advent Calendarの記事を考えよう :)

 

以下、軽めの確認ログとスクリーンショットなど。

VirtualBox Test Build 7.0.97 BETA5
20231117-30344

OVAインポート成功後、OSは正常に起動したものの、PostgreSQL 13.4 は起動失敗。 MySQL 8.0.32は起動成功!。
Pg_ng_mysql_ok

Oracle Database 23c Free Developer Editionを構成したovaインポート後、Database起動中にfatal errorでVM停止。惜しいね。

 20231117-122036

MySQL 8.0.32 on Oracle Linux 8.5 on VirtualBox Test Build 7.0.97 BETA5 for macOS/M1/M2でMySQLへ接続!
Mysql-8032

 



 

VirtualBoxホストの情報 M2 MBAです。

leaffish ~ % /usr/sbin/system_profiler SPHardwareDataType | grep -E '(Processor|Cores|Memory|Chip|Model Name)'
Model Name: MacBook Air
Chip: Apple M2
Total Number of Cores: 8 (4 performance and 4 efficiency)
Memory: 24 GB


VirtualBoxは、Text Build最新(17-Nov-2023)

VirtualBox test builds
https://www.virtualbox.org/wiki/Testbuilds より、macOS/ARM64 BETAとExtension Packを利用

leaffish ~ % VBoxManage -v
7.0.97_BETA5r160167

 

M2 MBAのTerminalからsshでローカルのVMへ。 M2 MBAのVirtualBox Guest OSは、Oracle Linux 8.5 です。起動してますね!

leaffish ~ % ssh master@192.168.1.117
master@192.168.1.117's password:
Activate the web console with: systemctl enable --now cockpit.socket

[master@localhost ~]$
[master@localhost ~]$ cat /etc/oracle-release
Oracle Linux Server release 8.5

[master@localhost ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)
[master@localhost ~]$

 

起動しているのは確認できましたが、MySQLへ接続してSQLを実行するまでが確認!
おおおおおおおおーーーーーーっ!。

MySQL 8.0.32 on Oracle Linux 8.5 on M2 MacBook Air VirtualBox 。Oracle Databaseではないけど、うれしくて涙が。。。出ますね。これ。

[master@localhost ~]$ mysql -u scott -D perftestdb -p 
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| perftestdb |
+--------------------+
3 rows in set (0.02 sec)

mysql> show tables;
+----------------------+
| Tables_in_perftestdb |
+----------------------+
| detail |
| hoge |
| master |
| t0 |
| t1 |
| t1017 |
| t1017_2 |
| t2 |
| t3 |
| t4 |
+----------------------+
10 rows in set (0.07 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.32 |
+-----------+
1 row in set (0.00 sec)

mysql> select * from t1;
+----+-------+
| id | t1_c1 |
+----+-------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 9 |
| 10 | 10 |
+----+-------+
10 rows in set (0.04 sec)

mysql> exit
Bye

 

ついでなので、停止も試しておきましょう:)

[master@localhost ~]$ sudo service mysqld stop
[[sudo] master のパスワード:
Redirecting to /bin/systemctl stop mysqld.service
[master@localhost ~]$ sudo shutdown -h now
Connection to 192.168.1.117 closed by remote host.
Connection to 192.168.1.117 closed.
leaffish ~ %

 

週末天気悪そうで、Walkingできないかもしれない。。..

 

では、また。

 

 

 

| | | コメント (0)

2023年8月 4日 (金)

MySQL 8.0.32 / explain analyze 実行途中でキャンセルできるみたいだけど、キャンセルしたら、Actual Plan、途中まで出るの?

本年度一発目のw Databaseネタは、なんと、MySQLネタからのスタートですw

MySQL 8.0.18以降、Actualプランが取得できるようになってた。
また、MySQL 8.0.20 以降、KILL QUERY または CTRL-C を使用してこのステートメントを終了できるとある。
ただ、マニュアルに記載されているのはここまでで、キャンセルできることは記載されているが、キャンセルした場合のActual Planはどこまで出力されるのだろう? or 全く出力されない?

OracleのリアルタイムSQL監視だとキャンセルすると不完全ではあるけども、なんとなーく判断できる程度の情報は途中まで取得できるが、
GATHER_PLAN_STATISTICSヒントなどを使ったActualプランは最後まで実行しないとアcつあlはしゅとくできない。どちらのタイプに似ているのでしょうね?

長時間(数日とかw)かかってしまうようになったSQLのActualプラン取得するの意外と難しいケースも場合によってはあったりするわけで。。。そんなとき、Actualみたいけど、キャンセルしたらどうなるのだろうと。。
途中まででも取得できるのか、それとも、Nothingなのか。。。

MySQLのActualプランの取得はどうなんだろう。。。ということで、試してみた。

EXPLAIN ANALYZE による情報の取得
https://dev.mysql.com/doc/refman/8.0/ja/explain.html#explain-analyze





結論から書くと、
MySQL 8.0.32での検証だが、

explain analyzeで取得できるActual Planは、対応しているSQL文の実行中にCTRL-Cでキャンセルしても、その時点までの、Actual Planを表示してくれる!!!!!!

ただし、パース時間が異常に長めのSQL文(結合数めちゃ多いとか)だと、実行以前に、パース時間が長いため、パースフェーズでキャンセルしてしまうの何も表示されない。。と(最初はこちらを引いてしまったので、常に表示されないものかと思い込んでしまった)
他の方法で実行をキャンセルした場合も同じだろう。とは思う。

いや、他にも出力されないケースがあるとか、その検証方法だから出力されているだけどか、MySQLのexplain analyzeのディープなツッコミがありましたら、よろしくお願いします。:)

MySQLの8.0台ってマイナー番号変わっても機能追加されたり変化しているので、一応。 MySQL 8.0.32 上では。ということにしておく。




以下、検証の記録的なもの。

確認に使用した MySQLのバージョン

[master@localhost ~]$ mysql -u scott -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.32 |
+-----------+
1 row in set (0.00 sec)

事前に準備したクエリ向け表と索引など

Database changed
mysql> use perftestdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>
mysql> desc master;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| dummya | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql> desc detail;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| subid | int | NO | PRI | NULL | |
| dummya | varchar(10) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> show indexes from master;
+--------+------------+----------+--------------+-------------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Index_type |
+--------+------------+----------+--------------+-------------+------------+
| master | 0 | PRIMARY | 1 | id | BTREE |
+--------+------------+----------+--------------+-------------+------------+
1 row in set (0.02 sec)

mysql> show indexes from detail;
+--------+------------+----------+--------------+-------------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Index_type |
+--------+------------+----------+--------------+-------------+------------+
| detail | 0 | PRIMARY | 1 | id | BTREE |
| detail | 0 | PRIMARY | 2 | subid | BTREE |
+--------+------------+----------+--------------+-------------+------------+
2 rows in set (0.02 sec)

mysql> select * from master;
+----+--------+
| id | dummya |
+----+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 9 |
| 10 | 10 |
+----+--------+
10 rows in set (0.01 sec)

mysql> select * from detail;
+----+-------+--------+
| id | subid | dummya |
+----+-------+--------+
| 1 | 1 | 11 |
| 1 | 2 | 12 |
| 2 | 1 | 21 |
| 2 | 2 | 22 |
| 3 | 1 | 31 |
...略...
| 7 | 1 | 71 |
| 7 | 2 | 72 |
| 8 | 1 | 81 |
| 8 | 2 | 82 |
| 9 | 1 | 91 |
| 9 | 2 | 92 |
| 10 | 1 | 101 |
| 10 | 2 | 102 |
+----+-------+--------+
20 rows in set (0.01 sec)

検証用に作ったSQL。どのぐらいのElapsed Timeかanaluyzeをつけて実行して、キャンセルしやすい程度のElapsed Timeか確認しておきます。

mysql> explain analyze
-> select *
-> from
-> master inner join detail
-> on master.id = detail.id
-> inner join detail t2
-> on
-> t2.id = detail.id
-> inner join detail t3
-> on
-> t3.id = t2.id
-> inner join detail t4
-> on
-> t4.id = t3.id
-> inner join detail t5
-> on
-> t5.id = t4.id
-> inner join detail t6
-> on
-> t6.id = t5.id
-> inner join detail t7
-> on
-> t7.id = t6.id
-> inner join detail t8
-> on
-> t8.id = t7.id
-> inner join detail t9
-> on
-> t9.id = t8.id
-> inner join detail t10
-> on
-> t10.id = t9.id
-> ;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop inner join (cost=5729.85 rows=8192) (actual time=0.115..37.938 rows=10240 loops=1)
-> Nested loop inner join (cost=2862.65 rows=4096) (actual time=0.108..18.747 rows=5120 loops=1)
-> Nested loop inner join (cost=1429.05 rows=2048) (actual time=0.102..9.267 rows=2560 loops=1)
-> Nested loop inner join (cost=712.25 rows=1024) (actual time=0.097..4.689 rows=1280 loops=1)
-> Nested loop inner join (cost=353.85 rows=512) (actual time=0.091..2.336 rows=640 loops=1)
-> Nested loop inner join (cost=174.65 rows=256) (actual time=0.086..1.203 rows=320 loops=1)
-> Nested loop inner join (cost=85.05 rows=128) (actual time=0.080..0.630 rows=160 loops=1)
-> Nested loop inner join (cost=40.25 rows=64) (actual time=0.075..0.337 rows=80 loops=1)
-> Nested loop inner join (cost=17.85 rows=32) (actual time=0.069..0.189 rows=40 loops=1)
-> Nested loop inner join (cost=6.65 rows=16) (actual time=0.063..0.110 rows=20 loops=1)
-> Table scan on master (cost=1.05 rows=8) (actual time=0.041..0.047 rows=10 loops=1)
-> Index lookup on detail using PRIMARY (id=`master`.id) (cost=0.53 rows=2) (actual time=0.005..0.006 rows=2 loops=10)
-> Index lookup on t2 using PRIMARY (id=`master`.id) (cost=0.51 rows=2) (actual time=0.003..0.004 rows=2 loops=20)
-> Index lookup on t3 using PRIMARY (id=`master`.id) (cost=0.51 rows=2) (actual time=0.002..0.003 rows=2 loops=40)
-> Index lookup on t4 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=80)
-> Index lookup on t5 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=160)
-> Index lookup on t6 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=320)
-> Index lookup on t7 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=640)
-> Index lookup on t8 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=1280)
-> Index lookup on t9 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=2560)
-> Index lookup on t10 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.002..0.003 rows=2 loops=5120)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (21.18 sec)


では、explain analyseを途中でキャンセルしてみます。elapsed timeが21秒ほどなので、20秒後にキャンセルしてみます。

mysql> explain analyze
select *
from
master inner join detail
on master.id = detail.id
inner join detail t2
on t2.id = master.id
inner join detail t3
on t3.id = master.id
inner join detail t4
on t4.id = master.id
inner join detail t5
on t5.id = master.id
inner join detail t6
on t6.id = master.id
inner join detail t7
on t7.id = master.id
inner join detail t8
on t8.id = master.id
inner join detail t9
on t9.id = master.id
inner join detail t10
on t10.id = master.id
;
^C^C -- query aborted
ERROR 1317 (70100): Query execution was interrupted
mysql>


! やはり、実行途中のキャンセルだとActual Planは何も出力されないみたい。。。。

??ん? いや、なんか違うな。これw!

SQL文の実行時間はたいしたことない。人間がこの時間内にピンポイントでキャンセルするには短すぎるよね。
SQL文の実行時間は、約38ミリ秒!!! こっちだw 最終に表示されている21秒には、SQLのパース時間も含まれているはず。。。。見逃した。俺としたことが。。。

| -> Nested loop inner join  (cost=5729.85 rows=8192) (actual time=0.115..37.938 rows=10240 loops=1)

キャンセルしたのは、SQL実行後、おおよそ、20秒後。SQLのActualタイムを見ると38ミリ秒なので、ギリギリ、パース時間中に被ってそう。

1 row in set (21.00 sec)

だとしたら、まず、そこから確認。パースにどの程度要しているか、explainだけにすれば、良さそうだよね。Oracle Databaseでもそうだし。(PostgreSQLはパース時間も表示してくれたりするけども。あれ意外に便利なんだよ)

mysql> explain format=tree    -> select *
-> from
-> master inner join detail
-> on master.id = detail.id
-> inner join detail t2
-> on
-> t2.id = detail.id
-> inner join detail t3
-> on
-> t3.id = t2.id
-> inner join detail t4
-> on
-> t4.id = t3.id
-> inner join detail t5
-> on
-> t5.id = t4.id
-> inner join detail t6
-> on
-> t6.id = t5.id
-> inner join detail t7
-> on
-> t7.id = t6.id
-> inner join detail t8
-> on
-> t8.id = t7.id
-> inner join detail t9
-> on
-> t9.id = t8.id
-> inner join detail t10
-> on
-> t10.id = t9.id
-> ;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop inner join (cost=5729.85 rows=8192)
-> Nested loop inner join (cost=2862.65 rows=4096)
-> Nested loop inner join (cost=1429.05 rows=2048)
-> Nested loop inner join (cost=712.25 rows=1024)
-> Nested loop inner join (cost=353.85 rows=512)
-> Nested loop inner join (cost=174.65 rows=256)
-> Nested loop inner join (cost=85.05 rows=128)
-> Nested loop inner join (cost=40.25 rows=64)
-> Nested loop inner join (cost=17.85 rows=32)
-> Nested loop inner join (cost=6.65 rows=16)
-> Table scan on master (cost=1.05 rows=8)
-> Index lookup on detail using PRIMARY (id=`master`.id) (cost=0.53 rows=2)
-> Index lookup on t2 using PRIMARY (id=`master`.id) (cost=0.51 rows=2)
-> Index lookup on t3 using PRIMARY (id=`master`.id) (cost=0.51 rows=2)
-> Index lookup on t4 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
-> Index lookup on t5 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
-> Index lookup on t6 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
-> Index lookup on t7 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
-> Index lookup on t8 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
-> Index lookup on t9 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
-> Index lookup on t10 using PRIMARY (id=`master`.id) (cost=0.50 rows=2)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (21.84 sec)


お! 予想通り、explainでパースだけさせたら、explain analyze(SQL文の実行を含む)とほぼ同じ 21秒台。想定は正しそう。

だとすると、今回確認したいことを実現するには、..... SQLの実行時間をもっと長くして、人がw キャンセルしやすい程度に実行時間を間延びさせておく必要がある。。
とはいえ、大量のデータを用意する時間もVMのストレージもないと。。。

さて、どうするか。。。。

***** ここで、 一休さん、考え中。。。 木魚の音。ポク、ポク、ポク。。。。w *****


***** ここで、 一休さん、閃いた。。。 鐘の音、チーーーーーん *****
 
sleep()関数を使って、眠らせると時間稼ぎできるのでは?  やってみよう!
おおおおお、いい感じだ。

mysql> explain analyze
-> select *, sleep(0.01)
-> from
-> master inner join detail
-> on master.id = detail.id
-> inner join detail t2
-> on
-> t2.id = detail.id
-> inner join detail t3
-> on
-> t3.id = t2.id
-> inner join detail t4
-> on
-> t4.id = t3.id
-> inner join detail t5
-> on
-> t5.id = t4.id
-> inner join detail t6
-> on
-> t6.id = t5.id
-> inner join detail t7
-> on
-> t7.id = t6.id
-> inner join detail t8
-> on
-> t8.id = t7.id
-> inner join detail t9
-> on
-> t9.id = t8.id
-> inner join detail t10
-> on
-> t10.id = t9.id
-> ;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop inner join (cost=5729.85 rows=8192) (actual time=0.170..232.399 rows=10240 loops=1)
-> Nested loop inner join (cost=2862.65 rows=4096) (actual time=0.164..75.457 rows=5120 loops=1)
-> Nested loop inner join (cost=1429.05 rows=2048) (actual time=0.159..37.659 rows=2560 loops=1)
-> Nested loop inner join (cost=712.25 rows=1024) (actual time=0.154..17.709 rows=1280 loops=1)
-> Nested loop inner join (cost=353.85 rows=512) (actual time=0.149..9.612 rows=640 loops=1)
-> Nested loop inner join (cost=174.65 rows=256) (actual time=0.143..4.658 rows=320 loops=1)
-> Nested loop inner join (cost=85.05 rows=128) (actual time=0.138..2.285 rows=160 loops=1)
-> Nested loop inner join (cost=40.25 rows=64) (actual time=0.132..1.174 rows=80 loops=1)
-> Nested loop inner join (cost=17.85 rows=32) (actual time=0.126..0.625 rows=40 loops=1)
-> Nested loop inner join (cost=6.65 rows=16) (actual time=0.120..0.347 rows=20 loops=1)
-> Table scan on master (cost=1.05 rows=8) (actual time=0.097..0.122 rows=10 loops=1)
-> Index lookup on detail using PRIMARY (id=`master`.id) (cost=0.53 rows=2) (actual time=0.017..0.021 rows=2 loops=10)
-> Index lookup on t2 using PRIMARY (id=`master`.id) (cost=0.51 rows=2) (actual time=0.010..0.013 rows=2 loops=20)
-> Index lookup on t3 using PRIMARY (id=`master`.id) (cost=0.51 rows=2) (actual time=0.010..0.013 rows=2 loops=40)
-> Index lookup on t4 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.010..0.013 rows=2 loops=80)
-> Index lookup on t5 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.010..0.014 rows=2 loops=160)
-> Index lookup on t6 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.011..0.015 rows=2 loops=320)
-> Index lookup on t7 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.009..0.012 rows=2 loops=640)
-> Index lookup on t8 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.011..0.015 rows=2 loops=1280)
-> Index lookup on t9 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.010..0.014 rows=2 loops=2560)
-> Index lookup on t10 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.010..0.028 rows=2 loops=5120)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (2 min 47.64 sec)


Elapsed Timeがパース時間より長くなったので、できそう。 60秒後にキャンセルすれば余裕はありそう。

1 row in set (2 min 47.64 sec)

explain analyzeを実行して、60秒後にキャンセルした!

mysql> explain analyze
-> select *, sleep(0.01)
-> from
-> master inner join detail
-> on master.id = detail.id
-> inner join detail t2
-> on
-> t2.id = detail.id
-> inner join detail t3
-> on
-> t3.id = t2.id
-> inner join detail t4
-> on
-> t4.id = t3.id
-> inner join detail t5
-> on
-> t5.id = t4.id
-> inner join detail t6
-> on
-> t6.id = t5.id
-> inner join detail t7
-> on
-> t7.id = t6.id
-> inner join detail t8
-> on
-> t8.id = t7.id
-> inner join detail t9
-> on
-> t9.id = t8.id
-> inner join detail t10
-> on
-> t10.id = t9.id
-> ;

^C^C -- query aborted

+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop inner join (cost=5729.85 rows=8192) (actual time=0.113..92.382 rows=2639 loops=1)
-> Nested loop inner join (cost=2862.65 rows=4096) (actual time=0.106..29.480 rows=1320 loops=1)
-> Nested loop inner join (cost=1429.05 rows=2048) (actual time=0.101..14.323 rows=660 loops=1)
-> Nested loop inner join (cost=712.25 rows=1024) (actual time=0.096..7.161 rows=330 loops=1)
-> Nested loop inner join (cost=353.85 rows=512) (actual time=0.090..3.507 rows=165 loops=1)
-> Nested loop inner join (cost=174.65 rows=256) (actual time=0.085..1.624 rows=83 loops=1)
-> Nested loop inner join (cost=85.05 rows=128) (actual time=0.079..0.867 rows=42 loops=1)
-> Nested loop inner join (cost=40.25 rows=64) (actual time=0.073..0.352 rows=21 loops=1)
-> Nested loop inner join (cost=17.85 rows=32) (actual time=0.068..0.210 rows=11 loops=1)
-> Nested loop inner join (cost=6.65 rows=16) (actual time=0.062..0.122 rows=6 loops=1)
-> Table scan on master (cost=1.05 rows=8) (actual time=0.040..0.044 rows=3 loops=1)
-> Index lookup on detail using PRIMARY (id=`master`.id) (cost=0.53 rows=2) (actual time=0.021..0.024 rows=2 loops=3)
-> Index lookup on t2 using PRIMARY (id=`master`.id) (cost=0.51 rows=2) (actual time=0.011..0.014 rows=2 loops=6)
-> Index lookup on t3 using PRIMARY (id=`master`.id) (cost=0.51 rows=2) (actual time=0.009..0.012 rows=2 loops=11)
-> Index lookup on t4 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.020..0.024 rows=2 loops=21)
-> Index lookup on t5 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.014..0.017 rows=2 loops=42)
-> Index lookup on t6 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.015..0.022 rows=2 loops=83)
-> Index lookup on t7 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.014..0.021 rows=2 loops=165)
-> Index lookup on t8 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.016..0.021 rows=2 loops=330)
-> Index lookup on t9 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.015..0.022 rows=2 loops=660)
-> Index lookup on t10 using PRIMARY (id=`master`.id) (cost=0.50 rows=2) (actual time=0.015..0.044 rows=2 loops=1320)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (1 min 3.57 sec)


SQLのActualタイムは、92ミリ秒、処理した行数が、2629行。

| -> Nested loop inner join  (cost=5729.85 rows=8192) (actual time=0.113..92.382 rows=2639 loops=1)

以下を見ると、loopsが、1320回となっている。

    -> Index lookup on t10 using PRIMARY (id=`master`.id)  (cost=0.50 rows=2) (actual time=0.015..0.044 rows=2 loops=1320)

やった〜〜〜。 MySQLの explain analyzeは、"SQLの実行途中"(パース時間が長い割に、実行時間が短い場合は、実行中にキャンセルするのが難しいので表示されないケースはあるので注意)でキャンセルしても、途中までのActual Planを返してくれる!


念の為、sleep()関数を使ったトリッキーな再現方法ではなく、実際にSQLの実行中にキャンセルする方法を思いついたので、さらに、試してみる!


お分かりだろうか。 みなさん大好き(?)、 再起問い合わせ再帰問合せでシーケンス番号を生成するクエリーだ。100000000ぐらい生成すれば、いい感じの実行時間になるだろうと、思われるので、まず、このSQLのパース時間だけ確認。


mysql> SET SESSION cte_max_recursion_depth = 100000000;
Query OK, 0 rows affected (0.00 sec)

パース時間はほぼかかってないですね。先ほどの例は、結合する表が多いので、パース時間は長くなる傾向があるので、シンプルなSQLだけど、実行時間は、なげ〜〜〜〜ぞ〜というのにしてみた。

mysql> explain format=tree
-> WITH RECURSIVE gen_nums(v)
-> AS
-> (
-> SELECT 1
-> UNION ALL
-> SELECT v + 1
-> FROM
-> gen_nums
-> WHERE v + 1 <= 100000000
-> )
-> SELECT v from gen_nums;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Table scan on gen_nums (cost=3.87..5.56 rows=3)
-> Materialize recursive CTE gen_nums (cost=3.03..3.03 rows=3)
-> Rows fetched before execution (cost=0.00..0.00 rows=1)
-> Repeat until convergence
-> Filter: ((gen_nums.v + 1) <= 100000000) (cost=2.73 rows=2)
-> Scan new records on gen_nums (cost=2.73 rows=2)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


explain analyzeの実時間を確認

mysql> explain analyze
-> WITH RECURSIVE gen_nums(v)
-> AS
-> (
-> SELECT 1
-> UNION ALL
-> SELECT v + 1
-> FROM
-> gen_nums
-> WHERE v + 1 <= 100000000
-> )
-> SELECT v from gen_nums;
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Table scan on gen_nums (cost=3.87..5.56 rows=3) (actual time=139082.095..178091.268 rows=100000000 loops=1)
-> Materialize recursive CTE gen_nums (cost=3.03..3.03 rows=3) (actual time=139081.959..139081.959 rows=100000000 loops=1)
-> Rows fetched before execution (cost=0.00..0.00 rows=1) (actual time=0.000..0.000 rows=1 loops=1)
-> Repeat until convergence
-> Filter: ((gen_nums.v + 1) <= 100000000) (cost=2.73 rows=2) (actual time=0.003..29453.367 rows=50000000 loops=2)
-> Scan new records on gen_nums (cost=2.73 rows=2) (actual time=0.002..21852.139 rows=50000000 loops=2)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (3 min 8.46 sec)

Actual timeは、178秒なので、60秒後にキャンセルすればよさそうですね。

| -> Table scan on gen_nums  (cost=3.87..5.56 rows=3) (actual time=139082.095..178091.268 rows=100000000 loops=1)

では、キャンセルでどうなるか検証!!

mysql> explain analyze
-> WITH RECURSIVE gen_nums(v)
-> AS
-> (
-> SELECT 1
-> UNION ALL
-> SELECT v + 1
-> FROM
-> gen_nums
-> WHERE v + 1 <= 100000000
-> )
-> SELECT v from gen_nums;
^C^C -- query aborted
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Table scan on gen_nums (cost=3.87..5.56 rows=3) (never executed)
-> Materialize recursive CTE gen_nums (cost=3.03..3.03 rows=3) (never executed)
-> Rows fetched before execution (cost=0.00..0.00 rows=1) (actual time=0.000..0.000 rows=1 loops=1)
-> Repeat until convergence
-> Filter: ((gen_nums.v + 1) <= 100000000) (cost=2.73 rows=2) (actual time=0.004..27789.355 rows=47924088 loops=1)
-> Scan new records on gen_nums (cost=2.73 rows=2) (actual time=0.002..20555.788 rows=47924088 loops=1)
|
+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (1 min 3.94 sec)


60行でキャンセルしたので、ほぼ同じ。

1 row in set, 1 warning (1 min 3.94 sec

以下の行ソースを見ると、Actual timeが21秒ほど、rowsも47924088行。


-> Scan new records on gen_nums (cost=2.73 rows=2) (actual time=0.002..20555.788 rows=47924088 loops=1)

興味深い部分は、以下の2行の行ソース。never execute と表示されている。

| -> Table scan on gen_nums  (cost=3.87..5.56 rows=3) (never executed)
-> Materialize recursive CTE gen_nums (cost=3.03..3.03 rows=3) (never executed)
¥


これを見る限り、MySQLのexplain analyzeは、SQL文の実行フェース中にキャンセルすると、その時点までの Actual Planを出力してくれる。これ、結構嬉しいよね。長時間実行で、仕方なくキャンセルするにしても途中の状態。運が良ければ、詰まっている部分が見えるかもしれないわけで。。。


いや、他にも出力されないケースがあるとか、その検証方法だから出力されているだけどか、MySQLのexplain analyzeのディープなツッコミがありましたら、よろしくお願いします。:) (大事なので、2度書いておくw)


以上、explain analyze のブラックボックステスト。 実行途中でキャンセルできるみたいだけど、キャンセルしたら、Actual Plan、途中まで出るの? の巻。終わり。


似てるようで、似てない。それぞれのRDBMSの世界w。 ではまた。

 

参考)
EXPLAIN ANALYZE による情報の取得
https://dev.mysql.com/doc/refman/8.0/ja/explain.html#explain-analyze


| | | コメント (0)

2022年3月30日 (水)

Oracle Database 21c EE for Linux on VirtualBox 6.1

諸事情w によりまだやってなかった Oracle Database 21c お遊び環境構築しました。今の所 VirtualBox向けrebuildなのはなさそうなので、400億年振りにw Linuxインストールから実施w とはいっても、インストール含め楽すぎて良いですね。(preinstallな方しか試して無いですが)

これで、またパラメータ数比較もできる:)


環境
VirtualBox (現時点の最新版 6.1 for macOS intel)
https://www.virtualbox.org/

Oracle Linux Installation Media (今回は8.4を使った)
https://yum.oracle.com/oracle-linux-isos.html

Oracle Database 21c (21.3) for Linux x86-64 (RPM)
https://www.oracle.com/database/technologies/oracle21c-linux-downloads.html

VirtualBoxのバージョン確認

discus-mother:~ oracle$ VBoxManage -v
6.1.32r149290

Oracle Linux 8.4のVM作成(ここは本題じゃないので省略)

Oracle Linuxのバージョン確認

[master@localhost ~]$ uname -rv
5.4.17-2102.201.3.el8uek.x86_64 #2 SMP Fri Apr 23 09:05:57 PDT 2021
[master@localhost ~]$
[master@localhost ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.4 (Ootpa)
[master@localhost ~]$ cat /etc/oracle-release
Oracle Linux Server release 8.4
[master@localhost ~]$


Oracle Database 21c EE 21.3.0.0.0のインストール

大人の事情w インストールからやるのかなり久々な上に、rpmでやるのは初!!!! しかも環境変数のあたり、ちょいと忘れているので怪しい(でツッコミ歓迎w)

では、first attempting... rpmは事前にダウンロード済み


master@localhost ~]$ ll -h oracle-database-ee-21c-1.0-1.ol8.x86_64.rpm
-rw-r--r--. 1 master master 2.6G 3月 29 03:07 oracle-database-ee-21c-1.0-1.ol8.x86_64.rpm

Install

[master@localhost ~]$ sudo dnf install oracle-database-ee-21c-1.0-1.ol8.x86_64.rpm
メタデータの期限切れの最終確認: 1:30:07 時間前の 2022年03月29日 02時07分01秒 に実施しました。
依存関係が解決しました。
======================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
======================================================================================================================
インストール:
oracle-database-ee-21c x86_64 1.0-1 @commandline 2.6 G
依存関係のインストール:
compat-openssl10 x86_64 1:1.0.2o-3.el8 ol8_appstream 1.1 M
ksh x86_64 20120801-254.0.1.el8 ol8_appstream 927 k
libnsl x86_64 2.28-151.0.1.el8 ol8_baseos_latest 102 k
oracle-database-preinstall-21c x86_64 1.0-1.el8 ol8_appstream 30 k

トランザクションの概要
======================================================================================================================
インストール 5 パッケージ

合計サイズ: 2.6 G
インストール後のサイズ: 7.1 G
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
[SKIPPED] libnsl-2.28-151.0.1.el8.x86_64.rpm: Already downloaded
[SKIPPED] compat-openssl10-1.0.2o-3.el8.x86_64.rpm: Already downloaded
[SKIPPED] ksh-20120801-254.0.1.el8.x86_64.rpm: Already downloaded
[SKIPPED] oracle-database-preinstall-21c-1.0-1.el8.x86_64.rpm: Already downloaded
----------------------------------------------------------------------------------------------------------------
合計 217 MB/s | 2.2 MB 00:00
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
準備 : 1/1
インストール中 : ksh-20120801-254.0.1.el8.x86_64 1/5
scriptletの実行中: ksh-20120801-254.0.1.el8.x86_64 1/5
インストール中 : compat-openssl10-1:1.0.2o-3.el8.x86_64 2/5
scriptletの実行中: compat-openssl10-1:1.0.2o-3.el8.x86_64 2/5
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2102.201.3.el8uek.x86_64.conf:6: hwcap directive ignored

インストール中 : libnsl-2.28-151.0.1.el8.x86_64 3/5
インストール中 : oracle-database-preinstall-21c-1.0-1.el8.x86_64 4/5
scriptletの実行中: oracle-database-ee-21c-1.0-1.x86_64 5/5
インストール中 : oracle-database-ee-21c-1.0-1.x86_64 5/5
scriptletの実行中: oracle-database-ee-21c-1.0-1.x86_64 5/5
[INFO] Executing post installation scripts...
[INFO] Oracle home installed successfully and ready to be configured.
To configure a sample Oracle Database you can execute the following service
configuration script as root: /etc/init.d/oracledb_ORCLCDB-21c configure

scriptletの実行中: oracle-database-preinstall-21c-1.0-1.el8.x86_64 5/5
scriptletの実行中: oracle-database-ee-21c-1.0-1.x86_64 5/5
/sbin/ldconfig: /etc/ld.so.conf.d/kernel-5.4.17-2102.201.3.el8uek.x86_64.conf:6: hwcap directive ignored

検証 : libnsl-2.28-151.0.1.el8.x86_64 1/5
検証 : compat-openssl10-1:1.0.2o-3.el8.x86_64 2/5
検証 : ksh-20120801-254.0.1.el8.x86_64 3/5
検証 : oracle-database-preinstall-21c-1.0-1.el8.x86_64 4/5
検証 : oracle-database-ee-21c-1.0-1.x86_64 5/5

インストール済み:
compat-openssl10-1:1.0.2o-3.el8.x86_64 ksh-20120801-254.0.1.el8.x86_64
libnsl-2.28-151.0.1.el8.x86_64 oracle-database-ee-21c-1.0-1.x86_64
oracle-database-preinstall-21c-1.0-1.el8.x86_64

完了しました!
[master@localhost ~]$


Configure
今回は、preinstallを構成します。カスタムな構成は今の所必要ないので。

[root@localhost ~]# cd /etc/init.d
[root@localhost init.d]# ll
合計 40
-rw-r--r--. 1 root root 1161 5月 19 2021 README
-rw-r--r--. 1 root root 18434 2月 15 2021 functions
-rwx------. 1 root root 1281 7月 13 2021 oracle-database-preinstall-21c-firstboot
-r-xr-xr-x. 1 root root 11307 7月 27 2021 oracledb_ORCLCDB-21c
[root@localhost init.d]#
[root@localhost ~]# /etc/init.d/oracledb_ORCLCDB-21c configure
Configuring Oracle Database ORCLCDB.
DB操作の準備
8%完了
データベース・ファイルのコピー中
31%完了
Oracleインスタンスの作成および起動中
32%完了
36%完了
40%完了
43%完了
46%完了
データベース作成の完了
51%完了
54%完了
プラガブル・データベースの作成
58%完了
77%完了
構成後アクションの実行
100%完了
データベースの作成が完了しました。詳細は、次の場所にあるログ・ファイルを参照してください:
/opt/oracle/cfgtoollogs/dbca/ORCLCDB。
データベース情報:
グローバル・データベース名:ORCLCDB
システム識別子(SID):ORCLCDB
詳細はログ・ファイル"/opt/oracle/cfgtoollogs/dbca/ORCLCDB/ORCLCDB.log"を参照してください。

Database configuration completed successfully. The passwords were auto generated,
you must change them by connecting to the database using 'sqlplus / as sysdba' as the oracle user.
[root@localhost ~]#


おおおおおおーーー、起動してるーーーー!! 21c 楽だw
20220329-182633

いろいろ見ていくと、oracleユーザーや必要なグループの作成等はおこなわれているが、なぜか、home directoryが存在しなかった(ご愛嬌ってところかw)

ということで、なぜか存在しなかったホームディレクトリ作成とパスワードを変更して、.bash_profileに、ほぼ忘れかけてた環境変数設定など。(漏れてないかな。。w)

[root@localhost ~]# cat /etc/passwd | grep oracle
oracle:x:54321:54321::/home/oracle:/bin/bash
[root@localhost ~]#
[root@localhost ~]# mkdir -p /home/oracle
[root@localhost ~]# chown oracle:oinstall /home/oracle
[root@localhost ~]# passwd oracle
ユーザー oracle のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
[root@localhost ~]# su - oracle
[oracle@localhost ~]$ cat .bash_profile
export ORACLE_BASE=/opt/oracle
export ORACLE_BASE_CONFIG=$ORACLE_BASE/dbs
export ORACLE_HOME=$ORACLE_BASE/product/21c/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=ORCLCDB
export NLS_LANG=Japanese_Japan.UTF8
export ORA_NLS10=$ORACLE_HOME/nls/data
[oracle@localhost ~]$ . .bash_profile
[oracle@localhost ~]$


そして、忘れる前にやっときましょうw glogin.sqlでSQL*Plusの環境を整えると。

[oracle@localhost ~]$ cat $ORACLE_HOME/sqlplus/admin/glogin.sql
--
-- Copyright (c) 1988, 2005, Oracle. All Rights Reserved.
--
-- NAME
-- glogin.sql
--
-- DESCRIPTION
-- SQL*Plus global login "site profile" file
--
-- Add any SQL*Plus commands here that are to be executed when a
-- user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
-- This script is automatically run
--
set linesize 300
set pagesize 1000
set timi on
set time on
set tab off
define _EDITOR=vi
set sqlp "_user""@""_connect_identifier> "
[oracle@localhost ~]$

SQL*Plusで接続!!!

[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 火 3月 29 06:14:52 2022
Version 21.3.0.0.0

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


Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
06:14:52 SYS@ORCLCDB> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB1 READ WRITE NO
06:14:57 SYS@ORCLCDB>
06:14:58 SYS@ORCLCDB>
06:14:58 SYS@ORCLCDB>
06:15:26 SYS@ORCLCDB> select banner_full from v$version;

BANNER_FULL
-------------------------------------------------------------------------------
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0


経過: 00:00:00.00
06:15:40 SYS@ORCLCDB> exit

Lisenerの状態も見ておきましょう

[oracle@localhost ~]$ lsnrctl status

LSNRCTL for Linux: Version 21.0.0.0.0 - Production on 29-3月 -2022 07:09:29

Copyright (c) 1991, 2021, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for Linux: Version 21.0.0.0.0 - Production
開始日 29-3月 -2022 03:57:55
稼働時間 0 日 3 時間 11 分 34 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /opt/oracle/homes/OraDBHome21cEE/network/admin/listener.ora
ログ・ファイル /opt/oracle/diag/tnslsnr/localhost/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=localhost)(PORT=5500))
(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))
サービスのサマリー...
サービス"ORCLCDB"には、1件のインスタンスがあります。
インスタンス"ORCLCDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"ORCLCDBXDB"には、1件のインスタンスがあります。
インスタンス"ORCLCDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"db57eedbd976b81ce055000000000001"には、1件のインスタンスがあります。
インスタンス"ORCLCDB"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orclpdb1"には、1件のインスタンスがあります。
インスタンス"ORCLCDB"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。
[oracle@localhost ~]$

停止してみましょう!

おっと、systemctlで起動停止というところまではやってくれないのか... ということで、自分で止めましょうw あとで作ろう。。w

[master@localhost ~]$ sudo service oracle stop
[sudo] master のパスワード:
Redirecting to /bin/systemctl stop oracle.service
Failed to stop oracle.service: Unit oracle.service not loaded.
[master@localhost ~]$ sudo su - oracle
[oracle@localhost ~]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 火 3月 29 07:16:55 2022
Version 21.3.0.0.0

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

Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
07:16:55 SYS@ORCLCDB> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
07:17:01 SYS@ORCLCDB>

インストール楽すぎて、ワロタ。



一気に桜が咲いた。がいつまでもつのだろう。今年は東北方面も開花が早そうで、GWはもう葉桜だろうな。
では

| | | コメント (0)

2018年2月20日 (火)

Temp落ち #3 - 手動PGA管理で作業領域として指定可能な最大サイズ

自動PGA管理は12cでどうなんだっけ?という確認の前に、
いままで何度か質問されたことがあり、FAQだと思っているので

手動PGA管理で利用する以下パラメータの最大サイズはいくつ? 

HASH_AREA_SIZE
SORT_AREA_SIZE
BITMAP_MERGE_AREA_SIZE
CREATE_BITMAP_AREA_SIZE

ということを書いておきたいと思います。

これからしばらく続く Temp落ち ネタで利用する環境で固定部分は以下のとおり
(初期化パラメータ等は必要に応じて載せるつもりです。)


環境は以下のとおり。
host osとguest osのバージョンやメモリーサイズなど

discus:˜ oracle$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.13.3
BuildVersion: 17D47

discus:˜ oracle$ system_profiler SPHardwareDataType | grep -E 'Processor Name|Cores|Memory'
Processor Name: 6-Core Intel Xeon
Total Number of Cores: 12
Memory: 32 GB

discus:˜ oracle$ VBoxManage -v
5.2.6r120293

discus:˜ oracle$ VBoxManage showvminfo e3d4f948-b2e6-4db3-a89d-df637d87a372 | grep -E 'Memory size|OS type|Number of CPUs'
Memory size: 23569MB
Number of CPUs: 12
OS type: Linux26_64


orcl12c@SYS> select * from v$version;

BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for Linux: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0


orcl12c@SYS> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ORCL READ WRITE NO

さて、今日の本題

手動PGA管理で各SQL Work Area Sizeを決定する以下の初期化パラメータの最大サイズは? いくつでしょう? 
すでにご存知のかたはスキップしていいですよ:)

マニュアルを読んでみるときづくのですが、手動PGA管理で各SQL Work Area Sizeを決定する4パラメータとも、「0以上、上限はOS依存」のような記述になっています。

そう、マニュアルを読んだだけではまったく参考にならないわけです。(え〜〜っ!)

そこで、みなさんサポートを頼るなり、ご自分でMOSを検索するなり、そこそこの苦労をして入手することになります。
私みたいな性格だと、どのマニュアルでもいいからまとめて載せてよーめんどくさいから。と、めんどくさい病の発作がでたりしますw

なので、環境があるのなら、you 試しちゃいなよー。が手っ取り早いかなーと(最終的にMOSとかサポートを頼るにしてもw)

上限はOS依存とだけしか記載されていませんが、私の観測範囲では、2GB - 1 が上限 となっています。
以下、Linux/Solaris/Windowsでの検証ログ。

Oracle® Databaseリファレンス 12cリリース2 (12.2) E72905-03より

HASH_AREA_SIZE
https://docs.oracle.com/cd/E82638_01/REFRN/HASH_AREA_SIZE.htm

SORT_AREA_SIZE
https://docs.oracle.com/cd/E82638_01/REFRN/SORT_AREA_SIZE.htm

BITMAP_MERGE_AREA_SIZE
https://docs.oracle.com/cd/E82638_01/REFRN/BITMAP_MERGE_AREA_SIZE.htm

CREATE_BITMAP_AREA_SIZE
https://docs.oracle.com/cd/E82638_01/REFRN/CREATE_BITMAP_AREA_SIZE.htm


Linux

orcl12c@SYS> !uname -r; cat /etc/redhat-release /etc/oracle-release
4.1.12-94.3.6.el7uek.x86_64
Red Hat Enterprise Linux Server release 7.3 (Maipo)
Oracle Linux Server release 7.3

orcl12c@SYS> create pfile from spfile;

File created.

orcl12c@SYS> --2GB
orcl12c@SYS> select 2*1024*1024*1024 from dual;

2*1024*1024*1024
----------------
2147483648

orcl12c@SYS> alter system set hash_area_size = 2147483648 scope=spfile;
alter system set hash_area_size = 2147483648 scope=spfile
*
ERROR at line 1:
ORA-02017: integer value required

orcl12c@SYS> alter system set sort_area_size = 2147483648 scope=spfile;
alter system set sort_area_size = 2147483648 scope=spfile
*
ERROR at line 1:
ORA-02017: integer value required

orcl12c@SYS> alter system set bitmap_merge_area_size = 2147483648 scope=spfile;
alter system set bitmap_merge_area_size = 2147483648 scope=spfile
*
ERROR at line 1:
ORA-02017: integer value required

orcl12c@SYS> alter system set create_bitmap_area_size = 2147483648 scope=spfile;
alter system set create_bitmap_area_size = 2147483648 scope=spfile
*
ERROR at line 1:
ORA-02017: integer value required

orcl12c@SYS> --2GB - 1
orcl12c@SYS> select 2*1024*1024*1024-1 from dual;

2*1024*1024*1024-1
------------------
2147483647

orcl12c@SYS> alter system set hash_area_size = 2147483647 scope=spfile;

System altered.

orcl12c@SYS> alter system set sort_area_size = 2147483647 scope=spfile;

System altered.

orcl12c@SYS> alter system set bitmap_merge_area_size = 2147483647 scope=spfile;

System altered.

orcl12c@SYS> alter system set create_bitmap_area_size = 2147483647 scope=spfile;

System altered.

orcl12c@SYS> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
orcl12c@SYS> create spfile from pfile;

File created.

orcl12c@SYS>


Solaris 11 (x86)

SQL> !uname -r; cat /etc/release
5.11
Oracle Solaris 11.3 X86
Copyright (c) 1983, 2015, Oracle and/or its affiliates. All rights reserved.
Assembled 06 October 2015

SQL>
SQL> create pfile from spfile;

ファイルが作成されました。

SQL> --2GB
SQL> select 2*1024*1024*1024 from dual;

2*1024*1024*1024
----------------
2147483648

SQL> alter system set hash_area_size = 2147483648 scope=spfile;
alter system set hash_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。


SQL> alter system set sort_area_size = 2147483648 scope=spfile;
alter system set sort_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。


SQL> alter system set bitmap_merge_area_size = 2147483648 scope=spfile;
alter system set bitmap_merge_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。


SQL> alter system set create_bitmap_area_size = 2147483648 scope=spfile;
alter system set create_bitmap_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。


SQL> --2GB - 1
SQL> select 2*1024*1024*1024-1 from dual;

2*1024*1024*1024-1
------------------
2147483647

SQL> alter system set hash_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> alter system set sort_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> alter system set bitmap_merge_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> alter system set create_bitmap_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
ERROR:
ORA-12514: TNS:
リスナーは接続記述子でリクエストされたサービスを現在認識していません


警告: Oracleにはもう接続されていません。
SQL> conn sys/oracle@orcl122 as sysdba
ERROR:
ORA-12514: TNS:
リスナーは接続記述子でリクエストされたサービスを現在認識していません


SQL> exit
bash-4.1$ export ORACLE_SID=orcl122
bash-4.1$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on 月 2月 19 22:44:47 2018

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

アイドル・インスタンスに接続しました。

SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area 838860800 bytes
Fixed Size 8790120 bytes
Variable Size 356519832 bytes
Database Buffers 465567744 bytes
Redo Buffers 7983104 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL> show parameter _area_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size integer 2147483647
create_bitmap_area_size integer 2147483647
hash_area_size integer 2147483647
sort_area_size integer 2147483647
workarea_size_policy string AUTO
SQL>
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL>
SQL> create spfile from pfile;

File created.


Microsoft Windows

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>
SQL> $ver

Microsoft Windows [Version 10.0.16299.125]

SQL> create pfile from spfile;

ファイルが作成されました。

SQL> --2GB
SQL> select 2*1024*1024*1024 from dual;

2*1024*1024*1024
----------------
2147483648

SQL> alter system set hash_area_size = 2147483648 scope=spfile;
alter system set hash_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。

SQL> alter system set sort_area_size = 2147483648 scope=spfile;
alter system set sort_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。

SQL> alter system set bitmap_merge_area_size = 2147483648 scope=spfile;
alter system set bitmap_merge_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。

SQL> alter system set create_bitmap_area_size = 2147483648 scope=spfile;
alter system set create_bitmap_area_size = 2147483648 scope=spfile
*
行1でエラーが発生しました。:
ORA-02017: 整数値が必要です。


SQL> --2GB - 1
SQL> select 2*1024*1024*1024-1 from dual;

2*1024*1024*1024-1
------------------
2147483647

SQL> alter system set hash_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> alter system set sort_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> alter system set bitmap_merge_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> alter system set create_bitmap_area_size = 2147483647 scope=spfile;

システムが変更されました。

SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
ERROR:ORA-12514: TNSリスナーは接続記述子でリクエストされたサービスを現在認識していません
SQL> 警告: Oracleにはもう接続されていません。
SQL> exit
Disconnected
C:\Users\discus>set ORACLE_SID=orcl122SQL>
C:\Users\discus>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 月 2月 19 22:28:45 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
SQL>
アイドル・インスタンスに接続しました。
SQL> create spfile from pfile;
SQL>
File created.
SQL> exit
Disconnected

C:\Users\discus>


ということで、

手動PGA管理でSQL Work Area Sizeを制御する初期化パラメータで指定可能な最大サイズは

2GB -1

ということになります。(HP-UXやAIXは未確認なので情報いただけたら、ここに追記しまーす。:)

次回へつづく。




Temp落ち #1 - "Temp落ち" って?
Temp落ち #2 - PGA (Program Global Area)

| | | コメント (0) | トラックバック (0)

2016年3月17日 (木)

こんなのでいいのかなぁ。ズンドコキヨシ  ObjectScript / MUMPS



2016/3/18追記#3

よ〜く見てたら、ズン!は4回だったw 結局この83文字のパターンマッチング版でよかったのか〜〜w (おしまい)

S l="",w(0)="ズン!",w(1)="ドコ!" F  S l=l_w($R(2)) I l ?.E4"ズン!"1"ドコ!" W !,l,"キ・ヨ・シ!" Q

USER>S l="",w(0)="ズン!",w(1)="ドコ!" F  S l=l_w($R(2)) I l ?.E4"ズン!"1"ドコ!" W !,l,"キ・ヨ・シ!" Q

ズン!ズン!ドコ!ズン!ドコ!ドコ!ズン!ズン!ドコ!ズン!ズン!ドコ!ドコ!ズン!ドコ!ドコ!ドコ!ズン!ドコ!ズン!ドコ!ズン!ドコ!ドコ!ズン!ズン!ズン!ズン!ドコ!キ・ヨ・シ!



2016/3/18追記#2

旧構文のFORとIFを使えば82文字まで短縮できた。

S l="",w(0)="ズン!",w(1)="ドコ!" F  S l=l_w($R(2)) I l["ズン!ズン!ズン!ドコ!" W !,l,"キ・ヨ・シ!" Q

USER>S l="",w(0)="ズン!",w(1)="ドコ!" F  S l=l_w($R(2)) I l["ズン!ズン!ズン!ドコ!" W !,l,"キ・ヨ・シ!" Q

ドコ!ズン!ズン!ドコ!ドコ!ズン!ドコ!ズン!ズン!ズン!ズン!ズン!ドコ!キ・ヨ・シ!


調子に乗ってパターンマッチに書き換えたら1文字増えて83文字w orz

S l="",w(0)="ズン!",w(1)="ドコ!" F  S l=l_w($R(2)) I l ?.E3"ズン!"1"ドコ!" W !,l,"キ・ヨ・シ!" Q

USER>S l="",w(0)="ズン!",w(1)="ドコ!" F  S l=l_w($R(2)) I l ?.E3"ズン!"1"ドコ!" W !,l,"キ・ヨ・シ!" Q

ズン!ズン!ドコ!ドコ!ズン!ズン!ドコ!ズン!ズン!ズン!ドコ!キ・ヨ・シ!



2016/3/18追記

85文字までに縮めたw もうむりか?

S l="",w(0)="ズン!",w(1)="ドコ!" F {S l=l_w($R(2)) I l["ズン!ズン!ズン!ドコ!" {W !,l,"キ・ヨ・シ!" Q}}

USER>S l="",w(0)="ズン!",w(1)="ドコ!" F {S l=l_w($R(2)) I l["ズン!ズン!ズン!ドコ!" {W !,l,"キ・ヨ・シ!" Q}}

ズン!ズン!ドコ!ドコ!ズン!ズン!ドコ!ズン!ズン!ドコ!ズン!ドコ!ドコ!ズン!ズン!ズン!ドコ!キ・ヨ・シ!

こんなのでいいのかなぁ。ズンドコキヨシ

もっといいのが浮かびそうだっただけど、眠気で頭まわらなくなってきたので、一旦これでw

ズンドコキヨシまとめ


M言語というか、MUMPSというか、Caché ObjectScriptでやっつけてみた

S s=0 F {S r=$R(2) W !,$CASE(r,0:"ズン!",1:"ドコ!") S s=$CASE(r,0:$CASE(s,0:1,1:2,2:3,:3),1:$CASE(s,3:4,:0)) W:s=4 !,"キ・ヨ・シ!" Q:s=4}
USER>S s=0 F {S r=$R(2) W !,$CASE(r,0:"ズン!",1:"ドコ!") S s=$CASE(r,0:$CASE(s,0:1,1:2,2:3,:3),1:$CASE(s,3:4,:0)) W:s=4 !,"キ・ヨ・シ!" Q:s=4}

ズン!
ズン!
ドコ!
ドコ!
ドコ!
ズン!
ドコ!
ズン!
ズン!
ドコ!
ズン!
ドコ!
ドコ!
ズン!
ズン!
ドコ!
ズン!
ズン!
ズン!
ズン!
ズン!
ズン!
ズン!
ドコ!
キ・ヨ・シ!

USER>halt
[oracle@pleco ˜]$

| | | コメント (0) | トラックバック (0)

2013年9月 6日 (金)

shutdown immeidateしない、ほかの理由に遭遇! は修正されていた! (12c)

数年前に、shutdown immeidateしない、ほかの理由に遭遇!
というエントリを書いていたことをご存知の方も多いと思います。

リリースされたばかりのOracle Database 12c R1 12.1.0.1.0ではどうなったか知りたくないですか? (俺だけかw)

Oracle Database 12c R1 12.1.0.1.0をリスナーも含め起動します。

※ /optの下がu01なのはこちらの事情なので突っ込みなしでお願いします m(_ _)m

[oracle@emperortetra ˜]$ lsnrctl start

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 06-9月 -2013 13:27:09

Copyright (c) 1991, 2013, Oracle. All rights reserved.

/opt/u01/product/12.1.0/dbhome_1/bin/tnslsnrを起動しています。お待ちください...

TNSLSNR for Linux: Version 12.1.0.1.0 - Production
システム・パラメータ・ファイルは/opt/u01/product/12.1.0/dbhome_1/network/admin/listener.oraです。
ログ・メッセージを/opt/u01/diag/tnslsnr/emperortetra/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=emperortetra)(PORT=1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for Linux: Version 12.1.0.1.0 - Production
開始日 06-9月 -2013 13:27:10
稼働時間 0 日 0 時間 0 分 0 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /opt/u01/product/12.1.0/dbhome_1/network/admin/listener.ora
ログ・ファイル /opt/u01/diag/tnslsnr/emperortetra/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=emperortetra)(PORT=1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
[oracle@emperortetra ˜]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on 金 9月 6 13:27:15 2013

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

アイドル・インスタンスに接続しました。

SYS@orcl12c> startup
ORACLEインスタンスが起動しました。

Total System Global Area 534462464 bytes
Fixed Size 2290416 bytes
Variable Size 473959696 bytes
Database Buffers 50331648 bytes
Redo Buffers 7880704 bytes
データベースがマウントされました。
データベースがオープンされました。
SYS@orcl12c> alter pluggable database all open;

プラガブル・データベースが変更されました。

SYS@orcl12c>


別terminalでSQL*Plusを起動しshellに入っておきます。

そして、

今回は特別に!

なんと、もう一度、SQL*Plus経由で、shellに入っておきます。:)

[oracle@emperortetra ˜]$ 
[oracle@emperortetra ˜]$ sqlplus system

SQL*Plus: Release 12.1.0.1.0 Production on 金 9月 6 13:31:13 2013

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

パスワードを入力してください:
最終正常ログイン時間: 金 9月 06 2013 13:30:24 +09:00

Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SYSTEM@orcl12c> !
[oracle@emperortetra ˜]$ sqlplus system

SQL*Plus: Release 12.1.0.1.0 Production on 金 9月 6 13:31:22 2013

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

パスワードを入力してください:
最終正常ログイン時間: 金 9月 06 2013 13:31:14 +09:00

Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
に接続されました。
SYSTEM@orcl12c>


前述の状態でpstreeでプロセスツリーを見ると以下のようになっています。

[oracle@emperortetra ˜]$ pstree -ualp oracle
VBoxClient,2099 --draganddrop
├─{VBoxClient},2104
└─{VBoxClient},2105

...中略...

sshd,3854
└─bash,3855
└─sqlplus,3876 \040\040\040\040\040\040
├─bash,3878
│ └─sqlplus,3891 \040\040\040\040\040\040
│ ├─bash,4019
│ └─oracle_3894_orc,3894 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
└─oracle_3877_orc,3877 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

tnslsnr,3304 LISTENER -inherit
└─{tnslsnr},3305
[oracle@emperortetra ˜]$

確認してみましょう!。11gではshutdown timeoutすら効かず停止できない状態になっていたのですが.....

SYS@orcl12c> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SYS@orcl12c>

おおおおおおおお〜〜〜、shutdown immediateできた〜〜〜〜! 12cでは修正されたようですね。:)




shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ
shutdown immeidateしない、ほかの理由に遭遇! おまけのおまけ(でた〜最近、よくあるパターンw)

ablog - shutdown immeidate ...

| | | コメント (0) | トラックバック (0)

2013年8月13日 (火)

Cross Platform Transportable Tablespace #12

ネタとしては地味ですがOracle Database 12cのTransportalbe tablespaceも軽めにチェック

以前のエントリ..2009年か〜〜遠い目
Cross Platform Transportable Tablespace #11


あれ、ちょいとズレてるけどご愛嬌:)

06:59:36 SYS@orcl12c> select * from v$version;

BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0
PL/SQL Release 12.1.0.1.0 - Production 0
CORE 12.1.0.1.0 Production 0
TNS for Linux: Version 12.1.0.1.0 - Production 0
NLSRTL Version 12.1.0.1.0 - Production 0

プラットフォームの情報も変化はない。Mac OSの文字もそのまま..

06:52:31 SYS@pdborcl> select * from v$transportable_platform;

PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT CON_ID
----------- ----------------------------------------------------------------------------------------------------- -------------- ----------
1 Solaris[tm] OE (32-bit) Big 0
2 Solaris[tm] OE (64-bit) Big 0
7 Microsoft Windows IA (32-bit) Little 0
10 Linux IA (32-bit) Little 0
6 AIX-Based Systems (64-bit) Big 0
3 HP-UX (64-bit) Big 0
5 HP Tru64 UNIX Little 0
4 HP-UX IA (64-bit) Big 0
11 Linux IA (64-bit) Little 0
15 HP Open VMS Little 0
8 Microsoft Windows IA (64-bit) Little 0
9 IBM zSeries Based Linux Big 0
13 Linux x86 64-bit Little 0
16 Apple Mac OS Big 0
12 Microsoft Windows x86 64-bit Little 0
17 Solaris Operating System (x86) Little 0
18 IBM Power Based Linux Big 0
19 HP IA Open VMS Little 0
20 Solaris Operating System (x86-64) Little 0
21 Apple Mac OS (x86-64) Little 0

20行が選択されました。


con_idはお約束で追加されていますが、ビューは大きく変わってないようですね。

12cで試している方のエントリを見つけたのでメモ:
Oracle 12c: Transport tablespaces across platforms




Cross Platform Transportable Tablespace #11

| | | コメント (0) | トラックバック (0)

2013年7月25日 (木)

Oracle Database 12c New Feature : Invisible Columnsの怪w s/怪w/謎/

Oracle® Database New Features Guide 12c Release 1 (12.1) - 1.5.5.3 Invisible Columns
Oracle® Database Administrator's Guide 12c Release 1 (12.1) - Understand Invisible Columns


予告通り Invisible Columnの小ネタを。
(祭りに呼び出されて書けないかかもしれない、という状況にはならずw この時間に自宅にいるのはラッキーw)

本題とは関係ないですが、改行されないのはご愛嬌:)

SYS@orcl12c> startup pluggable database pdborcl;
ラガブル・データベースがオープンされました。SYS@orcl12c>
SYS@orcl12c>
SYS@orcl12c> conn scott@pdborcl
パスワードを入力してください:
接続されました。
SCOTT@pdborcl>

Invisible columnを含む表を作成します。(問題なく作成されました。当たり前か..)

SCOTT@pdborcl> create table hoge (a number, b number, c number invisible);

表が作成されました。


SQL*Plusのdescコマンドで見てみます。マニュアルの通り、Invisible columnはリストされません。

SCOTT@pdborcl> desc hoge
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER


さあ、ここから、気持ち悪い事が起きますよ〜〜。よ〜〜〜く見ててくださいね〜〜。

列は隠れていますが、存在を知って、Invisible Columnでもカラムを指定すればデータを登録できるんです。見えてないだけなんです!

SCOTT@pdborcl> insert into hoge(a,b,c) values(1,2,4);

1行が作成されました。


カラム指定しないとa列と、b列しかないものとして扱われ、見慣れたエラー、「ORA-00913: 値の個数が多すぎます。」となります。

いい感じの気持ち悪さでしょ :)

SCOTT@pdborcl> insert into hoge values(11,12,14);
insert into hoge values(11,12,14)
*
行1でエラーが発生しました。:
ORA-00913: 値の個数が多すぎます。

2列分なら正常に登録できます。見えるのはa列とb列の2列なので当然と言えば当然。

SCOTT@pdborcl> insert into hoge values(11,12);

1行が作成されました。

SELECTリストに * を指定すれば、ほらほら、自然です。 a列とb列だけがリストされています。

SCOTT@pdborcl> select * from hoge;

A B
---------- ----------
1 2
11 12


でも...c列の存在を知っている人には....見えちゃうんです。

SCOTT@pdborcl> select a, b, c from hoge;

A B C
---------- ---------- ----------
1 2 4
11 12 [null]

同様に削除や更新もできちゃいます。見えないものが見えてる人にはw。
(その存在を知らない人には見えないわですが...)

SCOTT@pdborcl> update hoge set c = 14 where c is null;

1行が更新されました。

SCOTT@pdborcl> select a, b, c from hoge where c = 14;

A B C
---------- ---------- ----------
11 12 14

SCOTT@pdborcl> delete from hoge where c = 14;

1行が削除されました。

SCOTT@pdborcl> select a, b, c from hoge;

A B C
---------- ---------- ----------
1 2 4


ORDER BY句でも、その存在さえ知っていればいろいろイタズラできますね。

SCOTT@pdborcl> select a,b,c from hoge order by c desc;

A B C
---------- ---------- ----------
11 12 14
1 2 4


おもしろいですね。

SCOTT@pdborcl> select * from hoge order by c desc;

A B
---------- ----------
11 12
1 2

Invisible columnには索引も作れます!

SCOTT@pdborcl> create index hoge_ix on hoge(c);

索引が作成されました。

SCOTT@pdborcl> set autot trace exp
SCOTT@pdborcl> select * from hoge where c = 14;

実行計画
----------------------------------------------------------
Plan hash value: 3349209795

-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 39 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| HOGE | 1 | 39 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | HOGE_IX | 1 | | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("C"=14)

Note
-----
- dynamic statistics used: dynamic sampling (level=2)

SCOTT@pdborcl>

次のようなイタズラもできます! うひゃw うひゃw 

相手の腕試をしするにはぴったりなイタズラです(嘘

SCOTT@pdborcl> alter table hoge modify (c number not null);

表が変更されました。

SCOTT@pdborcl>
SCOTT@pdborcl> insert into hoge(a, b) values(100,111);
insert into hoge(a, b) values(100,111)
*
行1でエラーが発生しました。:
ORA-01400: ("SCOTT"."HOGE"."C")にはNULLは挿入できません。


イタズラはこれくらいにして、Invisible Columnをディクショナリビューから覗いてみましょう。
Invisible Indexもディクショナリビューからいろいろと情報を得ることができましたよね! 
(多分、同じように見れるのでは...と思っていたが...

desc[ribe]コマンドではInvisible Columnは見えませんが、 ALL/DBA/USER_TAB_COLUMNSからは見る事ができます。

racle® Database Reference 12c Release 1 (12.1) - ALL_TAB_COLUMNS


ただし、見る事はできるのですが、その列がInvisible Columnかどうかを確認する列がないんですよ。(ぱっと見)

例えば、Invisible IndexだとALL/DBA/USER_INDEXES確認できます

SCOTT@pdborcl> select index_name,visibility from user_indexes where table_name='HOGE';

INDEX_NAME VISIBILIT
------------------------------ ---------
HOGE_IX INVISIBLE
HOGE_PK VISIBLE


そこで疑問!
SQL*PLusのdesc[ribe]コマンドはどのような情報を基にVisible Columeだけを表示してるんでしょうねぇ〜。

これ、探すのにてこずりましたよ!

以下のマニュアルにも記載されていますが、Visible/InvisibleにするとColumn Orderが変化することにも関連しているようです。
Oracle® Database Administrator's Guide 12c Release 1 (12.1) - Understand Invisible Columns

desc[ribe]ではInvisible Columnは見えません

SCOTT@pdborcl> desc hoge
名前 NULL? 型
----------------------------------------- -------- ----------------------------
A NUMBER
B NUMBER


どのような情報を見てInvisibleであると判断しているのか....

SCOTT@pdborcl> select column_name,data_type,nullable,column_id from user_tab_columns where table_name='HOGE' order by column_id;

COLUMN_NAME DATA_TYPE N COLUMN_ID
------------------------------ ---------- - ----------
A NUMBER Y 1
B NUMBER Y 2
C NUMBER N [null]


COLUMN_IDがNULLである列がInvisible Columns !!!!

SCOTT@pdborcl> l
1 select
2 column_name
3 ,data_type
4 ,nullable
5 ,column_id
6 from
7 user_tab_columns
8 where
9 table_name='HOGE'
10 and column_id is not null
11 order by
12* column_id
SCOTT@pdborcl> /

COLUMN_NAME DATA_TYPE N COLUMN_ID
------------------------------ ---------- - ----------
A NUMBER Y 1
B NUMBER Y 2

いずれ、ALL/DBA/USER_TAB_COLUMNSに、VISIBILITYという列が追加されるんじゃないかと想像してます :)

それまでは俺俺 USER_TAB_COLUMNSビューでも作っておくと便利かも...しれない。

SCOTT@pdborcl> create view my_tab_columns as
2 select
3 user_tab_columns.*
4 ,case when user_tab_columns.column_id is null
5 then 'INVISIBLE' else 'VISIBLE' end as VISIBILITY
6 from
7 user_tab_columns
8 ;

ビューが作成されました。
SCOTT@pdborcl> select column_name,data_type,nullable,visibility from my_tab_columns where table_name='HOGE' order by column_id;

COLUMN_NAME DATA_TYPE N VISIBILIT
------------------------------ ---------- - ---------
A NUMBER Y VISIBLE
B NUMBER Y VISIBLE
C NUMBER N INVISIBLE


このような特性を理解した上で、どのような場面で使うと便利なのか、じ〜〜〜〜っくり考えてみたいと...と思いつつ...寝ます。パタリ。 1:48am


| | | コメント (0) | トラックバック (0)

2013年7月13日 (土)

Oracle Database 12c R1 : コンテナデータベースとプラガブルデータベースを歩きやすくしてみる

世界を見渡せば、かなりの方がOracle Database 12cのインストール手順を公開し始めているのでインストール後の話を書いておきますね。

インストール時にPluggable Databaseも同時に作成してもtnsnames.oraにはContainer Databaseへの接続定義しか無かったんです。(私のインストール手順に問題がなければ..なんですが)
無くてもEasy connectを使えば接続できるので問題はないんですが...

ただ、Easy connectで毎回タイプするのも面倒(少々長いし)なので、tnsnames.oraにPluggable Database接続用定義を作成しておきましょう。

定義内容はいままでと変わらず。 SERVICE_NAMEの箇所を接続先のPluggable Database名にするだけ。
(Pluggable Database名と書いたが、マニュアル読みきれてないので表現は間違っているかもしれません。間違っていたら後で修正します)

[oracle@emperortetra]$ cat $ORACLE_HOME/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /opt/u01/product/12.1.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

# for Container Database : orcl12c
ORCL12C =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = emperortetra)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl12c)
)
)

# for Pluggable Database : pdborcl
PDBORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = emperortetra)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdborcl)
)
)

本題である、歩きやすくするための設定がこれ。

複数のPluggable DatabaseとContainer Database間を旅することも多くなりそうですから、今、自分はどこにいるのか把握しやすくしておいたほうが吉かと。

12c以前から定番で設定している内容ではあるのですが。赤字部分がポイント

目立たないけど、地味に大切なのが、 set tab off だと思っているのは私だけだろうか!w 
(ここのところ、set tab offじゃない人のコピペしてきた、位置ズレまくりの実行計画見せられててイライラしている影響もある :)


それ以外の設定も、設定してるだけで、「むむむ、この方できるかも!」 と、
思わせる(思わせるだけですからね!w つかみはOK的な感じなので、あとはあなた次第)設定内容なので大切と言えば大切。
(login.sqlでもOK)

[oracle@emperortetra]$ cat $ORACLE_HOME/sqlplus/admin/glogin.sql
--
-- Copyright (c) 1988, 2005, Oracle. All Rights Reserved.
--
-- NAME
-- glogin.sql
--
-- DESCRIPTION
-- SQL*Plus global login "site profile" file
--
-- Add any SQL*Plus commands here that are to be executed when a
-- user starts SQL*Plus, or uses the SQL*Plus CONNECT command.
--
-- USAGE
-- This script is automatically run
--
set linesize 180
set pagesize 10000
set timi on
set time on
define _EDITOR=vi
col table_name for a30
col column_name for a30
col segment_name for a30
col tablespace_name for a30
col index_name for a30
col partition_name for a30
col sub_partition_name for a30
set sqlp "_USER'@'_CONNECT_IDENTIFIER> "
set tab off
[oracle@emperortetra]$


リスナーを起動してステータスを見てみましょう (u01が/optの下にあるのは内緒w じゃないw
まだ、データベースを起動していないのでこんな感じです。

[oracle@emperortetra]$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 06-7月 -2013 09:10:04

Copyright (c) 1991, 2013, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for Linux: Version 12.1.0.1.0 - Production
開始日 06-7月 -2013 09:06:38
稼働時間 0 日 0 時間 3 分 26 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /opt/u01/product/12.1.0/dbhome_1/network/admin/listener.ora
ログ・ファイル /opt/u01/diag/tnslsnr/emperortetra/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=emperortetra)(PORT=1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
[oracle@emperortetra]$


Container Databaseの起動(12cより前のOracle Databaseと同じですね)

Container Databaseである orcl12c がSQL*Plusのプロンプトに表示されていますよね!! :)

[oracle@emperortetra]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on 土 7月 6 09:25:22 2013

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

アイドル・インスタンスに接続しました。

09:25:22 SYS@orcl12c> startup
ORACLEインスタンスが起動しました。

Total System Global Area 1653518336 bytes
Fixed Size 2289016 bytes
Variable Size 1040188040 bytes
Database Buffers 603979776 bytes
Redo Buffers 7061504 bytes
データベースがマウントされました。
データベースがオープンされました。
09:25:32 SYS@orcl12c>



Pluggable Databaseを起動します!

09:25:34 SYS@orcl12c> alter pluggable database pdborcl open;

プラガブル・データベースが変更されました。

経過: 00:00:00.86


Pluggable DatabaseのSYS、SYSTEMおよび、SCOTTユーザに接続してみます!
09:25:53 SYSTEM@orcl12c> conn sys@pdborcl as sysdba
パスワードを入力してください:
接続されました。
09:26:06 SYS@pdborcl>
09:26:07 SYS@pdborcl>
09:26:07 SYS@pdborcl> conn system@pdborcl
パスワードを入力してください:
接続されました。
09:26:34 SYSTEM@pdborcl>
09:26:34 SYSTEM@pdborcl>
09:26:35 SYSTEM@pdborcl> conn scott@pdborcl
パスワードを入力してください:
接続されました。
09:26:50 SCOTT@pdborcl>
09:26:51 SCOTT@pdborcl>
09:26:51 SCOTT@pdborcl>


SQL*Plusのプロンプトに接続先の情報を表示しておくと便利ですよね。Database間を歩きやすく、迷子になりにくくなりますよ! :)

おまけ
Container Databaseおよび、Pluggable Database起動後のlistenerのステータスは以下の通り。

[oracle@emperortetra]$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 06-7月 -2013 09:28:09

Copyright (c) 1991, 2013, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for Linux: Version 12.1.0.1.0 - Production
開始日 06-7月 -2013 09:06:38
稼働時間 0 日 0 時間 21 分 31 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /opt/u01/product/12.1.0/dbhome_1/network/admin/listener.ora
ログ・ファイル /opt/u01/diag/tnslsnr/emperortetra/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=emperortetra)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=emperortetra)(PORT=5500))(Security=(my_wallet_directory=/opt/u01/admin/orcl12c/xdb_wallet))(Presentation=HTTP)(Session=RAW))
サービスのサマリー...
サービス"orcl12c"には、1件のインスタンスがあります。
インスタンス"orcl12c"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"orcl12cXDB"には、1件のインスタンスがあります。
インスタンス"orcl12c"、状態READYには、このサービスに対する1件のハンドラがあります...
サービス"pdborcl"には、1件のインスタンスがあります。
インスタンス"orcl12c"、状態READYには、このサービスに対する1件のハンドラがあります...
コマンドは正常に終了しました。
[oracle@emperortetra]$

Enjoy Oracle Database 12c R1 :)


| | | コメント (0) | トラックバック (0)

2013年7月 8日 (月)

rownum使って満足しちゃってると.....おまけのおまけ FETCH FIRST N ROWS ONLY編

20130628_233812


Oracle Database 12c R1 12.1.0.1.0 がリリースされたので、自分用のメモとしても使うネタから :)



実行環境は Oracle Database 12c R1 12.1.0.1.0 EE/Oracle Linux 6.4/VirtualBox for OS X
11g R2と同じデータをインポートし統計情報を再取得しています。


まず、rownum から!

おおおおお〜、 まあ想定通りではあるのですが、11gとは違う点が一つ。

TABLE ACCESS BY INDEX ROWID BATCHEDと見慣れないオペレーションが...興味深いですね。これ :)

別途調べるTODO :)

23:14:41 SCOTT@pdborcl> r
1 select /*+ leading(tc) use_nl(tc tb ta) */ *
2 from
3 tc join tb
4 on
5 tc.version = tb.version
6 and tc.branch# = tb.branch#
7 join ta
8 on
9 tb.version = ta.version
10 where
11 tc.version between 1 and 10
12* and rownum <= 1000

1000行が選択されました。

経過: 00:00:00.13

実行計画
----------------------------------------------------------
Plan hash value: 1463769645

-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 2952K| 4813 (1)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | NESTED LOOPS | | | | | |
| 3 | NESTED LOOPS | | 2002 | 5910K| 4813 (1)| 00:00:01 |
| 4 | NESTED LOOPS | | 4004 | 7894K| 2810 (1)| 00:00:01 |
| 5 | TABLE ACCESS BY INDEX ROWID BATCHED| TC | 4004 | 3953K| 585 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | PK_TC | | | 14 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID | TB | 1 | 1008 | 1 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | PK_TB | 1 | | 0 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | PK_TA | 1 | | 0 (0)| 00:00:01 |
| 10 | TABLE ACCESS BY INDEX ROWID | TA | 1 | 1004 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<=1000)
6 - access("TC"."VERSION">=1 AND "TC"."VERSION"<=10)
8 - access("TC"."VERSION"="TB"."VERSION" AND "TC"."BRANCH#"="TB"."BRANCH#")
filter("TB"."VERSION"<=10 AND "TB"."VERSION">=1)
9 - access("TB"."VERSION"="TA"."VERSION")
filter("TA"."VERSION">=1 AND "TA"."VERSION"<=10)


統計
----------------------------------------------------------
0 recursive calls
0 db block gets
2418 consistent gets
0 physical reads
0 redo size
1059870 bytes sent via SQL*Net to client
1270 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1000 rows processed


次に、Oracle Database 12c R1 12.1.0.1.0 から実装された FETCH FIRST N ROWS ONLYとの比較

FETCH FIRST N ROWS ONLYを利用した場合TCを全表走査してしまったので、rownum利用時と同じオブジェクト参照させるためヒントでPK_TC索引を利用するようチューニングしてあります
ただ..なぜか、TABLE ACCESS BY INDEX ROWID BATCHEDではなくTABLE ACCESS BY INDEX ROWIDとなっています。


さらに不思議なことに、COSTが異常に跳ね上がっています。Rowsの見積もり件数で大きな差があることが影響しているように見えるんだが、なんでこんなに違うんだろう!
いろいろ試してみると、不思議なことがおきそうな気配w


Buffer Getsはほぼ同じなので、全表走査になりやすい?場合、索引が利用できそうなら使わせたほうがいいですな。多分。

23:12:22 SCOTT@pdborcl> r
1 select /*+ leading(tc) use_nl(tc tb ta) index(tc pk_tc) */ *
2 from
3 tc join tb
4 on
5 tc.version = tb.version
6 and tc.branch# = tb.branch#
7 join ta
8 on
9 tb.version = ta.version
10 where
11 tc.version between 1 and 10
12* fetch first 1000 rows only

1000行が選択されました。

経過: 00:00:00.13

実行計画
----------------------------------------------------------
Plan hash value: 3242622317

------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 300K| 456M| 1141K (1)| 00:00:45 |
|* 1 | VIEW | | 300K| 456M| 1141K (1)| 00:00:45 |
|* 2 | WINDOW NOSORT STOPKEY | | 300K| 864M| 1141K (1)| 00:00:45 |
| 3 | NESTED LOOPS | | | | | |
| 4 | NESTED LOOPS | | 300K| 864M| 1141K (1)| 00:00:45 |
| 5 | NESTED LOOPS | | 600K| 1155M| 841K (1)| 00:00:33 |
| 6 | TABLE ACCESS BY INDEX ROWID| TC | 1200K| 1156M| 174K (1)| 00:00:07 |
|* 7 | INDEX RANGE SCAN | PK_TC | 1200K| | 3278 (1)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID| TB | 1 | 1008 | 1 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | PK_TB | 1 | | 0 (0)| 00:00:01 |
|* 10 | INDEX UNIQUE SCAN | PK_TA | 1 | | 0 (0)| 00:00:01 |
| 11 | TABLE ACCESS BY INDEX ROWID | TA | 1 | 1004 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("from$_subquery$_006"."rowlimit_$$_rownumber"<=1000)
2 - filter(ROW_NUMBER() OVER ( ORDER BY NULL )<=1000)
7 - access("TC"."VERSION">=1 AND "TC"."VERSION"<=10)
9 - access("TC"."VERSION"="TB"."VERSION" AND "TC"."BRANCH#"="TB"."BRANCH#")
filter("TB"."VERSION"<=10 AND "TB"."VERSION">=1)
10 - access("TB"."VERSION"="TA"."VERSION")
filter("TA"."VERSION">=1 AND "TA"."VERSION"<=10)


統計
----------------------------------------------------------
0 recursive calls
0 db block gets
2420 consistent gets
0 physical reads
0 redo size
1044954 bytes sent via SQL*Net to client
1270 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1000 rows processed

FETCH FISRSTを利用すると、rownumとは異なり、内部でROW_NUMBER() OVER( OVER BY NULL) <= N
のような変換が発生するんですね!!!! 


rownumの弱点はどうなったか確認してみます。

12c でも rownum は rownumですね! という確認から。

23:37:32 SCOTT@pdborcl> r
1 select /*+ leading(tc) use_nl(tc tb ta) */ *
2 from
3 tc join tb
4 on
5 tc.version = tb.version
6 and tc.branch# = tb.branch#
7 join ta
8 on
9 tb.version = ta.version
10 where
11 tc.version between 11 and 20
12* and rownum <= 1000

レコードが選択されませんでした。

経過: 00:00:08.21

実行計画
----------------------------------------------------------
Plan hash value: 1463769645

-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 2952K| 37940 (1)| 00:00:02 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | NESTED LOOPS | | | | | |
| 3 | NESTED LOOPS | | 1101 | 3250K| 37940 (1)| 00:00:02 |
| 4 | NESTED LOOPS | | 22019 | 42M| 26928 (1)| 00:00:02 |
| 5 | TABLE ACCESS BY INDEX ROWID BATCHED| TC | 38230 | 36M| 5683 (1)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | PK_TC | | | 109 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID | TB | 1 | 1008 | 1 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | PK_TB | 1 | | 0 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | PK_TA | 1 | | 0 (0)| 00:00:01 |
| 10 | TABLE ACCESS BY INDEX ROWID | TA | 1 | 1004 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<=1000)
6 - access("TC"."VERSION">=11 AND "TC"."VERSION"<=20)
8 - access("TC"."VERSION"="TB"."VERSION" AND "TC"."BRANCH#"="TB"."BRANCH#")
filter("TB"."VERSION">=11 AND "TB"."VERSION"<=20)
9 - access("TB"."VERSION"="TA"."VERSION")
filter("TA"."VERSION">=11 AND "TA"."VERSION"<=20)


統計
----------------------------------------------------------
0 recursive calls
0 db block gets
1174942 consistent gets
176197 physical reads
0 redo size
913 bytes sent via SQL*Net to client
533 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed


FETCH FIRST N ROWS ONLYでも弱点は同じです!

23:36:02 SCOTT@pdborcl> r
1 select /*+ leading(tc) use_nl(tc tb ta) index(tc pk_tc) */ *
2 from
3 tc join tb
4 on
5 tc.version = tb.version
6 and tc.branch# = tb.branch#
7 join ta
8 on
9 tb.version = ta.version
10 where
11 tc.version between 11 and 20
12* fetch first 1000 rows only

レコードが選択されませんでした。

経過: 00:00:07.36

実行計画
----------------------------------------------------------
Plan hash value: 3242622317

------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 29999 | 45M| 1141K (1)| 00:00:45 |
|* 1 | VIEW | | 29999 | 45M| 1141K (1)| 00:00:45 |
|* 2 | WINDOW NOSORT STOPKEY | | 29999 | 86M| 1141K (1)| 00:00:45 |
| 3 | NESTED LOOPS | | | | | |
| 4 | NESTED LOOPS | | 29999 | 86M| 1141K (1)| 00:00:45 |
| 5 | NESTED LOOPS | | 599K| 1155M| 841K (1)| 00:00:33 |
| 6 | TABLE ACCESS BY INDEX ROWID| TC | 1200K| 1156M| 174K (1)| 00:00:07 |
|* 7 | INDEX RANGE SCAN | PK_TC | 1200K| | 3278 (1)| 00:00:01 |
| 8 | TABLE ACCESS BY INDEX ROWID| TB | 1 | 1008 | 1 (0)| 00:00:01 |
|* 9 | INDEX UNIQUE SCAN | PK_TB | 1 | | 0 (0)| 00:00:01 |
|* 10 | INDEX UNIQUE SCAN | PK_TA | 1 | | 0 (0)| 00:00:01 |
| 11 | TABLE ACCESS BY INDEX ROWID | TA | 1 | 1004 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("from$_subquery$_006"."rowlimit_$$_rownumber"<=1000)
2 - filter(ROW_NUMBER() OVER ( ORDER BY NULL )<=1000)
7 - access("TC"."VERSION">=11 AND "TC"."VERSION"<=20)
9 - access("TC"."VERSION"="TB"."VERSION" AND "TC"."BRANCH#"="TB"."BRANCH#")
filter("TB"."VERSION">=11 AND "TB"."VERSION"<=20)
10 - access("TB"."VERSION"="TA"."VERSION")
filter("TA"."VERSION">=11 AND "TA"."VERSION"<=20)


統計
----------------------------------------------------------
0 recursive calls
0 db block gets
1174942 consistent gets
175116 physical reads
0 redo size
913 bytes sent via SQL*Net to client
533 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed


最後に、ハッシュ結合にした場合のrownum vs fetch first n rows onlyの比較

NL結合にすべきか、ハッシュ結合にすべきかどうかは、悩むんですよ。状況に合わせて使い分ける必要があるのは、11gでも12cでも同じだと思います。理由は前回のエントリを参照のこと。

rownumでハッシュ結合にした場合、11g R2では黙っていても索引を利用していたのですが、12c R1では全表走査になる傾向が見られます。
11gの実行計画と同じオブジェクトを参照するようにヒントでチューニングしてありますが、やはりここでもTABLE ACCESS BY INDEX ROWID BATCHEDが行われていますね。

実に興味深い。

23:46:06 SCOTT@pdborcl> r
1 select /*+ leading(tc) use_hash(tc tb ta) index(ta pk_ta) */ *
2 from
3 tc join tb
4 on
5 tc.version = tb.version
6 and tc.branch# = tb.branch#
7 join ta
8 on
9 tb.version = ta.version
10 where
11 tc.version between 1 and 10
12* and rownum <= 1000

1000行が選択されました。

経過: 00:00:34.63

実行計画
----------------------------------------------------------
Plan hash value: 3316229909

--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1000 | 4923K| | 199K (1)| 00:00:08 |
|* 1 | COUNT STOPKEY | | | | | | |
|* 2 | HASH JOIN | | 2002 | 9857K| | 199K (1)| 00:00:08 |
| 3 | TABLE ACCESS BY INDEX ROWID BATCHED | TA | 10 | 10040 | | 4 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | PK_TA | 10 | | | 1 (0)| 00:00:01 |
|* 5 | HASH JOIN | | 4004 | 7894K| 1170M| 199K (1)| 00:00:08 |
|* 6 | TABLE ACCESS FULL | TC | 1200K| 1156M| | 139K (1)| 00:00:06 |
| 7 | TABLE ACCESS BY INDEX ROWID BATCHED| TB | 10001 | 9844K| | 1486 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | PK_TB | 10000 | | | 26 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter(ROWNUM<=1000)
2 - access("TB"."VERSION"="TA"."VERSION")
4 - access("TA"."VERSION">=1 AND "TA"."VERSION"<=10)
5 - access("TC"."VERSION"="TB"."VERSION" AND "TC"."BRANCH#"="TB"."BRANCH#")
6 - filter("TC"."VERSION"<=10 AND "TC"."VERSION">=1)
8 - access("TB"."VERSION">=1 AND "TB"."VERSION"<=10)


統計
----------------------------------------------------------
1258 recursive calls
0 db block gets
515770 consistent gets
516798 physical reads
0 redo size
1062679 bytes sent via SQL*Net to client
1270 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1000 rows processed

FETCH FIRST N ROWS ONLYを利用した場合

00:20:36 SCOTT@pdborcl> r
1 select /*+ leading(tc) use_hash(tc tb ta) index(ta pk_ta) index(tb pk_tb) */ *
2 from
3 tc join tb
4 on
5 tc.version = tb.version
6 and tc.branch# = tb.branch#
7 join ta
8 on
9 tb.version = ta.version
10 where
11 tc.version between 1 and 10
12* fetch first 1000 rows only

1000行が選択されました。

経過: 00:00:32.69

実行計画
----------------------------------------------------------
Plan hash value: 3430218324

-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 300K| 456M| | 199K (1)| 00:00:08 |
|* 1 | VIEW | | 300K| 456M| | 199K (1)| 00:00:08 |
|* 2 | WINDOW NOSORT STOPKEY | | 300K| 864M| | 199K (1)| 00:00:08 |
|* 3 | HASH JOIN | | 300K| 864M| | 199K (1)| 00:00:08 |
| 4 | TABLE ACCESS BY INDEX ROWID | TA | 10 | 10040 | | 4 (0)| 00:00:01 |
|* 5 | INDEX RANGE SCAN | PK_TA | 10 | | | 1 (0)| 00:00:01 |
|* 6 | HASH JOIN | | 600K| 1155M| 1170M| 199K (1)| 00:00:08 |
|* 7 | TABLE ACCESS FULL | TC | 1200K| 1156M| | 139K (1)| 00:00:06 |
| 8 | TABLE ACCESS BY INDEX ROWID| TB | 10001 | 9844K| | 1486 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | PK_TB | 10000 | | | 26 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("from$_subquery$_006"."rowlimit_$$_rownumber"<=1000)
2 - filter(ROW_NUMBER() OVER ( ORDER BY NULL )<=1000)
3 - access("TB"."VERSION"="TA"."VERSION")
5 - access("TA"."VERSION">=1 AND "TA"."VERSION"<=10)
6 - access("TC"."VERSION"="TB"."VERSION" AND "TC"."BRANCH#"="TB"."BRANCH#")
7 - filter("TC"."VERSION"<=10 AND "TC"."VERSION">=1)
9 - access("TB"."VERSION">=1 AND "TB"."VERSION"<=10)


統計
----------------------------------------------------------
1456 recursive calls
0 db block gets
516181 consistent gets
514506 physical reads
0 redo size
1045990 bytes sent via SQL*Net to client
1270 bytes received via SQL*Net from client
68 SQL*Net roundtrips to/from client
75 sorts (memory)
0 sorts (disk)
1000 rows processed


Top N に関してはrownumでも fetch first N rows onlyでも弱点は弱点なのでrownumと同じ考え方でチューニングの方向を決めないと、ね。


rownum使って満足しちゃってると..... #1
rownum使って満足しちゃってると..... #2
rownum使って満足しちゃってると..... #3
rownum使って満足しちゃってると..... #4
rownum使って満足しちゃってると.....おまけ

| | | コメント (0) | トラックバック (0)

2013年6月27日 (木)

Oracle Database 12c R1 12.1.0.1.0 released!

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

Oracle Database 12c release 1 12.1.0.1.0 がやっと公開されました :)

ダウンロードは朝一でしたが、帰宅してからインストール、力尽きたので、寝ます。<イマココ

ちなみに、Linuxは、CentOS5.8 x86_64です。Oracle11g R2をインストールしていたのですが、そのまま別ORACLE_HOMEへインストールしてみました。 

問題なく?インストールできたようですが、6系とかSolarisにしたほうが良かったかなぁ...w


20130627_03453


20130627_11605


なんか、沢山のバックグランドプロセスが... まだマニュアルもまともに読んでないので、これからです :)


20130627_12233


そして、噂のpga_aggregate_limit

SQL> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_limit big integer 3596M
pga_aggregate_target big integer 1798M
SQL>

| | | コメント (0) | トラックバック (0)

2013年4月14日 (日)

db file scattered read と db file parallel read と db file sequential read (その6)

続きです。

system callからも読み取れますが、各待機イベントでは
db file sequential read - 単一ブロック読み込み
db file parallel read - 不連続ブロックの複数ブロックの読み込み
db file scattered read - 連続したブロックの複数ブロック読み込み

が行われ、読み込まれたブロックはバッファキャッシュに乗せられるわけです。

注)
今回は発生しないようにしていますが、Oracle11g R2では実行計画上フルスキャンとなっていても、db file scattered readまたはdirect path read(バッファキャッシュを経由しない)になる場合があります。(smart flash cacheが無い場合)

db file scattered read vs direct path read関連の話題は以下のブログを参考に :)
10046 trace name context forever - Oracle OpenWorld 2012 Unconference presented by JPOUG
10046 trace name context forever - Smart Flash Cache 簡単なパフォーマンス比較
技術情報| Insight Techology, Inc. Part 7 - 11gR2からのフルスキャン
Ask Tom "Direct path reads 11gR2" - Thanks for the question regarding "Direct path reads 11gR2", version 11.2.0.1

direct path readが発生していないので :)
...キャッシュヒット率100%ならば発生しないってこと、ですよね。

試してみます!

バッファキャッシュには以下のSQL文でアクセスする表以外のオブジェクトも含め事前に乗せてあります。
以下SQL文では表、索引ともバッファキャッシュヒット率100%になるようにしてあります。

v$bhの状態(STATUS=freeがないので空きブロックの無い状態)

STATUS       COUNT(1)
---------- ----------
xcur 8904
cr 21

SQLトレースを見ると物理読み込みは発生していないこと、db file * read待機イベントが発生していないことが確認できます!

SQLトレース(tkprofにて整形後)

select
/*+
leading(t2 t1)
use_nl(t2 t1)
index(t2 pk_high_clustering_factor)
*/
t2.id
,t2.name
,t1.name
from
low_clustering_factor t1
inner join high_clustering_factor t2
on
t1.id = t2.id
where
t2.id between 30001 and 35000

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 163 0.06 0.07 0 5252 0 2421
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 165 0.06 0.07 0 5252 0 2421

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows Row Source Operation
------- ---------------------------------------------------
2421 NESTED LOOPS (cr=5252 pr=0 pw=0 time=63861 us)
2421 NESTED LOOPS (cr=2831 pr=0 pw=0 time=67887 us cost=5012 size=1530612 card=2501)
2421 TABLE ACCESS BY INDEX ROWID HIGH_CLUSTERING_FACTOR (cr=2589 pr=0 pw=0 time=51456 us cost=2510 size=765612 card=2502)
2421 INDEX RANGE SCAN PK_HIGH_CLUSTERING_FACTOR (cr=168 pr=0 pw=0 time=7260 us cost=8 size=0 card=2502)(object id 82774)
2421 INDEX UNIQUE SCAN PK_LOW_CLUSTERING_FACTOR (cr=242 pr=0 pw=0 time=0 us cost=0 size=0 card=1)(object id 82772)
2421 TABLE ACCESS BY INDEX ROWID LOW_CLUSTERING_FACTOR (cr=2421 pr=0 pw=0 time=0 us cost=1 size=306 card=1)


Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 163 0.00 0.00
SQL*Net message from client 163 0.02 2.51
SQL*Net more data to client 161 0.00 0.00
********************************************************************************

select
/*+
leading(t1 t2)
use_nl(t1 t2)
index(t1 pk_low_clustering_factor)
*/
t1.id
,t1.name
,t2.name
from
low_clustering_factor t1
inner join high_clustering_factor t2
on
t1.id = t2.id
where
t1.id between 1 and 5000

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 173 0.04 0.05 0 3367 0 2566
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 175 0.04 0.05 0 3367 0 2566

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows Row Source Operation
------- ---------------------------------------------------
2566 NESTED LOOPS (cr=3367 pr=0 pw=0 time=44887 us)
2566 NESTED LOOPS (cr=801 pr=0 pw=0 time=32245 us cost=5231 size=1530000 card=2500)
5000 TABLE ACCESS BY INDEX ROWID LOW_CLUSTERING_FACTOR (cr=564 pr=0 pw=0 time=17496 us cost=229 size=1530000 card=5000)
5000 INDEX RANGE SCAN PK_LOW_CLUSTERING_FACTOR (cr=181 pr=0 pw=0 time=3624 us cost=11 size=0 card=5000)(object id 82772)
2566 INDEX UNIQUE SCAN PK_HIGH_CLUSTERING_FACTOR (cr=237 pr=0 pw=0 time=0 us cost=0 size=0 card=1)(object id 82774)
2566 TABLE ACCESS BY INDEX ROWID HIGH_CLUSTERING_FACTOR (cr=2566 pr=0 pw=0 time=0 us cost=1 size=306 card=1)


Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 173 0.00 0.00
SQL*Net message from client 172 0.07 2.01
SQL*Net more data to client 171 0.00 0.00

db file * read祭りだった際には明らかに増加していた physical reads prefetch warmupやphysical reads cache prefetchも含め、
物理読み込みが発生しない状況であれば、それらの待機イベントも発生しないのは当然と言えば当然ですよね。 :)

SQL実行前のシステム統計(physical readとprefetch関連のみ)


---------------------------------------------------------------- ----------
index crx upgrade (prefetch) 0
physical read IO requests 2201
physical read bytes 18030592
physical read flash cache hits 0
physical read requests optimized 0
physical read total IO requests 2201
physical read total bytes 18030592
physical read total multi block requests 0
physical reads 2201
physical reads cache 2201
physical reads cache prefetch 741
physical reads direct 0
physical reads direct (lob) 0
physical reads direct temporary tablespace 0
physical reads for flashback new 0
physical reads prefetch warmup 0
physical reads retry corrupt 0
prefetch clients - 16k 0
prefetch clients - 2k 0
prefetch clients - 32k 0
prefetch clients - 4k 0
prefetch clients - 8k 0
prefetch clients - default 0
prefetch clients - keep 0
prefetch clients - recycle 0
prefetch warmup blocks aged out before use 0
prefetch warmup blocks flushed out before use 0
prefetched blocks aged out before use 0

SQL文実行後のシステム統計(physical readとprefetch関連のみ)

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
index crx upgrade (prefetch) 0
physical read IO requests 2201
physical read bytes 18030592
physical read flash cache hits 0
physical read requests optimized 0
physical read total IO requests 2201
physical read total bytes 18030592
physical read total multi block requests 0
physical reads 2201
physical reads cache 2201
physical reads cache prefetch 741
physical reads direct 0
physical reads direct (lob) 0
physical reads direct temporary tablespace 0
physical reads for flashback new 0
physical reads prefetch warmup 0
physical reads retry corrupt 0
prefetch clients - 16k 0
prefetch clients - 2k 0
prefetch clients - 32k 0
prefetch clients - 4k 0
prefetch clients - 8k 0
prefetch clients - default 0
prefetch clients - keep 0
prefetch clients - recycle 0
prefetch warmup blocks aged out before use 0
prefetch warmup blocks flushed out before use 0
prefetched blocks aged out before use 0

物理読み込みが発生しない状況を作りdb file * read関連の物理読み込みが発生しない状況で、physical reads prefetch warmup/cache prefetchが発生していないことは確認しました。

次回はphysical reads prefetch warmupってどんな時に発生しやすいのか確認してみます。その際、発生する待機イベントってなんだろう? (もうわかってるでしょ、でしょ?)

つづく

”SSD”、”SSD”、ってプロジェクトでお金握ってる人の耳元で毎日つぶやいていれば、

いつの日か、「あ、そうだ! SSDがあるじゃまいか」と、自分から言うようになるんじゃないかなと思っているんだが、だれか実践してくれないかなw 



バックナンバー

db file scattered read と db file parallel read と db file sequential read (その1)
db file scattered read と db file parallel read と db file sequential read (その2)
db file scattered read と db file parallel read と db file sequential read (その3)
db file scattered read と db file parallel read と db file sequential read (その4)
db file scattered read と db file parallel read と db file sequential read (その5)

| | | コメント (0) | トラックバック (0)

2013年4月 8日 (月)

db file scattered read と db file parallel read と db file sequential read (その4)

db file scattered read と db file parallel read と db file sequential read の続きです。

再びリクエストにお答えしてw、SQLとレースを有効した状態でstraceして該当待機イベントでどのようなsystem callになっているのか確認してみたよ > @yoheia :)


db file sequential read

WAIT #4: nam='db file sequential read' ela= 53584 file#=7 block#=375476 blocks=1 obj#=82773 tim=1365258291285100

....
pread64(17, "\6\242\0\0\372\267\5\0\\]\216\0\0\0\1\6\226y\0\0\1\0\0\0UC\1\0009]\216\0"..., 8192, 3070181376) = 8192

db file scattered read

WAIT #4: nam='db file scattered read' ela= 14462 file#=7 block#=374752 blocks=26 obj#=82773 tim=1365258291450333

....
pread64(17, "\6\242\0\0\340\267\5\0005]\216\0\0\0\1\6}\372\0\0\1\0\0\0UC\1\0002]\216\0"..., 212992, 3069968384) = 212992

db file parallel read

WAIT #4: nam='db file parallel read' ela= 25040 files=1 blocks=11 requests=11 obj#=82773 tim=1365258291641614

....
io_submit(1261568, 11, {{0x7981c8, 0, 0, 0, 17}, {0x79834c, 0, 0, 0, 17}, {0x7984d0, 0, 0, 0, 17}, {0x798654, 0, 0, 0, 17}, {0x7987d8, 0, 0, 0, 17}, {0x79895c, 0, 0, 0, 17}, {0x798ae0, 0, 0, 0, 17}, {0x798c64, 0, 0, 0, 17}, {0x798de8, 0, 0, 0, 17}, {0x798f6c, 0, 0, 0, 17}, {0x7990f0, 0, 0, 0, 17}}) = 11
io_getevents(1261568, 11, 128, {{0x79834c, 0x79834c, 8192, 0}, {0x7984d0, 0x7984d0, 8192, 0}, {0x7981c8, 0x7981c8, 8192, 0}, {0x798654, 0x798654, 8192, 0}, {0x7987d8, 0x7987d8, 8192, 0}, {0x798ae0, 0x798ae0, 8192, 0}, {0x798c64, 0x798c64, 8192, 0}, {0x798de8, 0x798de8, 8192, 0}, {0x7990f0, 0x7990f0, 8192, 0}, {0x798f6c, 0x798f6c, 8192, 0}, {0x79895c, 0x79895c, 8192, 0}}, {600, 0}) = 11

このdb file parallel readも狙って出せるくらいだから、たまたまそういう状況では発生しちゃうわけですよ。

以下のSQLトレースは、全てHIGH_CLUSTERING_FACTOR(表)に対する待機イベントですが、何が起きているか想像するとワクワクしてきませんか? (変態だな)

WAIT #4: nam='db file parallel read' ela= 10307 files=1 blocks=14 requests=14 obj#=82773 tim=1364725159669764 
WAIT #4: nam='db file scattered read' ela= 1931 file#=7 block#=374755 blocks=29 obj#=82773 tim=1364725159671819
WAIT #4: nam='db file parallel read' ela= 5874 files=1 blocks=14 requests=14 obj#=82773 tim=1364725159733551 
WAIT #4: nam='db file sequential read' ela= 337 file#=7 block#=374065 blocks=1 obj#=82773 tim=1364725159733959 

ということで、いろいろと、力尽きたので今日はここまで。

次回へつづく。



バックナンバー

db file scattered read と db file parallel read と db file sequential read (その1)
db file scattered read と db file parallel read と db file sequential read (その2)
db file scattered read と db file parallel read と db file sequential read (その3)

| | | コメント (0) | トラックバック (0)

2013年3月23日 (土)

R(relation)の線が無いERDを見てて..思いついたこと....でもメンテする気がなけりゃ同じだけどな

ExcelでメンテされてないERDとか、リリース当初からERDのR(relation)の線がない(ヒアリングするrelationは確かにあるんだよ)ERDとか見てて...寂しくなった。
ERD見る意味ないじゃん。というか、なんでそんなERDメンテするのに工数取ってんの?
とか、そんなERDベースにテストデータどうやって作るのさ...急に呼ばれて飛び出てきたのに...
ということをもやもや考えてた日々がしばらくありまして...

Oracle SQL Developer ModelerでリバースエンジニアリングしてERD作ろうと思っても...

そういう所って外部参照制約なんてないんですよ。

そもそも外部参照制約作れないだろって所もあるわけですけど...それはない前提で...

20130323_145704

20130323_145856

ERDをリバースエンジニアリングで作成しようと思うと、エンティティ図になってしまうという残念な結果になるのは目に見えてるわけです。はい。(><)

外部参照制約作成していれば.....

20130323_154430_2

20130323_154436


20130323_154444


20130323_154451_2


20130323_154503

こんな感じですぐにできるので、面倒くさくなくて素敵なんですね。

だた、参照整合性嫌いだし。とか、毎日夜間バッチで整合性チェックしてるからいいの!
ってところは多いわけです。


....で....ある日、電球がピカりんこと光った訳ですよ....


Oracle SQL Developer Data Modelerのリバースエンジニアリングって 、外部参照制約がdisableかつnovalidateで制約が効かない(一部制限あり*1)状態でもERDではrelation作成してくれるかも〜〜〜〜。と。

忘れないうちにすぐ試す!
外部参照制約はdropしないで、disable かつ novalidate済み!


20130323_144207


20130323_144244


20130323_144256


20130323_144311


20130323_144318

できた〜〜〜〜っ!


Enjoy! Oracle SQL Data Modeler and Developer !



*1:
外部参照整合性をdisable かつ novalidateにしていても外部参照整合性が作成されているだけで親表は子表より先にdropできなくなるのでその点はお忘れなく!

試験環境は以下のとおり
Oracle11g R2 for linux x86
Oracle SQL Developer 3.3.20 for OS X
Oracle DataModeler 3.1.4 for OS X

| | | コメント (0) | トラックバック (0)

2013年2月 3日 (日)

jdk-7u13にアップデート

http://docs.oracle.com/javase/


20130203_61623


| | | コメント (0) | トラックバック (0)

2012年12月23日 (日)

やはり、来たね VirtualBoxアップデート :)

この時期に仕事やっつけてないと、クリスマスが大変だものね〜 :) と

https://www.virtualbox.org/wiki/Changelog

20121223_142825

20121223_143046


| | | コメント (0) | トラックバック (0)

2012年12月15日 (土)

VirtualBoxのゲストさん、いらっしゃ〜〜い

VirtualBox で いろんなGuestOS起動してみた。(MacOS Xは以前書きましたけど、他のOSもまとめて書いておきますね)

HostはMac/OS X Mountain Lionでございます。
20121215_64848

VirtualBoxは、4.2.4でございます。

20121215_65224


GuestOSのみなさま :)

まずは、Mac on Mac から

Mac OS X Leopard 10.5
Macos_x_leopard_105

Oracle Solaris11.1
Oracle_solaris111


HAIKU Alpha4
Haiku_alpha4


OpenSUSE 12.2
Opensuse122


Ubuntu 12.10
Ubuntu1210_2


Fedora 17
Fedora

CentOSとかWindowsもね

CentOS 5 and 6
Centos5_2

Centos6

Windows XP and 7
Windowsxp

Windows7


| | | コメント (0) | トラックバック (0)

2012年10月29日 (月)

VirtualBox 4.2.4 Released

余裕がなくてアップデート1つ飛ばしてしまった >< 

OS X関連 bug fix含んでいるので更新など...

対応ゲストOS一覧はここ.
https://www.virtualbox.org/wiki/Guest_OSes


https://www.virtualbox.org/wiki/Changelog

20121029_53350
20121029_53427

20121029_53455
20121029_53517
20121029_53541

20121029_55901


| | | コメント (0) | トラックバック (0)

2012年9月22日 (土)

VirtualBox 4.2 Released !!!

VirtualBoxリリーススピードがすごいっす。。

VIrutalBox 4.2リリース! グループ化したVMは一括起動できるんで便利ですね〜

一括起動するとする際には、グループ内の並び順で順次起動されてます。この機能が追加されるとたぶん更なる要求があるかもしれませんね。順に起動するだけでなく任意に一括起動とか、各VMの起動間隔したいとか :)

20120922_141057


20120922_141104


2012/9/23更新(相変わらずミスが多い ><)

| | | コメント (0) | トラックバック (0)

2012年9月11日 (火)

VirtualBox 4.1.22 、 4.2近くに来てるし〜:)

4.1.22 今回は随分間隔短いリリースだな (^^;;;

20120911_84234

4.2.0 も RC4な


| | | コメント (0) | トラックバック (0)

2012年9月 2日 (日)

Index Only Accessネタのおまけのおまけ

Caché de Index Only Access できるのか?

CachéってSQLもサポートしてるので、Index Only Accessサポートしてるのかな〜と素朴な疑問から調べてみたもののマニュアルには記載されていない。
書かれていなきゃどうなるか、試すのが手っ取り早いですね。
(ダウンロードするにはフォームからリクエストする必要があります。1セッション限定の試用ライセンスのようです。他の制限は該当ページ読んでくださいな。)



OracleのIndex Only Accessは以下のエントリを参考にしてください。

いん!、イン!、Index どっぷり Inde Only Access生活w - Oracle OpenWorld Unconference presented by JPOUG

JPOUG SET EVENTS 20120721 - 「(続)いん!、イン!、Index 大人の事情縛りのSQLチューニング」資料公開

MySQL/PostgreSQLのIndex Only Accessは以下のエントリを参考にしてください。
Index Only Accessネタのおまけ


いつもはMacBook Air使うんですが、今回は都合により母艦のVirtualBoxを使いました (^^;;

MacPro Mid 2012 12Core/24GB (OS X Mountain Lion Server)
VirtualBox4.1.20 for MacOS X
GuestOS:CentOS5.8 x86_64 (CPU数とメモリサイズはMacBook Airのx86環境と同じ)

Caché 2012.1 for Linux x86_64


まず、ターミナルで接続して表、索引、データ登録、他のデータベースで言う統計情報取得から。

[oracle@pleco ˜]$ csession cache -U samples

ノード: pleco.macdeoracle.jp インスタンス: CACHE

SAMPLES>

SAMPLES>d $System.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>
SAMPLES>>create table tab3(unique_id numeric(10) not null, item_code char(15) not null, data varchar(500), is_delete numeric(1), status_code char(2))
1. create table tab3(unique_id numeric(10) not null, item_code char(15) not null, data varchar(500), is_delete numeric(1), status_code char(2))

0 Rows Affected
statement prepare time: 0.0118s, elapsed execute time: 0.2405s.
---------------------------------------------------------------------------
SAMPLES>>
SAMPLES>>alter table tab3 add constraint tab3_pk primary key(unique_id)
3. alter table tab3 add constraint tab3_pk primary key(unique_id)

0 Rows Affected
statement prepare time: 0.0092s, elapsed execute time: 4.9465s.
---------------------------------------------------------------------------
SAMPLES>>
SAMPLES>>create table tab311 (unique_id numeric(10) not null,sub_item_code char(10),data varchar(500),is_delete numeric(1))
4. create table tab311 (unique_id numeric(10) not null,sub_item_code char(10),data varchar(500),is_delete numeric(1))

0 Rows Affected
statement prepare time: 0.0115s, elapsed execute time: 0.1953s.
---------------------------------------------------------------------------
SAMPLES>>create table tab31 (item_code char(15) not null,sub_item_code char(10),data varchar(500),is_delete numeric(1))
5. create table tab31 (item_code char(15) not null,sub_item_code char(10),data varchar(500),is_delete numeric(1))

0 Rows Affected
statement prepare time: 0.0133s, elapsed execute time: 0.1985s.
---------------------------------------------------------------------------
SAMPLES>>
SAMPLES>>alter table tab31 add constraint tab31_pk primary key(item_code)
7. alter table tab31 add constraint tab31_pk primary key(item_code)

0 Rows Affected
statement prepare time: 0.0102s, elapsed execute time: 0.2589s.
---------------------------------------------------------------------------
SAMPLES>>alter table tab311 add constraint tab311_pk primary key(unique_id)
8. alter table tab311 add constraint tab311_pk primary key(unique_id)

0 Rows Affected
statement prepare time: 0.0116s, elapsed execute time: 0.2627s.
---------------------------------------------------------------------------
SAMPLES>>create index tab311_ix on tab311(sub_item_code)
9. create index tab311_ix on tab311(sub_item_code)

0 Rows Affected
statement prepare time: 0.0111s, elapsed execute time: 0.2870s.
---------------------------------------------------------------------------
SAMPLES>>q

確認は管理ポータルで!(どこみればよいか分からなかったので楽な方法で..)

Desc_tab3

Tab3_indexes_no_index_only

Desc_tab31

Tab31_indexes_no_index_only

Desc_tab311

Tab311_indexes_no_index_only_scan

Oracleなら統計情報取得、他のRDBMSならアナライズ(昔はオラクルもアナライズだったんですけどね)、Cachéの世界では「テーブルチューニング」というそうな。
(管理ポータルから実行しています)
Table_analyze

Tab31_analyze

Tab311_analyze

表と索引ができたのでデータ登録。
これまたOracleとは勝っても違うし、DSMの時代(DIGITAL STANDARD MUMPS)から大きく拡張されてるのでかなり辛いな〜MUMPS思い出すというより別物に近い感じw。あの当時はSQL使えねーしというより必要ねーし、だったしね (^^;;;

以下、データ作成中のログ..
グルグル回しているのは気にしないでねw

[oracle@pleco ˜]$ csession cache -U samples

ノード: pleco.macdeoracle.JP インスタンス: CACHE

SAMPLES>
SAMPLES>
SAMPLES>s rs=##class(%SQL.Statement).%ExecDirect(,"start transaction")
TL1:SAMPLES>s sql="insert into SQLUser.tab3 values(?,to_char((?#500000)+1,'FM099999999999999'),repeat('*',250-length(to_char(?)))||to_char(?),0,'00')"
TL1:SAMPLES>s stmt=##class(%SQL.Statement).%New() s stat=stmt.%Prepare(sql)
TL1:SAMPLES>f i=1:1:1000000 {s rs=stmt.%Execute(i,i,i,i)}
TL1:SAMPLES>s rs=##class(%SQL.Statement).%ExecDirect(,"commit")
SAMPLES>d $System.SQL.Shell()

SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>select count(1) from tab3
7. select count(1) from tab3

Aggregate_1
1000000

1 Rows(s) Affected
statement prepare time: 0.0009s, elapsed execute time: 2.6558s.
---------------------------------------------------------------------------
SAMPLES>>select min(unique_id) as "min", max(unique_id) as "max" from tab3
8. select min(unique_id) as "min", max(unique_id) as "max" from tab3

min max
1 1000000

1 Rows(s) Affected
statement prepare time: 0.1423s, elapsed execute time: 0.0006s.
---------------------------------------------------------------------------
SAMPLES>>select min(item_code) "min",max(item_code) "max" from tab3
9. select min(item_code) "min",max(item_code) "max" from tab3

min max
000000000000001 000000000500000

1 Rows(s) Affected
statement prepare time: 0.1324s, elapsed execute time: 3.4683s.
---------------------------------------------------------------------------
SAMPLES>>
SAMPLES>>q

SAMPLES>halt
[oracle@pleco ˜]$

SAMPLES>d $System.SQL.SetAutoCommit(2)
SAMPLES>s rs=##class(%SQL.Statement).%ExecDirect(,"start transaction")
TL1:SAMPLES>s sql="insert into SQLUser.tab31 values(to_char(?,'FM099999999999999'),to_char((?#500000)+1,'FM0999999999'),repeat('*',250-length(to_char(?)))||to_char(?),0)"
TL1:SAMPLES>s stmt=##class(%SQL.Statement).%New() s stat=stmt.%Prepare(sql)
TL1:SAMPLES>f i=1:1:2000000 {s rs=stmt.%Execute(i,i,i,i)}
TL1:SAMPLES>s rs=##class(%SQL.Statement).%ExecDirect(,"commit")

SAMPLES>d $System.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>select count(1) from tab31
2. select count(1) from tab31

Aggregate_1
2000000

1 Rows(s) Affected
statement prepare time: 0.1349s, elapsed execute time: 6.0684s.
---------------------------------------------------------------------------
SAMPLES>>select min(item_code) "item_code(MIN)",max(item_code) "item_code(MAX)" from tab31
3. select min(item_code) "item_code(MIN)",max(item_code) "item_code(MAX)" from tab31

item_code(MIN) item_code(MAX)
000000000000001 000000002000000

1 Rows(s) Affected
statement prepare time: 0.1361s, elapsed execute time: 0.0010s.
---------------------------------------------------------------------------
SAMPLES>>select min(sub_item_code) "sub_item_code(MIN)",max(sub_item_code) "sub_item_code(MAX)" from tab31
4. select min(sub_item_code) "sub_item_code(MIN)",max(sub_item_code) "sub_item_code(MAX)" from tab31

sub_item_code(MIN) sub_item_code(MAX)
0000000001 0000500000

1 Rows(s) Affected
statement prepare time: 0.1391s, elapsed execute time: 6.7417s.
---------------------------------------------------------------------------
SAMPLES>>q
SAMPLES>

SAMPLES>d $System.SQL.SetAutoCommit(2)
SAMPLES>s rs=##class(%SQL.Statement).%ExecDirect(,"start transaction")
TL1:SAMPLES>s sql="insert into SQLUser.tab311 values(?,to_char((?#500000)+1,'FM0999999999'),repeat('*',250-length(to_char(?)))||to_char(?),0)"
TL1:SAMPLES>s stmt=##class(%SQL.Statement).%New() s stat=stmt.%Prepare(sql)
TL1:SAMPLES>f i=1:1:2000000 {s rs=stmt.%Execute(i,i,i,i)}
TL1:SAMPLES>s rs=##class(%SQL.Statement).%ExecDirect(,"commit")

SAMPLES>d $System.SQL.Shell()

SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>select count(1) from tab311
5. select count(1) from tab311

Aggregate_1
2000000

1 Rows(s) Affected
statement prepare time: 0.0009s, elapsed execute time: 3.7845s.
---------------------------------------------------------------------------
SAMPLES>>select min(sub_item_code) "sub_item_code(MIN)", max(sub_item_code) "sub_item_code(MAX)" from tab311
6. select min(sub_item_code) "sub_item_code(MIN)", max(sub_item_code) "sub_item_code(MAX)" from tab311

sub_item_code(MIN) sub_item_code(MAX)
0000000001 0000500000

1 Rows(s) Affected
statement prepare time: 0.1558s, elapsed execute time: 0.0004s.
---------------------------------------------------------------------------
SAMPLES>>q


本題からはずれるのですが... SQL使ってるとはいっても、ベースはMUMPSというかM言語だからね〜というお話を。。

tab3表及び主キー制約で作成された索引に対応するglobals。索引を見るとSparse Multidimensional Arrayをうまく利用しているのがよくわかる :)
Cachéの表や索引の実態はSparse Multidimensional Arrayなんだお。

1:      ^User.tab3D    =     1512812
2: ^User.tab3D(512813) = $lb("",1,"000000000000002","***************** ...中略... *******************************1",0,"00")
3: ^User.tab3D(512814) = $lb("",2,"000000000000003","***************** ...中略... *******************************2",0,"00")
4: ^User.tab3D(512815) = $lb("",3,"000000000000004","***************** ...中略... *******************************3",0,"00")
...以下略...

tab3表の主キー索引

1:      ^User.tab3I("tab3pk",1,512813)    =     ""
2: ^User.tab3I("tab3pk",2,512814) = ""
3: ^User.tab3I("tab3pk",3,512815) = ""
...以下略...

次は、tab31表と主キー索引

1:      ^User.tab31D    =     2000000
2: ^User.tab31D(1) = $lb("","000000000000001","0000000002","***************** ...中略... *************************1",0)
3: ^User.tab31D(2) = $lb("","000000000000002","0000000003","***************** ...中略... *************************2",0)
4: ^User.tab31D(3) = $lb("","000000000000003","0000000004","***************** ...中略... *************************3",0)
...以下略...


1:      ^User.tab31I("tab31pk"," 000000000000001",1)    =     ""
2: ^User.tab31I("tab31pk"," 000000000000002",2) = ""
3: ^User.tab31I("tab31pk"," 000000000000003",3) = ""
...以下略...


最後に、tab311表と主キー索引及び、非ユニーク索引に対応したSparse Multidimensional Arrayの内容

1:      ^User.tab311D    =     2000000
2: ^User.tab311D(1) = $lb("",1,"0000000002","********************************* ...中略... ************************1",0)
3: ^User.tab311D(2) = $lb("",2,"0000000003","********************************* ...中略... ************************2",0)
4: ^User.tab311D(3) = $lb("",3,"0000000004","********************************* ...中略... ************************3",0)
...以下略...

1:      ^User.tab311I("tab311ix"," 0000000001",500000)    =     ""
2: ^User.tab311I("tab311ix"," 0000000001",1000000) = ""
3: ^User.tab311I("tab311ix"," 0000000001",1500000) = ""
4: ^User.tab311I("tab311ix"," 0000000001",2000000) = ""
5: ^User.tab311I("tab311ix"," 0000000002",1) = ""
6: ^User.tab311I("tab311ix"," 0000000002",500001) = ""
7: ^User.tab311I("tab311ix"," 0000000002",1000001) = ""
8: ^User.tab311I("tab311ix"," 0000000002",1500001) = ""
9: ^User.tab311I("tab311ix"," 0000000003",2) = ""
10: ^User.tab311I("tab311ix"," 0000000003",500002) = ""
11: ^User.tab311I("tab311ix"," 0000000003",1000002) = ""
12: ^User.tab311I("tab311ix"," 0000000003",1500002) = ""
13: ^User.tab311I("tab311ix"," 0000000004",3) = ""
14: ^User.tab311I("tab311ix"," 0000000004",500003) = ""
15: ^User.tab311I("tab311ix"," 0000000004",1000003) = ""
16: ^User.tab311I("tab311ix"," 0000000004",1500003) = ""
...以下略...


実行するクエリはOracle/MySQL/PostgreSQLで実行したものと同じです。

select
t1.unique_id,
t1.item_code,
(
select
max(t3.unique_id)
from
tab31 t2 join tab311 t3
on
t2.sub_item_code = t3.sub_item_code
and t3.is_delete = 0
where
t2.item_code = t1.item_code
and t2.is_delete = 0
) current_sub_item
from
tab3 t1
where
t1.unique_id between 1 and 10000
and t1.is_delete = 0
and t1.status_code = '00'


以下、管理ポータルのSQL実行プラン表示で取得した実行計画とコスト。
Index Only AccessではないのでCacheのSQLの世界で表アクセスを意味するオペレーションである、Read Master mapがスカラー問合せ部分に現れている。
ちなみに、索引アクセスを意味するオペレーションは、Read index mapのようだ。

実行プランが以下に表示されます:
クエリ文字列

SELECT t1 . unique_id , t1 . item_code , ( SELECT MAX ( t3 . unique_id ) FROM tab31 t2 JOIN tab311 t3 ON t2 . sub_item_code = t3 . sub_item_code AND t3 .
is_delete = ? WHERE t2 . item_code = t1 . item_code AND t2 . is_delete = ? ) current_sub_item FROM tab3 t1 WHERE t1 . unique_id BETWEEN ? AND ? AND t1 .
is_delete = ? AND t1 . status_code = ?

クエリプラン
相対コスト = 74082

Call module B, which populates bitmap temp-file A.
Read bitmap temp-file A, looping on ID.
For each row:
Read master map SQLUser.tab3.IDKEY, using the given idkey value.
Output the row.

module B
Read index map SQLUser.tab3.tab3_pk, looping on unique_id (with a range condition) and ID.
For each row:
Add ID bit to bitmap temp-file A.

subquery
Call module E.
Determine subquery result.

module E
Read index map SQLUser.tab31.tab31_pk, using the given %SQLUPPER(item_code), and looping on ID.
For each row:
Read master map SQLUser.tab31.IDKEY, using the given idkey value.
Read index map SQLUser.tab311.tab311_ix, using the given %SQLUPPER(sub_item_code), and looping on ID.
For each row:
Read master map SQLUser.tab311.IDKEY, using the given idkey value.
Accumulate the max(unique_id).


では、Index Only Accessによるチューニング。 Covering Indexを2つ作成します。(Oracle/MySQL/PostgreSQLで作成した索引と同じ名称にしてあります)

[oracle@pleco ˜]$ csession cache -U samples

ノード: pleco.macdeoracle.JP インスタンス: CACHE

SAMPLES>d $System.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------

The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>create index tab31_demo_ix on tab31(item_code, is_delete, sub_item_code)
1. create index tab31_demo_ix on tab31(item_code, is_delete, sub_item_code)

0 Rows Affected
statement prepare time: 4.8277s, elapsed execute time: 9.6483s.
---------------------------------------------------------------------------
SAMPLES>>create index tab311_demo_ix on tab311(sub_item_code, is_delete, unique_id)
2. create index tab311_demo_ix on tab311(sub_item_code, is_delete, unique_id)

0 Rows Affected
statement prepare time: 0.0130s, elapsed execute time: 8.6777s.
---------------------------------------------------------------------------
SAMPLES>>

索引は正しく作成されています。(管理ポータルから確認した結果)
Tab31_indexes_index_only

Tab311_indexes_inde_only

お〜〜〜〜〜っ!。 CacheのSQLワールドでもIndex Only Accessになってる〜〜〜。 (ヒントのような仕組みはないようなのですが、狙い通りの索引が利用されていますね)
スカラー副問合せの実行計画から Read Master Map(表に対応するSparse Multidimensional Array)をアクセスする操作が消え、Read index Map(索引に対応するSparse Multidimensional Array)をアクセスする操作だけになっていることが確認できた。 :)

以下、管理ポータルの「SQL実行」>「実行計画」で取得した実行計画

クエリプラン
相対コスト = 74082

Call module B, which populates bitmap temp-file A.
Read bitmap temp-file A, looping on ID.
For each row:
Read master map SQLUser.tab3.IDKEY, using the given idkey value.
Output the row.

module B
Read index map SQLUser.tab3.tab3_pk, looping on unique_id (with a range condition) and ID.
For each row:
Add ID bit to bitmap temp-file A.

subquery
Call module E.
Determine subquery result.

module E
Read index map SQLUser.tab31.tab31_demo_ix, using the given %SQLUPPER(item_code) and is_delete, and looping on %SQLUPPER(sub_item_code) and ID.
For each row:
Read index map SQLUser.tab311.tab311_demo_ix, using the given %SQLUPPER(sub_item_code) and is_delete, and looping on unique_id and ID.
For each row:
Accumulate the max(unique_id).

| | | コメント (0) | トラックバック (0)

2012年8月22日 (水)

VirtualBox 4.1.20 released!

Mac OS X hosts: adaptions to Mountain Lionとの記載もあるので即アップデート

20120822_90846


| | | コメント (0) | トラックバック (0)

2012年6月23日 (土)

VirtualBox 4.1.18 released!

https://www.virtualbox.org/wiki/Changelog

定期的にアップデートされてて素敵:)

20120623_73025


| | | コメント (0) | トラックバック (0)

2012年6月 7日 (木)

VirtualBox 4.1.16 released

https://www.virtualbox.org/wiki/Changelog

https://www.virtualbox.org/wiki/Downloads

Mac OS X hosts: addressed issues running on Mountain Lion Preview 3 と Moutain Lion対応も順調のようですな〜 :)


20120602_75941

とりあえず、MacOS X Lion阪はアップデートdone.

| | | コメント (0) | トラックバック (0)

2012年5月 6日 (日)

VirtualBox 4.1.14 と OS X Mountain Lion対応? 4.1.15がリリースされてた

今気づいたけど、4.1.14だけだと思ったら、MacOS X Mountain Lion対応の VirtualBox 4.1.15も出てたのね。:)

https://www.virtualbox.org/wiki/Downloads

20120506_183804


20120506_190633


とりあえずアップデート

20120506_185041


| | | コメント (0) | トラックバック (0)

2012年4月 7日 (土)

VirtualBox 4.1.12 released

https://www.virtualbox.org/wiki/Changelog

20120407_194045

おやおや、今気づいたけど、VirtualBoxについてのダイアログ。バー部分が角張ってるよね。4.1.10から上部だけ角張ってる。

4.1.8まではラウンドだったのに…気になる

以下、4.1.8

20111220_12335


| | | コメント (0) | トラックバック (0)

2012年3月16日 (金)

VirtualBox 4.1.10 released - あれ前回は 4.1.8だったけど一つ飛んだね

https://www.virtualbox.org/

少々時間空いたな〜と思っていたら、4.1.8の次は、一つ飛ばして4.1.10ですね。:)

20120316_163833

Oracle OpenWorld Tokyo 2012 Unconference当日のデモ環境は VirtualBox4.1.10で、GuestOSはCentOS5.8、データベースはOracle11g R2で。もちろんホストOSはOS Xですよ:)

Unconference_jpoug

| | | コメント (0) | トラックバック (0)

2012年1月14日 (土)

shutdown immeidateしない、ほかの理由に遭遇! (FYI)


ず〜〜〜〜っと、追記しようと思ってたんだけど書いてなかったので、徹夜明けで早起きした次いでなんで書いておきます。

もう一年近く前のネタなんだけどね。「shutdown immeidateしない、ほかの理由に遭遇!」

> yoheia-a さんありがとう :)

私か書いた記事がキッカケで調べなきゃいけなくなったらしいんだけどね。 ;)

http://d.hatena.ne.jp/yohei-a/20110627/1309180675




shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ
shutdown immeidateしない、ほかの理由に遭遇! おまけのおまけ(でた〜最近、よくあるパターンw)

| | | コメント (0) | トラックバック (0)

2011年12月20日 (火)

VIrtualBox 4.1.8 released :)

クリスマス前にリリース! されてたのでupdate. Linuxのは後で。

https://www.virtualbox.org/wiki/Downloads

20111220_12000


20111220_12335


特に問題なく起動したし:)

20111220_12543


| | | コメント (0) | トラックバック (0)

2011年12月14日 (水)

PL/SQL de Conditional Compile #6

随分前にPL/SQL de Conditional Compile #5ってエントリ書いてたのを思い出して、11g R1/R2用のを見てみたらソースに丁寧なコメント(マニュアルよりいいんじゃね?w )が書かれていてうれしくなった。

オラクルさんとして見せたくない部分は見えないようになっているけど、見せても問題ないところはコードが見える(all_sourceビュー)わけで、それはそれでうれしいわけです。はい。マニュアルが意外に不親切だったりするので。

(マニュアル、良くなりましたよ。昔より。 > 褒めておかないとね、だれとなくw。)...文字サイズも多くしておきましたw

● Oracle11g R1 11.1 の DBMS_DB_VERSION

package dbms_db_version is
version constant pls_integer := 11; -- RDBMS version number
release constant pls_integer := 1; -- RDBMS release number

/* The following boolean constants follow a naming convention. Each
constant gives a name for a boolean expression. For example,
ver_le_9_1 represents version <= 9 and release <= 1
ver_le_10_2 represents version <= 10 and release <= 2
ver_le_10 represents version <= 10

A typical usage of these boolean constants is

$if dbms_db_version.ver_le_10 $then
version 10 and ealier code
$elsif dbms_db_version.ver_le_11 $then
version 11 code
$else
version 12 and later code
$end

This code structure will protect any reference to the code
for version 12. It also prevents the controlling package
constant dbms_db_version.ver_le_11 from being referenced
when the program is compiled under version 10. A similar
observation applies to version 11. This scheme works even
though the static constant ver_le_11 is not defined in
version 10 database because conditional compilation protects
the $elsif from evaluation if the dbms_db_version.ver_le_10 is
TRUE.
*/

ver_le_9_1 constant boolean := FALSE;
ver_le_9_2 constant boolean := FALSE;
ver_le_9 constant boolean := FALSE;
ver_le_10_1 constant boolean := FALSE;
ver_le_10_2 constant boolean := FALSE;
ver_le_10 constant boolean := FALSE;
ver_le_11_1 constant boolean := TRUE;
ver_le_11 constant boolean := TRUE;

end dbms_db_version;


● Oracle11g R2 11.2 の DBMS_DB_VERSION

package dbms_db_version is
version constant pls_integer := 11; -- RDBMS version number
release constant pls_integer := 2; -- RDBMS release number

/* The following boolean constants follow a naming convention. Each
constant gives a name for a boolean expression. For example,
ver_le_9_1 represents version <= 9 and release <= 1
ver_le_10_2 represents version <= 10 and release <= 2
ver_le_10 represents version <= 10

A typical usage of these boolean constants is

$if dbms_db_version.ver_le_10 $then
version 10 and ealier code
$elsif dbms_db_version.ver_le_11 $then
version 11 code
$else
version 12 and later code
$end

This code structure will protect any reference to the code
for version 12. It also prevents the controlling package
constant dbms_db_version.ver_le_11 from being referenced
when the program is compiled under version 10. A similar
observation applies to version 11. This scheme works even
though the static constant ver_le_11 is not defined in
version 10 database because conditional compilation protects
the $elsif from evaluation if the dbms_db_version.ver_le_10 is
TRUE.
*/

ver_le_9_1 constant boolean := FALSE;
ver_le_9_2 constant boolean := FALSE;
ver_le_9 constant boolean := FALSE;
ver_le_10_1 constant boolean := FALSE;
ver_le_10_2 constant boolean := FALSE;
ver_le_10 constant boolean := FALSE;
ver_le_11_1 constant boolean := FALSE;
ver_le_11_2 constant boolean := TRUE;
ver_le_11 constant boolean := TRUE;

end dbms_db_version;

version 12 and later codeなんて箇所、いいですね〜w



PL/SQL de Conditional Compile #1
PL/SQL de Conditional Compile #2
PL/SQL de Conditional Compile #3
PL/SQL de Conditional Compile #4
PL/SQL de Conditional Compile #5

| | | コメント (0) | トラックバック (0)

2011年10月 5日 (水)

VIrtualBox 4.1.4 released

http://www.virtualbox.org/wiki/Changelog


LinuxとMacのVirtualBoxを4.1.4アップデートするなど。毎月一回のお約束:)

VirtualBox4.1.4 about


| | | コメント (0) | トラックバック (0)

2011年8月16日 (火)

VirtualBox 4.1.2 released! 月1ペースか。:)

http://www.virtualbox.org/wiki/Changelog

ほんと良いペースですねー。


20110816_230112


| | | コメント (0) | トラックバック (0)

2011年8月15日 (月)

CentOS6.0 on VirtualBox4.1.0 for MacOS X(Snow Leopard)

まだLionじゃなくて、Snow Leopardなのですが…

VirtualBox4.1.0でCentOS6.0をGuestOSとして構築してみた。この続きは暇を見て…。
20110815_03357

20110815_71248

| | | コメント (0) | トラックバック (0)

2011年8月14日 (日)

Macユーザ増えたよな〜 :) とアクセスログ見て

このブログを書き始めたころは、タイトルとは裏腹にWindowsとかIEからのアクセスが多かったのですが、ここ1、2年でずいぶん変ってきたな〜、とか、IEの減りっぷりって凄いとか思いながらアクセスログみてると思います。

次のグラフは当ブログのアクログからIEの世代交替状況を見たものです。来年はどうなってるか楽しみですねー。さすがにIE10はまだありませんが、IE7など以前のはとっとと消えてほしいですね。


Ies



次のグラフは、当ブログを参照しているブラウザの種類(バージョンに関係なく)でまとめたものです。
IEの減りっぷりは見事というか、IE9の出遅れ感が強いだけで、これからIE10とかで盛り返してくるのか見物ですね〜。ただIE6/7/8使っているところって大人の事情で金縛り状態のところが多いから切り替わるためには1、2年のタイムラグはありそうな気がします。 だって昨年でさえ、IE6/7対応縛りでjavascriptがおそーいとか無茶やってるとこ多数あったしw


Browser



最後のグラフは、OS別(バージョンに関係なく)でまとめたものです。
いろいろな勉強会とか参加してて特にここ2、3年で随分Macユーザ増えましたよねー、ほんと。
以前はWindowノートが半分以上だったところでも、最近MBAだらけとかいうとこ多いっす。


Os


| | | コメント (0) | トラックバック (0)

2011年7月22日 (金)

Lionがでたとおもったら、VirtualBox 4.1も出てたのね。

http://www.virtualbox.org/wiki/Changelog

20110722_13624

Lion入れるより先にVirtualBox 4.1にしてみたw

| | | コメント (0) | トラックバック (0)

2011年7月17日 (日)

VirtualBox 4.0.12 リリース、活発だな〜 :)

気づいたら、4.0.12がリリースされてる。:) すげ〜活発な。  アップデートdone.

20110717_83523

| | | コメント (0) | トラックバック (0)

2011年5月17日 (火)

VirtualBox 4.0.8でました〜

VirtualBox 4.0.8がリリースされたので早速アップデート :)

Mac OS X関連のbug fixも含まれてますねー。
http://www.virtualbox.org/wiki/Downloads

Changelog for VirtualBox 4.0.8

  • Mac OS X hosts: fixed incompatibility with recent Mac OS X versions in 64-bit mode (bug #8474)
  • Mac OS X hosts: fixed incompatibility with hosts with more than 16 cores (bug #8389)
  • Mac OS X hosts: fixed painting corruptions on a second monitor in 64-bit mode (bug #7606)
  • GUI: restored functionality to set an empty host key to disallow any host key combination (4.0.6 regression; bug #8793)
  • VBoxManage: added controlvm screenshotpng subcommand for saving the screenshot of a running VM in PNG format
  • VBoxHeadless: fixed potential crash during shutdown (Windows hosts only)
  • NAT: built-in services use the correct Ethernet addresses in Ethernet header and in ARP requests
  • Host-only networking: fixed adapter reference counting
  • E1000: fixed rare guest crashes with Linux SMP guests (bug #8755)
  • SATA: fixed guest disk corruption under rare circumstances (only relevant for guests with more than 2GB RAM; bug #8826)
  • Storage: fixed data corruption after a snapshot was taken with asynchronous I/O enabled (bug #8498)
  • Floppy: several improvement
  • HPET: another fix for time jumps (bug #8707)
  • USB: removed assumption that string descriptors are null-terminated (Windows hosts only)
  • 3D support: fixed a potential crash when resizing the guest window
  • 3D support: fixed GNOME 3 rendering under Ubuntu 11.04 and Fedora 15
  • Snapshots: fixed another bug which could lose entries in the media registry when restoring a snapshot (bug #8363)
  • Shared Folders: don't stop mounting the other valid folders if one host folder is inaccessible (4.0.6 regression)
  • Linux Additions: check whether gcc and make are installed before building kernel modules (bug #8795)
  • Solaris Additions: added support for X.Org Server 1.10
  • Guest Additions: fixed inappropriate Guest Additions update notification when using vendor-specific
  • version suffixes (bug #8844)

20110517_50809


20110517_50844


20110517_50852


20110517_50906


20110517_50924_2
20110517_50938


20110517_51357

各Guest OSのGuest Additions scriptの実行もお忘れなく!

| | | コメント (0) | トラックバック (0)

2011年4月 3日 (日)

VirtualBox de Oracle Linux 6

http://blogs.oracle.com/linux/2011/02/oracle_linux_6_dvds_now_available.html

ってことだったので、VirtualBox 使ってお試し環境作っておいた。問題もなくinstall done…

20110402_214835

| | | コメント (0) | トラックバック (0)

2011年3月11日 (金)

IE9テスト用Windows7 64bit環境をVirtualBox VMで

うちの奥さんが関わっているサイトでもIE9対応とかありそうだし、私もいろいろ確認したいこともあり、VirtualBox4.x for LInux x86_64でWindow7 64bit 環境を作った。VMのおかげてでいろいろ楽できるな〜。

以下、MacBook AirのTerminalからX forwording使って接続した様子。:) MacOS/Linux/Windowsの共演w

20110311_60558

Screenshot20110311

| | | コメント (0) | トラックバック (0)

2011年2月17日 (木)

shutdown immeidateしない、ほかの理由に遭遇! おまけのおまけ(でた〜最近、よくあるパターンw)

さて、前回のおまけで終了〜。 のつもりだったがリスナー経由の時は問題ないな〜と気づいて気が変わり。おまけのおまけとなりましたw


前回まではBEQで繋いでたな〜、と思ってリスナー経由の専用サーバー接続で同じことを試してみたらshutdown immeidateが待機させられない事に気づいた。

お〜〜〜〜っ。oracleのサーバープロセスがdefunctにならないっつーことは…

ということで、早速試してみた。

※1つめの端末でSQL*Plusを起動してOracleをスタートアップ(なお事前にリスナーは起動済みです)

[oracle@lampeye ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 水 2月 16 23:10:11 2011

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

23:10:11 > conn / as sysdba
接続されました。
23:21:54 SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 1603411968 bytes
Fixed Size 2160112 bytes
Variable Size 436210192 bytes
Database Buffers 1157627904 bytes
Redo Buffers 7413760 bytes
データベースがマウントされました。
データベースがオープンされました。
23:22:04 SYS>

※2つめの端末でSQL*Plusを起動してリスナー経由(この例では専用サーバー接続)でOracleへ接続後、host command(!)でshellへ入っておく。

[oracle@lampeye ˜]$ 
[oracle@lampeye ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 水 2月 16 23:22:45 2011

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

23:22:45 > conn scott/tiger@lampeye
接続されました。
23:22:53 SCOTT> !
[oracle@lampeye ˜]$

※この状態で、プロセスツリーをチェックしてみると…Bequeath Protocol接続の時は、PID=5398の子プロセスとしてOracleのサーバープロセスがforkされていたのに、居ないのよ…

[oracle@lampeye ˜]$ ps -ef | grep gnome-terminal
oracle 4976 1 0 23:08 ? 00:00:01 gnome-terminal
oracle 5440 5031 0 23:23 pts/3 00:00:00 grep gnome-terminal
[oracle@lampeye ˜]$
[oracle@lampeye ˜]$ pstree -p 4976 -ual
gnome-terminal,4976,oracle
├─bash,4982
│ └─sqlplus,5154
│ └─oracle,5376 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
├─bash,5007
│ └─sqlplus,5398
│ └─bash,5413
├─bash,5031
│ └─pstree,5441 -p 4976 -ual
├─bash,5161
├─gnome-pty-helpe,4981
└─{gnome-terminal},4983
[oracle@lampeye ˜]$

※じゃ、どこに行ったのよ…と、調べてみると…リスナー経由だとサーバープロセスの親プロセスはINIT

23:29:17 SYS> select s.username,p.username,p.spid from v$process p join v$session s on p.addr = s.paddr where s.username='SCOTT'

USERNAME USERNAME SPID
------------------------------ --------------- ------------------------
SCOTT oracle 5400

経過: 00:00:00.01
23:29:18 SYS>

[oracle@lampeye ˜]$ ps -f -p 5400
UID PID PPID C STIME TTY TIME CMD
oracle 5400 1 0 23:22 ? 00:00:00 oraclelampeye (LOCAL=NO)
[oracle@lampeye ˜]$

※これならshutdown immeidateは待たされずに実行される!

23:35:22 SYS> 
23:35:22 SYS> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
23:35:33 SYS>

ということは、SQL*PlusからBequeath Protocol接続の場合、host commandでshellへ入ったままにしているとshutdown immeidateが待機させられるのな…


じゃ、sqlnet.ora に BEQUEATH_DETACH=yes を設定すれば回避できそーな気がする
Oracle Database Net Servicesリファレンス 11g リリース1(11.1)- 5.2.1 BEQUEATH_DETACH

早速、検証…

sqlnet.oraにBEQUEATH_DETACH=yesを追記。

[oracle@lampeye ˜]$ 
[oracle@lampeye ˜]$ cat $ORACLE_HOME/network/admin/sqlnet.ora
# sqlnet.ora Network Configuration File: /opt/u01/app/oracle/product/11.1.0/db_1/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
BEQUEATH_DETACH=yes

[oracle@lampeye ˜]$

※1つめの端末でSQL*Plusを起動し、Oracleをstartup…

[oracle@lampeye ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 水 2月 16 23:39:14 2011

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

23:39:14 > conn / as sysdba
アイドル・インスタンスに接続しました。
23:39:17 SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 1603411968 bytes
Fixed Size 2160112 bytes
Variable Size 436210192 bytes
Database Buffers 1157627904 bytes
Redo Buffers 7413760 bytes
データベースがマウントされました。
データベースがオープンされました。
23:39:26 SYS>


※2つめの端末でSQL*Plusを起動、BEQ接続でSCOTTユーザへ接続後、host command(!)でshellへ入っておく…

[oracle@lampeye ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 水 2月 16 23:39:39 2011

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

23:39:39 > conn scott/tiger
接続されました。
23:39:45 SCOTT> !
[oracle@lampeye ˜]$


※この状態でプロセスツリーを見てみると…お〜〜〜、SQL*Plusの子プロセスではなくなっている…

[oracle@lampeye ˜]$ pstree -p 4976 -ual 
gnome-terminal,4976,oracle
├─bash,4982
│ └─sqlplus,5596
├─bash,5007
│ └─sqlplus,5664
│ └─bash,5686
├─bash,5031
│ └─pstree,5711 -p 4976 -ual
├─bash,5161
├─gnome-pty-helpe,4981
└─{gnome-terminal},4983
[oracle@lampeye ˜]$

※じゃ〜、どこの子になっちゃったのか調べてみましょう…

23:41:08 SYS> select s.username,p.username,p.spid from v$process p join v$session s on p.addr = s.paddr where s.username IN ('SYS','SCOTT');

USERNAME USERNAME SPID
------------------------------ --------------- ------------------------
SYS oracle 5685
SCOTT oracle 5666

経過: 00:00:00.03
23:41:40 SYS>

お〜、やはり、SQL*Plusの子じゃなくて、INITの養子となってしまったようですw

[oracle@lampeye ˜]$ ps -f -p 5685 5666
UID PID PPID C STIME TTY STAT TIME CMD
oracle 5666 1 0 23:39 ? Ss 0:00 oraclelampeye (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle 5685 1 0 23:40 ? Ss 0:00 oraclelampeye (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
[oracle@lampeye ˜]$

これなら、shutdown immeidateも待たされないでしょうね :)

23:42:52 SYS> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
23:43:07 SYS>

immeidateしない、ほかの理由に遭遇! ネタはこれで、ほんとにほんとのおしまい :)



shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ

| | | コメント (0) | トラックバック (0)

2011年2月10日 (木)

shutdown immeidateしない、ほかの理由に遭遇! おまけ

前回までで状況も把握できたし、そうなった場合の回避策も見えたのですが、子プロセスの生成とかdefunctなゾンピ君の刈り取りってどーなってんだろーと気になり…

子プロセスの生成状況を以下の順で見てみる…

  1. shellに入っただけ
  2. SQL*Plus起動
  3. SCOTTユーザへ接続
  4. host command(!)でshellへ入る


shellに入っただけ

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ ps -e -u oracle | grep gnome-terminal
3337 ? 00:00:09 gnome-terminal
[oracle@pleco ˜]$
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)
├─bash(3737)───pstree(4063)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)


SQL*Plus起動

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$
[oracle@pleco ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 木 2月 10 14:54:44 2011

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

14:54:44 >

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)───sqlplus(4064)
├─bash(3737)───pstree(4066)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)


SCOTTユーザへ接続

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$
[oracle@pleco ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 木 2月 10 14:54:44 2011

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

14:54:44 > conn scott/tiger
接続されました。
14:54:57 SCOTT>

scottユーザに接続した状態…
このようにSQL*Plusの子プロセスが1つであればshutdown immeidateが待機させられることはないんだけど…ね。
[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)───sqlplus(4064)───oracle(4067)
├─bash(3737)───pstree(4068)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)


host command(!)でshellに入った

[oracle@pleco ˜]$ 
[oracle@pleco ˜]$
[oracle@pleco ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.7.0 - Production on 木 2月 10 14:54:44 2011

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

14:54:44 > conn scott/tiger
接続されました。
14:54:57 SCOTT> !
[oracle@pleco ˜]$

SQL*Plusからホストコマンド(!)でshellに入った状態…
SQL*Plusの子プロセスが複数でoracle以外のがある状態で、他のSQL*Plusからshutdown immediateを実行されちゃうと、以下にあるpid=4067が<defunct>状態のまま刈り取られない。===>Oracleがshutdown immeidateで停止しない。ってことになるのな。
[oracle@pleco ˜]$ 
[oracle@pleco ˜]$ pstree -p 3337 -u
gnome-terminal(3337,oracle)─┬─bash(3377)───sqlplus(4064)─┬─bash(4069)
└─oracle(4067)
├─bash(3737)───pstree(4093)
├─gnome-pty-helpe(3342)
└─{gnome-terminal}(3344)
[oracle@pleco ˜]$
[oracle@pleco ˜]$

じゃ、実験!

以下のようにshutdown immeidateが待機させられている状態を作る。赤字(pid=3627)の子プロセスがdefunctつまりゾンビになるわけね。

shutdown immeidateを実行するSQL*Plusとは別にSQL*Plusを起動し、host command(!)でshellに入っておきます…

16:09:28 > conn scott/tiger
接続されました。
16:12:45 SCOTT> !
[oracle@pleco ˜]$

[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)─┬─bash(3628)
└─oracle(3627)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3672)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)

この状態で、もう一つのSQL*Plusからsysユーザでshutdown immeidateを実行します…shutdown immeidateは待機させられます。
この時、pid=3627の子プロセスはdefunct状態になってますが、刈り取られていません。この影響でshutdown immediateが待機させられています。
SQL*Plusからshellに入っていない場合、つまり、SQL*Plusのプロセス(pid=3493)の子プロセスが1つしかない場合は、shutdown immeidateが待機させられることはない…この辺りに問題がありそうな気がします…

16:12:59 SYS> 
16:12:59 SYS>
16:13:00 SYS> shutdown immediate

[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)─┬─bash(3628)
└─oracle(3627)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3672)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)

試しに親プロセスであるSQL*Plus(pid=3493)にSIGCHLDシグナルを送ってみましょう。
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ kill -SIGCHLD 3493
・・・・以下略w・・・・

ん〜〜〜〜〜。ゾンビを刈り取ってくれません><

試しにshellからexitしてみます…

16:09:28 > conn scott/tiger
接続されました。
16:12:45 SCOTT> !
[oracle@pleco ˜]$ exit
exit

16:18:24 SCOTT>
[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)───oracle(3627)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3673)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)

shellからはexitしました。SQL*Plus(pid=3493)の子プロセスがoracleだけ(pid=3627)のゾンビだけになりました。oracleのゾンビ(pid=3627)が残っているうちはshutdown immeidateは待機させられたままです! 

では、もう一回、親プロセスであるSQL*PlusにSIGCHLDシグナルを送ってみましょう! 今度はうまく行きそうな気がします!

[oracle@pleco ˜]$ kill -SIGCHLD 3493
[oracle@pleco ˜]$ pstree -p 3372 -u
gnome-terminal(3372,oracle)─┬─bash(3378)───sqlplus(3493)
├─bash(3403)───sqlplus(3427)───oracle(3599)
├─bash(3520)───pstree(3675)
├─gnome-pty-helpe(3377)
└─{gnome-terminal}(3379)
[oracle@pleco ˜]$

やった〜〜〜〜〜〜 :) SQL*Plus(pid=3493)の子プロセス(pid=3627)のゾンビが見事に刈り取られました!

その瞬間……待機させられていたshutdown immeidateは見事終了!!!!

16:12:59 SYS> 
16:12:59 SYS>
16:13:00 SYS> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
16:18:42 SYS>


shutdown immeidateしない、ほかの理由に遭遇! ネタはこれにて :)




shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ

| | | コメント (0) | トラックバック (0)

2011年2月 9日 (水)

shutdown immeidateしない、ほかの理由に遭遇! #3

もう一つ検証し忘れてた!。

この現象に気づいたとき、SQL*Plusから接続していたユーザがsysユーザや、systemユーザだけだったので、それ以外のユーザで接続している場合は大丈夫なんじゃね?都市伝説の検証…

これまでと同様に2つのSQL*Plusを起動しておきます。

1つめのSQL*Plusでは、sysユーザに接続しておきます…

[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 07:26:10 2011

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

07:26:10 > conn / as sysdba
接続されました。


2つめのSQL*Plusでは、scottユーザ(sysユーザ、systemユーザ以外の一般ユーザ)に接続し、host command(!)でshellに入ったままにしておきます…

[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 07:26:23 2011

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

07:26:23 > conn scott/tiger
接続されました。
07:26:29 SCOTT> !
[oracle@leaffish ˜]$


では、sysユーザでshutdown immeidateを実行してみます…

07:26:10 > conn / as sysdba
接続されました。
07:26:16 SYS>
07:26:16 SYS>
07:26:17 SYS> shutdown immediate

お〜〜〜、shutdown immeidateが待機させられています。

「SQL*Plusから接続していたユーザがsysユーザや、systemユーザだけだったので、それ以外のユーザで接続している場合は大丈夫なんじゃね?都市伝説」は都市伝説
Oracleへ接続するユーザに関係なく、SQL*Plusからhost command(!)でshellに入ったままのセッションがある状態で他のセッションからshutdown immeidateを実行した場合、shutdown immeidateは、shutdown timeoutせずにshutdownを待機し続けるのは事実。

まとめると…

現象:

  • shutdown immeidate文を実行したがshutdown timeout(1時間)も発生せずshutdownが待機させれれたままになり停止できない。


発生条件(Updated 16-Feb-2011):

  • Linux/Unix系のOracle11g R2 11.2.0.1.0 (ちなみにそれ以外のリリースでは11.1.0.7.0で同様の現象を確認しています、他のリリースでは未検証。)
  • shutdown immeidateを発行するセッション以外に、SQL*Plusからhost command(! はたま host)でshellに入ったままになっているセッションがある場合。かつ、Bequeath ProtocolでOracleへ接続している。


確認ポイント:

  • アラートログに "SHUTDOWN: Active processes prevent shutdown operation"が繰り返される。
  • ps -ef | grep ora などでプロセスをみると <defunct>な子プロセスがあり、親プロセスがSQL*Plusである。
  • ls -lrt で最後にリストされるトレースファイル(shutdownを実行しているプロセスのトレースファイル)に"ksukia: Attempt <連番?> to re-kill process OS PID=<pid>"のメッセージが繰り返し出力され続ける


対処(Updated 16-Feb-2011):

  • shutdown aboartするしかない。<defunct>なプロセスの親であるSQL*Plusのプロセスをkill -SIGTERMとか-SIGKILLで終了させる。それでもshutdownが待機しているようなら、最後の手段、shutdown abortということで。
    SQL*Plus起動してる人が連絡取れる場所にいるのならその方にexitしてもらうのもありw
  • その他の方法として、sqlnet.oraに、BEQUEATH_DETACH=yes を設定して、サーバープロセスをSQL*Plusの子ではなく、INITの子になってもらう(これがおすすめかも)


現象と回避方法を確認したリリース(Updated 16-Feb-2011):

  • Oracle11g R1 11.1.0.7.0 for Linux (32bit/64bit)
  • Oracle11g R1 11.1.0.7.0 for HP-UX(itanium)
  • Oracle11g R2 11.2.0.1.0 for Linux (32bit/64bit)
  • Oracle11g R2 11.2.0.1.0 for Solaris x86-64

KROWNっぽいまとめ方にしてみました :) (他のUnix系リリースでも作りはおなじでしょうね)

でもさあ、SQL*Plusからホストコマンド、使うんだよね結構。shellに入って、SQL*Plusから入っていたこと忘れて、また、SQL*Plus起動しちゃって…さらにshellに入って…以下繰り返しw。 注意しましょうね。→ 自分。




shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ

| | | コメント (0) | トラックバック (0)

shutdown immeidateしない、ほかの理由に遭遇! #2

さて、昨日のつづきです。

Oracle11g R2 11.2.0.1.0 for Linux x86 をVirtualBox4.0 for MacOS XのCentOS5.5にインストールしてあります。

昨日は、SQL*Plusの!(host command)でshellへ入っている状態、かつ、別端末のSQL*plusからshutdown immeidate文を発行してしまうとSQL*Plusのプロセスの子プロセスに<defunct>なプロセスが登場して、shutdown immeidateを待機させてしまうところまでを再現してみました。

今日は、shutdown immediate文を発行するsysユーザ以外のsysユーザがSQL*Plusから接続しているだけでもshutdown immediateを待機させるんじゃないか?疑惑の確認と、shutdown immeidateの待機させるだけじゃなく、shutdown timeoutも抑止しちゃってるよね疑惑などを検鏡検証してみようと思います。

短期遠征先から帰宅している予定だったのによそーーーーー外の1日延泊となってしまった次いでに、VirtuslBox4.0のCentOS5.5のOracle11g R2でたっぷり検証してみましょうw

では、最初に、shutdown immeidateを実行するsysユーザ以外のsysユーザがSQL*Plusから接続しているだけでも実行に他の端末のSQL*Plusでsysユーザが接続しているだけでもshutdown immeidateを待機させるんじゃないか?疑惑するんじゃね?疑惑の検証から。

まず、SQL*Plusでsysユーザに接続している端末を2つ用意して…

一つめのSQL*Plusで〜す。

[oracle@leaffish ˜]$ 
[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 00:09:00 2011

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

00:09:00 > conn / as sysdba
接続されました。
00:09:11 SYS>
00:09:12 SYS>
00:09:12 SYS>

2つめのSQL*Plusで〜す。

[oracle@leaffish ˜]$ 
[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 00:08:39 2011

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

00:08:39 > conn / as sysdba
接続されました。
00:08:44 SYS>
00:08:45 SYS>
00:08:45 SYS>

この状態で1つめのSQL*Plusのsysユーザでshutdown immeidate文を実行します…

00:22:43 SYS> 
00:22:43 SYS> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
00:22:57 SYS>

待機させられることなく、shutdown immeidate文が実行されました。Oracle11g R2 11.2.0.1.0 for Linuxでは”疑惑”だけだったようですね。一安心w。他のバージョンだとどうなんだろ=>TODO.
(昨日の記事では、systemユーザがSQL*Plusで接続している場合、他の端末のSQL*Plusのsysユーザがshutdown immeidateを実行した場合の検証もしていましたよね。これでshutdown immeidate文を実行するセッション以外にsysユーザやsystemユーザのセッションが存在していてもshutdown immeidateが待機させられることは、すくなくともOracle11g R2 11.2.0.1.0 for Linuxでは発生しないことは確かなようです。)


つづいて、SQL*Plusのhost command(!)からshellへ入ったままのセッションが存在している状態でshutdown immeidate文を別セッションから実行してしまうとshutdown immediateを待機させるだけでなく、shutdown timeoutも妨害してしまい1時間を経過してもハングしたままじゃね疑惑を検証してみたいと思います。

同じように2つのSQL*Plusを起動し、ともにsysユーザで接続して、一方のセッションではhost command (!)でshellへ入ったままにしておきます。

1つめのSQL*Plusです…

[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 00:36:01 2011

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

00:36:01 > conn / as sysdba
接続されました。
00:36:04 SYS>
00:36:04 SYS>

2つめのSQL*Plusです〜、こちらはhost commandでshellへ入っておきます。

[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 水 2月 9 00:35:51 2011

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

00:35:51 > conn / as sysdba
接続されました。
00:35:54 SYS>
00:35:56 SYS> !
[oracle@leaffish ˜]$
[oracle@leaffish ˜]$

この状態で1つめのSQL*Plusのセッションからshutdown immeidate文を実行してみます…

00:39:34 SYS> 
00:39:34 SYS> shutdown immediate

見事にshutdown immeidateは待機させられます。すばらし〜。
このまま放置してみます。Oracle10g以降の機能であるshutdown timeoutが働いて1時間程度でshutdownはキャンセルされるはずです。しばしの間、ご歓談くださいませ。:)

・・・・・・・・・中略・・・・・・・・・・・

ながらくお待たせいたしました〜、shutdown immeidateを実行してから2時間以上経過しましたが、shutdown timeoutでshutdownがキャンセルされるどころか、止まる気配すらありません…

以下、アラートログの内容です。

Wed Feb 09 00:39:41 2011
Shutting down instance (immediate)
Stopping background process SMCO
Shutting down instance: further logons disabled
Stopping background process QMNC
Stopping background process MMNL
Stopping background process MMON
License high water mark = 2
All dispatchers and shared servers shutdown
Wed Feb 09 00:44:51 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 00:50:05 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 00:55:20 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 01:00:36 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 01:05:48 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 01:10:57 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 01:16:12 2011
SHUTDOWN: Active processes prevent shutdown operation

・・・中略・・・

Wed Feb 09 02:28:17 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 02:33:21 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 02:38:25 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 02:43:28 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 02:48:32 2011
SHUTDOWN: Active processes prevent shutdown operation
Wed Feb 09 02:53:38 2011
SHUTDOWN: Active processes prevent shutdown operation


ということで、「shutdown immeidateを待機させるだけじゃなく、shutdown timeoutも抑止しちゃってるよね!疑惑」は、疑惑じゃなくて真実。


次回へつづく。



shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ

| | | コメント (0) | トラックバック (0)

2011年2月 8日 (火)

shutdown immeidateしない、ほかの理由に遭遇!

別途検証して別エントリにする予定だけど(遠征先で時間ないので…)、この状態でshutdown immeidateが待機するとshutdown timeoutしないというのも特徴みたい…

Oracleのバージョンは11g R2 11.2.0.1.0 for Linux (32bit)だけどUnix/Linux系なら発生するよ、きっと。

そういえば、以前こんなエントリ書いてましたっけ「shutdown timeout

では、早速再現テスト。

まず、SQL*Plusを起動、SYSユーザに接続してOracleインスタンスを起動します…

[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 火 2月 8 00:46:11 2011

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

00:46:11 > conn / as sysdba
アイドル・インスタンスに接続しました。
00:46:16 SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 422670336 bytes
Fixed Size 1336960 bytes
Variable Size 373295488 bytes
Database Buffers 41943040 bytes
Redo Buffers 6094848 bytes
データベースがマウントされました。
データベースがオープンされました。
00:47:17 SYS>


別端末でSQL*Plusを起動してSYSTEMユーザまたはSYSユーザに接続.
(別途詳しく検証する予定だけど、今のところSYSTEM/SYSユーザ以外では発生してないので)

[oracle@leaffish ˜]$ 
[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 火 2月 8 00:50:18 2011

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

00:50:18 > conn system
パスワードを入力してください:
接続されました。
00:50:23 SYSTEM>


次にOracleを起動したSQL*PlusのSYSユーザでshutdown immeidateを発行する…

00:51:22 SYS> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
00:51:34 SYS>


この状態だとOracleインスタンスは正常にshutdown immeidateで停止できる。あたりまえだけど。

では、再現テストですよん。

では次のパターンはどうか?

前述した手順と同じく、SYSで接続してOracleインスタンスを起動する…

[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 火 2月 8 00:54:47 2011

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

00:54:47 > conn / as sysdba
アイドル・インスタンスに接続しました。
00:54:52 SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 422670336 bytes
Fixed Size 1336960 bytes
Variable Size 373295488 bytes
Database Buffers 41943040 bytes
Redo Buffers 6094848 bytes
データベースがマウントされました。
データベースがオープンされました。
00:55:46 SYS>


前述した手順と同様に、別端末でSQL*Plusを起動し、SYSTEMユーザ(SYSユーザでもいいよ)へ接続する。
さらに、! (SQL*Plusのhost command)でshellに入っておく…。ここがポイント

[oracle@leaffish ˜]$ 
[oracle@leaffish ˜]$
[oracle@leaffish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 火 2月 8 01:01:42 2011

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

01:01:42 > conn system
パスワードを入力してください:
接続されました。
01:01:47 SYSTEM> !
[oracle@leaffish ˜]$


shutdow immeidateの待機を再現させますよー、Oracleインスタンスを起動したSQL*PlusのSYSユーザでshutdown immeidate文を発行する…

01:03:04 SYS> 
01:03:05 SYS> shutdown immediate


いつまでたってもOracleインスタンスは停止しない。この例では載せていないがマニュアルに記載されているshutdown timeoutも1時間たっても2時間たっても発生しないようだ…(別途検証予定)


アラートログを確認してみると…5分毎に、”SHUTDOWN: Active processes prevent shutdown operation”というログを出力し続けてる…

Tue Feb 08 01:03:07 2011
Shutting down instance (immediate)
Shutting down instance: further logons disabled
Stopping background process QMNC
Stopping background process MMNL
Stopping background process MMON
License high water mark = 2
All dispatchers and shared servers shutdown
Tue Feb 08 01:08:17 2011
SHUTDOWN: Active processes prevent shutdown operation
Tue Feb 08 01:13:24 2011
SHUTDOWN: Active processes prevent shutdown operation
Tue Feb 08 01:18:31 2011
SHUTDOWN: Active processes prevent shutdown operation
Tue Feb 08 01:23:37 2011
SHUTDOWN: Active processes prevent shutdown operation
Tue Feb 08 01:28:43 2011
SHUTDOWN: Active processes prevent shutdown operation


プロセスのトレースファイルで最新のものでファイルサイズが増えつつけているものがある…
tailでのぞいてみると…

PID=3542のOSプロセスをkillできずにループしているように見える…

[oracle@leaffish trace]$ ll -lrt

・・・中略・・・

-rw-r----- 1 oracle oinstall 61 2月 8 01:00 discus_mman_3483.trm
-rw-r----- 1 oracle oinstall 863 2月 8 01:00 discus_mman_3483.trc
-rw-r----- 1 oracle oinstall 61 2月 8 01:00 discus_dbrm_3477.trm
-rw-r----- 1 oracle oinstall 904 2月 8 01:00 discus_dbrm_3477.trc
-rw-r----- 1 oracle oinstall 45 2月 8 01:01 discus_ora_3539.trm
-rw-r----- 1 oracle oinstall 669 2月 8 01:01 discus_ora_3539.trc
-rw-r----- 1 oracle oinstall 235323 2月 8 01:08 alert_discus.log
-rw-r----- 1 oracle oinstall 6420 2月 8 01:12 discus_ora_3513.trm
-rw-r----- 1 oracle oinstall 60565 2月 8 01:12 discus_ora_3513.trc
[oracle@leaffish trace]$
[oracle@leaffish trace]$ tail -f discus_ora_3513.trc
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:15.641
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:16.663
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:17.678
ksukia: Starting kill, flags = 1
ksukia: Attempt 119 to re-kill process OS PID=3542.
ksukia: killed 1 out of 1 processes.

*** 2011-02-08 01:13:18.699
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:19.709
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:20.735
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:21.750
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:22.756
ksukia: Starting kill, flags = 1
ksukia: Attempt 120 to re-kill process OS PID=3542.
ksukia: killed 1 out of 1 processes.

*** 2011-02-08 01:13:23.779
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:24.790
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

*** 2011-02-08 01:13:25.821
ksukia: Starting kill, flags = 1
ksukia: killed 0 out of 1 processes.

[oracle@leaffish trace]$

killできないと繰り返しログに吐かれているプロセス PID=3542とは何者?…
psとpstreeコマンドでみてみると…

SQL*Plusの!(host command)でshellに入る生成されるプロセスらしい…、このプロセスSYSTEMユーザやSYSユーザ以外接続している場合はなぜか今のところ生成されいないように見える…

この<defunct>なプロセスは何屋さん? shutdown immediateをimmediateじゃない状態にするのは大量のundoデータだけじゃないのね〜><

それもSQL*Plusの!(host command)は便利なので、私も多用していまして、ついつい、SQL*Plusに接続して、!でshellに入って、SQL*Plusから入ったのを忘れてさらに、SQL*Plus起動して、!でshellに入って…なんてことやってしまうことは多々あります。><

これが原因で、shutdown immeidateが待機させられるなんて〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜><。

[oracle@leaffish ˜]$ ps -ef | grep 3542
oracle 3542 3541 0 01:01 ? 00:00:00 [oracle] <defunct>
oracle 3785 3056 0 01:24 pts/5 00:00:00 grep 3542
[oracle@leaffish ˜]$
[oracle@leaffish ˜]$ pstree -up oracle

・・・中略・・・

gnome-terminal(2806)─┬─bash(2812)───sqlplus(3398)───oracle(3513)
├─bash(2909)───tail(3055)
├─bash(2937)
├─bash(3031)───sqlplus(3541)─┬─bash(3543)
│ └─oracle(3542)
├─bash(3056)───pstree(3772)
├─gnome-pty-helpe(2811)
└─{gnome-terminal}(2813)

・・・以下略・・・


もう少し検証してみましょう! 

shellからだけexitしてみるも……Oracleはまだ停止しない…

01:01:42 > conn system
パスワードを入力してください:
接続されました。
01:01:47 SYSTEM> !
[oracle@leaffish ˜]$ exit
exit

01:30:56 SYSTEM>


じゃ、SQL*Plusからもexitしよう

01:01:42 > conn system
パスワードを入力してください:
接続されました。
01:01:47 SYSTEM> !
[oracle@leaffish ˜]$ exit
exit

01:30:56 SYSTEM> exit
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
[oracle@leaffish ˜]$


次の瞬間……

データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
01:32:10 SYS>

なんだと〜〜〜〜〜〜〜〜。いつからこーなんだー。 怖くてSQL*Plusから!(host command)でshellに入れないじゃないか〜〜〜><


次回へつづく。



shutdown immeidateしない、ほかの理由に遭遇!
shutdown immeidateしない、ほかの理由に遭遇! #2
shutdown immeidateしない、ほかの理由に遭遇! #3
shutdown immeidateしない、ほかの理由に遭遇! おまけ

| | | コメント (0) | トラックバック (0)

2011年1月30日 (日)

CentOS5.5のVirtualBox4.0のWindowsXP ProfessionalのVirtualPC2007のWindowsXPのIE7(長過ぎw)

うちの奥さんがIE7以上の動作確認などもしたいということだったので、タイミングよく公開されたInternet Explorer Application Compatibility VPC ImageのXP向けIE7とVirtualPCを使ってIE7のテスト環境を作ってみた。

CentOS5.5(HostOS)のVirtualBox4.0のWindowsXP Professional(GuestOS)のVirtualPC2007に前述のWindowsXP+IE7(英語版+日本語フォント)の環境になっとります。これで奥さん用IE7確認環境のできあがり。

フォント追加がめんどくさいので日本語フォントを含んだのもあるといいんですけどね〜 :)

Version1

| | | コメント (0) | トラックバック (0)

2011年1月 9日 (日)

CentOS5.5のVirtualBoxも4.0にアップデートした

MacOS X版VirtualBoxにつづき、CentOS5.5のVirtualBoxも3.2から4.0にアップデートした。

ついでなので、CentOS5.5のVirtualBoxのSolaris10をMacOS XのTerminalからX11 forwadingを使ってMac側で起動してみた。(どんな次いでだw)

まず最初はCentOSのVirtualBoxを3.2から4.0へアップデート。MacOS Xの場合特に気にすることもないのだが、Linuxの場合、3.2がインストールされたままだと4.0でアップデートできないので、一旦、VirtualBox 3.2はアンインストールする必要がある。アンインストールがうまくいったら4.0をインストールがうまくいく。(新規で4.0をインストールする場合は気にする必要ないですよ…)

ちなみに、うちのは64bit版です ;)

[root@lampeye Desktop]# cat /etc/redhat-release
CentOS release 5.5 (Final)
[root@lampeye Desktop]#
[root@lampeye Desktop]# uname -r
2.6.18-194.26.1.el5
[root@lampeye Desktop]#
[root@lampeye Desktop]# rpm -e VirtualBox-3.2-3.2.12_68302_rhel5-1.x86_64
[root@lampeye Desktop]# rpm -ivh VirtualBox-4.0-4.0.0_69151_rhel5-1.x86_64.rpm
警告: VirtualBox-4.0-4.0.0_69151_rhel5-1.x86_64.rpm: ヘッダ V4 DSA signature: NOKEY, key ID 98ab5139
準備中... ########################################### [100%]
1:VirtualBox-4.0 ########################################### [100%]

Creating group 'vboxusers'. VM users must be member of that group!

No precompiled module for this kernel found -- trying to build one. Messages
emitted during module compilation will be logged to /var/log/vbox-install.log.

Stopping VirtualBox kernel modules [ OK ]
Uninstalling old VirtualBox DKMS kernel modules [ OK ]
Trying to register the VirtualBox kernel modules using DKMS [失敗]
(Failed, trying without DKMS)
Recompiling VirtualBox kernel modules [ OK ]
Starting VirtualBox kernel modules [ OK ]


[root@lampeye Desktop]#

ちゃんとやっとこうかな〜と思って、やり直しておいた(2011/1/10更新)

[root@lampeye Desktop]# cat /etc/redhat-release
CentOS release 5.5 (Final)
[root@lampeye Desktop]#
[root@lampeye Desktop]# uname -r
2.6.18-194.26.1.el5
[root@lampeye Desktop]#
[root@lampeye Desktop]# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
[root@lampeye Desktop]# rpm --import oracle_vbox.asc
[root@lampeye Desktop]# rpm --checksig VirtualBox-4.0-4.0.0_69151_rhel5-1.x86_64.rpm
VirtualBox-4.0-4.0.0_69151_rhel5-1.x86_64.rpm: (sha1) dsa sha1 md5 gpg OK
[root@lampeye Desktop]# rpm -e VirtualBox-3.2-3.2.12_68302_rhel5-1.x86_64
[root@lampeye Desktop]# rpm -ivh VirtualBox-4.0-4.0.0_69151_rhel5-1.x86_64.rpm
準備中... ########################################### [100%]
1:VirtualBox-4.0 ########################################### [100%]

Creating group 'vboxusers'. VM users must be member of that group!

No precompiled module for this kernel found -- trying to build one. Messages
emitted during module compilation will be logged to /var/log/vbox-install.log.

Stopping VirtualBox kernel modules [ OK ]
Uninstalling old VirtualBox DKMS kernel modules [ OK ]
Trying to register the VirtualBox kernel modules using DKMS [失敗]
(Failed, trying without DKMS)
Recompiling VirtualBox kernel modules [ OK ]
Starting VirtualBox kernel modules [ OK ]
[root@lampeye Desktop]#

これで3.2から4.0へ移行は完了! :)

では本題、MacOS XのTerminalからX11 forwordingを使ってCentOS5.5のVirtualBox4.0を起動し、GuestOSとしてSolaris10を起動してみます。(なお、このVM、以前、MacOS XのVirtualBox3.2で作成したものをCentOS5.5にコピーというか移動したもの…)

discus:˜ discus$
discus:˜ discus$
discus:˜ discus$ ssh -Y discus@lampeye
discus@lampeye's password:
Warning: No xauth data; using fake authentication data for X11 forwarding.
Last login: Sun Jan 9 11:19:09 2011 from 192.168.1.30
[discus@lampeye ˜]$
[discus@lampeye ˜]$ VirtualBox &
[1] 4796
[discus@lampeye ˜]$

20110109_112433

20110109_112116


20110109_112218

うまくいくもんですね〜 :)




VirtualBox 4.0にアップデートした

| | | コメント (0) | トラックバック (0)

2011年1月 6日 (木)

VirtualBox 4.0にアップデートした

VirtualBox4.0にアップデートしてみたMacOS Xのだけだけど。あとでLinuxのもやるよー

20110106_233143

20110106_233148

| | | コメント (0) | トラックバック (0)

VirtualBox de Oracle11g R2 RAC #23

VirtualBox de Oracle11g R2 RACのつづき。

さて、いよいよVirtualBox de Oracle11g R2 RACの最終回。簡単なTAFのテスト!

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

簡単なTransparent Application Failover (TAF)の確認

MacOS X Snow LeopardにあるOracle Instant Client 10g R2 for MacOS Xのtnsnames.oraを編集し以下の定義を追加しておきました!

ORCLTAF =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus-rac64-scan.macdeoracle.jp)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)

TAF定義の接続識別子で接続します。

discus:˜ oracle$ 
discus:˜ oracle$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on 木 1月 6 04:47:16 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

> conn scott/tiger@orcltaf
接続されました。
SCOTT>
SCOTT>
SCOTT> select count(*) from user_objects;

COUNT(*)
----------
0


orcl1インスタンスで、sysユーザで接続し、セッションの状態を確認してみます。

[oracle@discus164 ˜]$ 
[oracle@discus164 ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 木 1月 6 04:48:42 2011

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

SYS>
SYS>
SYS> conn / as sysdba
接続されました。
SYS>
SYS> select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11 sess.username = 'SCOTT'
12 /

INSTANCE_NAME USERNAME FAILOVER_TYPE FAILOVER_M FAI
---------------- ------------------------------ ------------- ---------- ---
orcl1 SCOTT SELECT BASIC NO

SYS>


SCOTTはorcl1インスタンスに接続されクエリが実行されたようですね!
failoverさせるため、orcl1インスタンスをabortで強制停止してみます。

SYS> !srvctl status database -d orcl
インスタンスorcl1はノードdiscus164で実行中です。
インスタンスorcl2はノードdiscus264で実行中です。

SYS> !srvctl stop instance -d orcl -i orcl1 -o abort
SYS>
SYS> !srvctl status database -d orcl
インスタンスorcl1はノードdiscus164で実行されていません。
インスタンスorcl2はノードdiscus264で実行中です。

SYS>
SYS> l
1 select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11* sess.username = 'SCOTT'
SYS> /
select
*
行1でエラーが発生しました。:
ORA-03135: 接続が失われました
プロセスID: 5563
セッションID: 13、シリアル番号: 25


おっと〜、sysユーザでorcl1インスタンスに接続していたのでした〜。exitしちゃいます。


SCOTTユーザで、failoverさせるためクエリを再実行します。

SCOTT> r
1* select count(*) from user_objects

COUNT(*)
----------
0

SCOTT>


インスタンス:orcl2へ接続し直し確認。お〜うまくいけてますね!
orcl1のセッションだったscottユーザのセッションがfailoverしorcl2のセッションになっています。また今回設定したTAFのモードではクエリはエラーにはならず、生存インスタンスへ透過的にfailoverされます。

[oracle@discus264 ˜]$ 
[oracle@discus264 ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 木 1月 6 04:55:48 2011

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

> conn / as sysdba
接続されました。
SYS> select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11 sess.username = 'SCOTT'
12 /


INSTANCE_NAME USERNAME FAILOVER_TYPE FAILOVER_M FAI
---------------- ------------------------------ ------------- ---------- ---
orcl2 SCOTT SELECT BASIC YES

SYS>


ちなみにcrsctl status resource -tで確認すると

・・・中略・・・
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 OFFLINE OFFLINE Instance Shutdown
2 ONLINE ONLINE discus264 Open
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164
[grid@discus164 ˜]$

となっています。今回のようにデータベースインスタンスだけを停止した場合はこんな状態になるんですね。:)


ついでなので更新トランザクションも試してみましょうかね。
停止したデータベースインスタンスを起動し、scottユーザでupdate文を実行します。

discus:˜ oracle$ 
discus:˜ oracle$ sqlplus scott/tiger@orcltaf

SQL*Plus: Release 10.2.0.4.0 - Production on 木 1月 6 05:20:27 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP
and Data Mining options
に接続されました。
SCOTT>
SCOTT>
SCOTT> insert into hoge values('abc');

1行が作成されました。

SCOTT>


orcl2インスタンスにsysユーザで接続して状態を確認してみます。
scottユーザはorcl1インスタンスに接続してinsert文を実行したようですね。まだ、failoverしていません。

SYS> 
SYS> l
1 select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11* sess.username = 'SCOTT'
SYS> /

INSTANCE_NAME USERNAME FAILOVER_TYPE FAILOVER_M FAI
---------------- ------------------------------ ------------- ---------- ---
orcl1 SCOTT SELECT BASIC NO


では、先ほどと同じようにorcl1インスタンスを強制停止してみます

SYS> !srvctl stop instance -d orcl -i orcl1 -o abort

SYS>
SYS> !srvctl status database -d orcl
インスタンスorcl1はノードdiscus164で実行されていません。
インスタンスorcl2はノードdiscus264で実行中です。


scottユーザで再度insert文を実行してみました。TAF特有のエラーメッセージが返されましたね。

SCOTT> r
1* insert into hoge values('abc')
insert into hoge values('abc')
*
行1でエラーが発生しました。:
ORA-25402: トランザクションをロールバックしてください。


セッションの状態を確認してみると…セッションはfailoverしています!

SYS> r
1 select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11* sess.username = 'SCOTT'

INSTANCE_NAME USERNAME FAILOVER_TYPE FAILOVER_M FAI
---------------- ------------------------------ ------------- ---------- ---
orcl2 SCOTT SELECT BASIC YES


scottユーザのトランザクションをロールバック後、リトライしてみると…

SCOTT> 
SCOTT> rollback;

ロールバックが完了しました。

SCOTT> insert into hoge values('abc');

1行が作成されました。

SCOTT>
SCOTT>

うまくいきましたね :)


ということで、VirtualBox de Oracle11g R2 RAC for Linux x86_64環境のできあがり〜。(完)






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17
VirtualBox de Oracle11g R2 RAC #18
VirtualBox de Oracle11g R2 RAC #19
VirtualBox de Oracle11g R2 RAC #20
VirtualBox de Oracle11g R2 RAC #21
VirtualBox de Oracle11g R2 RAC #22




VirtualBox de Oracle11g R2 RAC #16 - 番外編

| | | コメント (0) | トラックバック (0)

2011年1月 5日 (水)

VirtualBox de Oracle11g R2 RAC #22

VirtualBox de Oracle11g R2 RACのつづき。

ラス前です :) cluster databaseの起動停止確認。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Clusterの開始と停止の確認

Grid Infrastructureは自動起動にしてますが、手動起動、停止を確認しておきます。

rootユーザにてcrsctlコマンドでclusterを起動します。データベースインスタンスはOracle所有者でsrvctlコマンドを利用して起動してみます。
(ちなみに、rootユーザには、grid infrastructureのHOMEのbinへパスを通してあります。)

[root@discus164 ˜]# 
[root@discus164 ˜]# crsctl check cluster -all
**************************************************************
discus164:
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
CRS-4534: Cannot communicate with Event Manager
**************************************************************
discus264:
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
CRS-4534: Cannot communicate with Event Manager
**************************************************************
[root@discus164 ˜]#
[root@discus164 ˜]# crsctl start cluster -all
CRS-2672: 'ora.cssdmonitor'('discus164')の起動を試行しています
CRS-2672: 'ora.cssdmonitor'('discus264')の起動を試行しています
CRS-2676: 'ora.cssdmonitor'('discus264')の起動が成功しました
CRS-2676: 'ora.cssdmonitor'('discus164')の起動が成功しました
CRS-2672: 'ora.cssd'('discus164')の起動を試行しています
CRS-2672: 'ora.cssd'('discus264')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus264')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus164')の起動を試行しています
CRS-2676: 'ora.diskmon'('discus264')の起動が成功しました
CRS-2676: 'ora.diskmon'('discus164')の起動が成功しました
CRS-2676: 'ora.cssd'('discus164')の起動が成功しました
CRS-2676: 'ora.cssd'('discus264')の起動が成功しました
CRS-2672: 'ora.ctssd'('discus164')の起動を試行しています
CRS-2672: 'ora.ctssd'('discus264')の起動を試行しています
CRS-2676: 'ora.ctssd'('discus164')の起動が成功しました
CRS-2672: 'ora.evmd'('discus164')の起動を試行しています
CRS-2676: 'ora.ctssd'('discus264')の起動が成功しました
CRS-2672: 'ora.evmd'('discus264')の起動を試行しています
CRS-2672: 'ora.asm'('discus164')の起動を試行しています
CRS-2672: 'ora.asm'('discus264')の起動を試行しています
CRS-2676: 'ora.evmd'('discus264')の起動が成功しました
CRS-2676: 'ora.evmd'('discus164')の起動が成功しました
CRS-2676: 'ora.asm'('discus164')の起動が成功しました
CRS-2672: 'ora.crsd'('discus164')の起動を試行しています
CRS-2676: 'ora.asm'('discus264')の起動が成功しました
CRS-2672: 'ora.crsd'('discus264')の起動を試行しています
CRS-2676: 'ora.crsd'('discus164')の起動が成功しました
CRS-2676: 'ora.crsd'('discus264')の起動が成功しました
[root@discus164 ˜]#
[root@discus164 ˜]# crsctl check cluster -all
**************************************************************

discus164:
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
discus264:
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
[root@discus164 ˜]#
[root@discus164 ˜]# crsctl status resource -w 'TYPE co ora' -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.DATA.dg
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.FRA.dg
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.LISTENER.lsnr
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.asm
ONLINE ONLINE discus164 Started
ONLINE ONLINE discus264 Started
ora.eons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.gsd
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.net1.network
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.ons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.registry.acfs
ONLINE ONLINE discus164
ONLINE ONLINE discus264
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 OFFLINE OFFLINE
2 OFFLINE OFFLINE
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164
[root@discus164 ˜]#

データベースインスタンスを起動します。

[root@discus164 ˜]# su - oracle
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl start database -d orcl
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status database -d orcl
インスタンスorcl1はノードdiscus164で実行中です。
インスタンスorcl2はノードdiscus264で実行中です。
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ exit
logout

[root@discus164 ˜]#
[root@discus164 ˜]# crsctl status resource ora.orcl.db
NAME=ora.orcl.db
TYPE=ora.database.type
TARGET=ONLINE , ONLINE
STATE=ONLINE on discus164, ONLINE on discus264

[root@discus164 ˜]#

起動しましたね :)

最後に、データベースインスタンスは起動したままの状態で、clusterを停止/起動し、再び、データベースインスタンスが起動した状態になるかを確認しておきます。
Oracle Restartってんでしたっけ? この機能。

まず、データベースインスタンスは起動したまま、Grid Infrastructureを停止(全ノードを停止)します。

[root@discus164 ˜]# crsctl stop cluster -all
CRS-2673: 'ora.crsd'('discus164')の停止を試行しています
CRS-2673: 'ora.crsd'('discus264')の停止を試行しています
CRS-2790: 'discus264'上にある、Cluster Ready Services管理下のリソースのシャットダウンを開始しています
CRS-2673: 'ora.LISTENER.lsnr'('discus264')の停止を試行しています
CRS-2790: 'discus164'上にある、Cluster Ready Services管理下のリソースのシャットダウンを開始しています
CRS-2673: 'ora.LISTENER.lsnr'('discus164')の停止を試行しています
CRS-2673: 'ora.LISTENER_SCAN2.lsnr'('discus164')の停止を試行しています
CRS-2673: 'ora.LISTENER_SCAN3.lsnr'('discus164')の停止を試行しています
CRS-2673: 'ora.CRS.dg'('discus164')の停止を試行しています
CRS-2673: 'ora.LISTENER_SCAN1.lsnr'('discus264')の停止を試行しています
CRS-2673: 'ora.orcl.db'('discus164')の停止を試行しています
CRS-2673: 'ora.CRS.dg'('discus264')の停止を試行しています
CRS-2673: 'ora.orcl.db'('discus264')の停止を試行しています
CRS-2673: 'ora.registry.acfs'('discus264')の停止を試行しています
CRS-2673: 'ora.registry.acfs'('discus164')の停止を試行しています
CRS-2677: 'ora.LISTENER.lsnr'('discus264')の停止が成功しました
CRS-2673: 'ora.discus264.vip'('discus264')の停止を試行しています
CRS-2677: 'ora.LISTENER_SCAN1.lsnr'('discus264')の停止が成功しました
CRS-2673: 'ora.scan1.vip'('discus264')の停止を試行しています
CRS-2677: 'ora.discus264.vip'('discus264')の停止が成功しました
CRS-2677: 'ora.scan1.vip'('discus264')の停止が成功しました
CRS-2677: 'ora.LISTENER_SCAN3.lsnr'('discus164')の停止が成功しました
CRS-2673: 'ora.scan3.vip'('discus164')の停止を試行しています
CRS-2677: 'ora.LISTENER.lsnr'('discus164')の停止が成功しました
CRS-2673: 'ora.discus164.vip'('discus164')の停止を試行しています
CRS-2677: 'ora.LISTENER_SCAN2.lsnr'('discus164')の停止が成功しました
CRS-2673: 'ora.scan2.vip'('discus164')の停止を試行しています
CRS-2677: 'ora.scan3.vip'('discus164')の停止が成功しました
CRS-2677: 'ora.discus164.vip'('discus164')の停止が成功しました
CRS-2677: 'ora.scan2.vip'('discus164')の停止が成功しました
CRS-2677: 'ora.registry.acfs'('discus264')の停止が成功しました
CRS-2677: 'ora.registry.acfs'('discus164')の停止が成功しました
CRS-2677: 'ora.CRS.dg'('discus264')の停止が成功しました
CRS-2677: 'ora.CRS.dg'('discus164')の停止が成功しました
CRS-2677: 'ora.orcl.db'('discus264')の停止が成功しました
CRS-2673: 'ora.DATA.dg'('discus264')の停止を試行しています
CRS-2673: 'ora.FRA.dg'('discus264')の停止を試行しています
CRS-2677: 'ora.FRA.dg'('discus264')の停止が成功しました
CRS-2677: 'ora.orcl.db'('discus164')の停止が成功しました
CRS-2673: 'ora.DATA.dg'('discus164')の停止を試行しています
CRS-2673: 'ora.FRA.dg'('discus164')の停止を試行しています
CRS-2677: 'ora.DATA.dg'('discus264')の停止が成功しました
CRS-2673: 'ora.asm'('discus264')の停止を試行しています
CRS-2677: 'ora.asm'('discus264')の停止が成功しました
CRS-2673: 'ora.eons'('discus264')の停止を試行しています
CRS-2673: 'ora.ons'('discus264')の停止を試行しています
CRS-2677: 'ora.DATA.dg'('discus164')の停止が成功しました
CRS-2677: 'ora.ons'('discus264')の停止が成功しました
CRS-2673: 'ora.net1.network'('discus264')の停止を試行しています
CRS-2677: 'ora.net1.network'('discus264')の停止が成功しました
CRS-2677: 'ora.FRA.dg'('discus164')の停止が成功しました
CRS-2673: 'ora.asm'('discus164')の停止を試行しています
CRS-2677: 'ora.asm'('discus164')の停止が成功しました
CRS-2677: 'ora.eons'('discus264')の停止が成功しました
CRS-2792: 'discus264'上にある、Cluster Ready Services管理下のリソースのシャットダウンが完了しました
CRS-2673: 'ora.eons'('discus164')の停止を試行しています
CRS-2673: 'ora.ons'('discus164')の停止を試行しています
CRS-2677: 'ora.crsd'('discus264')の停止が成功しました
CRS-2673: 'ora.cssdmonitor'('discus264')の停止を試行しています
CRS-2673: 'ora.ctssd'('discus264')の停止を試行しています
CRS-2673: 'ora.evmd'('discus264')の停止を試行しています
CRS-2673: 'ora.asm'('discus264')の停止を試行しています
CRS-2677: 'ora.cssdmonitor'('discus264')の停止が成功しました
CRS-2677: 'ora.evmd'('discus264')の停止が成功しました
CRS-2677: 'ora.ctssd'('discus264')の停止が成功しました
CRS-2677: 'ora.asm'('discus264')の停止が成功しました
CRS-2673: 'ora.cssd'('discus264')の停止を試行しています
CRS-2677: 'ora.cssd'('discus264')の停止が成功しました
CRS-2673: 'ora.diskmon'('discus264')の停止を試行しています
CRS-2677: 'ora.diskmon'('discus264')の停止が成功しました
CRS-2675: 'ora.ons'('discus164')の停止に失敗しました
CRS-2679: 'ora.ons'('discus164')のクリーニングを試行しています
CRS-2681: 'ora.ons'('discus164')のクリーニングが成功しました
CRS-2673: 'ora.net1.network'('discus164')の停止を試行しています
CRS-2677: 'ora.net1.network'('discus164')の停止が成功しました
CRS-2677: 'ora.eons'('discus164')の停止が成功しました
CRS-2792: 'discus164'上にある、Cluster Ready Services管理下のリソースのシャットダウンが完了しました
CRS-2677: 'ora.crsd'('discus164')の停止が成功しました
CRS-2673: 'ora.cssdmonitor'('discus164')の停止を試行しています
CRS-2673: 'ora.ctssd'('discus164')の停止を試行しています
CRS-2673: 'ora.evmd'('discus164')の停止を試行しています
CRS-2673: 'ora.asm'('discus164')の停止を試行しています
CRS-2677: 'ora.cssdmonitor'('discus164')の停止が成功しました
CRS-2677: 'ora.evmd'('discus164')の停止が成功しました
CRS-2677: 'ora.asm'('discus164')の停止が成功しました
CRS-2677: 'ora.ctssd'('discus164')の停止が成功しました
CRS-2673: 'ora.cssd'('discus164')の停止を試行しています
CRS-2677: 'ora.cssd'('discus164')の停止が成功しました
CRS-2673: 'ora.diskmon'('discus164')の停止を試行しています
CRS-2677: 'ora.diskmon'('discus164')の停止が成功しました
[root@discus164 ˜]#
[root@discus164 ˜]# crsctl check cluster -all
**************************************************************
discus164:
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
CRS-4534: Cannot communicate with Event Manager
**************************************************************
discus264:
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4530: Communications failure contacting Cluster Synchronization Services daemon
CRS-4534: Cannot communicate with Event Manager
**************************************************************
[root@discus164 ˜]#
[root@discus164 ˜]# su - oracle
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status database -d orcl
PRCD-1027 : データベースorclの取得に失敗しました
PRCR-1070 : リソース ora.orcl.dbが登録されているかどうかの確認に失敗しました
Cannot communicate with crsd
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ exit
logout


では、起動しま〜す。

[oracle@discus164 ˜]$ 
[root@discus164 ˜]# crsctl start cluster -all
CRS-2672: 'ora.cssdmonitor'('discus164')の起動を試行しています
CRS-2672: 'ora.cssdmonitor'('discus264')の起動を試行しています
CRS-2676: 'ora.cssdmonitor'('discus164')の起動が成功しました
CRS-2672: 'ora.cssd'('discus164')の起動を試行しています
CRS-2676: 'ora.cssdmonitor'('discus264')の起動が成功しました
CRS-2672: 'ora.cssd'('discus264')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus264')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus164')の起動を試行しています
CRS-2676: 'ora.diskmon'('discus264')の起動が成功しました
CRS-2676: 'ora.diskmon'('discus164')の起動が成功しました
CRS-2676: 'ora.cssd'('discus264')の起動が成功しました
CRS-2672: 'ora.ctssd'('discus264')の起動を試行しています
CRS-2676: 'ora.cssd'('discus164')の起動が成功しました
CRS-2672: 'ora.ctssd'('discus164')の起動を試行しています
CRS-2676: 'ora.ctssd'('discus264')の起動が成功しました
CRS-2676: 'ora.ctssd'('discus164')の起動が成功しました
CRS-2672: 'ora.evmd'('discus264')の起動を試行しています
CRS-2672: 'ora.evmd'('discus164')の起動を試行しています
CRS-2672: 'ora.asm'('discus264')の起動を試行しています
CRS-2672: 'ora.asm'('discus164')の起動を試行しています
CRS-2676: 'ora.evmd'('discus264')の起動が成功しました
CRS-2676: 'ora.evmd'('discus164')の起動が成功しました
CRS-2676: 'ora.asm'('discus164')の起動が成功しました
CRS-2672: 'ora.crsd'('discus164')の起動を試行しています
CRS-2676: 'ora.asm'('discus264')の起動が成功しました
CRS-2672: 'ora.crsd'('discus264')の起動を試行しています
CRS-2676: 'ora.crsd'('discus164')の起動が成功しました
CRS-2676: 'ora.crsd'('discus264')の起動が成功しました
[root@discus164 ˜]#
[root@discus164 ˜]# crsctl status resource -w 'TYPE co ora' -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.DATA.dg
ONLINE ONLINE discus164
OFFLINE OFFLINE discus264
ora.FRA.dg
ONLINE ONLINE discus164
OFFLINE OFFLINE discus264
ora.LISTENER.lsnr
ONLINE ONLINE discus164
ONLINE OFFLINE discus264
ora.asm
ONLINE ONLINE discus164 Started
ONLINE ONLINE discus264 Started
ora.eons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.gsd
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.net1.network
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.ons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.registry.acfs
ONLINE ONLINE discus164
ONLINE ONLINE discus264
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE INTERMEDIATE discus164 FAILED OVER
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 ONLINE OFFLINE
2 ONLINE OFFLINE
ora.scan1.vip
1 ONLINE ONLINE discus164
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164


ora.LISTENER_SCAN1.lsnr/ora.discus264.vipの両リソースがノードdiscus164からノードdiscus264へ移動し、ノードdiscus164でデータベースインスタンスが起動しました…

・・・中着・・・
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 ONLINE ONLINE discus164 Open
2 ONLINE OFFLINE
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164


最後にノードdiscus264でもデータベースインスタンスが起動し、crsctl stop cluster -allで停止する以前の状況になっています。 :)

・・・中略・・・
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 ONLINE ONLINE discus164 Open
2 ONLINE ONLINE discus264 Open
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164


ということで起動/停止の確認終了!

次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17
VirtualBox de Oracle11g R2 RAC #18
VirtualBox de Oracle11g R2 RAC #19
VirtualBox de Oracle11g R2 RAC #20
VirtualBox de Oracle11g R2 RAC #21




VirtualBox de Oracle11g R2 RAC #16 - 番外編

| | | コメント (0) | トラックバック (0)

VirtualBox de Oracle11g R2 RAC #21

VirtualBox de Oracle11g R2 RACのつづき。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oralce Grid InsfastructureとDatabase構成の確認

OUIやらなんやらがいろいろと構成してくれたりしてくれてるので確認方法の確認って感じですが…

Oracle所有者にて実行…

[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status database -d orcl
インスタンスorcl1はノードdiscus164で実行中です。
インスタンスorcl2はノードdiscus264で実行中です。
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status instance -d orcl -n discus164
インスタンスorcl1はノードdiscus164で実行中です。
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status instance -d orcl -n discus264
インスタンスorcl2はノードdiscus264で実行中です。
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status nodeapps
VIP discus164-vipは有効です
VIP discus164-vipはノードで実行中です: discus164
VIP discus264-vipは有効です
VIP discus264-vipはノードで実行中です: discus264
ネットワークは有効です
ネットワークはノードで実行中です: discus164
ネットワークはノードで実行中です: discus264
GSDは無効です
GSDはノードで実行されていません: discus164
GSDはノードで実行されていません: discus264
ONSは有効です
ONSデーモンはノードで実行中です: discus164
ONSデーモンはノードで実行中です: discus264
eONSは有効です
eONSデーモンはノードで実行中です:discus164
eONSデーモンはノードで実行中です:discus264
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status vip -n discus164
VIP discus164-vipは有効です
VIP discus164-vipはノードで実行中です: discus164
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status vip -n discus264
VIP discus264-vipは有効です
VIP discus264-vipはノードで実行中です: discus264
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status asm -a
ASMはdiscus164,discus264で実行中です
ASMは有効です。
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status listener -n discus164
リスナーLISTENERはノードで有効です: discus164
リスナーLISTENERはノードで実行中です: discus164
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status listener -n discus264
リスナーLISTENERはノードで有効です: discus264
リスナーLISTENERはノードで実行中です: discus264
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status scan
SCAN VIP scan1は有効です
SCAN VIP scan1はノードdiscus264で実行されています
SCAN VIP scan2は有効です
SCAN VIP scan2はノードdiscus164で実行されています
SCAN VIP scan3は有効です
SCAN VIP scan3はノードdiscus164で実行されています
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status scan_listener
SCANリスナーLISTENER_SCAN1は有効です
SCANリスナーLISTENER_SCAN1はノードdiscus264で実行されています
SCANリスナーLISTENER_SCAN2は有効です
SCANリスナーLISTENER_SCAN2はノードdiscus164で実行されています
SCANリスナーLISTENER_SCAN3は有効です
SCANリスナーLISTENER_SCAN3はノードdiscus164で実行されています
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status srvpool -a
サーバー・プール名: Free
アクティブ・サーバー数: 0
アクティブ・サーバー名:
サーバー・プール名: Generic
アクティブ・サーバー数: 2
アクティブ・サーバー名: discus164,discus264
NAME=discus164 STATE=ONLINE
NAME=discus264 STATE=ONLINE
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status server -n discus164,discus264 -a
サーバー名: discus164
サーバーの状態: ONLINE
アクティブなサーバー・プール: Generic ora.orcl
サーバーの状態の詳細:
サーバー名: discus264
サーバーの状態: ONLINE
アクティブなサーバー・プール: Generic ora.orcl
サーバーの状態の詳細:
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status oc4j
OC4Jは無効です
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status diskgroup -g DATA -a
ディスク・グループDATAはdiscus164,discus264で実行中です
ディスク・グループDATAは有効です
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status diskgroup -g CRS -a
ディスク・グループCRSはdiscus164,discus264で実行中です
ディスク・グループCRSは有効です
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl status diskgroup -g FRA -a
ディスク・グループFRAはdiscus164,discus264で実行中です
ディスク・グループFRAは有効です
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$

構成の確認…

[oracle@discus164 ˜]$ 
[oracle@discus164 ˜]$ srvctl config database -d orcl -a
一意のデータベース名: orcl
データベース名: orcl
Oracleホーム: /u01/app/oracle/product/11.2.0/dbhome_1
Oracleユーザー: oracle
spfile: +DATA/orcl/spfileorcl.ora
ドメイン: macdeoracle.info
開始オプション: open
停止オプション: immediate
データベース・ロール: PRIMARY
管理ポリシー: AUTOMATIC
サーバー・プール: orcl
データベース・インスタンス: orcl1,orcl2
ディスク・グループ: DATA,FRA
サービス:
データベースは有効です
データベースは管理者によって管理されています
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl config nodeapps -a -g -s
VIPが存在します。:discus164
VIPが存在します。: /discus164-vip/192.168.1.190/255.255.255.0/eth0
VIPが存在します。:discus264
VIPが存在します。: /discus264-vip/192.168.1.191/255.255.255.0/eth0
GSDが存在します。
ONSデーモンは存在します。ローカル・ポート6100、リモート・ポート6200
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl config asm -a
ASMホーム: /u01/app/11.2.0/grid
ASMリスナー: LISTENER
ASMは有効です。
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl config listener -a
名前: LISTENER
ネットワーク: 1、所有者: grid
ホーム: <CRS home>
ノードdiscus264,discus164の/u01/app/11.2.0/grid
エンド・ポイント: TCP:1521
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl config scan
SCAN名: discus-rac64-scan.macdeoracle.jp、ネットワーク: 1/192.168.1.0/255.255.255.0/eth0
SCAN VIP名: scan1、IP: /discus-rac64-scan.macdeoracle.jp/192.168.1.200
SCAN VIP名: scan2、IP: /discus-rac64-scan.macdeoracle.jp/192.168.1.201
SCAN VIP名: scan3、IP: /discus-rac64-scan.macdeoracle.jp/192.168.1.202
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl config scan_listener
SCANリスナーLISTENER_SCAN1は存在します。ポート: TCP:1521
SCANリスナーLISTENER_SCAN2は存在します。ポート: TCP:1521
SCANリスナーLISTENER_SCAN3は存在します。ポート: TCP:1521
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ srvctl config srvpool
サーバー・プール名: Free
重要度: 0、最小: 0、最大: -1
候補サーバー名:
サーバー・プール名: Generic
重要度: 0、最小: 0、最大: -1
候補サーバー名: discus164,discus264
[oracle@discus164 ˜]$


Grid Infrastructureユーザにて実行…

[grid@discus164 ˜]$ crsctl check cluster -all
**************************************************************
discus164:
CRS-4537: Cluster Ready Servicesがオンラインです
CRS-4529: Cluster Synchronization Servicesがオンラインです
CRS-4533: イベント・マネージャがオンラインです
**************************************************************
discus264:
CRS-4537: Cluster Ready Servicesがオンラインです
CRS-4529: Cluster Synchronization Servicesがオンラインです
CRS-4533: イベント・マネージャがオンラインです
**************************************************************
[grid@discus164 ˜]$
[grid@discus164 ˜]$ crsctl check crs
CRS-4638: Oracle高可用性サービスがオンラインです
CRS-4537: Cluster Ready Servicesがオンラインです
CRS-4529: Cluster Synchronization Servicesがオンラインです
CRS-4533: イベント・マネージャがオンラインです
[grid@discus164 ˜]$
[grid@discus164 ˜]$ crsctl check ctss
CRS-4700: クラスタ時刻同期化サービスはオブザーバ・モードになっています。
[grid@discus164 ˜]$
[grid@discus164 ˜]$ crsctl check css
CRS-4529: Cluster Synchronization Servicesがオンラインです
[grid@discus164 ˜]$
[grid@discus164 ˜]$
[grid@discus164 ˜]$ crsctl status serverpool
NAME=Free
ACTIVE_SERVERS=

NAME=Generic
ACTIVE_SERVERS=discus164 discus264

NAME=ora.orcl
ACTIVE_SERVERS=discus164 discus264

[grid@discus164 ˜]$
[grid@discus164 ˜]$
[grid@discus164 ˜]$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 8f431fe5d1304fd9bf6ad331d3aef536 (ORCL:CRSVOL1) [CRS]
1の投票ディスクを検出しました。
[grid@discus164 ˜]$
[grid@discus164 ˜]$ crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.DATA.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.FRA.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.LISTENER.lsnr
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.asm
ONLINE ONLINE discus164 Started
ONLINE ONLINE discus264 Started
ora.eons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.gsd
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.net1.network
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.ons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.registry.acfs
ONLINE ONLINE discus164
ONLINE ONLINE discus264
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 ONLINE ONLINE discus164 Open
2 ONLINE ONLINE discus264 Open
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164

[grid@discus164 ˜]$


あれ、perlでエラーメッセージでてるけどご愛嬌 :)

[grid@discus164 ˜]$ asmcmd
ASMCMD>
ASMCMD>
ASMCMD> lsdg -g
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 42.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 42.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 42.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 42.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 42.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 42.
Inst_ID State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
1 MOUNTED EXTERN N 512 4096 1048576 4092 3694 0 3694 0 N CRS/
2 MOUNTED EXTERN N 512 4096 1048576 4092 3694 0 3694 0 N CRS/
1 MOUNTED NORMAL N 512 4096 1048576 43006 37436 0 18718 0 N DATA/
2 MOUNTED NORMAL N 512 4096 1048576 43006 37436 0 18718 0 N DATA/
1 MOUNTED NORMAL N 512 4096 1048576 43006 42336 0 21168 0 N FRA/
2 MOUNTED NORMAL N 512 4096 1048576 43006 42336 0 21168 0 N FRA/
ASMCMD>
ASMCMD> lsct -g
Instance_ID DB_Name Status Software_Version Compatible_version Instance_Name Disk_Group
1 +ASM CONNECTED 11.2.0.1.0 11.2.0.1.0 +ASM1 CRS
1 +ASM CONNECTED 11.2.0.1.0 11.2.0.1.0 +ASM1 DATA
2 +ASM CONNECTED 11.2.0.1.0 11.2.0.1.0 +ASM2 CRS
2 +ASM CONNECTED 11.2.0.1.0 11.2.0.1.0 +ASM2 DATA
1 orcl CONNECTED 11.2.0.1.0 11.2.0.0.0 orcl1 DATA
1 orcl CONNECTED 11.2.0.1.0 11.2.0.0.0 orcl1 FRA
2 orcl CONNECTED 11.2.0.1.0 11.2.0.0.0 orcl2 DATA
2 orcl CONNECTED 11.2.0.1.0 11.2.0.0.0 orcl2 FRA
ASMCMD>
ASMCMD> ls -g
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 46.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 46.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 46.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 46.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 46.
Use of uninitialized value in string comparison (cmp) at /u01/app/11.2.0/grid/lib/asmcmdbase.pm line 3420, <STDIN> line 46.
Inst_ID Name
1 CRS/
2 CRS/
1 DATA/
2 DATA/
1 FRA/
2 FRA/
ASMCMD>
ASMCMD> lsof
DB_Name Instance_Name Path
+ASM +ASM1 +crs.255.4294967295
orcl orcl1 +data/orcl/controlfile/current.256.739409625
orcl orcl1 +data/orcl/datafile/sysaux.260.739409693
orcl orcl1 +data/orcl/datafile/system.259.739409647
orcl orcl1 +data/orcl/datafile/undotbs1.261.739409729
orcl orcl1 +data/orcl/datafile/undotbs2.263.739409753
orcl orcl1 +data/orcl/datafile/users.264.739409767
orcl orcl1 +data/orcl/onlinelog/group_1.257.739409631
orcl orcl1 +data/orcl/onlinelog/group_2.258.739409637
orcl orcl1 +data/orcl/onlinelog/group_3.265.739412213
orcl orcl1 +data/orcl/onlinelog/group_4.266.739412217
orcl orcl1 +data/orcl/tempfile/temp.262.739409741
orcl orcl1 +fra/orcl/controlfile/current.256.739409629
orcl orcl1 +fra/orcl/onlinelog/group_1.257.739409635
orcl orcl1 +fra/orcl/onlinelog/group_2.258.739409643
orcl orcl1 +fra/orcl/onlinelog/group_3.259.739412215
orcl orcl1 +fra/orcl/onlinelog/group_4.260.739412225
ASMCMD>

最後にSQL*Plusから

SYS> l
1 select
2 inst_id
3 ,instance_name
4 ,parallel
5 ,status
6 ,database_status
7 ,active_state
8 ,host_name
9 from
10* gv$instance
SYS>
SYS> /

INST_ID INSTANCE_NAME PAR STATUS DATABASE_STATUS ACTIVE_ST HOST_NAME
---------- ---------------- --- ------------ ----------------- --------- ------------------------------
1 orcl1 YES OPEN ACTIVE NORMAL discus164.macdeoracle.jp
2 orcl2 YES OPEN ACTIVE NORMAL discus264.macdeoracle.jp

SYS>


次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17
VirtualBox de Oracle11g R2 RAC #18
VirtualBox de Oracle11g R2 RAC #19
VirtualBox de Oracle11g R2 RAC #20




VirtualBox de Oracle11g R2 RAC #16 - 番外編

| | | コメント (0) | トラックバック (0)

VirtualBox de Oracle11g R2 RAC #20

VirtualBox de Oracle11g R2 RACのつづき。

データベースも無事?作成できたので、今回はNet Serviceの確認を。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Net Serviceの確認

まず、クライアントになるMacOS X Snow LeopardのOracle10g R2 Instant Client側の設定(tnsnames.ora)から。

tnsnames.oraにVirtualBox上に構築したRACに接続するため以下ように定義した。
接続識別子ORCLはVirtualBox上に構築した際、自動生成された部分を複製し、残り2つの定義はRACの各ノードを個別に狙って接続するため接続識別子ORCL1/ORCL2を定義した。

discus:˜ oracle$ diff -u $TNS_ADMIN/tnsnames.ora.org $TNS_ADMIN/tnsnames.ora
--- /Users/Shared/instantclient_10_2/tnsnames.ora.org 2011-01-04 22:34:28.000000000 +0900
+++ /Users/Shared/instantclient_10_2/tnsnames.ora 2011-01-04 22:57:31.000000000 +0900
@@ -10,3 +10,32 @@
)
)

+# Oracle11g R2 11.2.0.1.0 RAC for Linux x86_64 / VirtualBox
+ORCL =
+ (DESCRIPTION =
+ (ADDRESS = (PROTOCOL = TCP)(HOST = discus-rac64-scan.macdeoracle.jp)(PORT = 1521))
+ (CONNECT_DATA =
+ (SERVER = DEDICATED)
+ (SERVICE_NAME = orcl.macdeoracle.info)
+ )
+ )
+
+ORCL2 =
+ (DESCRIPTION =
+ (ADDRESS = (PROTOCOL = TCP)(HOST = discus-rac64-scan.macdeoracle.jp)(PORT = 1521))
+ (CONNECT_DATA =
+ (SERVER = DEDICATED)
+ (SERVICE_NAME = orcl.macdeoracle.info)
+ (INSTANCE_NAME = orcl2)
+ )
+ )
+
+ORCL1 =
+ (DESCRIPTION =
+ (ADDRESS = (PROTOCOL = TCP)(HOST = discus-rac64-scan.macdeoracle.jp)(PORT = 1521))
+ (CONNECT_DATA =
+ (SERVER = DEDICATED)
+ (SERVICE_NAME = orcl.macdeoracle.info)
+ (INSTANCE_NAME = orcl1)
+ )
+ )
discus:˜ oracle$


接続テスト

事前にscan vipがどのような状態か確認しておく。

[oracle@discus164 ˜]$ srvctl status scan
SCAN VIP scan1は有効です
SCAN VIP scan1はノードdiscus264で実行されています
SCAN VIP scan2は有効です
SCAN VIP scan2はノードdiscus164で実行されています
SCAN VIP scan3は有効です
SCAN VIP scan3はノードdiscus164で実行されています
[oracle@discus164 ˜]$

[root@discus164 ˜]# crsctl status resource -w 'TYPE co scan' -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164
[root@discus164 ˜]#

MacOS X Snow LeopardのSQL*PlusからVirtualBox上のOracle11g R2 11.2.0.1.0 RACへの接続テスト。

discus:˜ oracle$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on 火 1月 4 23:16:53 2011

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

SQL> -- ロードバランシングで適当なインスタンスへ接続される。この場合インスタンス2に接続した
SQL> conn scott/tiger@orcl
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SQL> -- 2度目はインスタンス1に接続した。(うまくいってる!)
SQL> conn scott/tiger@orcl
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SQL> -- インスタンス1(orcl1)を狙った接続! OK.
SQL> conn scott/tiger@orcl1
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SQL> -- 念のためもう一度。狙ったインスタンスへ接続している。
SQL> conn scott/tiger@orcl1
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SQL> -- インスタンス2(orcl2)を狙った接続! OK.
SQL> conn scott/tiger@orcl2
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SQL> -- 念のためもう一度!。狙ったインスタンスへ接続している。
SQL> conn scott/tiger@orcl2
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SQL>


リモートからのも接続OK :)


以下、RACインスタンスのバージョン情報、Client側情報としてSQL*Plusのバージョン及び、OSのバージョン情報。

SQL> select * from gv$version; 

INST_ID BANNER
---------- --------------------------------------------------------------------------------
2 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
2 PL/SQL Release 11.2.0.1.0 - Production
2 CORE 11.2.0.1.0 Production
2 TNS for Linux: Version 11.2.0.1.0 - Production
2 NLSRTL Version 11.2.0.1.0 - Production
1 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
1 PL/SQL Release 11.2.0.1.0 - Production
1 CORE 11.2.0.1.0 Production
1 TNS for Linux: Version 11.2.0.1.0 - Production
1 NLSRTL Version 11.2.0.1.0 - Production

10行が選択されました。

SQL> !sqlplus -v

SQL*Plus: Release 10.2.0.4.0 - Production

SQL> !system_profiler SPSoftwareDataType | grep 'System Version'
System Version: Mac OS X 10.6.5 (10H574)

SQL>

次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17
VirtualBox de Oracle11g R2 RAC #18
VirtualBox de Oracle11g R2 RAC #19




VirtualBox de Oracle11g R2 RAC #16 - 番外編

| | | コメント (0) | トラックバック (0)

VirtualBox de Oracle11g R2 RAC #16の番外編

VirtualBox de Oracle11g R2 RAC #16の番外編として、Oracle11g R2 11.2.0.1.0のOracle Grid Infrastructureをdeinstallツールのログを備忘録として残しておきます。 :)

[grid@discus164 deinstall]$ ./deinstall
Checking for required files and bootstrapping ...
Please wait ...
Location of logs /tmp/deinstall2010-12-01_08-36-01-午後/logs/

############ ORACLE DEINSTALL & DECONFIG TOOL START ############


######################## CHECK OPERATION START ########################
インストールの構成確認の開始


Oracleホームの場所が存在するかどうかを確認しています /u01/app/11.2.0/grid
選択された削除対象のOracleホームのタイプ: CRS
選択された削除対象のOracleベース: /u01/app/grid
中央インベントリの場所が存在するかどうかを確認しています /u01/app/oraInventory
Oracle Grid Infrastructureホームが存在するかどうかを確認しています /u01/app/11.2.0/grid
次のノードはこのクラスタの一部です: discus164,discus264

インストールの構成確認の終了

Traces log file: /tmp/deinstall2010-12-01_08-36-01-午後/logs//crsdc.log

ネットワーク構成チェック構成START

ネットワーク構成解除トレース・ファイルの場所: /tmp/deinstall2010-12-01_08-36-01-午後/logs/netdc_check7323528496868837695.log

構成解除するすべてのRACリスナーを指定してください[LISTENER]:

ネットワーク構成チェック構成END

ASMチェック構成START

ASM構成解除トレース・ファイルの場所: /tmp/deinstall2010-12-01_08-36-01-午後/logs/asmcadc_check7638050551281896899.log

このOracleホーム/u01/app/11.2.0/gridで自動ストレージ管理(ASM)インスタンスが検出されました。
ASM診断先: /u01/app/grid
ASMディスク・グループ: +CRS
ディスク・グループは削除されます
ASMを構成解除すると、クリーンアップ時にすべてのディスク・グループおよびそのコンテンツが削除されます。これは、
このASMインスタンスを使用するすべてのデータベースおよびACFSに影響します。
既存のディスク・グループを保持する場合、または検出された情報が正しくない場合、'y'と入力することにより、変更できます。前述の情報(y|n)を変更しますか [n]: y
ASMの診断先を指定してください [/u01/app/grid]:
このASMインスタンスによって管理されているディスク・グループを指定してください [+CRS]:

ASMを構成解除すると、クリーンアップ時にすべてのディスク・グループが削除されます。構成解除ツールでディスク・グループy|nを削除しますか [y]: y


######################### CHECK OPERATION END #########################


####################### CHECK OPERATION SUMMARY #######################
Oracle Grid Infrastructureホーム: /u01/app/11.2.0/grid
Oracleホームが存在するクラスタ・ノード: (ノードを","で区切って入力してください。例: node1,node2,...)discus164,discus264
選択された削除対象のOracleホーム: /u01/app/11.2.0/grid
Oracleホームが登録されているインベントリの場所: /u01/app/oraInventory
次のRACリスナーが構成解除されます: LISTENER
ASMインスタンスはこのOracleホームから構成解除されます
続行しますか (y - はい、n - いいえ)[n]: y
このセッションのログは/tmp/deinstall2010-12-01_08-36-01-午後/logs/deinstall_deconfig2010-12-01_08-36-34-PM.outに書き込まれます
このセッションのすべてのエラー・メッセージは/tmp/deinstall2010-12-01_08-36-01-午後/logs/deinstall_deconfig2010-12-01_08-36-34-PM.errに書き込まれます

######################## CLEAN OPERATION START ########################
ASM構成解除トレース・ファイルの場所: /tmp/deinstall2010-12-01_08-36-01-午後/logs/asmcadc_clean4713857881917098991.log
ASMクリーンアップ構成START
ASMクリーンアップ構成END

ネットワーク構成クリーニング構成START

ネットワーク構成解除トレース・ファイルの場所: /tmp/deinstall2010-12-01_08-36-01-午後/logs/netdc_clean533226112421006626.log

RACリスナーの構成解除: LISTENER

リスナーの構成解除: LISTENER
リスナーを停止しています: LISTENER
リスナーの停止に成功しました。
リスナーを登録解除しています: LISTENER
リスナーの登録解除に成功しました。
リスナーは正常に構成解除されました。

すべてのノードでネーミング・メソッド構成ファイルの構成解除中です...
ネーミング・メソッド構成ファイルが正常に構成解除されました。

すべてのノードでローカル・ネット・サービス名構成ファイルの構成解除中です...
ローカル・ネット・サービス名構成ファイルが正常に構成解除されました。

すべてのノードでディレクトリ使用構成ファイルの構成解除中です...
ディレクトリ使用構成ファイルが正常に構成解除されました。

すべてのノードでバックアップ・ファイルの構成解除中です...
バックアップ・ファイルが正常に構成解除されました。

ネットワーク構成が正常にクリーンアップされました。

ネットワーク構成クリーニング構成END


---------------------------------------->

ノード"discus264"のrootユーザーまたは管理者として次のコマンドを実行します。

/tmp/deinstall2010-12-01_08-36-01-午後/perl/bin/perl -I/tmp/deinstall2010-12-01_08-36-01-午後/perl/lib -I/tmp/deinstall2010-12-01_08-36-01-午後/crs/install /tmp/deinstall2010-12-01_08-36-01-午後/crs/install/rootcrs.pl -force -delete -paramfile /tmp/deinstall2010-12-01_08-36-01-午後/response/deinstall_Ora11g_gridinfrahome1.rsp

ノード"discus164"のrootユーザーまたは管理者として次のコマンドを実行します。

/tmp/deinstall2010-12-01_08-36-01-午後/perl/bin/perl -I/tmp/deinstall2010-12-01_08-36-01-午後/perl/lib -I/tmp/deinstall2010-12-01_08-36-01-午後/crs/install /tmp/deinstall2010-12-01_08-36-01-午後/crs/install/rootcrs.pl -force -delete -paramfile /tmp/deinstall2010-12-01_08-36-01-午後/response/deinstall_Ora11g_gridinfrahome1.rsp -lastnode

前述のコマンドを実行した後、[Enter]を押します

<----------------------------------------

Oracle Universal Installerクリーンアップの開始

Oracleホーム'/u01/app/11.2.0/grid'をローカル・ノードの中央インベントリからデタッチします : 終了

ローカル・ノードのディレクトリ'/u01/app/11.2.0/grid'を削除します : 終了

ローカル・ノードのディレクトリ'/u01/app/oraInventory'を削除します : 終了

ローカル・ノードのディレクトリ'/u01/app/grid'を削除します : 終了

Oracleホーム'/u01/app/11.2.0/grid'をリモート・ノード'discus264'の中央インベントリからデタッチします : 終了

リモート・ノード'discus264'のディレクトリ'/u01/app/11.2.0/grid'を削除します : 終了

リモート・ノード'discus264'のディレクトリ'/u01/app/oraInventory'を削除します : 終了

リモート・ノード'discus264'のディレクトリ'/u01/app/grid'を削除します : 終了

Oracle Universal Installerのクリーンアップが成功しました。

Oracle Universal Installerクリーンアップの終了


Oracleインストール・クリーンアップの開始

インストールのクリーンアップ操作により、ノードdiscus164の一時ディレクトリ/tmp/installを削除しています
インストールのクリーンアップ操作により、ノードdiscus264の一時ディレクトリ/tmp/installを削除しています

Oracleインストール・クリーンアップの終了


######################### CLEAN OPERATION END #########################


####################### CLEAN OPERATION SUMMARY #######################
ASMインスタンスはOracleホームから正常に構成解除されました
次のRACリスナーが正常に構成解除されました: LISTENER
Oracleクラスタウェアはノード"discus164"で停止され、正常に構成解除されています
Oracleクラスタウェアはノード"discus264"で停止され、正常に構成解除されています
Oracleクラスタウェアは正常に停止および構成解除されています。
Oracleホーム'/u01/app/11.2.0/grid'がローカル・ノードの中央インベントリから正常にデタッチされました。
ローカル・ノードのディレクトリ'/u01/app/11.2.0/grid'が正常に削除されました。
ローカル・ノードのディレクトリ'/u01/app/oraInventory'が正常に削除されました。
ローカル・ノードのディレクトリ'/u01/app/grid'が正常に削除されました。
Oracleホーム'/u01/app/11.2.0/grid'がリモート・ノード'discus264'の中央インベントリから正常にデタッチされました。
リモート・ノード'discus264'のディレクトリ'/u01/app/11.2.0/grid'が正常に削除されました。
リモート・ノード'discus264'のディレクトリ'/u01/app/oraInventory'が正常に削除されました。
リモート・ノード'discus264'のディレクトリ'/u01/app/grid'が正常に削除されました。
Oracle Universal Installerのクリーンアップが成功しました。


セッション終了時にノード'discus164,discus264'でrootとして'rm -rf /etc/oraInst.loc'を実行します。

Oracleインストールにより、一時ディレクトリが正常にクリーンアップされました。
#######################################################################


############# ORACLE DEINSTALL & DECONFIG TOOL END #############

[grid@discus164 deinstall]$





これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17
VirtualBox de Oracle11g R2 RAC #18
VirtualBox de Oracle11g R2 RAC #19

| | | コメント (0) | トラックバック (0)

2011年1月 4日 (火)

VirtualBox de Oracle11g R2 RAC #19

VirtualBox de Oracle11g R2 RACのつづき。

いよいよデータベースの作成です。 :)

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle Cluster databaseの作成


Screenshot981

映像を見てもお分かりだと思いますが、VirtualBox上でクラスタデータベースを作成するとほぼ100%、DBCAの最後のダイアログを表示後DBCAを起動したVMが固まります。
Oracle11g R1 RACをVirtualBox上で構築した時と同じ症状です。DBCAのダイアログ上、データベースは作成されましたと表示されているのでそれを信じるばかり (^^;;;

念のため1時間ほど放置したあと、固まったVMは強制終了、残るノードはCentOSをシャットダウンします。その後、Openfiler、RACの両ノードを起動します。(ノード間の処理で固まっているようで実は処理に時間を要していることがなんどかあったので…念のため)

grid infrastructureユーザからcrsctlコマンドで状態を確認した結果は以下。(ちなみに、VM再起動後の状態)

[grid@discus164 ˜]$ crsctl status resource -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.DATA.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.FRA.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.LISTENER.lsnr
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.asm
ONLINE ONLINE discus164 Started
ONLINE ONLINE discus264 Started
ora.eons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.gsd
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.net1.network
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.ons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.registry.acfs
ONLINE ONLINE discus164
ONLINE ONLINE discus264
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.orcl.db
1 ONLINE ONLINE discus164 Open
2 ONLINE ONLINE discus264 Open
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164
[grid@discus164 ˜]$


[oracle@discus164 ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 火 11月 30 14:54:50 2010

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

SQL> conn / as sysdba
パスワードを入力してください:
接続されました。
SQL> set linesize 132
SQL> select * from gv$version;

INST_ID BANNER
---------- --------------------------------------------------------------------------------
1 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
1 PL/SQL Release 11.2.0.1.0 - Production
1 CORE 11.2.0.1.0 Production
1 TNS for Linux: Version 11.2.0.1.0 - Production
1 NLSRTL Version 11.2.0.1.0 - Production
2 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
2 PL/SQL Release 11.2.0.1.0 - Production
2 CORE 11.2.0.1.0 Production
2 TNS for Linux: Version 11.2.0.1.0 - Production
2 NLSRTL Version 11.2.0.1.0 - Production

10行が選択されました。

SQL>

ふ〜、なんとかできたようですね。 とりあえず遊べそうです。

次回へつづく。 Grid Infrastructure周りはもっと調べないと…覚える必要のあることはまだまだ多い (^^;;

Oracle Clusterware管理およびデプロイメント・ガイド 11gリリース2(11.2非推奨のサブプログラムまたはコマンド…このマニュアルもちゃんと読んでおかないとな。><






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17
VirtualBox de Oracle11g R2 RAC #18

| | | コメント (0) | トラックバック (0)

2011年1月 3日 (月)

VirtualBox de Oracle11g R2 RAC #18

VirtualBox de Oracle11g R2 RACのつづきです。

インストールしなくてもいいんだけどいろいろと試したくなったときは便利なので、次いでにexamplesもインストール。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle11g R2 11.2.0.1.0 examplesのインストール

[oracle@discus164 database]$ 
[oracle@discus164 database]$
[oracle@discus164 database]$ cd ../examples
[oracle@discus164 examples]$ ll
合計 48
drwxr-xr-x 7 oracle oinstall 4096 8月 12 2009 doc
drwxr-xr-x 4 oracle oinstall 4096 8月 15 2009 install
drwxrwxr-x 2 oracle oinstall 4096 8月 15 2009 response
-rwxr-xr-x 1 oracle oinstall 3230 8月 15 2009 runInstaller
drwxr-xr-x 12 oracle oinstall 4096 8月 15 2009 stage
-rw-r--r-- 1 oracle oinstall 3419 8月 18 2009 welcome.html
[oracle@discus164 examples]$

[oracle@discus164 examples]$ ./runInstaller
Oracle Universal Installerを起動中です...
・・・中略・・・

Screenshot391

Screenshot621

Screenshot631

Screenshot641

Screenshot651

Screenshot661

Screenshot671

次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16
VirtualBox de Oracle11g R2 RAC #17

| | | コメント (0) | トラックバック (0)

VirtualBox de Oracle11g R2 RAC #17

VirtualBox de Oracle11g R2 RACのつづきです。

つづいてOracle11g R2 11.2.0.1.0 Database Installのインストール。
データベースは作成しないでソフトウェアだけのインストールを行います。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

ASMディスクグループの作成

Grid Infrastructureのインストール同様、Oracle所有者でもsshはパスフレーズありであらかじめ作成しておきます。OUIが作ってくれるだろうということを期待してね。

と、その前に、asmcaでOracleデータファイル及び、フラッシュ・リカバリ・エリア向けASMディスクグループを作成しておきました。
データファイル向けに+DATA、フラッシュ・リカバリ・エリア向けに+FRAというASMディスクグループを作成します。


Oracle11g R2 11.2.0.1.0 Database softwareのインストール

次に、Oracle Database 11g R2 11.2.0.1.0をインストールします。データベースは作成せず、別途dbcaを利用してデータベースを作成します。

省略していますが、お約束、root.shの実行もお忘れなく!



次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15
VirtualBox de Oracle11g R2 RAC #16

| | | コメント (0) | トラックバック (0)

VirtualBox de Oracle11g R2 RAC #16

VirtualBox de Oracle11g R2 RACのつづきです。

いよいよOracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール♪

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール

今回、確かめたかったこともあり、意図的にパスフレーズ付きでsshを手動構成しておいた。
その結果は…CVUの検査はパスするもののOUI上ではsshの構成がNGとなりOUIからsshの構成を行った。その後は問題なくインストールできた :) 便になったねOUI.

[grid@discus164 grid]$ ./runInstaller 
[1] 4417
[grid@discus164 grid]$ Oracle Universal Installerを起動中です...

一時領域の確認中: 120MBを超えている必要があります. 実際 32846MB 問題なし
スワップ領域の確認中: 150MBを超えている必要があります. 実際 5951MB 問題なし
モニターの確認中: 少なくとも256色表示するよう設定されている必要があります. 実際 16777216 問題なし
Oracle Universal Installerの起動を準備中 /tmp/OraInstall2010-11-29_01-51-19PM. お待ちください...


Root_shell



インストールの後半で、上記画面が表示されたら、いつものお約束、orainstRoot.shの実行とroot.shスクリプトの実行です!
RACを構成する全ノードのrootユーザで。最初にOUIを実行したノードで実行。成功したら以後残りのノードで実施(残りのノードでは平行実行可能だとか…今回は2ノードなので確認できず…)。

まず、OUIを実行したノードで実行!

[root@discus164 ˜]#
[root@discus164 ˜]# /u01/app/oraInventory/orainstRoot.sh
権限を変更中 /u01/app/oraInventory.
グループの読取り/書込み権限を追加中。
全ユーザーの読取り/書込み/実行権限を削除中。

グループ名の変更 /u01/app/oraInventory 宛先 oinstall.
スクリプトの実行が完了しました。

[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# /u01/app/11.2.0/grid/root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
ORACLE_OWNER= grid
ORACLE_HOME= /u01/app/11.2.0/grid

Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...

・・・中略・・・

profile reader pa cert TP
profile reader peer cert TP
peer user cert
pa user cert
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
ADVM/ACFS is not supported on centos-release-5-5.el5.centos

CRS-2672: 'ora.gipcd'('discus164')の起動を試行しています

・・・中略・・・

CRS-2676: 'ora.ctssd'('discus164')の起動が成功しました

ASMは正常に作成され、起動しました。

ディスク・グループCRSは正常に作成されました。

clscfg: -install mode specified
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
CRS-2672: 'ora.crsd'('discus164')の起動を試行しています
CRS-2676: 'ora.crsd'('discus164')の起動が成功しました
CRS-4256: Updating the profile
Successful addition of voting disk 5d6c953bf3aa4fe6bfff2a0f9b1e0d37.
Successfully replaced voting disk group with +CRS.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 5d6c953bf3aa4fe6bfff2a0f9b1e0d37 (ORCL:CRSVOL1) [CRS]
Located 1 voting disk(s).
CRS-2673: 'ora.crsd'('discus164')の停止を試行しています

・・・中略・・・

CRS-2676: 'ora.asm'('discus164')の起動が成功しました
CRS-2672: 'ora.CRS.dg'('discus164')の起動を試行しています
CRS-2676: 'ora.CRS.dg'('discus164')の起動が成功しました

discus164 2010/11/29 14:21:13 /u01/app/11.2.0/grid/cdata/discus164/backup_20101129_142113.olr
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
クラスタウェアのインベントリ・プロパティの更新中
Oracle Universal Installerを起動中です...

スワップ領域の確認中: 500MBを超えている必要があります. 実際 5951MB 問題なし
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /u01/app/oraInventory
'UpdateNodeList'が成功しました。
[root@discus164 ˜]#

ADVM/ACFS is not supported on centos-release-5-5.el5.centosという気になるメッセージがあったがこれはCentOSが正式にサポートされていないことが影響している。
一昨年暮れのエントリだけど、以下のブログが参考になるかも。

参考:
http://brianbontrager.blogspot.com/2009/09/learning-asm-breakin-rules-or-running.html

2011/1/4追記:
http://ivan.kartik.sk/index.php?show_article=49
リリースを偽装する方法もあるんだけどね。後者の方が楽は楽だけど元に戻すのが面倒だから今回はパスした。

簡単にリカバル方法がよくわかんなかったんでOracle Grid Infrastructureを一旦deinstallした。(これが一番わかりやすい!)
Oracle Grid Infrastructureをdeinstallコマンドで削除した記録は別途書くとして、一旦deinstallしたと思ってください!!!

ということで、OUIでOracle Grid Infrastractureをインストール。

orainstRoot.shを実行したところで、前述の参考ブログに記載されていたCentOS向け手当を行う。手当を行ってからroot.shを実行する。

orainstRoot.shを実行したところで、前述の参考ブログに記載されていたCentOS向け手当を行う。手当を行ってからroot.shを実行する。

CentOS上へのOracle Grid Infrastructureインストールでは大切(らしい)なので2度、書きましたよw

Oracle Grid Infrastructureユーザの$ORACLE_HOME/lib/osds_acfslib.pmの278行目以下にCentOSも正常に処理できるよう修正を加える。

[grid@discus164 ˜]$ su -
パスワード:
[root@discus164 ˜]# cd /u01/app/11.2.0/grid/lib
[root@discus164 lib]#
[root@discus164 lib]# cp -p osds_acfslib.pm osds_acfslib.pm.org
[root@discus164 lib]#
[root@discus164 lib]# vi osds_acfslib.pm
[root@discus164 lib]#
[root@discus164 lib]# diff -u osds_acfslib.pm osds_acfslib.pm.org
--- osds_acfslib.pm 2010/11/29 17:19:00.000000000 +0900
+++ osds_acfslib.pm.org 2009-07-02 11:13:48.000000000 +0900
@@ -278,8 +278,7 @@
# OK, now check to see if we support this release
$supported = 0;
if (($release =˜ /enterprise-release-5/) ||
- ($release =˜ /redhat-release-5/) ||
- ($release =˜ /centos-release-5/))
+ ($release =˜ /redhat-release-5/))
{
# Redhat 5
$supported = 1;
[root@discus164 lib]#

多分上記の修正だけで対処できると思うのだが、自信がないので以下のこともやっておいた… 写経になっております。m(_ _)m (RACを構成する全ノードのrootユーザで実施)

[root@discus164 ˜]# mkdir /lib/modules/2.6.18-194.17.1.el5/extra/usm
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ls /u01/app/11.2.0/grid/install/usm/EL5/x86_64/2.6.18-8/2.6.18-8.el5-x86_64/bin/*ko
/u01/app/11.2.0/grid/install/usm/EL5/x86_64/2.6.18-8/2.6.18-8.el5-x86_64/bin/oracleacfs.ko
/u01/app/11.2.0/grid/install/usm/EL5/x86_64/2.6.18-8/2.6.18-8.el5-x86_64/bin/oracleadvm.ko
/u01/app/11.2.0/grid/install/usm/EL5/x86_64/2.6.18-8/2.6.18-8.el5-x86_64/bin/oracleoks.ko
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# cp /u01/app/11.2.0/grid/install/usm/EL5/x86_64/2.6.18-8/2.6.18-8.el5-x86_64/bin/*ko /lib/modules/2.6.18-194.17.1.el5/extra/usm
[root@discus164 ˜]# chmod 744 /lib/modules/2.6.18-194.17.1.el5/extra/usm
[root@discus164 ˜]#
[root@discus164 ˜]# depmod
[root@discus164 ˜]#
[root@discus164 ˜]# cp /u01/app/11.2.0/grid/install/usm/EL5/x86_64/2.6.18-8/2.6.18-8.el5-x86_64/bin/acfsdbg /sbin
[root@discus164 ˜]# chmod 755 /sbin/acfsdbg


ここまでの作業を終えたらOUIでOracle Grid InfrastructureをOUIでインストールする。手順は前述の映像を見てくださいね。

お約束のorainstRoot.shそれに続いて、root.shをOUIを起動したノードで実施、その後、残りのノードでも同様にrootユーザで実施する。

root.shの実行。こんどは大丈夫でしょうか〜〜〜〜。

[root@discus164 grid]# ./root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
ORACLE_OWNER= grid
ORACLE_HOME= /u01/app/11.2.0/grid

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file "dbhome" already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
Copying dbhome to /usr/local/bin ...
The file "oraenv" already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
Copying oraenv to /usr/local/bin ...
The file "coraenv" already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
2010-11-29 17:23:44: Parsing the host name
2010-11-29 17:23:44: Checking for super user privileges
2010-11-29 17:23:44: User has super user privileges

Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
LOCAL ADD MODE
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
root wallet
root wallet cert
root cert export
peer wallet
profile reader wallet
pa wallet
peer wallet keys
pa wallet keys
peer cert request
pa cert request
peer cert
pa cert
peer root cert TP
profile reader root cert TP
pa root cert TP
peer pa cert TP
pa peer cert TP
profile reader pa cert TP
profile reader peer cert TP
peer user cert
pa user cert
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
CRS-2672: 'ora.gipcd'('discus164')の起動を試行しています
CRS-2672: 'ora.mdnsd'('discus164')の起動を試行しています
CRS-2676: 'ora.gipcd'('discus164')の起動が成功しました
CRS-2676: 'ora.mdnsd'('discus164')の起動が成功しました
CRS-2672: 'ora.gpnpd'('discus164')の起動を試行しています
CRS-2676: 'ora.gpnpd'('discus164')の起動が成功しました
CRS-2672: 'ora.cssdmonitor'('discus164')の起動を試行しています
CRS-2676: 'ora.cssdmonitor'('discus164')の起動が成功しました
CRS-2672: 'ora.cssd'('discus164')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus164')の起動を試行しています
CRS-2676: 'ora.diskmon'('discus164')の起動が成功しました
CRS-2676: 'ora.cssd'('discus164')の起動が成功しました
CRS-2672: 'ora.ctssd'('discus164')の起動を試行しています
CRS-2676: 'ora.ctssd'('discus164')の起動が成功しました

ASMは正常に作成され、起動しました。

ディスク・グループCRSは正常に作成されました。

clscfg: -install mode specified
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
CRS-2672: 'ora.crsd'('discus164')の起動を試行しています
CRS-2676: 'ora.crsd'('discus164')の起動が成功しました
CRS-4256: Updating the profile
Successful addition of voting disk 8f431fe5d1304fd9bf6ad331d3aef536.
Successfully replaced voting disk group with +CRS.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 8f431fe5d1304fd9bf6ad331d3aef536 (ORCL:CRSVOL1) [CRS]
Located 1 voting disk(s).
CRS-2673: 'ora.crsd'('discus164')の停止を試行しています
CRS-2677: 'ora.crsd'('discus164')の停止が成功しました
CRS-2673: 'ora.asm'('discus164')の停止を試行しています
CRS-2677: 'ora.asm'('discus164')の停止が成功しました
CRS-2673: 'ora.ctssd'('discus164')の停止を試行しています
CRS-2677: 'ora.ctssd'('discus164')の停止が成功しました
CRS-2673: 'ora.cssdmonitor'('discus164')の停止を試行しています
CRS-2677: 'ora.cssdmonitor'('discus164')の停止が成功しました
CRS-2673: 'ora.cssd'('discus164')の停止を試行しています
CRS-2677: 'ora.cssd'('discus164')の停止が成功しました
CRS-2673: 'ora.gpnpd'('discus164')の停止を試行しています
CRS-2677: 'ora.gpnpd'('discus164')の停止が成功しました
CRS-2673: 'ora.gipcd'('discus164')の停止を試行しています
CRS-2677: 'ora.gipcd'('discus164')の停止が成功しました
CRS-2673: 'ora.mdnsd'('discus164')の停止を試行しています
CRS-2677: 'ora.mdnsd'('discus164')の停止が成功しました
CRS-2672: 'ora.mdnsd'('discus164')の起動を試行しています
CRS-2676: 'ora.mdnsd'('discus164')の起動が成功しました
CRS-2672: 'ora.gipcd'('discus164')の起動を試行しています
CRS-2676: 'ora.gipcd'('discus164')の起動が成功しました
CRS-2672: 'ora.gpnpd'('discus164')の起動を試行しています
CRS-2676: 'ora.gpnpd'('discus164')の起動が成功しました
CRS-2672: 'ora.cssdmonitor'('discus164')の起動を試行しています
CRS-2676: 'ora.cssdmonitor'('discus164')の起動が成功しました
CRS-2672: 'ora.cssd'('discus164')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus164')の起動を試行しています
CRS-2676: 'ora.diskmon'('discus164')の起動が成功しました
CRS-2676: 'ora.cssd'('discus164')の起動が成功しました
CRS-2672: 'ora.ctssd'('discus164')の起動を試行しています
CRS-2676: 'ora.ctssd'('discus164')の起動が成功しました
CRS-2672: 'ora.asm'('discus164')の起動を試行しています
CRS-2676: 'ora.asm'('discus164')の起動が成功しました
CRS-2672: 'ora.crsd'('discus164')の起動を試行しています
CRS-2676: 'ora.crsd'('discus164')の起動が成功しました
CRS-2672: 'ora.evmd'('discus164')の起動を試行しています
CRS-2676: 'ora.evmd'('discus164')の起動が成功しました
CRS-2672: 'ora.asm'('discus164')の起動を試行しています
CRS-2676: 'ora.asm'('discus164')の起動が成功しました
CRS-2672: 'ora.CRS.dg'('discus164')の起動を試行しています
CRS-2676: 'ora.CRS.dg'('discus164')の起動が成功しました
CRS-2672: 'ora.registry.acfs'('discus164')の起動を試行しています
CRS-2676: 'ora.registry.acfs'('discus164')の起動が成功しました

discus164 2010/11/29 17:30:15 /u01/app/11.2.0/grid/cdata/discus164/backup_20101129_173015.olr
パッケージインストールの準備中...
cvuqdisk-1.0.7-1
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
クラスタウェアのインベントリ・プロパティの更新中
Oracle Universal Installerを起動中です...

スワップ領域の確認中: 500MBを超えている必要があります. 実際 5951MB 問題なし
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /u01/app/oraInventory
'UpdateNodeList'が成功しました。
[root@discus164 grid]#

お〜〜、でけた。

では、他のノードでも実行
残りのノードでも同様の操作実施後root.sh実行

[root@discus264 grid]# ./root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
ORACLE_OWNER= grid
ORACLE_HOME= /u01/app/11.2.0/grid

Enter the full pathname of the local bin directory: [/usr/local/bin]:
The file "dbhome" already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
Copying dbhome to /usr/local/bin ...
The file "oraenv" already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
Copying oraenv to /usr/local/bin ...
The file "coraenv" already exists in /usr/local/bin. Overwrite it? (y/n)
[n]: y
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
2010/11/29 17:45:30: Parsing the host name
2010/11/29 17:45:30: Checking for super user privileges
2010/11/29 17:45:30: User has super user privileges
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
LOCAL ADD MODE
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
CRS-4402: CSSデーモンが排他モードで開始されましたが、ノードdiscus164、番号1のアクティブCSSデーモンが検出されたため中断します
CRS-2673: 'ora.cssdmonitor'('discus264')の停止を試行しています
CRS-2677: 'ora.cssdmonitor'('discus264')の停止が成功しました
CRS-2673: 'ora.gpnpd'('discus264')の停止を試行しています
CRS-2677: 'ora.gpnpd'('discus264')の停止が成功しました
CRS-2673: 'ora.gipcd'('discus264')の停止を試行しています
CRS-2677: 'ora.gipcd'('discus264')の停止が成功しました
CRS-2673: 'ora.mdnsd'('discus264')の停止を試行しています
CRS-2677: 'ora.mdnsd'('discus264')の停止が成功しました
An active cluster was found during exclusive startup, restarting to join the cluster
CRS-2672: 'ora.mdnsd'('discus264')の起動を試行しています
CRS-2676: 'ora.mdnsd'('discus264')の起動が成功しました
CRS-2672: 'ora.gipcd'('discus264')の起動を試行しています
CRS-2676: 'ora.gipcd'('discus264')の起動が成功しました
CRS-2672: 'ora.gpnpd'('discus264')の起動を試行しています
CRS-2676: 'ora.gpnpd'('discus264')の起動が成功しました
CRS-2672: 'ora.cssdmonitor'('discus264')の起動を試行しています
CRS-2676: 'ora.cssdmonitor'('discus264')の起動が成功しました
CRS-2672: 'ora.cssd'('discus264')の起動を試行しています
CRS-2672: 'ora.diskmon'('discus264')の起動を試行しています
CRS-2676: 'ora.diskmon'('discus264')の起動が成功しました
CRS-2676: 'ora.cssd'('discus264')の起動が成功しました
CRS-2672: 'ora.ctssd'('discus264')の起動を試行しています
CRS-2676: 'ora.ctssd'('discus264')の起動が成功しました
CRS-2672: 'ora.drivers.acfs'('discus264')の起動を試行しています
CRS-2676: 'ora.drivers.acfs'('discus264')の起動が成功しました
CRS-2672: 'ora.asm'('discus264')の起動を試行しています
CRS-2676: 'ora.asm'('discus264')の起動が成功しました
CRS-2672: 'ora.crsd'('discus264')の起動を試行しています
CRS-2676: 'ora.crsd'('discus264')の起動が成功しました
CRS-2672: 'ora.evmd'('discus264')の起動を試行しています
CRS-2676: 'ora.evmd'('discus264')の起動が成功しました

discus264 2010/11/29 17:48:45 /u01/app/11.2.0/grid/cdata/discus264/backup_20101129_174845.olr
パッケージインストールの準備中...
cvuqdisk-1.0.7-1
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
クラスタウェアのインベントリ・プロパティの更新中
Oracle Universal Installerを起動中です...

スワップ領域の確認中: 500MBを超えている必要があります. 実際 5951MB 問題なし
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /u01/app/oraInventory
'UpdateNodeList'が成功しました。
[root@discus264 grid]#


root.sh実行おわり!


Grid Infrastructureインストール後の簡単な確認(RACを構成する全ノードのgrid infrastructureユーザ及び、rootユーザで実施)

crsの状態確認(RACを構成する全ノードのGrid Infrastructureユーザで

[grid@discus164 ˜]$ crsctl check crs
CRS-4638: Oracle高可用性サービスがオンラインです
CRS-4537: Cluster Ready Servicesがオンラインです
CRS-4529: Cluster Synchronization Servicesがオンラインです
CRS-4533: イベント・マネージャがオンラインです
[grid@discus164 ˜]$

[grid@discus264 ˜]$ crsctl check crs
CRS-4638: Oracle高可用性サービスがオンラインです
CRS-4537: Cluster Ready Servicesがオンラインです
CRS-4529: Cluster Synchronization Servicesがオンラインです
CRS-4533: イベント・マネージャがオンラインです
[grid@discus264 ˜]$


clusterノードの確認(RACを構成する全ノードのGrid Infrastructureユーザで)

[grid@discus164 ˜]$ olsnodes -n
discus164 1
discus264 2
[grid@discus164 ˜]$

[grid@discus264 ˜]$ olsnodes -n
discus164 1
discus264 2
[grid@discus264 ˜]$

リスナーの確認(RACを構成する全ノード

[grid@discus164 ˜]$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_SCAN2
LISTENER_SCAN3
LISTENER
[grid@discus164 ˜]$

[grid@discus264 ˜]$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_SCAN1
LISTENER
[grid@discus264 ˜]$

以下、OUIを実行したノードから確認しとけばOKかな
ASMは起動してるかな〜(Grid Infrastructureユーザで

[grid@discus164 ˜]$ srvctl status asm -a
ASMはdiscus164,discus264で実行中です
ASMは有効です。
[grid@discus164 ˜]$

rootユーザでcrsctlコマンド実行してますが、Grid Infrastructureホームのbinにパス通しているだけです :) 楽なので。
Oracle Cluster Registry (OCR) - rootユーザで実施

[root@discus164 grid]# ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 3
Total space (kbytes) : 262120
Used space (kbytes) : 2364
Available space (kbytes) : 259756
ID : 1391852321
Device/File Name : +CRS
Device/File integrity check succeeded

Device/File not configured

Device/File not configured

Device/File not configured

Device/File not configured

Cluster registry integrity check succeeded

Logical corruption check succeeded

[root@discus164 grid]#


Voting Diskの確認(Grid Infrastructureユーザで

[grid@discus164 ˜]$ crsctl query css votedisk
## STATE File Universal Id File Name Disk group
-- ----- ----------------- --------- ---------
1. ONLINE 5d6c953bf3aa4fe6bfff2a0f9b1e0d37 (ORCL:CRSVOL1) [CRS]
1の投票ディスクを検出しました。
[grid@discus164 ˜]$

[grid@discus164 ~]$ crsctl status resource -w 'TYPE co ora' -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.CRS.dg
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.LISTENER.lsnr
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.asm
ONLINE ONLINE discus164 Started
ONLINE ONLINE discus264 Started
ora.eons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.gsd
OFFLINE OFFLINE discus164
OFFLINE OFFLINE discus264
ora.net1.network
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.ons
ONLINE ONLINE discus164
ONLINE ONLINE discus264
ora.registry.acfs
ONLINE ONLINE discus164
ONLINE ONLINE discus264
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE discus264
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE discus164
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE discus164
ora.discus164.vip
1 ONLINE ONLINE discus164
ora.discus264.vip
1 ONLINE ONLINE discus264
ora.oc4j
1 OFFLINE OFFLINE
ora.scan1.vip
1 ONLINE ONLINE discus264
ora.scan2.vip
1 ONLINE ONLINE discus164
ora.scan3.vip
1 ONLINE ONLINE discus164
[grid@discus164 ~]$


root.shのバックアップが推奨されているので、これはやっといた。

Back Up the root.sh Script

Oracle recommends that you back up the root.sh script after you
complete an installation. If you install other products
in the same Oracle home directory, then the installer updates
the contents of the existing root.sh script during the installation.
If you require information contained in the original root.sh script,
then you can recover it from the root.sh file copy.

Back up the root.sh file on both Oracle RAC nodes as root:

[grid@discus164 ˜]$ su -
パスワード:
[root@discus164 ˜]# cd /u01/app/11.2.0/grid
[root@discus164 grid]# ls -l root.sh
-rwxr-x--- 1 grid oinstall 723 11月 29 14:10 root.sh
[root@discus164 grid]# cp -p root.sh root.sh.discus164_after_install20101129
[root@discus164 grid]#

[grid@discus264 ˜]$ su -
パスワード:
[root@discus264 ˜]# cd /u01/app/11.2.0
[root@discus264 11.2.0]# cd grid
[root@discus264 grid]# ls -l root.sh
-rwxr-x--- 1 grid oinstall 723 11月 29 14:12 root.sh
[root@discus264 grid]# cp -p root.sh root.sh.discus264_after_install20101129
[root@discus264 grid]#


Install Cluster Health Management Software が推奨されてるけど。別途時間があったらやる→TODO


次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14
VirtualBox de Oracle11g R2 RAC #15

| | | コメント (0) | トラックバック (0)

2011年1月 2日 (日)

VirtualBox de Oracle11g R2 RAC #15

VirtualBox de Oracle11g R2 RACのつづきです。

今回はOracle11g R2 11.2.0.1.0 RACインストール事前作業。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle11g R2 11.2.0.1.0 RACインストール事前作業

以下、Linux 64bit版をダウンロード
Oracle11g R2 11.2.0.1.0 for Linux (64bit)
linux.x64_11gR2_database_1of2.zip
linux.x64_11gR2_database_2of2.zip

Oracle11g R2 Grid Infrastructure for Linux (64bit)
linux.x64_11gR2_grid.zip

Oracle11g R2 Examples for Linux (64bit)
linux.x64_11gR2_examples.zip


ダウンロードした、Oracle Grid Infrastructureをgrid infrastructureユーザで解凍

[grid@discus164 oracle]$ ll
合計 1029240
-rw-r--r-- 1 grid oinstall 1052897657 11月 25 10:51 linux.x64_11gR2_grid.zip
[grid@discus164 oracle]$ unzip linux.x64_11gR2_grid.zip

・・・中略・・・

extracting: grid/install/addLangs.sh
inflating: grid/runInstaller
inflating: grid/welcome.html
inflating: grid/runcluvfy.sh
[grid@discus164 oracle]$


ダウンロードしたOracle11g R2 11.2.0.1.0とexamplesをOracle所有者で解凍

[oracle@discus164 oracle]$ ll
合計 2840744
-rw-r--r-- 1 oracle oinstall 1239269270 11月 25 10:56 linux.x64_11gR2_database_1of2.zip
-rw-r--r-- 1 oracle oinstall 1111416131 11月 25 10:57 linux.x64_11gR2_database_2of2.zip
-rw-r--r-- 1 oracle oinstall 555366950 11月 25 10:57 linux.x64_11gR2_examples.zip
[oracle@discus164 oracle]$ unzip linux.x64_11gR2_database_1of2.zip

・・・中略・・・

extracting: database/install/addLangs.sh
inflating: database/runInstaller
inflating: database/welcome.html
[oracle@discus164 oracle]$
[oracle@discus164 oracle]$ unzip linux.x64_11gR2_database_2of2.zip

・・・中略・・・

inflating: database/stage/Components/oracle.sysman.console.db/11.2.0.1.0/1/DataFiles/filegroup13.jar
inflating: database/stage/Components/oracle.sysman.console.db/11.2.0.1.0/1/DataFiles/filegroup8.jar
inflating: database/stage/Components/oracle.sysman.console.db/11.2.0.1.0/1/DataFiles/filegroup9.jar
[oracle@discus164 oracle]$
[oracle@discus164 oracle]$ unzip linux.x64_11gR2_examples.zip

・・・中略・・・

extracting: examples/install/addLangs.sh
inflating: examples/runInstaller
inflating: examples/welcome.html
[oracle@discus164 oracle]$


cvudiskパッケージのインストール(RACを構成する全ノードのrootユーザで)

[grid@discus164 ˜]$ cd ./software/oracle/grid/rpm
[grid@discus164 rpm]$ su
パスワード:
[root@discus164 rpm]# ll
合計 12
-rw-rw-r-- 1 grid oinstall 8173 7月 15 2009 cvuqdisk-1.0.7-1.rpm
[root@discus164 rpm]# CVUQDISK_GRP=oinstall; export CVUQDISK_GRP
[root@discus164 rpm]# rpm -iv cvuqdisk-1.0.7-1.rpm
パッケージインストールの準備中...
cvuqdisk-1.0.7-1
[root@discus164 rpm]#


CVUによる事前チェック(RACを構成する全ノードのOracle Grid Infrastructureユーザで実施)
-fixupオプションを付加すると修正用スクリプトが作成されますが、下記例では付加していません。(修正スクリプトを作成させた方が楽ですけどね。)

今回は全ログを省略なしで!w

[grid@discus164 grid]$ pwd
/home/grid/software/oracle/grid
[grid@discus164 grid]$ ll
合計 76
drwxr-xr-x 9 grid oinstall 4096 8月 17 2009 doc
drwxr-xr-x 4 grid oinstall 4096 12月 3 11:05 install
drwxrwxr-x 2 grid oinstall 4096 8月 15 2009 response
drwxrwxr-x 2 grid oinstall 4096 8月 15 2009 rpm
-rwxr-xr-x 1 grid oinstall 3227 8月 15 2009 runInstaller
-rwxrwxr-x 1 grid oinstall 3795 1月 29 2009 runcluvfy.sh
drwxrwxr-x 2 grid oinstall 4096 8月 15 2009 sshsetup
drwxr-xr-x 14 grid oinstall 4096 8月 15 2009 stage
-rw-r--r-- 1 grid oinstall 4228 8月 18 2009 welcome.html
[grid@discus164 grid]$
[grid@discus164 grid]$
[grid@discus164 grid]$ ./runcluvfy.sh stage -pre crsinst -n discus164,discus264 -verbose

クラスタ・サービス設定の事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus164"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus264 はい
discus164 はい
結果: ノード"discus164"からのノード到達可能性チェックに合格しました


ユーザー等価をチェック中...

チェック: ユーザー"grid"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus264 合格
discus164 合格
結果: ユーザー"grid"のユーザー等価チェックに合格しました

ノード接続性をチェック中...

ホスト構成ファイルをチェック中...
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus264 合格
discus164 合格

ホスト構成ファイルの検証に成功しました


ノード"discus264"のインタフェース情報
名前 IPアドレス サブネット ゲートウェイ デフォルト・ゲートウェイ HWアドレス MTU
------ --------------- --------------- --------------- --------------- ----------------- ------
eth0 192.168.1.91 192.168.1.0 0.0.0.0 192.168.1.1 08:00:27:CC:3B:97 1500
eth1 192.168.3.91 192.168.3.0 0.0.0.0 192.168.1.1 08:00:27:2F:97:0D 1500
eth2 192.168.2.91 192.168.2.0 0.0.0.0 192.168.1.1 08:00:27:AD:F8:40 1500


ノード"discus164"のインタフェース情報
名前 IPアドレス サブネット ゲートウェイ デフォルト・ゲートウェイ HWアドレス MTU
------ --------------- --------------- --------------- --------------- ----------------- ------
eth0 192.168.1.90 192.168.1.0 0.0.0.0 192.168.1.1 08:00:27:B1:38:96 1500
eth1 192.168.3.90 192.168.3.0 0.0.0.0 192.168.1.1 08:00:27:FC:A5:8E 1500
eth2 192.168.2.90 192.168.2.0 0.0.0.0 192.168.1.1 08:00:27:47:E9:2C 1500


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus264:eth0 discus164:eth0 はい
結果: ノードdiscus264,discus164を持つサブネット"192.168.1.0"のノード接続性に合格しました


チェック: サブネット"192.168.1.0"のTCP接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus164:192.168.1.90 discus264:192.168.1.91 合格
結果: サブネット"192.168.1.0"のTCP接続性チェックに合格しました


チェック: サブネット"192.168.3.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus264:eth1 discus164:eth1 はい
結果: ノードdiscus264,discus164を持つサブネット"192.168.3.0"のノード接続性に合格しました


チェック: サブネット"192.168.3.0"のTCP接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus164:192.168.3.90 discus264:192.168.3.91 合格
結果: サブネット"192.168.3.0"のTCP接続性チェックに合格しました


チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus264:eth2 discus164:eth2 はい
結果: ノードdiscus264,discus164を持つサブネット"192.168.2.0"のノード接続性に合格しました


チェック: サブネット"192.168.2.0"のTCP接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus164:192.168.2.90 discus264:192.168.2.91 合格
結果: サブネット"192.168.2.0"のTCP接続性チェックに合格しました


VIPの候補となるサブネット"192.168.1.0"で見つかったインタフェースは次のとおりです:
discus264 eth0:192.168.1.91
discus164 eth0:192.168.1.90

プライベート・インターコネクトの候補となるサブネット"192.168.3.0"で見つかったインタフェースは次のとおりです:
discus264 eth1:192.168.3.91
discus164 eth1:192.168.3.90

プライベート・インターコネクトの候補となるサブネット"192.168.2.0"で見つかったインタフェースは次のとおりです:
discus264 eth2:192.168.2.91
discus164 eth2:192.168.2.90

結果: ノード接続性チェックに合格しました


チェック: メモリー合計
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 3.86GB (4051640.0KB) 1.5GB (1572864.0KB) 合格
discus164 3.86GB (4051640.0KB) 1.5GB (1572864.0KB) 合格
結果: メモリー合計チェックに合格しました

チェック: 使用可能なメモリー
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 3.5GB (3673300.0KB) 50MB (51200.0KB) 合格
discus164 3.34GB (3498792.0KB) 50MB (51200.0KB) 合格
結果: 使用可能なメモリーチェックに合格しました

チェック: スワップ領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 5.81GB (6094840.0KB) 3.86GB (4051640.0KB) 合格
discus164 5.81GB (6094840.0KB) 3.86GB (4051640.0KB) 合格
結果: スワップ領域チェックに合格しました

チェック: "discus264:/tmp"のディスク空き領域
パス ノード名 マウント・ポイント 使用可能 必須 コメント
---------------- ------------ ------------ ------------ ------------ ------------
/tmp discus264 / 37.78GB 1GB 合格
結果: "discus264:/tmp"のディスク空き領域チェックに合格しました

チェック: "discus164:/tmp"のディスク空き領域
パス ノード名 マウント・ポイント 使用可能 必須 コメント
---------------- ------------ ------------ ------------ ------------ ------------
/tmp discus164 / 33.62GB 1GB 合格
結果: "discus164:/tmp"のディスク空き領域チェックに合格しました

チェック: "grid"の既存ユーザー
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus264 存在します 合格
discus164 存在します 合格
結果: "grid"の既存ユーザーチェックに合格しました

チェック: "oinstall"のグループの存在
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus264 存在します 合格
discus164 存在します 合格
結果: "oinstall"のグループの存在チェックに合格しました

チェック: "dba"のグループの存在
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus264 存在します 合格
discus164 存在します 合格
結果: "dba"のグループの存在チェックに合格しました

チェック: グループ"oinstall"内のユーザー"grid"[プライマリ]のメンバーシップ
ノード名 ユーザーが存在します グループが存在します グループ内のユーザー プライマリ コメント
---------------- ------------ ------------ ------------ ------------ ------------
discus264 はい はい はい はい 合格
discus164 はい はい はい はい 合格
結果: グループ"oinstall"内のユーザー"grid"[プライマリ]のメンバーシップ・チェックに合格しました

チェック: グループ"dba"内のユーザー"grid"のメンバーシップ
ノード名 ユーザーが存在します グループが存在します グループ内のユーザー コメント
---------------- ------------ ------------ ------------ ----------------
discus264 はい はい いいえ 失敗
discus164 はい はい いいえ 失敗
結果: グループ"dba"内のユーザー"grid"のメンバーシップ・チェックが失敗しました

チェック: 実行レベル
ノード名 実行レベル 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 5 3,5 合格
discus164 5 3,5 合格
結果: 実行レベルチェックに合格しました

チェック: "最大オープン・ファイル記述子数"の強い制限
ノード名 タイプ 使用可能 必須 コメント
---------------- ------------ ------------ ------------ ----------------
discus264 強い 65536 65536 合格
discus164 強い 65536 65536 合格
結果: "最大オープン・ファイル記述子数"の強い制限チェックに合格しました

チェック: "最大オープン・ファイル記述子数"の弱い制限
ノード名 タイプ 使用可能 必須 コメント
---------------- ------------ ------------ ------------ ----------------
discus264 弱い 1024 1024 合格
discus164 弱い 1024 1024 合格
結果: "最大オープン・ファイル記述子数"の弱い制限チェックに合格しました

チェック: "最大ユーザー・プロセス"の強い制限
ノード名 タイプ 使用可能 必須 コメント
---------------- ------------ ------------ ------------ ----------------
discus264 強い 16384 16384 合格
discus164 強い 16384 16384 合格
結果: "最大ユーザー・プロセス"の強い制限チェックに合格しました

チェック: "最大ユーザー・プロセス"の弱い制限
ノード名 タイプ 使用可能 必須 コメント
---------------- ------------ ------------ ------------ ----------------
discus264 弱い 2047 2047 合格
discus164 弱い 2047 2047 合格
結果: "最大ユーザー・プロセス"の弱い制限チェックに合格しました

チェック: システム・アーキテクチャ
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 x86_64 x86_64 合格
discus164 x86_64 x86_64 合格
結果: システム・アーキテクチャチェックに合格しました

チェック: カーネル・バージョン
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 2.6.18-194.17.1.el5 2.6.9 合格
discus164 2.6.18-194.17.1.el5 2.6.9 合格
結果: カーネル・バージョンチェックに合格しました

チェック: "semmsl"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 250 250 合格
discus164 250 250 合格
結果: "semmsl"のカーネル・パラメータチェックに合格しました

チェック: "semmns"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 32000 32000 合格
discus164 32000 32000 合格
結果: "semmns"のカーネル・パラメータチェックに合格しました

チェック: "semopm"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 100 100 合格
discus164 100 100 合格
結果: "semopm"のカーネル・パラメータチェックに合格しました

チェック: "semmni"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 128 128 合格
discus164 128 128 合格
結果: "semmni"のカーネル・パラメータチェックに合格しました

チェック: "shmmax"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 68719476736 536870912 合格
discus164 68719476736 536870912 合格
結果: "shmmax"のカーネル・パラメータチェックに合格しました

チェック: "shmmni"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 4096 4096 合格
discus164 4096 4096 合格
結果: "shmmni"のカーネル・パラメータチェックに合格しました

チェック: "shmall"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 4294967296 2097152 合格
discus164 4294967296 2097152 合格
結果: "shmall"のカーネル・パラメータチェックに合格しました

チェック: "file-max"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 6815744 6815744 合格
discus164 6815744 6815744 合格
結果: "file-max"のカーネル・パラメータチェックに合格しました

チェック: "ip_local_port_range"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 between 9000 & 65500 between 9000 & 65500 合格
discus164 between 9000 & 65500 between 9000 & 65500 合格
結果: "ip_local_port_range"のカーネル・パラメータチェックに合格しました

チェック: "rmem_default"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 262144 262144 合格
discus164 262144 262144 合格
結果: "rmem_default"のカーネル・パラメータチェックに合格しました

チェック: "rmem_max"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 4194304 4194304 合格
discus164 4194304 4194304 合格
結果: "rmem_max"のカーネル・パラメータチェックに合格しました

チェック: "wmem_default"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 262144 262144 合格
discus164 262144 262144 合格
結果: "wmem_default"のカーネル・パラメータチェックに合格しました

チェック: "wmem_max"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 1048576 1048576 合格
discus164 1048576 1048576 合格
結果: "wmem_max"のカーネル・パラメータチェックに合格しました

チェック: "aio-max-nr"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 1048576 1048576 合格
discus164 1048576 1048576 合格
結果: "aio-max-nr"のカーネル・パラメータチェックに合格しました

チェック: "make-3.80"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 make-3.81-3.el5 make-3.80 合格
discus164 make-3.81-3.el5 make-3.80 合格
結果: "make-3.80"のパッケージの存在チェックに合格しました

チェック: "binutils-2.15.92.0.2"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 binutils-2.17.50.0.6-14.el5 binutils-2.15.92.0.2 合格
discus164 binutils-2.17.50.0.6-14.el5 binutils-2.15.92.0.2 合格
結果: "binutils-2.15.92.0.2"のパッケージの存在チェックに合格しました

チェック: "gcc-3.4.6"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 gcc-4.1.2-48.el5 gcc-3.4.6 合格
discus164 gcc-4.1.2-48.el5 gcc-3.4.6 合格
結果: "gcc-3.4.6"のパッケージの存在チェックに合格しました

チェック: "libaio-0.3.105 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libaio-0.3.106-5 (i386) libaio-0.3.105 (i386) 合格
discus164 libaio-0.3.106-5 (i386) libaio-0.3.105 (i386) 合格
結果: "libaio-0.3.105 (i386)"のパッケージの存在チェックに合格しました

チェック: "libaio-0.3.105 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libaio-0.3.106-5 (x86_64) libaio-0.3.105 (x86_64) 合格
discus164 libaio-0.3.106-5 (x86_64) libaio-0.3.105 (x86_64) 合格
結果: "libaio-0.3.105 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "glibc-2.3.4-2.41 (i686)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 glibc-2.5-49.el5_5.6 (i686) glibc-2.3.4-2.41 (i686) 合格
discus164 glibc-2.5-49.el5_5.6 (i686) glibc-2.3.4-2.41 (i686) 合格
結果: "glibc-2.3.4-2.41 (i686)"のパッケージの存在チェックに合格しました

チェック: "glibc-2.3.4-2.41 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 glibc-2.5-49.el5_5.6 (x86_64) glibc-2.3.4-2.41 (x86_64) 合格
discus164 glibc-2.5-49.el5_5.6 (x86_64) glibc-2.3.4-2.41 (x86_64) 合格
結果: "glibc-2.3.4-2.41 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "compat-libstdc++-33-3.2.3 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 compat-libstdc++-33-3.2.3-61 (i386) compat-libstdc++-33-3.2.3 (i386) 合格
discus164 compat-libstdc++-33-3.2.3-61 (i386) compat-libstdc++-33-3.2.3 (i386) 合格
結果: "compat-libstdc++-33-3.2.3 (i386)"のパッケージの存在チェックに合格しました

チェック: "compat-libstdc++-33-3.2.3 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 compat-libstdc++-33-3.2.3-61 (x86_64) compat-libstdc++-33-3.2.3 (x86_64) 合格
discus164 compat-libstdc++-33-3.2.3-61 (x86_64) compat-libstdc++-33-3.2.3 (x86_64) 合格
結果: "compat-libstdc++-33-3.2.3 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "elfutils-libelf-0.97 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 elfutils-libelf-0.137-3.el5 (x86_64) elfutils-libelf-0.97 (x86_64) 合格
discus164 elfutils-libelf-0.137-3.el5 (x86_64) elfutils-libelf-0.97 (x86_64) 合格
結果: "elfutils-libelf-0.97 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "elfutils-libelf-devel-0.97"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 elfutils-libelf-devel-0.137-3.el5 elfutils-libelf-devel-0.97 合格
discus164 elfutils-libelf-devel-0.137-3.el5 elfutils-libelf-devel-0.97 合格
結果: "elfutils-libelf-devel-0.97"のパッケージの存在チェックに合格しました

チェック: "glibc-common-2.3.4"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 glibc-common-2.5-49.el5_5.6 glibc-common-2.3.4 合格
discus164 glibc-common-2.5-49.el5_5.6 glibc-common-2.3.4 合格
結果: "glibc-common-2.3.4"のパッケージの存在チェックに合格しました

チェック: "glibc-devel-2.3.4 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 glibc-devel-2.5-49.el5_5.6 (x86_64) glibc-devel-2.3.4 (x86_64) 合格
discus164 glibc-devel-2.5-49.el5_5.6 (x86_64) glibc-devel-2.3.4 (x86_64) 合格
結果: "glibc-devel-2.3.4 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "glibc-headers-2.3.4"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 glibc-headers-2.5-49.el5_5.6 glibc-headers-2.3.4 合格
discus164 glibc-headers-2.5-49.el5_5.6 glibc-headers-2.3.4 合格
結果: "glibc-headers-2.3.4"のパッケージの存在チェックに合格しました

チェック: "gcc-c++-3.4.6"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 gcc-c++-4.1.2-48.el5 gcc-c++-3.4.6 合格
discus164 gcc-c++-4.1.2-48.el5 gcc-c++-3.4.6 合格
結果: "gcc-c++-3.4.6"のパッケージの存在チェックに合格しました

チェック: "libaio-devel-0.3.105 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libaio-devel-0.3.106-5 (i386) libaio-devel-0.3.105 (i386) 合格
discus164 libaio-devel-0.3.106-5 (i386) libaio-devel-0.3.105 (i386) 合格
結果: "libaio-devel-0.3.105 (i386)"のパッケージの存在チェックに合格しました

チェック: "libaio-devel-0.3.105 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libaio-devel-0.3.106-5 (x86_64) libaio-devel-0.3.105 (x86_64) 合格
discus164 libaio-devel-0.3.106-5 (x86_64) libaio-devel-0.3.105 (x86_64) 合格
結果: "libaio-devel-0.3.105 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "libgcc-3.4.6 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libgcc-4.1.2-48.el5 (i386) libgcc-3.4.6 (i386) 合格
discus164 libgcc-4.1.2-48.el5 (i386) libgcc-3.4.6 (i386) 合格
結果: "libgcc-3.4.6 (i386)"のパッケージの存在チェックに合格しました

チェック: "libgcc-3.4.6 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libgcc-4.1.2-48.el5 (x86_64) libgcc-3.4.6 (x86_64) 合格
discus164 libgcc-4.1.2-48.el5 (x86_64) libgcc-3.4.6 (x86_64) 合格
結果: "libgcc-3.4.6 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "libstdc++-3.4.6 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libstdc++-4.1.2-48.el5 (i386) libstdc++-3.4.6 (i386) 合格
discus164 libstdc++-4.1.2-48.el5 (i386) libstdc++-3.4.6 (i386) 合格
結果: "libstdc++-3.4.6 (i386)"のパッケージの存在チェックに合格しました

チェック: "libstdc++-3.4.6 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libstdc++-4.1.2-48.el5 (x86_64) libstdc++-3.4.6 (x86_64) 合格
discus164 libstdc++-4.1.2-48.el5 (x86_64) libstdc++-3.4.6 (x86_64) 合格
結果: "libstdc++-3.4.6 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "libstdc++-devel-3.4.6 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 libstdc++-devel-4.1.2-48.el5 (x86_64) libstdc++-devel-3.4.6 (x86_64) 合格
discus164 libstdc++-devel-4.1.2-48.el5 (x86_64) libstdc++-devel-3.4.6 (x86_64) 合格
結果: "libstdc++-devel-3.4.6 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "sysstat-5.0.5"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 sysstat-7.0.2-3.el5_5.1 sysstat-5.0.5 合格
discus164 sysstat-7.0.2-3.el5_5.1 sysstat-5.0.5 合格
結果: "sysstat-5.0.5"のパッケージの存在チェックに合格しました

チェック: "unixODBC-2.2.11 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 unixODBC-2.2.11-7.1 (i386) unixODBC-2.2.11 (i386) 合格
discus164 unixODBC-2.2.11-7.1 (i386) unixODBC-2.2.11 (i386) 合格
結果: "unixODBC-2.2.11 (i386)"のパッケージの存在チェックに合格しました

チェック: "unixODBC-2.2.11 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 unixODBC-2.2.11-7.1 (x86_64) unixODBC-2.2.11 (x86_64) 合格
discus164 unixODBC-2.2.11-7.1 (x86_64) unixODBC-2.2.11 (x86_64) 合格
結果: "unixODBC-2.2.11 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "unixODBC-devel-2.2.11 (i386)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 unixODBC-devel-2.2.11-7.1 (i386) unixODBC-devel-2.2.11 (i386) 合格
discus164 unixODBC-devel-2.2.11-7.1 (i386) unixODBC-devel-2.2.11 (i386) 合格
結果: "unixODBC-devel-2.2.11 (i386)"のパッケージの存在チェックに合格しました

チェック: "unixODBC-devel-2.2.11 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 unixODBC-devel-2.2.11-7.1 (x86_64) unixODBC-devel-2.2.11 (x86_64) 合格
discus164 unixODBC-devel-2.2.11-7.1 (x86_64) unixODBC-devel-2.2.11 (x86_64) 合格
結果: "unixODBC-devel-2.2.11 (x86_64)"のパッケージの存在チェックに合格しました

チェック: "pdksh-5.2.14"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 pdksh-5.2.14-36.el5 pdksh-5.2.14 合格
discus164 pdksh-5.2.14-36.el5 pdksh-5.2.14 合格
結果: "pdksh-5.2.14"のパッケージの存在チェックに合格しました

チェック: "expat-1.95.7 (x86_64)"のパッケージの存在
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 expat-1.95.8-8.3.el5_5.3 (x86_64) expat-1.95.7 (x86_64) 合格
discus164 expat-1.95.8-8.3.el5_5.3 (x86_64) expat-1.95.7 (x86_64) 合格
結果: "expat-1.95.7 (x86_64)"のパッケージの存在チェックに合格しました

UID値0を持つ複数のユーザーをチェック中
結果: UID値0を持つ複数のユーザーのチェックに合格しました

チェック: 現行のグループID
結果: 現行のグループIDチェックに合格しました
コア・ファイル名パターンの一貫性をチェック中...
コア・ファイル名パターンの一貫性チェックに合格しました。

ユーザー"grid"が"root"グループにないことを確認中
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus264 存在しません 合格
discus164 存在しません 合格
結果: ユーザー"grid"は"root"グループの一部ではありません。チェックに合格しました

デフォルトのユーザー・ファイル作成マスクのチェック
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus264 0022 0022 合格
discus164 0022 0022 合格
結果: デフォルトのユーザー・ファイル作成マスクのチェックに合格しました

ネットワーク・タイム・プロトコル(NTP)を使用してクロック同期のチェックを開始中...

NTP構成ファイルのチェックが開始されました...
NTP構成ファイル"/etc/ntp.conf"はすべてのノードで使用できます
NTP構成ファイルのチェックに合格しました

デーモン活性をチェック中...

チェック: "ntpd"の活性
ノード名 実行中ですか
------------------------------------ ------------------------
discus264 はい
discus164 はい
結果: "ntpd"の活性チェックに合格しました

NTPデーモンのコマンドラインのslewオプション"-x"をチェック中
チェック: NTPデーモン・コマンド・ライン
ノード名 Slewオプションが設定されているか
------------------------------------ ------------------------
discus264 はい
discus164 はい
結果:
NTPデーモンのslewオプションのチェックに合格しました

ファイル"/etc/sysconfig/ntpd"内のNTPデーモンのブート時構成のslewオプション"-x"をチェック中

チェック: NTPデーモンのブート時構成
ノード名 Slewオプションが設定されているか
------------------------------------ ------------------------
discus264 はい
discus164 はい
結果:
NTPデーモンのブート時構成のslewオプションのチェックに合格しました

NTP共通タイム・サーバーのチェックが開始されました...
NTPタイム・サーバー"210.173.160.86"は、NTPデーモンが実行されているすべてのノードで共通です
NTPタイム・サーバー"210.173.176.251"は、NTPデーモンが実行されているすべてのノードで共通です
PRVF-5408 : NTPタイム・サーバー"210.173.160.56"は、次のノード"discus264"でのみ共通です
共通NTPタイム・サーバーのチェックに合格しました

NTPタイム・サーバーからのクロック時間オフセットのチェックが開始されました...
ノード"[discus264, discus164]"をチェック中...
チェック: NTP タイム・サーバーからのクロック時間オフセット

タイム・サーバー: 210.173.160.86
時間オフセット制限: 1000.0 ミリ秒
ノード名 時間オフセット ステータス
------------ ------------------------ ------------------------
discus264 -428.02 合格
discus164 0.164 合格
タイム・サーバー"210.173.160.86"の時間オフセットは、ノード"[discus264, discus164]"の許容限界内です。

タイム・サーバー: 210.173.176.251
時間オフセット制限: 1000.0 ミリ秒
ノード名 時間オフセット ステータス
------------ ------------------------ ------------------------
discus264 -427.36 合格
discus164 0.417 合格
タイム・サーバー"210.173.176.251"の時間オフセットは、ノード"[discus264, discus164]"の許容限界内です。
クロック時間オフセットのチェックに合格しました

結果: ネットワーク・タイム・プロトコル(NTP)を使用したクロック同期のチェックに合格しました


クラスタ・サービス設定の事前チェックはすべてのノードで失敗しました。

「結果: グループ"dba"内のユーザー"grid"のメンバーシップ・チェックが失敗しました」という箇所は無視可能というかマニュアルにもGrid Infrastructureユーザをdbaグループに属させる必要があると記載されていないので無視でOK.


次に、H/WとOSの設定の事前チェック(RACを構成する全ノードのOracle Grid Infrastructureユーザで実施)

[grid@discus164 grid]$ pwd
/home/grid/software/oracle/grid
[grid@discus164 grid]$ ll
合計 76
drwxr-xr-x 9 grid oinstall 4096 8月 17 2009 doc
drwxr-xr-x 4 grid oinstall 4096 12月 3 11:05 install
drwxrwxr-x 2 grid oinstall 4096 8月 15 2009 response
drwxrwxr-x 2 grid oinstall 4096 8月 15 2009 rpm
-rwxr-xr-x 1 grid oinstall 3227 8月 15 2009 runInstaller
-rwxrwxr-x 1 grid oinstall 3795 1月 29 2009 runcluvfy.sh
drwxrwxr-x 2 grid oinstall 4096 8月 15 2009 sshsetup
drwxr-xr-x 14 grid oinstall 4096 8月 15 2009 stage
-rw-r--r-- 1 grid oinstall 4228 8月 18 2009 welcome.html
[grid@discus164 grid]$
[grid@discus164 grid]$
[grid@discus164 grid]$ ./runcluvfy.sh stage -post hwos -n discus164,discus264 -verbose

ハードウェアとオペレーティング・システム設定の事後チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus164"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus264 はい
discus164 はい
結果: ノード"discus164"からのノード到達可能性チェックに合格しました


ユーザー等価をチェック中...

チェック: ユーザー"grid"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus264 合格
discus164 合格
結果: ユーザー"grid"のユーザー等価チェックに合格しました

ノード接続性をチェック中...

ホスト構成ファイルをチェック中...
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus264 合格
discus164 合格

ホスト構成ファイルの検証に成功しました


ノード"discus264"のインタフェース情報
名前 IPアドレス サブネット ゲートウェイ デフォルト・ゲートウェイ HWアドレス MTU
------ --------------- --------------- --------------- --------------- ----------------- ------
eth0 192.168.1.91 192.168.1.0 0.0.0.0 192.168.1.1 08:00:27:CC:3B:97 1500
eth1 192.168.3.91 192.168.3.0 0.0.0.0 192.168.1.1 08:00:27:2F:97:0D 1500
eth2 192.168.2.91 192.168.2.0 0.0.0.0 192.168.1.1 08:00:27:AD:F8:40 1500


ノード"discus164"のインタフェース情報
名前 IPアドレス サブネット ゲートウェイ デフォルト・ゲートウェイ HWアドレス MTU
------ --------------- --------------- --------------- --------------- ----------------- ------
eth0 192.168.1.90 192.168.1.0 0.0.0.0 192.168.1.1 08:00:27:B1:38:96 1500
eth1 192.168.3.90 192.168.3.0 0.0.0.0 192.168.1.1 08:00:27:FC:A5:8E 1500
eth2 192.168.2.90 192.168.2.0 0.0.0.0 192.168.1.1 08:00:27:47:E9:2C 1500


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus264:eth0 discus164:eth0 はい
結果: ノードdiscus264,discus164を持つサブネット"192.168.1.0"のノード接続性に合格しました


チェック: サブネット"192.168.1.0"のTCP接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus164:192.168.1.90 discus264:192.168.1.91 合格
結果: サブネット"192.168.1.0"のTCP接続性チェックに合格しました


チェック: サブネット"192.168.3.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus264:eth1 discus164:eth1 はい
結果: ノードdiscus264,discus164を持つサブネット"192.168.3.0"のノード接続性に合格しました


チェック: サブネット"192.168.3.0"のTCP接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus164:192.168.3.90 discus264:192.168.3.91 合格
結果: サブネット"192.168.3.0"のTCP接続性チェックに合格しました


チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus264:eth2 discus164:eth2 はい
結果: ノードdiscus264,discus164を持つサブネット"192.168.2.0"のノード接続性に合格しました


チェック: サブネット"192.168.2.0"のTCP接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus164:192.168.2.90 discus264:192.168.2.91 合格
結果: サブネット"192.168.2.0"のTCP接続性チェックに合格しました


VIPの候補となるサブネット"192.168.1.0"で見つかったインタフェースは次のとおりです:
discus264 eth0:192.168.1.91
discus164 eth0:192.168.1.90

プライベート・インターコネクトの候補となるサブネット"192.168.3.0"で見つかったインタフェースは次のとおりです:
discus264 eth1:192.168.3.91
discus164 eth1:192.168.3.90

プライベート・インターコネクトの候補となるサブネット"192.168.2.0"で見つかったインタフェースは次のとおりです:
discus264 eth2:192.168.2.91
discus164 eth2:192.168.2.90

結果: ノード接続性チェックに合格しました


UID値0を持つ複数のユーザーをチェック中
結果: UID値0を持つ複数のユーザーのチェックに合格しました

ハードウェアとオペレーティング・システム設定の事後チェックは成功しました。

次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13
VirtualBox de Oracle11g R2 RAC #14

| | | コメント (0) | トラックバック (0)

2011年1月 1日 (土)

VirtualBox de Oracle11g R2 RAC #14

VirtualBox de Oracle11g R2 RACのつづきです。

今回は、ASMlibのインストール及び構成です。(やっと半分w)

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成

[root@discus164 tmp]# uname -a
Linux discus164.macdeoracle.jp 2.6.18-194.17.1.el5 #1 SMP Wed Sep 29 12:50:31 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux


CentOS5.5 2.6.18-194.17.1.el5 x86_64なので、以下のasmパッケージをRACを構成する全ノードでインストール、構成する。

oracleasm-support-2.1.3-1.el5.x86_64.rpm
oracleasmlib-2.0.4-1.el5.x86_64.rpm
oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm

ダウンロード(RACを構成する全ノードのrootユーザで)CentOS5.5 x86_64ですが、ダウンロードするのはrhel5 amd64版でOK

[root@discus164 tmp]# wget http://oss.oracle.com/projects/oracleasm-support/dist/files/RPMS/rhel5/amd64/2.1.3/oracleasm-support-2.1.3-1.el5.x86_64.rpm
--2010-11-24 16:19:15-- http://oss.oracle.com/projects/oracleasm-support/dist/files/RPMS/rhel5/amd64/2.1.3/oracleasm-support-2.1.3-1.el5.x86_64.rpm
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 90444 (88K) [application/x-rpm]
`oracleasm-support-2.1.3-1.el5.x86_64.rpm' に保存中

100%[=================================================================================================>] 90,444 105K/s 時間 0.8s

2010-11-24 16:19:17 (105 KB/s) - `oracleasm-support-2.1.3-1.el5.x86_64.rpm' へ保存完了 [90444/90444]

[root@discus164 tmp]# wget http://download.oracle.com/otn_software/asmlib/oracleasmlib-2.0.4-1.el5.x86_64.rpm
--2010-11-24 16:19:30-- http://download.oracle.com/otn_software/asmlib/oracleasmlib-2.0.4-1.el5.x86_64.rpm
download.oracle.com をDNSに問いあわせています... 203.77.186.253, 203.77.186.254
download.oracle.com|203.77.186.253|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 14176 (14K) [text/plain]
`oracleasmlib-2.0.4-1.el5.x86_64.rpm' に保存中

100%[=================================================================================================>] 14,176 --.-K/s 時間 0.01s

2010-11-24 16:19:30 (1.33 MB/s) - `oracleasmlib-2.0.4-1.el5.x86_64.rpm' へ保存完了 [14176/14176]

[root@discus164 tmp]# wget
http://oss.oracle.com/projects/oracleasm/dist/files/RPMS/rhel5/amd64/2.0.5/2.6.18-194.17.1.el5/oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm
--2010-11-24 16:19:44-- http://oss.oracle.com/projects/oracleasm/dist/files/RPMS/rhel5/amd64/2.0.5/2.6.18-194.17.1.el5/oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 137417 (134K) [application/x-rpm]
`oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm' に保存中

100%[=================================================================================================>] 137,417 161K/s 時間 0.8s

2010-11-24 16:19:46 (161 KB/s) - `oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm' へ保存完了 [137417/137417]

[root@discus164 tmp]#

インストール(RACを構成する全ノードのrootユーザで)

[root@discus164 tmp]# rpm -ivh oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm oracleasm-support-2.1.3-1.el5.x86_64.rpm oracleasmlib-2.0.4-1.el5.x86_64.rpm
警告: oracleasm-2.6.18-194.17.1.el5-2.0.5-1.el5.x86_64.rpm: ヘッダ V3 DSA signature: NOKEY, key ID 1e5e0159
準備中... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.18-194.17########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
[root@discus164 tmp]#


構成(RACを構成する全ノードのrootユーザで)

[root@discus164 ˜]# /usr/sbin/oracleasm configure
ORACLEASM_ENABLED=false
ORACLEASM_UID=
ORACLEASM_GID=
ORACLEASM_SCANBOOT=true
ORACLEASM_SCANORDER=""
ORACLEASM_SCANEXCLUDE=""
[root@discus164 ˜]# /usr/sbin/oracleasm configure -i
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting without typing an
answer will keep that current value. Ctrl-C will abort.

Default user to own the driver interface []: grid
Default group to own the driver interface []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
[root@discus164 ˜]#
[root@discus164 ˜]# /usr/sbin/oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Mounting ASMlib driver filesystem: /dev/oracleasm
[root@discus164 ˜]#

ASMディスクの作成(RACを構成する1ノードのrootユーザで実行する)
iSCSIとして作成したデバイスへ作成する。

[root@discus164 iscsi]# ls -l /dev/iscsi/*
/dev/iscsi/openfiler:asm1:
合計 0
lrwxrwxrwx 1 root root 9 11月 24 10:39 part -> ../../sdb
lrwxrwxrwx 1 root root 10 11月 24 10:39 part1 -> ../../sdb1

/dev/iscsi/openfiler:asm2:
合計 0
lrwxrwxrwx 1 root root 9 11月 24 10:39 part -> ../../sdf
lrwxrwxrwx 1 root root 10 11月 24 10:39 part1 -> ../../sdf1

/dev/iscsi/openfiler:asm3:
合計 0
lrwxrwxrwx 1 root root 9 11月 24 10:39 part -> ../../sde
lrwxrwxrwx 1 root root 10 11月 24 10:39 part1 -> ../../sde1

/dev/iscsi/openfiler:asm4:
合計 0
lrwxrwxrwx 1 root root 9 11月 24 10:39 part -> ../../sdd
lrwxrwxrwx 1 root root 10 11月 24 10:39 part1 -> ../../sdd1

/dev/iscsi/openfiler:crs1:
合計 0
lrwxrwxrwx 1 root root 9 11月 24 10:39 part -> ../../sdg
lrwxrwxrwx 1 root root 10 11月 24 10:39 part1 -> ../../sdg1

/dev/iscsi/openfiler:crs2:
合計 0
lrwxrwxrwx 1 root root 9 11月 24 10:39 part -> ../../sdc
lrwxrwxrwx 1 root root 10 11月 24 10:39 part1 -> ../../sdc1
[root@discus164 iscsi]#
[root@discus164 iscsi]# /usr/sbin/oracleasm createdisk CRSVOL1 /dev/iscsi/openfiler:crs1/part1
Writing disk header: done
Instantiating disk: done
[root@discus164 iscsi]# /usr/sbin/oracleasm createdisk CRSVOL2 /dev/iscsi/openfiler:crs2/part1
Writing disk header: done
Instantiating disk: done
[root@discus164 iscsi]# /usr/sbin/oracleasm createdisk DATAVOL1 /dev/iscsi/openfiler:asm1/part1
Writing disk header: done
Instantiating disk: done
[root@discus164 iscsi]# /usr/sbin/oracleasm createdisk DATAVOL2 /dev/iscsi/openfiler:asm2/part1
Writing disk header: done
Instantiating disk: done
[root@discus164 iscsi]# /usr/sbin/oracleasm createdisk FRAVOL1 /dev/iscsi/openfiler:asm3/part1
Writing disk header: done
Instantiating disk: done
[root@discus164 iscsi]# /usr/sbin/oracleasm createdisk FRAVOL2 /dev/iscsi/openfiler:asm4/part1
Writing disk header: done
Instantiating disk: done
[root@discus164 iscsi]#

ASMディスクを確認(RACを構成する全ノードのrootユーザで)
ASMディスクを作成したノード以外で scandisksコマンドを実行して認識させる。

[root@discus264 ˜]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "FRAVOL2"
Instantiating disk "FRAVOL1"
Instantiating disk "DATAVOL1"
Instantiating disk "CRSVOL2"
Instantiating disk "DATAVOL2"
Instantiating disk "CRSVOL1"
[root@discus264 ˜]#

listdisksコマンドでASMディスクが認識されたか確認!

[root@discus164 ˜]# 
[root@discus164 ˜]#
[root@discus164 ˜]# /usr/sbin/oracleasm listdisks
CRSVOL1
CRSVOL2
DATAVOL1
DATAVOL2
FRAVOL1
FRAVOL2
[root@discus164 ˜]#

[root@discus264 ˜]# 
[root@discus264 ˜]#
[root@discus264 ˜]# /usr/sbin/oracleasm listdisks
CRSVOL1
CRSVOL2
DATAVOL1
DATAVOL2
FRAVOL1
FRAVOL2
[root@discus264 ˜]#

次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12
VirtualBox de Oracle11g R2 RAC #13

| | | コメント (0) | トラックバック (0)

2010年12月31日 (金)

VirtualBox de Oracle11g R2 RAC #13

VirtualBox de Oracle11g R2 RACのつづきです。

RACを構成する各ノードの構成ファイルを確認しておきま〜す。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle RACノード構成ファイルの確認

RACを構成する各ノードの構成ファイルをざっと確認。ここまでの作業でRACを構成する各ノードの構成ファイルは以下のようになっているはず…

/etc/hosts

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
#::1 localhost6.localdomain6 localhost6

#for public network
192.168.1.90 discus164.macdeoracle.jp discus164
192.168.1.91 discus264.macdeoracle.jp discus264
192.168.1.92 arowana2.macdeoracle.jp arowana2

#for Oracle Interconnect private network
192.168.3.90 discus164-priv.macdeoracle.jp discus164-priv
192.168.3.91 discus264-priv.macdeoracle.jp discus264-priv

#for iSCSI private network
192.168.2.92 arowana2-priv.macdeoracle.jp arowana2-priv
192.168.2.90 discus164-iscsi.macdeoracle.jp discus164-iscsi
192.168.2.91 discus264-iscsi.macdeoracle.jp discus264-iscsi

#for virtual public network
192.168.1.190 discus164-vip.macdeoracle.jp discus164-vip
192.168.1.191 discus264-vip.macdeoracle.jp discus264-vip

192.168.1.2 lampeye.macdeoracle.jp lampeye


/etc/security/limits.conf

[root@discus164 security]# diff -u limits.conf.org limits.conf
--- limits.conf.org 2010-03-12 02:24:15.000000000 +0900
+++ limits.conf 2010-11-24 11:10:30.000000000 +0900
@@ -48,3 +48,11 @@
#@student - maxlogins 4

# End of file
+grid soft nproc 2047
+grid hard nproc 16384
+grid soft nofile 1024
+grid hard nofile 65536
+oracle soft nproc 2047
+oracle hard nproc 16384
+oracle soft nofile 1024
+oracle hard nofile 65536
[root@discus164 security]#


/etc/pam.d/login

[root@discus164 pam.d]# diff -u login.org login
--- login.org 2010-01-20 19:36:29.000000000 +0900
+++ login 2010-11-24 11:16:33.000000000 +0900
@@ -12,3 +12,4 @@
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session optional pam_keyinit.so force revoke
+session required pam_limits.so
[root@discus164 pam.d]#


/etc/profile

[root@discus164 etc]# diff -u profile.org profile
--- profile.org 2009-09-22 08:27:09.000000000 +0900
+++ profile 2010-11-24 11:21:27.000000000 +0900
@@ -56,3 +56,12 @@

unset i
unset pathmunge
+if [ $USER = "oracle" ] || [ $USER = "grid" ]; then
+ if [ $SHELL = "/bin/ksh" ]; then
+ ulimit -p 16384
+ ulimit -n 65536
+ else
+ ulimit -u 16384 -n 65536
+ fi
+ umask 022
+fi
[root@discus164 etc]#


/etc/sysctl.conf

[root@discus164 ˜]# sysctl -a | grep -E '(se|sh)m|file-max|aio-max-nr|ip_local_port_range|(w|r)mem_(default|max)'
net.ipv4.ip_local_port_range = 32768 61000
net.core.rmem_default = 129024
net.core.wmem_default = 129024
net.core.rmem_max = 131071
net.core.wmem_max = 131071
vm.hugetlb_shm_group = 0
kernel.sem = 250 32000 32 128
kernel.shmmni = 4096
kernel.shmall = 4294967296
kernel.shmmax = 68719476736
fs.aio-max-nr = 65536
fs.file-max = 371217
[root@discus164 ˜]#


/etc/udev/rules.d/55-openiscsi.rules

[root@discus164 ˜]# cat /etc/udev/rules.d/55-openiscsi.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"
[root@discus164 ˜]#


/etc/udev/scripts

[root@discus164 ˜]# cd /etc/udev/scripts
[root@discus164 scripts]# cat iscsidev.sh
#!/bin/sh

# FILE: /etc/udev/scripts/iscsidev.sh

BUS=${1}
HOST=${BUS%%:*}
[ -e /sys/class/iscsi_host ] || exit 1

file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"

target_name=$(cat ${file})

# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
exit 1
fi

echo "${target_name##*.}"
[root@discus164 scripts]#

/etc/ntp.conf

[root@discus164 ˜]# cat /etc/ntp.conf
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default kod nomodify notrap nopeer noquery

# Permit all access over the loopback interface. This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1
#restrict -6 ::1

# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).

#broadcast 192.168.1.255 key 42 # broadcast server
#broadcastclient # broadcast client
#broadcast 224.0.1.1 key 42 # multicast server
#multicastclient 224.0.1.1 # multicast client
#manycastserver 239.255.254.254 # manycast server
#manycastclient 239.255.254.254 key 42 # manycast client

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
#server 127.127.1.0
#fudge 127.127.1.0 stratum 10

# Drift file. Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
driftfile /var/lib/ntp/drift

# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys

# Specify the key identifiers which are trusted.
#trustedkey 4 8 42

# Specify the key identifier to use with the ntpdc utility.
#requestkey 8

# Specify the key identifier to use with the ntpq utility.
#controlkey 8
server 192.168.1.2
server 192.168.1.2
server 192.168.1.2
restrict 192.168.1.2 mask 255.255.255.255 nomodify notrap noquery
[root@discus164 ˜]#


/etc/sysconfig/ntpd

[root@discus164 ˜]# cat /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"

# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=yes

# Additional options for ntpdate
NTPDATE_OPTIONS="-B"
[root@discus164 ˜]#

/etc/host.conf

[root@discus164 ˜]$ cat /etc/host.conf
order hosts,bind

Oracle Grid Infrastructureユーザや、Oracle所有者の確認はこちら

念のためにuserとgroupのスナップショットを乗せておきますね。

Users

Groups


Openfier側構成(ゾンビセッション抑止などは以前の記事参照のこと)


次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11
VirtualBox de Oracle11g R2 RAC #12

| | | コメント (0) | トラックバック (0)

2010年12月26日 (日)

VirtualBox de Oracle11g R2 RAC #12

VirtualBox de Oracle11g R2 RACのつづきです。

今回はRACノード構成ファイルの確認という予定だったのですが、DNSの構成を別建てにして置く事にします。量が多いので (^^;;

構成するDNSは、ローカルネットワークかつRACを構成するノードの管理さえできればいいので、ローカルネームサーバとして機能すれば十分。
ということで、RAC向けローカルネームサーバを構成することにします。(DNSは素人なので調べるほうが大変だったw)


では、さっそくやってみましょう。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

DNSの構成

悩んだのが、DNSをどこにたてるかということ。いろいろ悩んでいたんですが、元ネタの1つからいいアイデアもらいました。
それは、DNSをOpenfiler上に構成するということ。ストレージサーバなのでRACを構成する各ノードより先に起動していますし。:)

最初にやるのはDNSサーバを最新版にアップデートすること。でもでもでもですね。以前痛い目にあっていたのでOpenfilerというかrPath Linuxのパッケージ管理は無効化していたんです。このままじゃDNSの最新パッケージを使えないので一時的に使えるようにします。

Openfilerのパッケージ管理は、conaryというrPath Linux由来のものが利用されています。/etc/conaryrcの内容をすべてコメントアウトして利用できないようしてあります。

[root@arowana2 ˜]# cat /etc/conaryrc
#installLabelPath openfiler.rpath.org@ofns:2 conary.rpath.com@rpl:1
#pinTroves (kernel|linux-image-2\.6\.[0-9]+-[0-9]+(-[a-z]+)?)([:-].*|$)
#autoResolve True
#includeConfigFile /etc/conary/config.d/*
[root@arowana2 ˜]#

コメントアウトしていただけなのですぐに利用できるように戻せるのだ! :)

[root@arowana2 ˜]# cat /etc/conaryrc
installLabelPath openfiler.rpath.org@ofns:2 conary.rpath.com@rpl:1
pinTroves (kernel|linux-image-2\.6\.[0-9]+-[0-9]+(-[a-z]+)?)([:-].*|$)
autoResolve True
includeConfigFile /etc/conary/config.d/*
[root@arowana2 ˜]#

conaryをつかってbindを最新版にアップデート!!

[root@arowana2 ˜]# conary update bind:runtime

Conary

確認! 最新版になりました!

[root@arowana2 ˜]# conary q bind
bind=9.4.3_P5-1.1-1

再び、conaryを無効化しておく。(トラウマなだけで今は安定しているかもしれんw だけど止めとくw)

[root@arowana2 ˜]# cat /etc/conaryrc
#installLabelPath openfiler.rpath.org@ofns:2 conary.rpath.com@rpl:1
#pinTroves (kernel|linux-image-2\.6\.[0-9]+-[0-9]+(-[a-z]+)?)([:-].*|$)
#autoResolve True
#includeConfigFile /etc/conary/config.d/*
[root@arowana2 ˜]#


Openfiler(host名:arowana2)で、DNSの構成を始めるにあたって参考にしたサイトを書いておきますね。

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - 2.7.4 グリッド・ネーミング・サービスの構成例
Openfiler側にDNSを立てるというアイデアを頂いたサイト。元ネタの1つでもある。
DNSの素人なりにいろいろググって見つけたすげー参考になったサイト「月刊NetworkWorld連載『DNSの仕組み完全解説』」(ありがとうございます!)


今回構築するRACのネットワーク構成は以前の書いたが以下のように構成する。

RACを構成するノード1 (hostname=discus164.macdeoracle.jp)
Hostname タイプ IP address 名前解決方法
discus164 Public 192.168.1.90 hostsおよびDNS
discus164-iscsi Private 192.168.2.90
discus164-priv Private 192.168.3.90
discus164-vip Virtual 192.168.1.190
RACを構成するノード2 (hostname=discus264.macdeoracle.jp)
Hostname タイプ IP address 名前解決方法
discus264 Public 192.168.1.91 hostsおよびDNS
discus264-iscsi Private 192.168.2.91
discus264-priv Private 192.168.3.91
discus264-vip Virtual 192.168.1.191
SCAN VIP1/2/3
Hostname タイプ IP address 名前解決方法
discus-rac64-scan Virtual 192.168.1.200 DNS
discus-rac64-scan 192.168.1.201
discus-rac64-scan 192.168.1.202
Openfiler2.3(iSCSI) - (hostname=arowana2.macdeoracle.jp)
Hostname タイプ IP address 名前解決方法
arowana2 Public 192.168.1.92 hostsおよびDNS
arowana2-priv Private 192.168.2.92

・DNSの構成

/etc/resolv.confの構成は以下の通り。ローカルipアドレスを利用しているRACの各ノードやOpenfilerは/etc/hostsとdnsで解決できるようにしておきます。ipアドレスはすべて固定です。
[root@arowana2 ˜]# cat /etc/resolv.conf
search macdeoracle.jp
nameserver 192.168.1.92

; Forward Lookup Zone
discus164 IN A 192.168.1.90
discus264 IN A 192.168.1.91
discus164-priv IN A 192.168.3.90
discus264-priv IN A 192.168.3.91
discus164-iscsi IN A 192.168.2.90
discus264-iscsi IN A 192.168.2.91
discus164-vip IN A 192.168.1.190
discus264-vip IN A 192.168.1.191
arowana2 IN A 192.168.1.92
arowana2-priv IN A 192.168.2.92
discus-rac64-scan IN A 192.168.1.200
discus-rac64-scan IN A 192.168.1.201
discus-rac64-scan IN A 192.168.1.202

; Reverse Lookup Zone
90 IN PTR discus164.macdeoracle.jp.
91 IN PTR discus264.nacdeiracle,jp.
190 IN PTR discus164-vip.macdeoracle.jp.
191 IN PTR discus264-vip.macdeoracle.jp.
200 IN PTR discus-rac64-scan.macdeoracle.jp.
201 IN PTR discus-rac64-scan.macdeoracle.jp.
202 IN PTR discus-rac64-scan.macdeoracle.jp.
[root@arowana2 ˜]#


/etc/named.confの構成。(逆引き/正引きのゾーン設定や上位DNSへの回送設定)
逆引きの設定で、RACで利用しているローカルipアドレス以外はダーミーゾーンに設定しているところがポイント。気になっていたところなのでググってよい参考サイト見つけられてよかった。ほんと感謝、感謝。

[root@arowana2 ˜]# cat /etc/named.conf
# DNS configuration file for Oracle RAC 11g release 2

options {


// FORWARDERS: Forward any name this DNS can't resolve to my router.
forwarders { 192.168.1.1; };

// DIRECTORY: Directory where named will look for zone files.
directory "/srv/named/data";

//allow query requests
allow-query { 192.168.0.0/22; };
};

# ----------------------------------
# Forward Zone
# ----------------------------------

zone "macdeoracle.jp" IN {
type master;
file "macdeoracle.jp.zone";
allow-update { none; };
};

# ----------------------------------
# Reverse Zone
# ----------------------------------

zone "1.168.192.in-addr.arpa" IN {
type master;
file "1.168.192.in-addr.arpa.zone";
allow-update { none; };
};

zone "168.192.in-addr.arpa" IN {
type master;
file "dummy.zone";
notify no;
};

zone "0.0.127.in-addr.arpa" IN {
type master;
file "0.0.127.in-addr.arpa.zone";
notify no;
};

# ----------------------------------
# private addresses dummy Zone
# ---------------------------------

zone "10.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "16.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "17,172,in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "18.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "19.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "20.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "21.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "22.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "23.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "24.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "25.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "26.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "27.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "28.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "29.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "30.172.in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

zone "31.172,in-addr.arpa" {
type master;
file "dummy.zone";
notify no;
};

[root@arowana2 ˜]#


・以下、正引き/逆引き用ゾーンファイルの作成
/srv/named/data/macdeoracle.jp.zoneの作成(正引き用ゾーンファイル)

[root@arowana2 ˜]# cat /srv/named/data/macdeoracle.jp.zone
; +-------------------------------------------------------------------+
; | /srv/named/data/macdeoracle.jp.zone |
; | |
; | Forward zone definition file for macdeoracle.jp zone |
; +-------------------------------------------------------------------+

$ORIGIN macdeoracle.jp.

$TTL 86400 ; time-to-live - (1 day)

@ IN SOA arowana2.macdeoracle.jp. discus.lampeye.macdeoracle.jp. (
201011021 ; serial number - (yyyymmdd+s)
7200 ; refresh - (2 hours)
300 ; retry - (5 minutes)
604800 ; expire - (1 week)
60 ; minimum - (1 minute)
)
IN NS arowana2.macdeoracle.jp.
localhost IN A 127.0.0.1

; Oracle RAC Nodes
discus164 IN A 192.168.1.90
discus264 IN A 192.168.1.91
discus164-priv IN A 192.168.3.90
discus264-priv IN A 192.168.3.91
discus164-iscsi IN A 192.168.2.90
discus264-iscsi IN A 192.168.2.91
discus164-vip IN A 192.168.1.190
discus264-vip IN A 192.168.1.191

; Network Storage Server
arowana2 IN A 192.168.1.92
arowana2-priv IN A 192.168.2.92

; Single Client Access Name (SCAN) virtual IP
discus-rac64-scan IN A 192.168.1.200
discus-rac64-scan IN A 192.168.1.201
discus-rac64-scan IN A 192.168.1.202

; Miscellaneous Nodes
lampeye IN A 192.168.1.2
[root@arowana2 ˜]#


/srv/named/data/168.192.in-addr.arpa.zon(逆引き用ゾーンファイル)の作成

[root@arowana2 data]# cat 168.192.in-addr.arpa.zone
; +-------------------------------------------------------------------+
; | /srv/named/data/168.192.in-addr.arpa.zone |
; | |
; | Reverse zone definition file for 168.192.in-addr.arpa.zone |
; +-------------------------------------------------------------------+

$ORIGIN 168.192.in-addr.arpa.

$TTL 86400 ; time-to-live - (1 day)

@ IN SOA arowana2.macdeoracle.jp. discus.lampeye.macdeoracle.jp. (
201011021 ; serial number - (yyyymmdd+s)
7200 ; refresh - (2 hours)
300 ; retry - (5 minutes)
604800 ; expire - (1 week)
60 ; minimum - (1 minute)
)
IN NS arowana2.macdeoracle.jp.

; Oracle RAC Nodes
90 IN PTR discus164.macdeoracle.jp.
91 IN PTR discus264.macdeoracle.jp.
190 IN PTR discus164-vip.macdeoracle.jp.
191 IN PTR discus264-vip.macdeoracle.jp.

; Network Storage Server
92 IN PTR arowana2.macdeoracle.jp.

; Single Client Access Name (SCAN) virtual IP
200 IN PTR discus-rac64-scan.macdeoracle.jp.
201 IN PTR discus-rac64-scan.macdeoracle.jp.
202 IN PTR discus-rac64-scan.macdeoracle.jp.

; Miscellaneous Nodes
2 IN PTR lampeye.macdeoracle.jp.
[root@arowana2 data]#


ローカルホスト(127.0.0.1)の逆引きゾーンの定義

[root@arowana2 ˜]# cat /srv/named/data/0.0.127.in-addr.arpa.zone
; +-------------------------------------------------------------------+
; | /srv/named/data/0.0.127.in-addr.arpa.zone |
; | |
; | Reverse zone definition file for 0.0.127.in-addr.arpa.zone |
; +-------------------------------------------------------------------+

$ORIGIN 0.0.127.in-addr.arpa.

$TTL 86400 ; time-to-live - (1 day)

@ IN SOA arowana2.macdeoracle.jp. discus.lampeye.macdeoracle.jp. (
201011021 ; serial number - (yyyymmdd+s)
7200 ; refresh - (2 hours)
300 ; retry - (5 minutes)
604800 ; expire - (1 week)
60 ; minimum - (1 minute)
)
IN NS arowana2.macdeoracle.jp.

; localhost
1 IN PTR localhost.
[root@arowana2 ˜]#


/srv/named/data/dummy.zone(ダミーゾーンファイル)の作成
「月刊NetworkWorld連載『DNSの仕組み完全解説』」の記事を参考にローカルipアドレスの逆引きの問い合わせが外部のDNSに発生しないようにするために利用するダミーゾーンファイルの定義を以下のように作成した。

[root@arowana2 ˜]# cat /srv/named/data/dummy.zone
; +-------------------------------------------------------------------+
; | /srv/named/data/dummy.zone |
; +-------------------------------------------------------------------+


$TTL 86400 ; time-to-live - (1 day)

@ IN SOA arowana2.macdeoracle.jp. discus.lampeye.macdeoracle.jp. (
201011021 ; serial number - (yyyymmdd+s)
28800 ; refresh - (2 hours)
2700 ; retry - (5 minutes)
604800 ; expire - (1 week)
3600 ; minimum - (1 minute)
)
IN NS arowana2.macdeoracle.jp.
[root@arowana2 ˜]#


構成できたらnamedを自動起動設定にしてnamedを起動

[root@arowana2 ˜]# chkconfig named on
[root@arowana2 ˜]# chkconfig --list named
named 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@arowana2 ˜]# service named start
Starting named: [ OK ]

ここまでてdnsの設定はおしまい。前述の作業はすべてOpenfilerを乗せているサーバ上で行った。


つづいて、RACを構成する各ノードでOpenfiler上に構成したローカルネームサーバを参照させるように設定する。
/etc/host.confの構成(RACを構成する全ノード及び、Openfilerを構成したノード)

/etc/hostsを優先させる。/etc/hostsを見てもらうとわかるけど、dnsと重複定義している。無駄と言えばむだだと思うけど。SCAN VIPだけdns管理すればOKなのかってとこまでは見えてないからそれはそれで別途確認だな→TODO
[oracle@discus164 ˜]$ cat /etc/host.conf
order hosts,bind


/etc/hostsの構成(RACを構成する全ノード及び、Openfilerを構成したノード)

[oracle@discus164 ˜]$ cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
#::1 localhost6.localdomain6 localhost6

#for public network
192.168.1.90 discus164.macdeoracle.jp discus164
192.168.1.91 discus264.macdeoracle.jp discus264
192.168.1.92 arowana2.macdeoracle.jp arowana2

#for Oracle Interconnect private network
192.168.3.90 discus164-priv.macdeoracle.jp discus164-priv
192.168.3.91 discus264-priv.macdeoracle.jp discus264-priv

#for iSCSI private network
192.168.2.92 arowana2-priv.macdeoracle.jp arowana2-priv
192.168.2.90 discus164-iscsi.macdeoracle.jp discus164-iscsi
192.168.2.91 discus264-iscsi.macdeoracle.jp discus264-iscsi

#for virtual public network
192.168.1.190 discus164-vip.macdeoracle.jp discus164-vip
192.168.1.191 discus264-vip.macdeoracle.jp discus264-vip


192.168.1.2 lampeye.macdeoracle.jp lampeye
[oracle@discus164 ˜]$

これで準備OK.続いて動作確認!

・正引きテスト

最初に外部サイトが引けるか確認…OK.

[root@discus164 ˜]# nslookup openfiler.com
Server: 192.168.1.92
Address: 192.168.1.92#53

Non-authoritative answer:
Name: openfiler.com
Address: 84.45.94.236

[root@discus164 ˜]#

次に内部…
[root@discus164 ˜]# nslookup lampeye 
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: lampeye.macdeoracle.jp
Address: 192.168.1.2

[root@discus164 ˜]# nslookup discus164
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: discus164.macdeoracle.jp
Address: 192.168.1.90

[root@discus164 ˜]# nslookup discus164-vip
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: discus164-vip.macdeoracle.jp
Address: 192.168.1.190

[root@discus164 ˜]# nslookup discus264
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: discus264.macdeoracle.jp
Address: 192.168.1.91

[root@discus164 ˜]# nslookup discus264-vip
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: discus264-vip.macdeoracle.jp
Address: 192.168.1.191

[root@discus164 ˜]# nslookup discus-rac64-scan
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: discus-rac64-scan.macdeoracle.jp
Address: 192.168.1.201
Name: discus-rac64-scan.macdeoracle.jp
Address: 192.168.1.202
Name: discus-rac64-scan.macdeoracle.jp
Address: 192.168.1.200

[root@discus164 ˜]# nslookup localhost
Server: 192.168.1.92
Address: 192.168.1.92#53

Name: localhost.macdeoracle.jp
Address: 127.0.0.1


・逆引きテスト

[root@discus164 ˜]# nslookup 192.168.1.200
Server: 192.168.1.92
Address: 192.168.1.92#53

200.1.168.192.in-addr.arpa name = discus-rac64-scan.macdeoracle.jp.

[root@discus164 ˜]# nslookup 192.168.1.201
Server: 192.168.1.92
Address: 192.168.1.92#53

201.1.168.192.in-addr.arpa name = discus-rac64-scan.macdeoracle.jp.

[root@discus164 ˜]# nslookup 192.168.1.202
Server: 192.168.1.92
Address: 192.168.1.92#53

202.1.168.192.in-addr.arpa name = discus-rac64-scan.macdeoracle.jp.

[root@discus164 ˜]# nslookup 192.168.1.90
Server: 192.168.1.92
Address: 192.168.1.92#53

90.1.168.192.in-addr.arpa name = discus164.macdeoracle.jp.

[root@discus164 ˜]# nslookup 192.168.1.91
Server: 192.168.1.92
Address: 192.168.1.92#53

91.1.168.192.in-addr.arpa name = discus264.macdeoracle.jp.

[root@discus164 ˜]# nslookup 192.168.1.190
Server: 192.168.1.92
Address: 192.168.1.92#53

190.1.168.192.in-addr.arpa name = discus164-vip.macdeoracle.jp.

[root@discus164 ˜]# nslookup 192.168.1.191
Server: 192.168.1.92
Address: 192.168.1.92#53

191.1.168.192.in-addr.arpa name = discus264-vip.macdeoracle.jp.


[root@discus164 ˜]# nslookup 127.0.0.1
Server: 192.168.1.92
Address: 192.168.1.92#53

1.0.0.127.in-addr.arpa name = localhost.

[root@discus164 ˜]#

これでOK次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10
VirtualBox de Oracle11g R2 RAC #11

| | | コメント (0) | トラックバック (0)

2010年12月25日 (土)

VirtualBox de Oracle11g R2 RAC #11

VirtualBox de Oracle11g R2 RACのつづきです。

今回は、RACノード間リモートアクセスの構成です。
Oracle11g R2 11.2.0.2.0ではパスフレーズなしでSSHを構成する必要があるのですが、OUIが自動構成してくれるということ、また、インストレーションガイドでもOUIの自動構成を利用するよう推奨されているんですが、今回はちょっと意地悪なことをしてみます。事前にパスワード付きでSSHを構成しておき、OUIがパスワードなしのSSH構成行われていないと認識しちゃんと自動構成してくれるか見てみます。

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - 2.13 インストール時におけるSSHの自動構成
Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - E.1 すべてのクラスタ・ノードでの手動によるSSHの構成

では、さっそくやってみましょう。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle RACノード間リモートアクセスの構成
念のために行った、多分、実施しなくても大丈夫だと思うけど…ちょいと意地悪な実験をしてみた)

sshパッケージの確認。(RACを構成する全ノードで)

[root@discus164 etc]# rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n"| grep ssh
openssh-server-4.3p2-41.el5_5.1 (x86_64)
openssh-askpass-4.3p2-41.el5_5.1 (x86_64)
openssh-clients-4.3p2-41.el5_5.1 (x86_64)
openssh-4.3p2-41.el5_5.1 (x86_64)
[root@discus164 etc]#


Oracle11g R2 11.2.0.2.0以降ではSSHのユーザの等価化ではパスフレーズなしのみサポートされているのだとか。なんなく面白そうなので、今回は手動でユーザの等価化をわざわざサポートされていないというパスフレーズ付きで実施してみた(ユーザの等価化チェックでエラーとなりOUI側で自動的にパスフレーズなしのユーザ等価化が行われるはず、なのでどうなるか楽しみ!!!)

RACを構成する全ノードのgrid infrastrucreユーザと/oracle所有者で実施する。(Oracle11g 11.2.0.2.0において手動でSSHのユーザ等価化を行う場合、パスフレーズを入力する箇所でパスフレーズを入力せず、[ENTER]キーをタイプすればOKなのですが、今回は、あえてパスフレーズを入力してあります。ログ上ではパスフレーズを入力していないように見えますが.)

[root@discus164 ˜]# su - grid
[grid@discus164 ˜]$
[grid@discus164 ˜]$ mkdir ˜/.ssh
[grid@discus164 ˜]$ chmod 700 ˜/.ssh
[grid@discus164 ˜]$ /usr/bin/ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/grid/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/grid/.ssh/id_dsa.
Your public key has been saved in /home/grid/.ssh/id_dsa.pub.
The key fingerprint is:
ba:bb:09:72:94:94:d6:29:99:12:7f:d2:a6:a6:60:0a grid@discus164.macdeoracle.jp
[grid@discus164 ˜]$

[root@discus164 ˜]#
[root@discus164 ˜]# su - oracle
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ mkdir ˜/.ssh
[oracle@discus164 ˜]$ chmod 700 ˜/.ssh
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ /usr/bin/ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/oracle/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/oracle/.ssh/id_dsa.
Your public key has been saved in /home/oracle/.ssh/id_dsa.pub.
The key fingerprint is:
88:5d:b0:ec:80:8c:59:ed:22:f7:d8:88:6d:6c:41:1a oracle@discus164.macdeoracle.jp
[oracle@discus164 ˜]$


以下の操作はRAC上の1ノードから行えばOK。ただ、gid infrastructureユーザとOracle所有者の両ユーザで行う必要があるのでご注意を。11.2.0.2.0以降では以前のリリースのように神経質にならなくてもいいかもね。sshの構成に関しては……
Oracle Grid Infrastructureユーザから…

[root@discus164 ˜]# su - grid
[grid@discus164 ˜]$
[grid@discus164 ˜]$
[grid@discus164 ˜]$ touch ˜/.ssh/authorized_keys
[grid@discus164 ˜]$ cd ˜/.ssh
[grid@discus164 .ssh]$ ls -l *.pub
-rw-r--r-- 1 grid oinstall 619 11月 24 13:11 id_dsa.pub
[grid@discus164 .ssh]$ ssh discus164 cat ˜/.ssh/id_dsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus164 (192.168.1.90)' can't be established.
RSA key fingerprint is 15:90:e9:89:98:8e:ed:3f:67:7b:d4:e7:97:6b:58:c5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus164,192.168.1.90' (RSA) to the list of known hosts.
grid@discus164's password:
[grid@discus164 .ssh]$ ssh discus264 cat ˜/.ssh/id_dsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus264 (192.168.1.91)' can't be established.
RSA key fingerprint is 55:80:d3:23:4f:82:44:4b:b8:89:02:d8:69:31:7e:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus264,192.168.1.91' (RSA) to the list of known hosts.
grid@discus264's password:
[grid@discus164 .ssh]$ scp ˜/.ssh/authorized_keys discus264:.ssh/authorized_keys
grid@discus264's password:
authorized_keys 100% 1238 1.2KB/s 00:00
[grid@discus164 .ssh]$ chmod 600 ˜/.ssh/authorized_keys
[grid@discus164 .ssh]$
[grid@discus164 ˜]$ ssh discus164 hostname
Enter passphrase for key '/home/grid/.ssh/id_dsa':
discus164.macdeoracle.jp
[grid@discus164 ˜]$ ssh discus264 hostname
Enter passphrase for key '/home/grid/.ssh/id_dsa':
discus264.macdeoracle.jp
[grid@discus164 ˜]$


次はOracle所有者で… 11.2.0.2.0以降パスブレーズなしにする必要があるのですがわざと入れてます (^^)

[root@discus164 ˜]# su - oracle
[oracle@discus164 ˜]$ touch ˜/.ssh/authorized_keys
[oracle@discus164 ˜]$ cd ˜/.ssh
[oracle@discus164 .ssh]$ ls -l *.pub
-rw-r--r-- 1 oracle oinstall 621 11月 24 13:14 id_dsa.pub
[oracle@discus164 .ssh]$ ssh discus164 cat ˜/.ssh/id_dsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus164 (192.168.1.90)' can't be established.
RSA key fingerprint is 15:90:e9:89:98:8e:ed:3f:67:7b:d4:e7:97:6b:58:c5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus164,192.168.1.90' (RSA) to the list of known hosts.
oracle@discus164's password:
[oracle@discus164 .ssh]$ ssh discus264 cat ˜/.ssh/id_dsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus264 (192.168.1.91)' can't be established.
RSA key fingerprint is 55:80:d3:23:4f:82:44:4b:b8:89:02:d8:69:31:7e:f5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus264,192.168.1.91' (RSA) to the list of known hosts.
oracle@discus264's password:
[oracle@discus164 .ssh]$ scp ˜/.ssh/authorized_keys discus264:.ssh/authorized_keys
oracle@discus264's password:
authorized_keys 100% 1242 1.2KB/s 00:00
[oracle@discus164 .ssh]$ chmod 600 ˜/.ssh/authorized_keys
[oracle@discus164 .ssh]$ cd
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ ssh discus164 hostname
Enter passphrase for key '/home/oracle/.ssh/id_dsa':
discus164.macdeoracle.jp

[oracle@discus164 ˜]$ ssh discus264 hostname
Enter passphrase for key '/home/oracle/.ssh/id_dsa':
discus264.macdeoracle.jp
[oracle@discus164 ˜]$


確認! gird infrastructureユーザとOracle所有者の両方で。

[oracle@discus164 ˜]$ 
[oracle@discus164 ˜]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus164 ˜]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_dsa:
Identity added: /home/oracle/.ssh/id_dsa (/home/oracle/.ssh/id_dsa)
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ ssh discus164 hostname
discus164.macdeoracle.jp
[oracle@discus164 ˜]$ ssh discus264 hostname
discus264.macdeoracle.jp
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ exit
exit
[root@discus164 ˜]# su - grid
[grid@discus164 ˜]$ exec /usr/bin/ssh-agent $SHELL
[grid@discus164 ˜]$ /usr/bin/ssh-add
Enter passphrase for /home/grid/.ssh/id_dsa:
Identity added: /home/grid/.ssh/id_dsa (/home/grid/.ssh/id_dsa)
[grid@discus164 ˜]$ ssh discus164 hostname
discus164.macdeoracle.jp
[grid@discus164 ˜]$ ssh discus264 hostname
discus264.macdeoracle.jp
[grid@discus164 ˜]$


最後に、sttyコマンドよるインストールエラーメッセージ抑止(全ノードの grid/oracleユーザで実施)

参考:Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - 2.14.5 インストール中にsttyコマンドによって発生するエラーの防止

[grid@discus164 ˜]$ su - oracle
パスワード:
[oracle@discus164 ˜]$ vi .bashrc
[oracle@discus164 ˜]$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions
if [ -t 0 ]; then
stty intr ^C
fi
[oracle@discus164 ˜]$


ここで、やる予定ではなかったのですが、次いでなのでNTPの設定もついでにやっちゃいました。

Host OS側で公開NTPサーバと同期、VirtualBox上に作成したRACを構成する各Guest OSは、Host OSをNTPサーバとして同期する。
このようにしておけば公開NTPサーバを参照するのはHost OSだけなので余計な問い合わせを押さえることができますよね。


RACを構成する全ノード及び、iSCSIでも同じ構成にしてあります。ちなみに、192.168.1.2がHost OS

/etc/ntp.confと/etc/sysconfig/ntpdで構成します。ntpはslewモードで調整するよう設定します。

[root@discus164 ˜]# cat /etc/ntp.conf
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default kod nomodify notrap nopeer noquery

# Permit all access over the loopback interface. This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1
#restrict -6 ::1

# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).

#broadcast 192.168.1.255 key 42 # broadcast server
#broadcastclient # broadcast client
#broadcast 224.0.1.1 key 42 # multicast server
#multicastclient 224.0.1.1 # multicast client
#manycastserver 239.255.254.254 # manycast server
#manycastclient 239.255.254.254 key 42 # manycast client

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
#server 127.127.1.0
#fudge 127.127.1.0 stratum 10

# Drift file. Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
driftfile /var/lib/ntp/drift

# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys

# Specify the key identifiers which are trusted.
#trustedkey 4 8 42

# Specify the key identifier to use with the ntpdc utility.
#requestkey 8

# Specify the key identifier to use with the ntpq utility.
#controlkey 8
server 192.168.1.2
server 192.168.1.2
server 192.168.1.2
restrict 192.168.1.2 mask 255.255.255.255 nomodify notrap noquery
[root@discus164 ˜]#

[root@discus164 ˜]# cat /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"

# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=yes

# Additional options for ntpdate
NTPDATE_OPTIONS="-B"
[root@discus164 ˜]#


HostOS側は公開NTPサーバと同期するので以下のような設定にしてあります。

[root@lampeye ˜]# cat /etc/ntp.conf
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default kod nomodify notrap nopeer noquery

# Permit all access over the loopback interface. This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1

# Hosts on local network are less restricted.
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server -4 ntp.nict.jp minpoll 8 maxpoll 12
server -4 ntp.nict.jp minpoll 8 maxpoll 12
server -4 ntp.nict.jp minpoll 8 maxpoll 12

#broadcast 192.168.1.255 key 42 # broadcast server
#broadcastclient # broadcast client
#broadcast 224.0.1.1 key 42 # multicast server
#multicastclient 224.0.1.1 # multicast client
#manycastserver 239.255.254.254 # manycast server
#manycastclient 239.255.254.254 key 42 # manycast client

# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server 127.127.1.0 #local clock
fudge 127.127.1.0 stratum 10

# Drift file. Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
driftfile /var/lib/ntp/drift

# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys

# Specify the key identifiers which are trusted.
#trustedkey 4 8 42

# Specify the key identifier to use with the ntpdc utility.
#requestkey 8

# Specify the key identifier to use with the ntpq utility.
#controlkey 8
restrict ntp.nict.jp mask 255.255.255.255 nomodify notrap noquery
[root@lampeye ˜]#

[root@lampeye ˜]# cat /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"

# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=yes

# Additional options for ntpdate
NTPDATE_OPTIONS="-B"
[root@lampeye ˜]#


service ntpd restart で再起動。しばらくしてから…

Host OSがntpサーバと同期できているか確認!!

[root@lampeye ˜]# ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
*210.171.226.40 .NICT. 1 u 38 1024 377 10.447 59.103 9.904
127.127.1.0 .LOCL. 10 l 22 64 377 0.000 0.000 0.001
[root@lampeye ˜]#

公開NTPサーバと同期できています。:)


次はRACを構成する各ノードでHost OSと同期しているか確認します。"*"が表示されているのでうまくいっているようですね。 :)

[root@discus164 ˜]# ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.1.2 210.171.226.40 2 u 95 128 377 0.179 121.450 39.443
[root@discus164 ˜]#

[root@discus264 ˜]# ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.1.2 210.171.226.40 2 u 5 128 377 0.288 214.652 43.610
[root@discus264 ˜]#

[root@arowana2 ˜]# ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.1.2 210.171.226.40 2 u 35 128 377 0.278 -83.188 0.087
[root@arowana2 ˜]#

ということで次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9
VirtualBox de Oracle11g R2 RAC #10

| | | コメント (0) | トラックバック (0)

2010年12月21日 (火)

VirtualBox de Oracle11g R2 RAC #10

VirtualBox de Oracle11g R2 RACのつづきです。

今回は、カーネルパラメータの調整、その他。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

Oracle Databaseインストレーション・ガイド 11gリリース2(11.2) for Linux - 2.8 Oracleインストール所有者のシェル制限の構成

前述のマニュアルに従い各構成ファイルを設定します。(RACを構成する全ノードで実施します。)

/etc/security/limits.confの設定(差分を載せています)

[root@discus164 security]# diff -u limits.conf.org limits.conf
--- limits.conf.org 2010-03-12 02:24:15.000000000 +0900
+++ limits.conf 2010-11-24 11:10:30.000000000 +0900
@@ -48,3 +48,11 @@
#@student - maxlogins 4

# End of file
+grid soft nproc 2047
+grid hard nproc 16384
+grid soft nofile 1024
+grid hard nofile 65536
+oracle soft nproc 2047
+oracle hard nproc 16384
+oracle soft nofile 1024
+oracle hard nofile 65536
[root@discus164 security]#


/etc/pam.d/loginの設定(差分のみ載せています)

[root@discus164 pam.d]# diff -u login.org login
--- login.org 2010-01-20 19:36:29.000000000 +0900
+++ login 2010-11-24 11:16:33.000000000 +0900
@@ -12,3 +12,4 @@
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session optional pam_keyinit.so force revoke
+session required pam_limits.so
[root@discus164 pam.d]#


/etc/profileの設定(差分のみ載せています)

[root@discus164 etc]# diff -u profile.org profile
--- profile.org 2009-09-22 08:27:09.000000000 +0900
+++ profile 2010-11-24 11:21:27.000000000 +0900
@@ -56,3 +56,12 @@

unset i
unset pathmunge
+if [ $USER = "oracle" ] || [ $USER = "grid" ]; then
+ if [ $SHELL = "/bin/ksh" ]; then
+ ulimit -p 16384
+ ulimit -n 65536
+ else
+ ulimit -u 16384 -n 65536
+ fi
+ umask 022
+fi
[root@discus164 etc]#


メモリ及びスワップの要件確認(RACを構成する全ノードで実施)
Oracle Databaseインストレーション・ガイド 11gリリース2(11.2) for Linux - 2.2.1 メモリー要件

[root@discus264 ~]# 
[root@discus264 ~]# cat /proc/meminfo | grep MemTotal
MemTotal: 4051640 kB
[root@discus264 ~]# cat /proc/meminfo | grep SwapTotal
SwapTotal: 6094840 kB
[root@discus264 ~]#


カーネルパラメータの設定(RACを構成する全ノードで実施)
Oracle Databaseインストレーション・ガイド 11gリリース2(11.2) for Linux - 2.9 カーネル・パラメータの構成

[root@discus164 ~]# sysctl -a | grep -E '(se|sh)m|file-max|aio-max-nr|ip_local_port_range|(w|r)mem_(default|max)'
net.ipv4.ip_local_port_range = 32768 61000
net.core.rmem_default = 129024
net.core.wmem_default = 129024
net.core.rmem_max = 131071
net.core.wmem_max = 131071
vm.hugetlb_shm_group = 0
kernel.sem = 250 32000 32 128
kernel.shmmni = 4096
kernel.shmall = 4294967296
kernel.shmmax = 68719476736
fs.aio-max-nr = 65536
fs.file-max = 371217
[root@discus164 ~]#

変更の必要があるのはsem/file-max/aio-max-nr/ip_local_port_range/rmem/wmenね。マニュアルの推奨値に設定します。
(以下、差分だけ載せています。)

[root@discus164 etc]# diff -u sysctl.conf.org sysctl.conf
--- sysctl.conf.org 2010-11-24 12:17:12.000000000 +0900
+++ sysctl.conf 2010-11-24 12:17:48.000000000 +0900
@@ -33,3 +33,12 @@

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
+# parameter setting for oracle
+net.ipv4.ip_local_port_range = 9000 65500
+kernel.sem = 250 32000 100 128
+fs.aio-max-nr = 1048576
+fs.file-max = 6815744
+net.core.rmem_default = 262144
+net.core.rmem_max = 4194304
+net.core.wmem_default = 262144
+net.core.wmem_max = 1048576
[root@discus164 etc]#
[root@discus164 etc]#
[root@discus164 etc]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.ip_local_port_range = 9000 65500
kernel.sem = 250 32000 100 128
fs.aio-max-nr = 1048576
fs.file-max = 6815744
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
[root@discus164 etc]#


次回は、RACノード間リモートアクセスの構成へ続きます!(本場のミソカツ食べたお)






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8
VirtualBox de Oracle11g R2 RAC #9

| | | コメント (0) | トラックバック (0)

2010年12月19日 (日)

VirtualBox de Oracle11g R2 RAC #9

VirtualBox de Oracle11g R2 RACのつづきです。

さて、やっと、Oracle所有者と関連ディレクトリの作成及び環境変数の設定作業まできました〜。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2その3
  6. Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

・Oracle所有者、Oracle Grid Infrastructureユーザの作成と関連ディレクトリの作成及び環境変数の設定


Oracle11g R2からOracle Grid Infrastructure(以前はOracle Clusterwareって言われていたやつにASMが組み込まれたと思えばいいのかな?)となり、Oracle所有者以外にOracle Grid Infrastructreユーザの作成が推奨されるようになったので、今回からはOracle所有者に加えてOracle Grid Infrastructureユーザも作成します。

さらに、asmadminやasmdbaといった新顔のグループも必要になり以前より手間が増えてる。 :)

グループの追加方法や、ユーザの作成方法はコマンドでやるもよし、GUIでやるもよし。好きなのを選べばよいと思います。
ノード数が多いとGUIではやらないと思いますけど2ノードですから気にする事ないと思いますよ。:)

で、フループも必要最低限で、oinstall/dba/asmadmin/asmdbaの4グループを作成します。

グループやユーザをコマンドで作成する方法はマニュアルにも記載されていので省略します。
参考:
http://download.oracle.com/docs/cd/E16338_01/install.112/b56271/prelinux.htm#CFIJDFIB
http://download.oracle.com/docs/cd/E16338_01/install.112/b56273/pre_install.htm#BABHHEJD
http://download.oracle.com/docs/cd/E16338_01/install.112/b56271/prelinux.htm#BABBIDCF


以下完成した状態、以下のようになっていればOK. 
[root@discus164 ˜]# 
[root@discus164 ˜]# cat /etc/group | grep -E '(oinstall|dba|asm*)'
oinstall:x:601:oracle,grid
dba:x:602:oracle
asmadmin:x:603:grid
asmdba:x:604:oracle,grid
[root@discus164 ˜]#
[root@discus164 ˜]# cat /etc/passwd | grep -E '(oracle|grid)'
oracle:x:601:601:oracle:/home/oracle:/bin/bash
grid:x:602:601:grid:/home/grid:/bin/bash
[root@discus164 ˜]#
[root@discus164 ˜]# id -a grid
uid=602(grid) gid=601(oinstall) 所属グループ=601(oinstall),603(asmadmin),604(asmdba) context=user_u:system_r:unconfined_t
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# id -a oracle
uid=601(oracle) gid=601(oinstall) 所属グループ=601(oinstall),602(dba),604(asmdba) context=user_u:system_r:unconfined_t


・ORACLE_BASE及びORACLE_HOMEディレクトリの作成

Oracle Grid InfrastructureユーザのORACLE_BASE/ORACLE_HOMEディレクトリ及び、Oracleソフトウェア所有者のORACLE_BASEディレクトリを作成しておきます。

Oracle Grid InfrastrucreユーザのORACLE_BASE=/u01/app/grid、ORACLE_HOME=/u01/app/11.2.0/grid、そして、Oracleソフトウェア所有者のORACLE_BASE=/u01/app/oracle となるように作成しておきます。

RACを構成する全ノードで実施します。

[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# mkdir -p /u01/app/grid
[root@discus164 ˜]# mkdir -p /u01/app/11.2.0/grid
[root@discus164 ˜]# chown -R grid:oinstall /u01
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# mkdir -p /u01/app/oracle
[root@discus164 ˜]# chown -R oracle:oinstall /u01/app/oracle
[root@discus164 ˜]# chmod -R 755 /u01
[root@discus164 ˜]#

[root@discus264 ˜]#
[root@discus264 ˜]#
[root@discus264 ˜]# mkdir -p /u01/app/grid
[root@discus264 ˜]# mkdir -p /u01/app/11.2.0/grid
[root@discus264 ˜]# chown -R grid:oinstall /u01
[root@discus264 ˜]#
[root@discus264 ˜]#
[root@discus264 ˜]# mkdir -p /u01/app/oracle
[root@discus264 ˜]# chown -R oracle:oinstall /u01/app/oracle
[root@discus264 ˜]# chmod -R 755 /u01
[root@discus264 ˜]#
[root@discus264 ˜]#


・環境変数


インストールの際には必要最低限の環境変数でいいんだけどね。設定してても問題になった事は、いまのところないのでこの時点で設定しちゃってます。

参考:
http://download.oracle.com/docs/cd/E16338_01/server.112/b56317/admin_ora.htm#i46652

ところで、Oracle11g だけど、ORA_NLS10なんだね。

でも、http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05816-01/app_initparam.htm#BABGIEFDというGateways系のパラメータではORA_NLS11で同じパスをさすんだけど、紛らわしいから環境変数もORA_NLS11にしちゃえばわかりやすいのにと思うのは私だけ?…


・Oracle Grid Infrastructureユーザの環境変数の例(RACを構成する全ノードのOracle Grid Infrastructureユーザに設定します)

Oracleソフトウェア所有者とはORACLE_SID、ORACLE_BASE環境変数の値が異なっていることに注意!
Oracle Grid InfrastructureユーザはASM管理者でもあるので。

この辺の設定も以前より手間が増えた部分ですね〜。

なお、ついでなので2.14.5 インストール中にsttyコマンドによって発生するエラーの防止対応を行っています。


[grid@discus164 ˜]$  cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions
if [ -t 0 ]; then
stty intr ^C
fi
[grid@discus164 ˜]$
[grid@discus164 ˜]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ˜/.bashrc ]; then
. ˜/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

#for Oracle Grid Infrastructure Owner
#for Grid Infrastructure Owner
# ORACLE_SID : discus164では+ASM1 , discus264では+ASM2をセット
export ORACLE_SID=+ASM1
# ORACLE_BASE/ORACLE_HOME: Grid InfrastructreユーザとOracleソフトウェア所有者では異なるので要注意
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export ORACLE_PATH=.:/u01/app/oracle/common/oracle/sql
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH
export NLS_LANG=Japanese_japan.al32utf8
export PATH=.:$ORACLE_HOME/bin:$PATH
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
export TNS_ADMIN=$ORACLE_HOME/network/admin
umask 022
[grid@discus164 ˜]$
[grid@discus164 ˜]$

[grid@discus264 ˜]$  cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions
if [ -t 0 ]; then
stty intr ^C
fi
[grid@discus264 ˜]$
[grid@discus264 ˜]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ˜/.bashrc ]; then
. ˜/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

#for Grid Infrastructure Owner
# ORACLE_SID : discus164では+ASM1 , discus264では+ASM2をセット
export ORACLE_SID=+ASM2
# ORACLE_BASE/ORACLE_HOME: Grid InfrastructreユーザとOracleソフトウェア所有者では異なるので要注意
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export ORACLE_PATH=.:/u01/app/oracle/common/oracle/sql
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH
export NLS_LANG=Japanese_japan.al32utf8
export PATH=.:$ORACLE_HOME/bin:$PATH
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
export TNS_ADMIN=$ORACLE_HOME/network/admin
umask 022
[grid@discus264 ˜]$
[grid@discus264 ˜]$

・Oracleソフトウェア所有者の環境変数の例(RACを構成する全ノードのOracleソフトウェア所有者に設定します)


以下、全ノードの設定内容。Oracleソフトウェア所有者の役割はいままで通り。今回作成するデータベースのSIDプリフィックスを orcl にするので
各ノードのORACLE_SID環境変数は orcl1/orcl2 に設定してあります。
[oracle@discus164 ˜]$  cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions
if [ -t 0 ]; then
stty intr ^C
fi
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ˜/.bashrc ]; then
. ˜/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

#for Oracle Owner
# ORACLE_SID : discus164ではorcl1 , discus264ではorcl2をセット
export ORACLE_SID=orcl1
# ORACLE_BASE/ORACLE_HOME: Grid InfrastructreユーザとOracleソフトウェア所有者では異なるので要注意
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_PATH=.:$ORACLE_BASE/common/oracle/sql
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH
export NLS_LANG=Japanese_japan.al32utf8
export PATH=.:$ORACLE_HOME/bin:$PATH
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
export TNS_ADMIN=$ORACLE_HOME/network/admin
# enterprise manager向け (作成するデータベースユニーク名は:orclなのでorclを設定しておく)
export ORACLE_UNQNAME=orcl
umask 022
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$

[oracle@discus264 ˜]$  cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions
if [ -t 0 ]; then
stty intr ^C
fi
[oracle@discus264 ˜]$
[oracle@discus264 ˜]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ˜/.bashrc ]; then
. ˜/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

#for Oracle Owner
# ORACLE_SID : discus164ではorcl1 , discus264ではorcl2をセット
export ORACLE_SID=orcl2
# ORACLE_BASE/ORACLE_HOME: Grid InfrastructreユーザとOracleソフトウェア所有者では異なるので要注意
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_PATH=.:$ORACLE_BASE/common/oracle/sql
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export CLASSPATH=$ORACLE_HOME/jre:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:$CLASSPATH
export NLS_LANG=Japanese_japan.al32utf8
export PATH=.:$ORACLE_HOME/bin:$PATH
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
export TNS_ADMIN=$ORACLE_HOME/network/admin
umask 022
[oracle@discus264 ˜]$

ということで次回カーネルパラメータなどの設定へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7
VirtualBox de Oracle11g R2 RAC #8

| | | コメント (0) | トラックバック (0)

2010年12月18日 (土)

VirtualBox de Oracle11g R2 RAC #8

VirtualBox de Oracle11g R2 RACのつづきです。

前回はiSCSI targetにローカルデバイス名をマッピングしたとこまででした。今回は前回iSCSIターゲットをマッピングしたローカルデバイスにパーティションを作成します。(
手順は前回と同じなので、そちらも参考に。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2、その3
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成(念のために行った、多分、実施しなくても大丈夫だと思うけど。別途確認する予定)
  9. Oracle RACノード構成ファイルの確認
  10. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  11. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  12. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  13. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  14. Oracle11g R2 11.2.0.1.0 examplesのインストール
  15. Oracle Cluster databaseの作成
  16. Net Serviceの確認
  17. Oralce Grid InsfastructureとDatabase構成の確認
  18. Clusterの開始と停止の確認
  19. 簡単なTransparent Application Failover (TAF)の確認

・パーティション

iSCSIターゲットを対応づけたローカルデバイスへfdiskコマンドでパーティションを作成します。

今回は、/dev/iscsi/openfiler:asm1/part、/dev/iscsi/openfiler:asm2/part、/dev/iscsi/openfiler:asm3/part、/dev/iscsi/openfiler:asm4/part、/dev/iscsi/openfiler:crs1/part、/dev/iscsi/openfiler:crs2/partに対して1パーティションを作成し利用可能な全シリンダを割り当てる。
尚、この操作はRACを構成するノードの1ノードからrootユーザとして実施する。

手順は前回の記事を参照のこと。ということで省略します。

最終的に以下の赤字部分の6パーティションが追加されることになります。RACを構成する全ノードで実施。

[root@discus164 ˜]# partprobe
[root@discus164 ˜]# fdisk -l

Disk /dev/sda: 53.6 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 6527 52323705 8e Linux LVM

Disk /dev/sde: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = シリンダ数 of 4154 * 512 = 2126848 bytes

デバイス Boot Start End Blocks Id System
/dev/sde1 1 1009 2095662 83 Linux

Disk /dev/sdc: 22.5 GB, 22548578304 bytes
64 heads, 32 sectors/track, 21504 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdc1 1 21504 22020080 83 Linux

Disk /dev/sdd: 22.5 GB, 22548578304 bytes
64 heads, 32 sectors/track, 21504 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdd1 1 21504 22020080 83 Linux

Disk /dev/sdf: 22.5 GB, 22548578304 bytes
64 heads, 32 sectors/track, 21504 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdf1 1 21504 22020080 83 Linux

Disk /dev/sdg: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = シリンダ数 of 4154 * 512 = 2126848 bytes

デバイス Boot Start End Blocks Id System
/dev/sdg1 1 1009 2095662 83 Linux

Disk /dev/sdb: 22.5 GB, 22548578304 bytes
64 heads, 32 sectors/track, 21504 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdb1 1 21504 22020080 83 Linux
[root@discus164 ˜]#
[root@discus164 ˜]#


・確認
パーティションの作成が済んだらRACの全ノードでrootユーザとしてパーティションが認識されているか確認する。RACを構成する全ノードで。

[root@discus164 ˜]# 
[root@discus164 ˜]#
[root@discus164 ˜]# cd /dev/disk/by-path; ls -l *openfiler* | awk '{print $9 " " $10 " " $11}'
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm1-lun-0 -> ../../sdb
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm1-lun-0-part1 -> ../../sdb1
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm2-lun-0 -> ../../sdc
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm2-lun-0-part1 -> ../../sdc1
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm3-lun-0 -> ../../sdd
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm3-lun-0-part1 -> ../../sdd1
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm4-lun-0 -> ../../sdf
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:asm4-lun-0-part1 -> ../../sdf1
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:crs1-lun-0 -> ../../sde
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:crs1-lun-0-part1 -> ../../sde1
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:crs2-lun-0 -> ../../sdg
ip-192.168.2.92:3260-iscsi-iqn.2006-01.com.openfiler:crs2-lun-0-part1 -> ../../sdg1
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ls -l /dev/iscsi/*/*
lrwxrwxrwx 1 root root 9 12月 18 13:40 /dev/iscsi/openfiler:asm1/part -> ../../sdb
lrwxrwxrwx 1 root root 10 12月 18 13:40 /dev/iscsi/openfiler:asm1/part1 -> ../../sdb1
lrwxrwxrwx 1 root root 9 12月 18 13:40 /dev/iscsi/openfiler:asm2/part -> ../../sdc
lrwxrwxrwx 1 root root 10 12月 18 13:40 /dev/iscsi/openfiler:asm2/part1 -> ../../sdc1
lrwxrwxrwx 1 root root 9 12月 18 13:40 /dev/iscsi/openfiler:asm3/part -> ../../sdd
lrwxrwxrwx 1 root root 10 12月 18 13:40 /dev/iscsi/openfiler:asm3/part1 -> ../../sdd1
lrwxrwxrwx 1 root root 9 12月 18 13:40 /dev/iscsi/openfiler:asm4/part -> ../../sdf
lrwxrwxrwx 1 root root 10 12月 18 13:40 /dev/iscsi/openfiler:asm4/part1 -> ../../sdf1
lrwxrwxrwx 1 root root 9 12月 18 13:40 /dev/iscsi/openfiler:crs1/part -> ../../sde
lrwxrwxrwx 1 root root 10 12月 18 13:40 /dev/iscsi/openfiler:crs1/part1 -> ../../sde1
lrwxrwxrwx 1 root root 9 12月 18 13:40 /dev/iscsi/openfiler:crs2/part -> ../../sdg
lrwxrwxrwx 1 root root 10 12月 18 13:40 /dev/iscsi/openfiler:crs2/part1 -> ../../sdg1
[root@discus164 ˜]#


2010/12//20追記
忘れてた、前回気づいたCentOS5.5でのiscsidの問題。これに対処しておかないと、Openfiler側に多数のゾンビセッションが残ってしまうので要注意!

ということで次回へつづく。






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5
VirtualBox de Oracle11g R2 RAC #6
VirtualBox de Oracle11g R2 RAC #7


| | | コメント (0) | トラックバック (0)

2010年12月10日 (金)

VirtualBox de Oracle11g R2 RAC #6

VirtualBox de Oracle11g R2 RACのつづきです。

前回はOpenfiler側でその準備をしたところまででした。今回はOracle RACの各ノードでiSCSIボリュームの構成です。

今回も以前行ったCentOS5.2(x86)内容と同じ手順なのでそちらの記事も参考してくださいね。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

・RACを構成する全ノードでiscsi-initiator-utilsがインストールされていることを確認。

インストールされていなかったらyumでインストールしてね。

[root@discus164 ˜]# 
[root@discus164 ˜]#
[root@discus164 ˜]# yum list installed iscsi-initiator-utils | grep installed
iscsi-initiator-utils.x86_64 6.2.0.871-0.16.el5 installed
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ssh discus264 "yum list installed iscsi-initiator-utils | grep installed"
root@discus264's password:
iscsi-initiator-utils.x86_64 6.2.0.871-0.16.el5 installed
[root@discus164 ˜]#
[root@discus164 ˜]#

・iscsiの起動確認、起動してなかったら service iscsi startで起動.

[root@discus164 ˜]# 
[root@discus164 ˜]# service iscsi status
iscsid (pid 1998) を実行中...
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ssh discus264 "service iscsi status"
root@discus264's password:
iscsid (pid 1996) を実行中...
[root@discus164 ˜]#
[root@discus164 ˜]#

・自動起動の確認、自動起動になってなかったら chkconfig iscsi on で設定.

[root@discus164 ˜]# chkconfig --list iscsi
iscsi 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@discus164 ˜]#
[root@discus164 ˜]# ssh discus264 "chkconfig --list iscsi"
root@discus264's password:
iscsi 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@discus164 ˜]#
[root@discus164 ˜]#

以下、CentOS5.5では iscsiを起動・停止すればiscsidも起動・停止されるので前述のようになっていればOK.
[root@discus164 ˜]#
[root@discus164 ˜]# cat /etc/rc.d/init.d/iscsi | grep iscsid
status iscsid
/etc/init.d/iscsid start
/etc/init.d/iscsid stop
status iscsid
[root@discus164 ˜]#
[root@discus164 ˜]#

/etc/iscsi/initiatorname.iscsiの設定.わかりやすいIQNにするといいですよん。

[root@discus164 ˜]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2010-10.jp.macdeoracle.discus1
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ssh root@discus264 "cat /etc/iscsi/initiatorname.iscsi"
root@discus264's password:
InitiatorName=iqn.2010-10.jp.macdeoracle.discus2
[root@discus164 ˜]#

・iscsi-targetの検出
OpenfilerとRACの各ノードは、VirtualBoxの内部ネットワークアダプタ(VM間でしか通信できない)を利用してprivateネットワークで繋いでおり、Openfiler側で許可したipアドレスからの接続しか受け付けないよう設定していましたよね?、覚えてます?
で、Openfiler側のprivateネットワークのipアドレスは、192.168.2.92と設定したので、 iscsi-targetの検出先は前述のipアドレスということにまります。

なので iscsiadmコマンドの -p パラメータに設定する ipアドレスは 192.168.2.92となっているわけです。

iscsi-targetが検出されました〜! 検出されたiscsi-targetへの接続確認、自動接続設定へと続きます。

[root@discus164 ˜]# 
[root@discus164 ˜]# cat /etc/hosts | grep arowana2-priv
192.168.2.92 arowana2-priv.macdeoracle.jp arowana2-priv
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# iscsiadm -m discovery -t sendtargets -p 192.168.2.92
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm1
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm2
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm4
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:crs2
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm3
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:crs1
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ssh discus264 "iscsiadm -m discovery -t sendtargets -p 192.168.2.92"
root@discus264's password:
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm3
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:crs2
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm1
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm2
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:asm4
192.168.2.92:3260,1 iqn.2006-01.com.openfiler:crs1
[root@discus164 ˜]#
[root@discus164 ˜]#

・iscsi-targetへの手動接続(RACを構成する全ノードで試してください。以下、discus164からの例。)

[root@discus164 ˜]# 
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:crs1 -p 192.168.2.92 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:crs2 -p 192.168.2.92 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm1 -p 192.168.2.92 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm2 -p 192.168.2.92 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm3 -p 192.168.2.92 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm4 -p 192.168.2.92 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]#

ちなみに…手動ログアウトする場合は -l の部分を -u に変えて実行すればOK.

[root@discus164 ˜]# 
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:crs1 -p 192.168.2.92 -u
Logging out of session [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Logout of [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
[root@discus164 ˜]#
[root@discus164 ˜]#

iscsi-targetへの自動接続設定(RACを構成する全ノードで実施します。以下discus164からの例)

[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:crs1 -p 192.168.2.92 --op update -n node.startup -v automatic
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:crs2 -p 192.168.2.92 --op update -n node.startup -v automatic
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm1 -p 192.168.2.92 --op update -n node.startup -v automatic
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm2 -p 192.168.2.92 --op update -n node.startup -v automatic
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm3 -p 192.168.2.92 --op update -n node.startup -v automatic
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:asm4 -p 192.168.2.92 --op update -n node.startup -v automatic
[root@discus164 ˜]
[root@discus164 ˜]#

ちなみに…手動接続に戻す場合は automatic の部分を manual に変えて実行すればOK.(多分、使う事ないと思いますけど、念のため)

[root@discus164 ˜]# 
[root@discus164 ˜]#
[root@discus164 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:crs1 -p 192.168.2.92 --op update -n node.startup -v manual
[root@discus164 ˜]#
[root@discus164 ˜]#

自動接続設定がうまく言っているか確認しましょう。
これまでの手順通りに操作していれば、RACを構成する各ノードから各iscsi-targetへ接続されている状態になっているはずです。

まず、サービスを停止してiscsi-targetからログアウトされるか確認してみます。

[root@discus164 ˜]# 
[root@discus164 ˜]#
[root@discus164 ˜]# service iscsi stop
Logging out of session [sid: 1, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Logging out of session [sid: 2, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Logging out of session [sid: 3, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Logging out of session [sid: 4, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Logging out of session [sid: 5, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Logging out of session [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Logout of [sid: 1, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
Logout of [sid: 2, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
Logout of [sid: 3, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
Logout of [sid: 4, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
Logout of [sid: 5, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
Logout of [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
Stopping iSCSI daemon:
[root@discus164 ˜]# [ OK ]
[root@discus164 ˜]#
[root@discus164 ˜]# ssh discus264 "service iscsi stop"
root@discus264's password:
Logging out of session [sid: 1, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Logging out of session [sid: 2, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Logging out of session [sid: 3, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Logging out of session [sid: 4, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Logging out of session [sid: 5, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Logging out of session [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Logout of [sid: 1, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
Logout of [sid: 2, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
Logout of [sid: 3, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
Logout of [sid: 4, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
Logout of [sid: 5, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
Logout of [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
Stopping iSCSI daemon:
[root@discus164 ˜]#

うまくいきました。次はiscsiサービスを起動して各iscsi-targetへ自動接続されるか確認します。

[root@discus164 ˜]# service iscsi start
iscsid が停止していますが PID ファイルが残っています
Starting iSCSI daemon: [ OK ]
[ OK ]
iSCSI ターゲットを設定中: Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
[ OK ]
[root@discus164 ˜]#
[root@discus164 ˜]#
[root@discus164 ˜]# ssh discus264 "service iscsi start"
root@discus264's password:
iscsid が停止していますが PID ファイルが残っています
[ OK ] iSCSI daemon: [ OK ]
[ OK ]
iSCSI ターゲットを設定中: Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
[ OK ]
[root@discus164 ˜]#
[root@discus164 ˜]#

うまく接続できたようです。

最後にOpenfilerの管理画面で接続状態を確認してみます。

20101210_150418

今日はこの辺で。





これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4
VirtualBox de Oracle11g R2 RAC #5

| | | コメント (0) | トラックバック (0)

2010年12月 9日 (木)

VirtualBox de Oracle11g R2 RAC #5

VirtualBox de Oracle11g R2 RACのつづきです。

Openfiler2.3のインストールとiSCSIボリュームの構成なのですが、VMでもリアルなマシンへのインストールとの違いは無いので詳しくは書きません。以前の記事を参考にしてくださいね。(ネットワーク関連は前回の記事もあわせてご覧ください

なお、今回Openfier2.3 (x86)向けに作成したVM (x86 red hat linux)は、CPU*2/RAM:2GB/DISK:100GBとしてあります。
Openfiler2.3 (x86)インストール時のパーティションは/bootに100MB、/に4GB、swapにメモリサイズの倍で4GBを配分し、残りの91.9GBを未割当としました。
未割当とした91.9GBをiSCSIボリュームで利用することになります。(この未割当分が大切。この時点ではパーティションに割り当てないで残しておいてね)

NOTE:
この時点では/etc/hostsファイルだけで、DNSは利用していません。Oracle11g R2 11.2.0.1.0 RACインストール事前作業Oracle RACノード間リモートアクセスの構成が終わったあとでDNSの構成を行います。(OpenfilerにDNSを構成することにしたので、このタイミングでDNSの構成とhostsファイルの構成を行うほうがよいとは思うのですが…


Openfiler2.3によるiSCSIボリュームの構成はこちらを参考に…
Mac de Oracle - 10万円未満 de RAC (11g編)#4 - 4. Openfiler2.3によるiSCSIボリュームの構成

以前と違う点は、Oracle11g R2からVoting diskとOCRがASM管理可能となったので全ボリュームをASM管理で行うことにしました。

という1点だけ。(iSCSIボリュームで利用する残り91.9GBをどのような割合で論理ボリュームへ配分したかは後述)

以前までOracleの共有ディスク・クラスタ・ファイルシステム(ocfs2)をインストールしていましたが今回は利用しません。Oracle11g R2でもVoting diskとOCRの共有ディスク・クラスタ・ファイルシステム管理は可能なようですが…)

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

以前の記事参照ください…ばかりだと、今回書く事がなくなってしまうのでiSCSIのボリューム構成で今回変えたところを書いておきますね。
(今回はすべてASM管理下に置くので…)

Openfiler2.3(x86)インストール完了後、/etc/hostsに設定した内容は以下の通り。

[root@arowana2 ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost

192.168.1.92 arowana2.macdeoracle.jp arowana2
192.168.1.90 discus164.macdeoracle.jp discus164
192.168.1.91 discus264.macdeoracle.jp discus264

192.168.2.92 arowana2-priv.macdeoracle.jp arowana2-priv
192.168.2.90 discus164-iscsi.macdeoracle.jp discus164-iscsi
192.168.2.91 discus264-iscsi.macdeoracle.jp discus264-iscsi

192.168.1.2 lampeye.macdeoracle.jp lampeye
[root@arowana2 ˜]#


今回作成するiSCSI論理ボリュームおよびターゲット名などは以下の通り。
(Openfilerの構成手順はMac de Oracle - 10万円未満 de RAC (11g編)#4を参照のこと。)

・ネットワークアクセスの構成

前回の書いた通り、iSCSI専用の経路でアクセスできるようdiscus164-iscsiおよびdiscus264-iscsiからのみOpenfilerへ接続できるよう設定した。
Network_access_configuration_2


・Partitionの作成および、Volume groupの作成

91.9GBの未割当領域を/dev/sda4としてパーティション割当を行った後、rac1というVolume Groupを作成し/dev/sda4を割り当てる。

Block_device_management

Volume_group_management


・論理ボリュームの割当

rac1(前述の操作で作成したVolume Group)を選択し、論理ボリュームを追加する。今回はcrs向けに2GBの論理ボリューム2つ、OracleのData向けに21GBの論理ボリューム2つ、そして、Fast Recovory Area向けに21GBの論理ボリュームを2つを追加作成する。(91.9GBのうち、88GBを利用したので3.9GBほど残っちゃいましたけどね)

Volume_management


・iSCSI Target Qualified Name(IQN)の設定

crs向けに2つ、Oracle data file向けに2つ、Oralce Fast Recovery Area向けに2つのボリュームグループを作成したので、それぞれにiSCSI Target Qualified Nameを割り当てた。

CRS向け - iqn.2006-01.com.openfiler:crs1 および crs2
Oracle Data file向け - iqn.2006-01.com.openfiler:asm1 および asm2
Oracle Fast Recovery Area向け - iqn.2006-01.com.openfiler:asm3 および asm4

asm1〜4より、data1/2とか fra1/2にしたほうがわかりやすかったですね〜…後から反省。


Iscsi_target


・Network ACLの設定

RACを構成する2ノードのiscsi用privateネットワーク(discus164-iscsiおよび、discus264-iscsi(からのアクセスを許可するよう設定した。

Network_acl


・LUNマッピング

iSCSI Target Qualified Name(IQN)の設定で作成した各IQNをLUNへマッピングする。
マッピング内容は以下の通り。

Lun_iqn_mapping

ここまでくればiSCSIの準備は終了!

次回へつづく。





これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3
VirtualBox de Oracle11g R2 RAC #4

| | | コメント (0) | トラックバック (0)

2010年12月 8日 (水)

VirtualBox de Oracle11g R2 RAC #4

VirtualBox de Oracle11g R2 RACのつづきです。

今回は、VirtuslBoxで作成したRed hat用64bitVMへCentOS5.5 (x86_64)をインストールします。が、もう既に何度も行っていることなのでインストール自体の解説は省略します。足りないパッケージがあればyumで都度インストールでもいいですし :) 端折りすぎと突っ込まれそうだが。
過去になんどか書いているのでそちらを参照していただいてもいいですし、元ネタを参照するもよし。(但し元ネタはOracle Enterprise Linuxですが、同じ系統なのでそれほど違いはないはず…Oracle Enterprise Linuxインスコしたことのないのに言うのもなんなんですが…)

Networkの構成については省略しないで書いてあるので m(_ _)m

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認

・CentOS5.5のダウンロード、DVDのisoイメージをダウンロードして今後のためにDVDに焼いておいた。MacOS XでisoイメージのDVDを焼く方法は以前の記事を参照のこと。
http://ftp.riken.jp/Linux/centos/5.5/isos/x86_64/CentOS-5.5-x86_64-bin-DVD-1of2.iso
http://ftp.riken.jp/Linux/centos/5.5/isos/x86_64/CentOS-5.5-x86_64-bin-DVD-2of2.iso

CentOS5.5になったからといって、特にインストール方法に大きな違いはないので詳細は以前の記事や、元ネタなどをご参考に。(元ネタはOracle Enterprise Linuxを利用していますが、系統は同じRed hatなので注意点などほぼ同じだと思います。)ちょっとだけ書いてくと、今回作成したCentOS5.5 x86_64用VMはメモリ4GB、DISK容量50GBを割り当てているので、swapはメモリと同サイズの4GB、/bootには100MB、残りを/へ配分しました。
また、SELinuxはPermissiveモード、FirewallはDisableにしておくというのはお約束なのでお忘れなく。FirewallをEnableにしたままだといろいろとハマりまるのでしっかりチェックしておくと吉ですよん。(ハマった人→私)


Oracle11g R2からネットワーク要件が変りネットワーク周りは大切なのでしっかり書いておきますね。
適当に書いた配置図も参照のこと。)また、IPv6はOFFで固定IPとしています。(IPv6はOFFにしなくても問題ないですが、今回のネタでは不要なので。)

以下、Openfiler(iSCSI)のノードも含めたネットワーク構成は以下。

RACを構成するノード1 (hostname=discus164.macdeoracle.jp)
device ip address sub-netmask 備考
eth0(ネットワークアダプタ:ブリッジアタプタ) 192.168.1.90 255.255.255.0 パブリックネットワーク用、ギガビット
eth1(ネットワークアダプタ:内部ネットワーク) 192.168.2.90 255.255.255.0 プライベートネットワーク用(iSCSIアクセス用)、ギガビット
eth2(ネットワークアダプタ:内部ネットワーク) 192.168.3.90 255.255.255.0 プライベートネットワーク用(Interconnect用)、ギガビット
RACを構成するノード2 (hostname=discus264.macdeoracle.jp)
device ip address sub-netmask 備考
eth0(ネットワークアダプタ:ブリッジアダプタ) 192.168.1.91 255.255.255.0 パブリックネットワーク用、ギガビット
eth1(ネットワークアダプタ:内部ネットワーク) 192.168.2.91 255.255.255.0 プライベートネットワーク用(iSCSIアクセス用)、ギガビット
eth2(ネットワークアダプタ:内部ネットワーク) 192.168.3.91 255.255.255.0 プライベートネットワーク用(Interconnect用)、ギガビット
iSCSIを構成するノード (hostname=arowana2.macdeoracle.jp)
device ip address sub-netmask 備考
eth0(ネットワークアダプタ:ブリッジアダプタ) 192.168.1.92 255.255.255.0 パブリックネットワーク用、ギガビット
eth1(ネットワークアダプタ:内部ネットワーク) 192.168.2.92 255.255.255.0 プライベートネットワーク用(iSCSIアクセス用)、ギガビット


上記を元に以下のドキュメントをおよび元ネタなどを参考に、hostsおよびDNSを利用して固定IPアドレスでネットワークを構成することにした。

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - 2.7.2.2 手動で構成する場合のIPアドレス要件

独り言:
2ノードRACでなぜ、3つのSCAN VIPが推奨されているのかは、未だによく理解できていない???? 2ノードRACだから2じゃだめなの? 3つだと何がおしいいの?
どんどん謎は深まる…。だれか教えてw どっかにSCAN VIPってなにがおいしいのか2ノードRACで3つのSCAN VIPが推奨される理由が書いてある資料ないのかな〜。3ノード以上のRACだとSCAN VIPをどの程度増やせばおいしくなるの〜などなど????w

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - 2.7.5 手動によるIPアドレスの構成例

http://www.oracle.com/technetwork/articles/hunter-rac11gr2-iscsi-088677.html

http://www.idevelopment.info/data/Oracle/DBA_tips/Oracle11gRAC/CLUSTER_12.shtml

前述のマニュアルなどを参考に今回構築する全ノードのhostsファイルやDNS構成の概要は以下の通り。

RACを構成するノード1 (hostname=discus164.macdeoracle.jp)
Hostname タイプ IP address 名前解決方法
discus164 Public 192.168.1.90 hostsおよびDNS
discus164-iscsi Private 192.168.2.90
discus164-priv Private 192.168.3.90
discus164-vip Virtual 192.168.1.190
RACを構成するノード2 (hostname=discus264.macdeoracle.jp)
Hostname タイプ IP address 名前解決方法
discus264 Public 192.168.1.91 hostsおよびDNS
discus264-iscsi Private 192.168.2.91
discus264-priv Private 192.168.3.91
discus264-vip Virtual 192.168.1.191
SCAN VIP1/2/3
Hostname タイプ IP address 名前解決方法
discus-rac64-scan Virtual 192.168.1.200 DNS
discus-rac64-scan 192.168.1.201
discus-rac64-scan 192.168.1.202
Openfiler2.3(iSCSI) - (hostname=arowana2.macdeoracle.jp)
Hostname タイプ IP address 名前解決方法
arowana2 Public 192.168.1.92 hostsおよびDNS
arowana2-priv Private 192.168.2.92


ということで次回へつづく。
(こちらの都合で慌てて書いたので、おそらくいつもよりタイポとか誤字脱字、リンク先ミスなどが多いかもしれない…気づいたら後で修正します!)

2010/12/9追記:
hostsファイルとDNSで同じ名前解決するのってどうなんだろーって思っておりますが…hosts優先だし…。まあ、そのまんまでいきます。はい。
で、インストール後、各ノードの/etc/hostsはどう設定したかというと…

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
#::1 localhost6.localdomain6 localhost6

#for public network
192.168.1.90 discus164.macdeoracle.jp discus164
192.168.1.91 discus264.macdeoracle.jp discus264
192.168.1.92 arowana2.macdeoracle.jp arowana2

#for Oracle Interconnect private network
192.168.3.90 discus164-priv.macdeoracle.jp discus164-priv
192.168.3.91 discus264-priv.macdeoracle.jp discus264-priv

#for iSCSI private network
192.168.2.92 arowana2-priv.macdeoracle.jp arowana2-priv
192.168.2.90 discus164-iscsi.macdeoracle.jp discus164-iscsi
192.168.2.91 discus264-iscsi.macdeoracle.jp discus264-iscsi

#for virtual public network
192.168.1.190 discus164-vip.macdeoracle.jp discus164-vip
192.168.1.191 discus264-vip.macdeoracle.jp discus264-vip

192.168.1.2 lampeye.macdeoracle.jp lampeye






これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…
VirtualBox de Oracle11g R2 RAC #3

| | | コメント (0) | トラックバック (0)

2010年12月 4日 (土)

VirtualBox de Oracle11g R2 RAC #3

VirtualBox de Oracle11g R2 RACのつづきです。

以下のような内容で進めていきます。ほぼ元ネタに近いですけどね :)

前々回前回と少々構成もあるあるていど書いてますが、全体像をまとめて書いておきますね。

  1. ハードウェア構成(VMなのでVMの構成も含めて)、ソフトウェア構成など
  2. Linux (CentOS 5.5 x86_64)のインストール
  3. Openfiler2.3 x86のインストール
  4. Openfiler2.3 x86によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. Oracle RACノード間リモートアクセスの構成とntpの構成
    sshの構成は念のために行った、多分、実施しなくても大丈夫だと思うけど…ついでなので、ちょいと意地悪な実験をしてみた)
  9. ローカルネームサーバの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Automatic Storage Management(ASMLib 2.0.5 x84_64)のインストール及び構成
  12. Oracle11g R2 11.2.0.1.0 RACインストール事前作業
  13. Oracle11g R2 11.2.0.1.0 Grid Infrastractureのインストール
  14. Oracle11g R2 11.2.0.1.0 Database softwareのインストール
  15. Oracle11g R2 11.2.0.1.0 examplesのインストール
  16. Oracle Cluster databaseの作成
  17. Net Serviceの確認
  18. Oralce Grid InsfastructureとDatabase構成の確認
  19. Clusterの開始と停止の確認
  20. 簡単なTransparent Application Failover (TAF)の確認



・Hardware

・CPU - Intel Core i7-980X Extreme Edition 3.33Ghz (6 core / 12 thread) * 1
・Memory - 12GB (2GB * 6)
・Disk - S-ATA2 1TB * 2
・NIC - on board Gbit NIC * 1
グラフィックカードは気にしてなかったので安めの、 NVIDIA GeForce GTS 250 (512MB)

上記PCで3つのVMを起動するので結構いっぱいいっぱいなのでクライアントはいつものようにMacを使います。
MacProの12-Core (2.66GHz 6コア Intel Xeon"Westmere" * 2)ってお化けPCがもうちょっと早く発表されてたらな〜、Mac上でVM作って楽しめたんだがタイミングの問題なのでしかたない 
><


・Software

・Host OS - CentOS5.5 (kernel 2.6.18-194.17.1.el5) x86_64
・System virtual machine software - VirtualBox 3.2.8 x86_64 for Linux

・Guest OS (for iSCSI) - Openfiler2.3 x86 (rPath Linux)
・DNS - bind9.4.3_P5-1.1-1 (rPath Linuxのソフトウェア管理ツールであるconaryを利用してインストールします)

・Guest OS (for RAC) - CentOS5.5 x86_64 (kernel 2.6.18-194.17.1.el5)

VMの構成は前回の通りなのだが、一応書いておくと

・Openfiler2.3 x86向けVMの構成
ネットワークアダプタ1をブリッジアダプタで定義してPublicネットワーク用に利用し、ネットワークアダプタ1は内部ネットワークとして定義しPrivateネットワーク用(iSCSIのアクセス用)に利用する。
ちなみに、VirtualBoxの内部ネットワークは、VM間でのみ通信できるアダプタなのでInterConnectなどのPrivateネットワーク向きなんじゃないかと思っている。

・OSタイプ - Red Hat (32bit仮想マシン)
・メインメモリ - 2GB (ちょいと少なめ)
・プロセッサ数 - 2
・SATAポート0 - 100GB
・ネットワークアダプタ1 - Intel PRO/1000 MT Desktop (ブリッジアダプタ - eth0)
・ネットワークアダプタ2 - Intel PRO/1000 MT Desktop (内部ネットワーク - intnet)

・各RACノードのCentOS5.5 x86_64向けVMの構成
Openfiler向けVMと同様にネットワークアダプタ1はブリッジアダプタとして定義して、Publicネットワークとして利用し、ネットワーク2は内部ネットワークで定義してiSCSI用のPrivateネットワーク。ネットワークアダプタ3も内部ネットワークとして定義し、Interconnect用Privateネットワークとして使う。

・OSタイプ - Red Hat (64bit仮想マシン)
・メインメモリ - 4GB
・プロセッサ数 - 4
・SATAポート0 - 50GB
・ネットワークアダプタ1 - Intel PRO/1000 MT Desktop (ブリッジアダプタ - eth0)
・ネットワークアダプタ2 - Intel PRO/1000 MT Desktop (内部ネットワーク - intnet)
・ネットワークアダプタ3 - Intel PRO/1000 MT Desktop (内部ネットワーク - intnet)


ということで次回へつづく。





これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1
VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…

| | | コメント (0) | トラックバック (0)

2010年12月 2日 (木)

VirtualBox de Oracle11g R2 RAC #2 - 事前調査など…

VirtualBox de Oracle11g R2 RACの続きです。

構築記録の詳細は後にして、最初に事前調査など(Oracle11g R2でいろいろと変わってるところあるので…)

・hangcheck-timerカーネル・モジュール

Oracle11g R1まではhangcheck-timerカーネル・モジュールが必要となっていたが、Oracle11g R2では不要となっている。
(Oracle11g R1でも当初不要とマニュアルに記載されていたが、後に必要と訂正されていた。おそらくフライングね)


・RACノード間の時刻同期

Cluster Time Synchronization Service (CTSS)という新機能が追加され、NTPで時刻合わせできない環境やNTPを利用しない環境でも時刻同期できるようになった。

が、今回はNTPで時刻合わせするのでCTSSは使わない


・Single Client Access Name (SCAN) VIP

SCANなるものが登場した。まだ勉強不足でSCANを使うと何がどうおいしいのか理解できていないのであとでちゃんと読むw

参考:

http://www.oracle.com/technology/global/jp/products/database/clustering/pdf/scan.pdf


・ネットワーク要件

前述のSCAN VIPの構成にも関わるが、以下のマニュアルによれば固定IP方式である場合、hostsファイルおよび、DNSという構成で対応できるということは確認できたので、今回は、hostsファイル+DNSという構成にすることにした。

参考:

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux - 2.7.5 手動によるIPアドレスの構成例


・ソフトウェア要件

いつもの通りCentOS5.5 x86_86を利用するのでRed Hadt系のソフトウェア要件を参考に…

参考:

Oracle Grid Infrastructureインストレーション・ガイド11gリリース2(11.2)for Linux 2.8.2 x86-64 - Linuxプラットフォームでのソフトウェア要件
Oracle Databaseクイック・インストレーション・ガイド 11gリリース2(11.2) for Linux x86-644 - ソフトウェア要件の確認


・ストレージ

Oracle11g R2からOracle ClusterファイルもASM管理化に置くことができるようになったので、OpenfilerのiSCSIのボリュームをすべてASM管理にしちゃう。
Oracle11g R1の時はOracle Clusterファイルだけocfs2を利用していたが、今回はocsf2のインストール・構成は不要になった。

参考:

Oracle Grid Infrastructureインストレーション・ガイド11gリリース2(11.2)for Linux 3.1.3 - サポートされている記憶域オプション


・仮想NIC

以前はまではInterconnect用とiSCSI用を兼用させていたけど、今回はそれぞれに個別にVNICを割り当てて使う。
どうせ仮想だからお金かからないのがいいところw リアルな環境だと予算の都合上できないことも簡単に試せる :)

2010/12/3追記:
・SSHユーザの等価関係の有効化

OUIでパスフレーズなしのユーザ等価関係の有効化を自動的にやってくれるようになったみたい。信用しないわけじゃないんだけどとりあえず、Oracle11g R1までのように手動でもやっとく。

Oracle Grid Infrastructureインストレーション・ガイド 11gリリース2(11.2)for Linux- E.1 すべてのクラスタ・ノードでの手動によるSSHの構成

という、ざっくりとした方針だけ決めてVirtualBox de Oracle11g R2 RACを構築〜。

以下、Openfier2.3 (x86)とRACのノードに利用するCentOS5.5(x86_64)向けVM構成(VirtualBox3.2.8を利用した3.2.10リリースされてるけど)のスナップショットなど…。

ちなみに、VirtualBox3.2.10と3.2.12でいろいろbug fixされてるけど、3.2.8のままで。


・Openfiler2.3 (iSCSI)に利用するVM構成は以下の通り。
※100GBのディスクにx86_64なんて名称をつけちゃってますが32bitの仮想マシンです!

20101202_132628


・Oracle11g R2 x86_64の各ノードで利用するCentOS5.5 x86_64向けVM構成は以下の通り。
※こちらは64bitの仮想マシンです。

20101202_132642

次回へつづく。





これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2



VirtualBox de Oracle11g R2 RAC #1

| | | コメント (0) | トラックバック (0)

2010年11月30日 (火)

VirtualBox de Oracle11g R2 RAC #1

前回VirtualBoxでOracle11g R1 RACを試したので今回はOracle11g R2 2ノードRACをVirtualBox上に構築してみた。

Oracle11g R1 RACをVirtualBox上に構築した際にも発生したdbcaの最後に表示される確認ダイアログを表示したまま固まるという状況があったものの今回もデータベースは作成されていた。
前回はdbcaの最後に表示される確認ダイアログで固まった後に強制終了させ、dbcaでデータベースの作成/削除を数度行い時間を要したもののハング?したような状態から正常に復帰したためそれ以外はなにも行わなかったのだが、今回はハング状態からVMを強制終了/起動してみた。
結果オーライという感じなのだが、dbcaの処理は終わっていたようで問題なくインスタンスが起動したのにはニッコリ!

[oracle@discus164 ˜]$ 
[oracle@discus164 ˜]$
[oracle@discus164 ˜]$ sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 火 11月 29 21:54:50 2010

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

SQL> conn system@orcl
パスワードを入力してください:
接続されました。
SQL>
SQL>
SQL> select * from gv$version;

INST_ID BANNER
---------- --------------------------------------------------------------------------------
1 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
1 PL/SQL Release 11.2.0.1.0 - Production
1 CORE 11.2.0.1.0 Production
1 TNS for Linux: Version 11.2.0.1.0 - Production
1 NLSRTL Version 11.2.0.1.0 - Production
2 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
2 PL/SQL Release 11.2.0.1.0 - Production
2 CORE 11.2.0.1.0 Production
2 TNS for Linux: Version 11.2.0.1.0 - Production
2 NLSRTL Version 11.2.0.1.0 - Production

10行が選択されました。

SQL>


20101130_161324


以下、前回よりもさらに適当に書いてしまった感じのする配置図。(雰囲気が伝われば問題ないのでこんなところで勘弁して〜w)

Virtualbox_de_rac_11g_r2_2


Oracle11g R2からGrid Infrastructure (Oracle11g R1までのOracle ASM + Oracle Clusterware)になりDNSまたはGNS(Grid Naming Service)が必要だってことで、iSCSIで利用しているOpenfiler上でDNSを構成したこと、および、RACを構成するノードごとVNICを3つ作成し、1つはPublicネットワーク用、1つはInterconnect専用、そしてもう1つは、iSCSIストレージアクセス専用としたところがポイント。(ちなみに、InterconnectとiSCSIはprivateネットワークとしてVirtualBoxの内部ネットワークアダプタを利用した)

参考にしたブログでは、nslookupを改造しちゃってDNSを使わない方法なんかもあったが今回はDNSを利用した。(普段やらないからDNSの構成ファイルの記述方法調べんのが一番めんどくさかったw)
SCAN (Single Client Access Name)を利用するのにDNSかGNSが必須なんですよー。新しい用語増え過ぎw

参考:

・SCANの解説でわかりやすい資料はこれかも↓
http://www.oracle.com/technology/global/jp/products/database/clustering/pdf/scan.pdf

・インストールおよび構成で参考にした記事
http://www.oracle.com/technetwork/articles/hunter-rac11gr2-iscsi-088677.html
http://www.idevelopment.info/data/Oracle/DBA_tips/Oracle11gRAC/CLUSTER_12.shtml





これまでのあらすじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1
VirtualBox de RAC (Oracle11g R1編) #2

| | | コメント (0) | トラックバック (0)

2010年10月31日 (日)

VirtualBox de RAC (Oracle11g R1編)#2

VirtualBox de RAC (Oracle11g R1編)の続きです。
試していて気付いた問題点やハマった点が幾つかあったので備忘録として残しておきますね。

まず最初はCentOS5.5でのiscsidの問題。

この問題、iscsiデバイスを利用しているCentOS5.5をshutdown/rebootすると停止時に以下のようなメッセージを表示した後、いきなりHALTしてしまう。Openfiler側が起動しっぱなりしの場合は、大量のゾンビセッションが残ってしまい 気付かないと大変なことになってしまうという、なかなかスリリングな事象なのでご用心を。

私の場合、停止時のエラーメッセージに気付き、Openfiler側のセッションがゾンビだらけで驚いた!〜っていうとこで気付いた。

ググってみたら、これは、Red hat Linux/CentOS 5.5でのバグということが判明。
暫定的な対処方法はいつくかあるが、私の環境では、/etc/init.d/iscsiを書き換え、run level 0/1/6でなにもしないで抜ける部分をコメントアウトして対処した。

ちなみに、run level 0/1/6以外ならiscsiは正しく動作してます。以下、stop/startで正しくiscsiが実行されてLogout/Logonが成功している状態。

[root@discus164  ˜]# service iscsi stop
Logging out of session [sid: 1, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Logging out of session [sid: 2, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Logging out of session [sid: 3, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Logging out of session [sid: 4, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Logging out of session [sid: 5, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Logging out of session [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Logout of [sid: 1, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
Logout of [sid: 2, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
Logout of [sid: 3, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
Logout of [sid: 4, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
Logout of [sid: 5, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
Logout of [sid: 6, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
Stopping iSCSI daemon:
[root@discus164 ˜]# service iscsi start
iscsid が停止していますが PID ファイルが残っています
Starting iSCSI daemon: [ OK ]
[ OK ]
iSCSI ターゲットを設定中: Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm1, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm2, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm4, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs2, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:asm3, portal: 192.168.2.92,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:crs1, portal: 192.168.2.92,3260]: successful
[ OK ]
[root@discus164 ˜]#


この場合はなんの問題もないわけです。が…

Status_ok


Iscsi_stop


Iscsi_after_stop


Iscsi_start


Iscsi_after_start



ところが、対処前のCentOS5.5では、shutdown/reboot時に以下のログが表示されLogoutできずOpenfiler側のセッションがゾンビ化する。

Unmounting pipe file systems:                              [  OK  ]
connection2:0: ping timeout of 5 secs expired, recv timeout 5, last rx 4300342437, last ping 4300347437, now 4300352437
connection2:0: detected conn error (1011)
connection1:0: ping timeout of 5 secs expired, recv timeout 5, last rx 4300342437, last ping 4300347437, now 4300352439
connection1:0: detected conn error (1011)
connection4:0: ping timeout of 5 secs expired, recv timeout 5, last rx 4300342437, last ping 4300347437, now 4300352449
connection4:0: detected conn error (1011)
connection3:0: ping timeout of 5 secs expired, recv timeout 5, last rx 4300342437, last ping 4300347437, now 4300352463
connection3:0: detected conn error (1011)
connection5:0: ping timeout of 5 secs expired, recv timeout 5, last rx 4300342437, last ping 4300347437, now 4300352472
connection5:0: detected conn error (1011)
connection6:0: ping timeout of 5 secs expired, recv timeout 5, last rx 4300342437, last ping 4300347437, now 4300352474
connection6:0: detected conn error (1011)
Unmounting file systems: [ OK ]
Halting system...

スクリーンショットは以下
Iscsi_eror



前述の問題の対処として/etc/init.d/iscsiを修正する方法を選択した。diffは以下のとおり。

[root@discus164 ˜]# diff -u /etc/init.d/iscsi.org /etc/init.d/iscsi
--- /etc/init.d/iscsi.org 2010-03-31 22:26:39.000000000 +0900
+++ /etc/init.d/iscsi 2010-10-31 01:33:12.000000000 +0900
@@ -35,10 +35,10 @@

# If this is a final shutdown/halt, do nothing since
# lvm/dm, md, power path, etc do not always handle this
- if [ "$RUNLEVEL" = "6" -o "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" ]; then
- success
- return
- fi
+ #if [ "$RUNLEVEL" = "6" -o "$RUNLEVEL" = "0" -o "$RUNLEVEL" = "1" ]; then
+ # success
+ # return
+ #fi

# don't turn off iscsi if root is possibly on a iscsi disk
rootopts=$(awk '{ if ($1 !˜ /^[ \t]*#/ && $2 == "/") { print $4; }}' /etc/mtab)

修正後は以下のとおり問題なくiscsiのセッションがlogoutされている ;)
Iscsi_ok



参考:

Stray Penguin - Linux Memo (iSCSi) - シャットダウン/リブート時のSCSI cache エラー
Red Hat Bugzilla – Bug 583218





これまでのあらずじ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

VirtualBox de RAC (Oracle11g R1編) #1

| | | コメント (0) | トラックバック (0)

2010年10月18日 (月)

Mac de Oracle - 10万円未満 de RAC (11g編)改め、 VirtualBox de RAC (Oracle11g R1編) #1

いままでいろいろと遊んでいたPCやうちの奥さんのPCがじゃまになってきたのでCore i7 980x (6 core / ハイパースレッディングを使って12CPU)というやつ1台に集約!

さすがに"10万円未満 de"はとは言えなくなった(購入金額をVM数で割ってもちょいと足がでるが、電気代とか占有スペースとか必要に応じてVM作って遊べるのでお得だ。)ので、VirtualBox de RACと改名いたしましたw

とは言っても、Oracle11g R1 EE for Linux x86でiSCSIを使うというのは同じで、違うのは全部VMっていうところだけ。
手順もMac de Oracle - 10万円未満 de RAC (11g編)と同じ(OCFS2やASMlibのバージョンはCentOSのバージョンに対応する最新のものを利用しています。)なのでVM使ってて悩んだ所などを中心に書く予定。


・CPU - Intel Core i7-980X Extreme Edition 3.33Ghz (6 core / 12 thread) * 1
・Memory - 12GB (2GB * 6)
・Disk - S-ATA2 1TB * 2
・NIC - on board Gbit NIC
グラフィックカードは気にしてなかったので安めの、 NVIDIA GeForce GTS 250 (512MB)



Screenshotvirtualbox


Screenshotoracle_vm_virtualbox1_2


Screenshotoracle_vm_virtualbox_2


Screenshotoracle_vm_virtualbox2_2

ソフトウェアは以下の通り。

ホストOS等
・CentOS5.5 x86_64 (Kernel:2.6.18-194.17.1.e15)
・VirtualBox3.2.8 x86_64


ゲストOS等
・CentOS5.5 x86 (kernel:2.6.18-194.17.1.e15PAE)
・Openfiler2.3 x86
・Oracle11g 11.1.0.6.0 EE for Linux x86
 など…

以下、適当に書いた配置図。
VNICの設定では、外部ネットワークにも行けるようにBridge Adapterを使ったこととInterconnect向けにInternal Networkを使った(VirtualBoxのInternal NetworkはGestOS間でのみ通信できHostOSからも見えない)
Virtualbox_de_rac_11g_r1

という案で、VMごとクラッシュさせたりいろいろ悩みながらなんとかインスコ&構築done。現在は以下ような状態! :)
Oem1

Virtualbox_de_rac_11g_r1_2


次回へつづく。



関連エントリ
Mac de Oracle - 10万円未満 de RAC (11g編)#28

| | | コメント (0) | トラックバック (0)

2010年10月 3日 (日)

How to install Oracle VM VirtualBox guest additions.

Guest Additionsインストールで悩んだ時はこれね!

Oracle VM VirtualBoxでguest additionsインストールでbash: ./VBoxLinuxAdditions-x86.run: /bin/sh: bad interpreter: 許可がありませんエラーに遭遇したんですが、多分皆さん一度はハマったかなっと思った事もあり、メモ替わりに載せておきます。

解決策は、見ての通りなのですが、ちょいと一瞬悩んじゃいました。:)

「VM上のメニュー」→「デバイスアイテム」→「Guest Additionsのインストール」を選択後、xtermを開く、まではいいんですが…。
Img01

[root@discus2 ˜]# cd /media
[root@discus2 media]# ll
合計 2
dr-xr-xr-x 4 root root 2048 8月 5 20:58 VBOXADDITIONS_3.2.8_64453
[root@discus2 media]# cd VBOXADDITIONS_3.2.8_64453
[root@discus2 VBOXADDITIONS_3.2.8_64453]# ll
合計 30317
dr-xr-xr-x 3 root root 2048 8月 5 20:58 32Bit
dr-xr-xr-x 2 root root 2048 8月 5 20:58 64Bit
-r-xr-xr-x 1 root root 222 6月 3 01:33 AUTORUN.INF
-r-xr-xr-x 1 root root 3286480 8月 5 20:50 VBoxLinuxAdditions-amd64.run
-r-xr-xr-x 1 root root 2846156 8月 5 20:57 VBoxLinuxAdditions-x86.run
-r-xr-xr-x 1 root root 11253760 8月 5 21:52 VBoxSolarisAdditions.pkg
-r-xr-xr-x 1 root root 7669024 8月 5 20:44 VBoxWindowsAdditions-amd64.exe
-r-xr-xr-x 1 root root 5701080 8月 5 20:41 VBoxWindowsAdditions-x86.exe
-r-xr-xr-x 1 root root 277008 8月 5 20:41 VBoxWindowsAdditions.exe
-r-xr-xr-x 1 root root 4890 8月 5 20:54 autorun.sh
[root@discus2 VBOXADDITIONS_3.2.8_64453]#
[root@discus2 VBOXADDITIONS_3.2.8_64453]#
[root@discus2 VBOXADDITIONS_3.2.8_64453]# ./VBoxLinuxAdditions-x86.run
bash: ./VBoxLinuxAdditions-x86.run: /bin/sh: bad interpreter: 許可がありません
[root@discus2 VBOXADDITIONS_3.2.8_64453]#
[root@discus2 VBOXADDITIONS_3.2.8_64453]#
[root@discus2 VBOXADDITIONS_3.2.8_64453]#
[root@discus2 VBOXADDITIONS_3.2.8_64453]# /bin/sh VBoxLinuxAdditions-x86.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 3.2.8 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 3.2.8 of VirtualBox Guest Additions...
Building the VirtualBox Guest Additions kernel modules
Your guest system does not seem to have sufficient OpenGL support to enable
accelerated 3D effects (this requires Linux 2.6.27 or later in the guest
system). This Guest Additions feature will be disabled.


Building the main Guest Additions module [ OK ]
Building the shared folder support module [ OK ]
Doing non-kernel setup of the Guest Additions [ OK ]
You should restart your guest to make sure the new modules are actually used

Installing the Window System drivers
Installing X.Org 7.1 modules [ OK ]
Setting up the Window System to use the Guest Additions [ OK ]
You may need to restart the hal service and the Window System (or just restart
the guest system) to enable the Guest Additions.

Installing graphics libraries and desktop services componen[ OK ]
[root@discus2 VBOXADDITIONS_3.2.8_64453]#



Img02

| | | コメント (0) | トラックバック (0)

2010年9月30日 (木)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #8

前回の続きです。pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2も今回で一旦終了。

今回は、最後に残った、Oracle11g EE R2 11.2.0.1.0 for Linux x86-64で再確認。64bit版のOracle11g R21と同じ結果になるに違いねぇ。とまた、決めつけてるw

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
SQL>
SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 104857600 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 100
aggregate PGA auto target 58.6582031
global memory bound 20

SQL>

pga_aggregate_targetを10MB/50MB/1GB/5GB/10GB/100GB/4095GBと、いつものように増加させながらv$pgastatビューのGlobal memory boundでpgaサイズを確認してみます!

SQL> alter system set pga_aggregate_target=10m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10485760 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SQL> alter system set pga_aggregate_target=50m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 52428800 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 50
aggregate PGA auto target 13.6582031
global memory bound 10

SQL> alter system set pga_aggregate_target=1g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 214732800 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1073741824 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 890.314453
global memory bound 102.392578

SQL> alter system set pga_aggregate_target=5g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073725440 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 5368709120 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 5120
aggregate PGA auto target 4576.67578
global memory bound 511.992188

SQL> alter system set pga_aggregate_target=10g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147471360 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10737418240 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10240
aggregate PGA auto target 9184.63184
global memory bound 1023.99414

SQL> alter system set pga_aggregate_target=100g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147483648 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 107374182400 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 102400
aggregate PGA auto target 92126.127
global memory bound 1024

SQL> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147483648 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 4396972769280 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773909.9
global memory bound 1024

SQL>


結果は、予想通り、Oracle11g EE R1 11.1.0.7.0 for Linux x86-64と全く同じでした〜

やっと、もやもやしてたOracle10g R2以降のpga回りの動きが掴めたので、ゆっくーり、寝れそうw (ほんとうはパラレル版もやりたいけど〜それはまた。)


前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #7

| | | コメント (0) | トラックバック (0)

2010年9月29日 (水)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #7

前回の続きです。

今回は、Oracle11g EE R2 11.2.0.1.0 for Linux x86で再確認。32bit版です。32bit版のOracle11g R1と同じ結果になるに違いねぇ。(決めつけてるw)


SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
SQL>
SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 104857600 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 100
aggregate PGA auto target 62.5078125
global memory bound 20

pga_aggregate_targetを10MB/50MB/1GB/5GB/10GB/100GB/4095GBと、いつものように増加させながらv$pgastatビューのGlobal memory boundでpgaサイズを確認してみます!

SQL> alter system set pga_aggregate_target=10m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10485760 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SQL> alter system set pga_aggregate_target=50m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 52428800 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 50
aggregate PGA auto target 16.59375
global memory bound 10

SQL> alter system set pga_aggregate_target=1g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 214732800 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1073741824 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 893.197266
global memory bound 102.392578

SQL> alter system set pga_aggregate_target=5g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073725440 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 5368709120 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 5120
aggregate PGA auto target 4580.46387
global memory bound 511.992188

SQL> alter system set pga_aggregate_target=10g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073741824 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10737418240 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10240
aggregate PGA auto target 9188.41992
global memory bound 512

SQL> alter system set pga_aggregate_target=100g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073741824 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 107374182400 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 102400
aggregate PGA auto target 92130.6797
global memory bound 512

SQL> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073741824 TRUE
_pgactx_cap_stacks FALSE TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 4396972769280 FALSE

9行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773915.44
global memory bound 512

SQL>


結果は、予想通り、Oracle11g EE R1 11.1.0.7.0 for Linux x86と全く同じでした〜


次回、Oracle11g R2 64bit版へつづく。



前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #6

| | | コメント (0) | トラックバック (0)

2010年9月28日 (火)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #6

前回の続きです。

今回は、Oracle11g EE R1 11.1.0.7.0 for Linux x86-64で再確認してみます。前回は、32bit版でしたが今回は同バージョンの64bit版です。何か違いがあるでしょうか?(多分、Oracle10g R2 MacOS X x86-64と同じなんじゃないかと予想してます。)

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SQL> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
SQL>
SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 104857600 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 100
aggregate PGA auto target 57.7529297
global memory bound 20

pga_aggregate_targetを10MB/50MB/1GB/5GB/10GB/100GB/4095GBと、いつものように増加させながらv$pgastatビューのGlobal memory boundでpgaサイズを確認してみます!

SQL> alter system set pga_aggregate_target=10m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10485760 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SQL> alter system set pga_aggregate_target=50m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 52428800 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 50
aggregate PGA auto target 12.7177734
global memory bound 10

SQL> alter system set pga_aggregate_target=1g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 214732800 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1073741824 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 889.3125
global memory bound 102.392578

SQL> alter system set pga_aggregate_target=5g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073725440 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 5368709120 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 5120
aggregate PGA auto target 4575.68262
global memory bound 511.992188

SQL> alter system set pga_aggregate_target=10g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147471360 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10737418240 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10240
aggregate PGA auto target 9183.62988
global memory bound 1023.99414

SQL> alter system set pga_aggregate_target=100g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147483648 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 107374182400 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 102400
aggregate PGA auto target 92126.0039
global memory bound 1024

SQL> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147483648 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 4396972769280 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773910.37
global memory bound 1024

SQL>

結果は、予想通り、Oracle10g EE R2 10.2.0.4.0 for MacOS X x86-64と全く同じ。:)


次回、Oracle11g R2 32bit版へつづく。



前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #5

| | | コメント (0) | トラックバック (0)

2010年9月27日 (月)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #5

前回の続きです。

今回は、Oracle11g EE R1 11.1.0.7.0 for Linux x86で再確認してみます。前回は、64bitのOracle10g R2でしたが今回は32bitのOracle11g R1です。さて何か違いがあるでしょうか?

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SQL> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
SQL>
SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 104857600 FALSE

7行が選択されました。

pga_aggregate_targetを10MB/50MB/1GB/5GB/10GB/100GB/4095GBと、いつものように増加させながらv$pgastatビューのGlobal memory boundでpgaサイズを確認してみます!

SQL> alter system set pga_aggregate_target=10m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10485760 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SQL> alter system set pga_aggregate_target=50m;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 52428800 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 50
aggregate PGA auto target 10.7929688
global memory bound 10

SQL> alter system set pga_aggregate_target=1g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 214732800 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1073741824 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 895.368164
global memory bound 102.392578

SQL> alter system set pga_aggregate_target=5g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073725440 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 5368709120 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 5120
aggregate PGA auto target 4581.67676
global memory bound 511.992188

SQL> alter system set pga_aggregate_target=10g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073741824 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10737418240 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10240
aggregate PGA auto target 9190.125
global memory bound 512

SQL> alter system set pga_aggregate_target=100G;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073741824 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 107374182400 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 102400
aggregate PGA auto target 92132.8242
global memory bound 512

SQL> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SQL> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
__pga_aggregate_target 134217728 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073741824 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 4396972769280 FALSE

7行が選択されました。

SQL> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773917.11
global memory bound 512

SQL>


お〜っ!。 Oracle10g R2のように_pga_max_sizeが自動調整されて増加しているのがわかります。ただ、Oracle10g R2 (64bit)と割当ルールはほぼ同じなようなのですが、1箇所だけ違うようですね。
それは 自動調整される _pga_max_sizeの上限値が、512MBであること。Oracle10g R2 (64bit)では、1GBまで増加したはず!。

このエントリに載せていない確認内容も含めてまとめると…


  1. Oracle11g R1(32bit)で_pga_max_sizeの値が、1000MBを超えると動的に変化し始める。
    - Oracle10g R2 (64bit)と同じ。

  2. pga_aggregate_targetが1GB近くまでだと、pga_aggregate_targetの20%。
    - Oracle10g R2 (64bit)と同じ。

  3. pga_aggregate_targetが1GB以上になると、_pga_max_sizeが、pga_aggregate_targetの19.999%程度の値に自動設定され、さらにその値の50%。結果的として、pga_aggregate_target値の10%をほんの少し下回る値が設定される。pga_aggregate_targetが5GBである場合、512MBをほんの少し下回るのサイズがpgaとして割り当てられる。

  4. pga_aggretate_targetが5GBを超えた場合、_pga_max_sizeが1GBで頭打ちとなり、結果的として512MBがPGAとして割り当てられる。つまり自動PGA管理における最大PGAサイズは512MBということになる。(32bit版ではね)


前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #4

| | | コメント (0) | トラックバック (0)

2010年9月26日 (日)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #4

Oracle10g R2 EE 10.2.0.4.0 for MacOS X x86-64で再確認の続き。

pga_aggregate_targetがどの程度になると、_pga_max_sizeが200MBをこえるんでしょうねぇ。調べてみましょう。わくわくです。

SYS> alter system set pga_aggregate_target=150m;

システムが変更されました。

SYS>
SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 157286400 FALSE

SYS> alter system set pga_aggregate_target=200m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 209715200 FALSE

SYS> alter system set pga_aggregate_target=500m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 524288000 FALSE

SYS> alter system set pga_aggregate_target=1023m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 214528000 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1072693248 FALSE

SYS> alter system set pga_aggregate_target=1010m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 211804160 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1059061760 FALSE

SYS> alter system set pga_aggregate_target=1000m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1048576000 FALSE

SYS> alter system set pga_aggregate_target=1001m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209920000 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1049624576 FALSE

SYS>

ということで、pga_aggreate_target=1000MBまでは、元々の値である200MBを維持しているようです。
1001MB以上で、_pga_max_sizeの値が動的に変化し始め、実際の値は、pga_aggregate_targetの19.999%程度になるようです。
丸めてしまえば、pga_aggregate_targetの20%なので、pga_aggregate_targetが1001MB以上の場合、その値の20%が、_pga_max_sizeに設定されるとしちゃっても特に問題ないかもしれませんけどね。

前回の結果も含めてまとめると、

  1. Oracle10g R2になると、10g R1までとは異なり_pga_max_sizeの値が、1000MBを超えると動的に変化し始める。
  2. pga_aggregate_targetが1GB近くまでだと、pga_aggregate_targetの20%。
  3. pga_aggregate_targetが1GB以上になると、_pga_max_sizeが、pga_aggregate_targetの19.999%程度の値に自動設定され、さらにその値の50%。結果的として、pga_aggregate_target値の10%をほんの少し下回る値が設定される。pga_aggregate_targetが10GBである場合、1GBをほんの少し下回るのサイズがpgaとして割り当てられる。
  4. pga_aggretate_targetが10GBを超えた場合、_pga_max_sizeが2GBで頭打ちとなり、結果的として1GBがPGAとして割り当てられる。つまり自動PGA管理における最大PGAサイズは1GBということになる。(64bit版ではね)

意図せず、_pga_max_sizeが固定化されてしまっていた以前のテストとは大きく異なる結果となってしまったが、_pga_max_sizeが動的に変化し最大2GBまで増えるってところを除けば仕組みは同じだよね。と :)

次回は、Oracle11g R1 EE 11.1.0.6.0 (x86) 32bit版で同様に再確認。次回へつづく。


前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #3

| | | コメント (0) | トラックバック (0)

2010年9月25日 (土)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #3

前回でOracle10g R1の再確認は終わり、今回はOracle10g R2 EE 10.2.0.4.0 for MacOS X x86_64で再確認。


pga_aggregate_targetパラメータを10MB/50MB/1GB/5GB/10GB/100GB/4095GBと変化させた場合、pgaに使用されるサイズがどのように変化するかv$pgastatビューのglobal memory boundを見て確認。


_pga_max_sizeパラメータがデフォルト値となっているか確認。問題なさそうですね :)

SYS> 
SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
SYS>
SYS> @pgastat.sql

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 100
aggregate PGA auto target 73.6699219
global memory bound 20

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 104857600 FALSE

では、早速、確認してみましょう!


pga_aggregate_targetをどんどん増加させ、あるサイズ以上になると、_pga_max_sizeパラメータが動的に増加し始めます。
これをキッカケにして、global memory boundも増加していき、最終的には、1024MBつまり1GBで頭打ちになります。まあ、ないとはおもいますけど、1セッションで1GBを超えるPGAが必要な場合は、_pga_max_sizeをセットしちゃうか、自動PGA管理をOFFにするんでしょうね。多分後者の方がいいように思いますね。やるなら。(^^:::

SYS> alter system set pga_aggregate_target=10m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10485760 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SYS> alter system set pga_aggregate_target=50m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 52428800 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 50
aggregate PGA auto target 28.6611328
global memory bound 10

SYS> alter system set pga_aggregate_target=1G;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 214732800 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1073741824 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 905.255859
global memory bound 102.392578

SYS> alter system set pga_aggregate_target=5G;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 1073725440 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 5368709120 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 5120
aggregate PGA auto target 4591.6084
global memory bound 511.992188

SYS> alter system set pga_aggregate_target=10g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147471360 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10737418240 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10240
aggregate PGA auto target 9199.56445
global memory bound 1023.99414

SYS> alter system set pga_aggregate_target=100g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147483648 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 107374182400 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 102400
aggregate PGA auto target 92142.4834
global memory bound 1024

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 2147483648 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 4396972769280 FALSE

SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773926.51
global memory bound 1024


ということで、Oracle10g R2 EE 10.2.0.4.0 for MacOS X x86_64での再確認パート1は終了。Oracle10g R1の頃と違い、PGAサイズって自動的に1GBまで多きくなるんですね。

次回は、_pga_max_sizeが元々の値である200MBから値が変化し始めるpga_aggregate_targetパラメータのサイズっていくつ? ってところをチェックしておこうと思います。


前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2

| | | コメント (0) | トラックバック (0)

2010年9月24日 (金)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #2

前回からのつづきです。Oracle10g R1 10.1.0.3.0 (32bit)で _pga_max_sizeパラメータ値がデフォルトの場合、pga_aggregate_targetパラメータ値を10MB/50MB/1GB/5GB/10GB/4095GBと変化させ、pgaに使用されるサイズがどのように変化するか、v$pgastatビューのglobal memory boundを見て確認していく。

結果は見ての通り。Oracle10g R1では、_pga_max_sizeパラメータはpga_aggregate_targetには影響されず、常に200MBで固定されている。従ってOracle10g R1では、以前のテスト結果の通り
pga_aggregate_targetの5%又は、_pga_max_size(200MB)の50%でいづれかの小さいサイズが利用されるというのは正しいようだ。

SYS> alter system set pga_aggregate_target=10m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10485760 FALSE

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound .5

SYS> alter system set pga_aggregate_target=50m;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 52428800 FALSE

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 50
aggregate PGA auto target 31.7548828
global memory bound 2.5


SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 1073741824 FALSE

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 908.358398
global memory bound 51.1992188

SYS> alter system set pga_aggregate_target=5g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 5368709120 FALSE

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 5120
aggregate PGA auto target 4594.71973
global memory bound 100

SYS> alter system set pga_aggregate_target=10g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 10737418240 FALSE

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 10240
aggregate PGA auto target 9202.67578
global memory bound 100

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 4396972769280 FALSE

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773929.69
global memory bound 100

SYS>


Oracle10g R2で再確認へつづく。



前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

| | | コメント (0) | トラックバック (0)

2010年9月23日 (木)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

前回のネタ振りから随分間があいてしまいました。m(_ _)m

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? 」シリーズで_pga_max_sizeが固定値の様に見えてしまっているのですが、そのようになってしまった、"大きなミス"ってどこかわかりますか?

ってところ、わかりますかね。

実は、行く先々で pga_aggregate_targetとか _pga_max_sizeの値を覗いてみてて、あれ、自分のMacやPCで確かめた値と違う???何故ってことが数回あって、あ、そういことかと気付いたわけです。

答えから先に言うと、

Oracle10g R1までは確かに _pga_max_sizeは200MBで固定値だった。ところが、Oracle10g R2以降は、Oracleが内部で動的に変更する隠しパラメータになったということ。

そして、_pga_max_sizeをalter system文で変更してしまうと、Oracle10g R2以降では、その値は動的に変更されず、ユーザが設定した値で固定されてしまう。


ということ。


この影響で、私が実施したテストケースでは全て_pga_max_sizeは200MBのままで固定値のように見えていたということ。。

orz... まあ、隠しパラメータですから、どんな仕様変更があっても文句はいいません。>< はい。


では、早速、alter system文で値を設定してしまった _pga_max_sizeパラメータを元の状態に戻しましょう!

手順としては、Oracleインスタンス起動、spfileからpfileを作り、pfileから_pga_max_sizeの部分を削除、インスタンス停止、pfileでOracleインスタンス起動、spfile作って再起動って感じです。

とりあえず、Oracle10g R1で。

SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
PL/SQL Release 10.1.0.3.0 - Production
CORE 10.1.0.3.0 Production
TNS for MacOS X Server: Version 10.1.0.3.0 - Production
NLSRTL Version 10.1.0.3.0 - Production

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 100M

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 100
aggregate PGA auto target 76.1923828
global memory bound 5

SYS>
SYS> create pfile from spfile;

ファイルが作成されました。

SYS> !cat $ORACLE_HOME/dbs/initxtiger.ora

・・・中略・・・

xtiger.__large_pool_size=4194304
xtiger.__shared_pool_size=104857600
*._pga_max_size=209715200
*.background_dump_dest='/Volumes/Discus/4oracle/oracle/u01/app/oracle/admin/xtiger/bdump'
*.compatible='10.1.0.2.0'

・・・中略・・・

SYS> edit $ORACLE_HOME/dbs/initxtiger.ora



*._pga_max_sizeの行を削除!
SYS> !cat $ORACLE_HOME/dbs/initxtiger.ora

・・・中略・・・

xtiger.__large_pool_size=4194304
xtiger.__shared_pool_size=104857600
*.background_dump_dest='/Volumes/Discus/4oracle/oracle/u01/app/oracle/admin/xtiger/bdump'
*.compatible='10.1.0.2.0'

・・・中略・・・

SYS> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SYS>
SYS> startup pfile=$ORACLE_HOME/dbs/initxtiger.ora
ORACLEインスタンスが起動しました。

Total System Global Area 293601280 bytes
Fixed Size 778888 bytes
Variable Size 120331640 bytes
Database Buffers 171966464 bytes
Redo Buffers 524288 bytes
データベースがマウントされました。
データベースがオープンされました。

SYS> create spfile from pfile;

ファイルが作成されました。

SYS> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 293601280 bytes
Fixed Size 778888 bytes
Variable Size 120331640 bytes
Database Buffers 171966464 bytes
Redo Buffers 524288 bytes
データベースがマウントされました。
データベースがオープンされました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
pga_aggregate_target big integer 100M

SYS> @pgastat

NAME size(MB)
------------------------------ ----------
aggregate PGA target parameter 100
aggregate PGA auto target 76.3242188
global memory bound 5

SYS> @show_hidden_pga_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ---------------------------
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_use_ism_for_pga TRUE TRUE
pga_aggregate_target 104857600 FALSE

SYS>


戻った〜。 show parameter pgaで 隠しパラメータである_pga_max_sizeパラメータが表示されているということは、その値がデフォルト値と同じ値であっても、そのパラメータの値は、ユーザがセットした値ということ。show parameterで _pga_max_sizeが表示されなくなったらOK。

ちなみに、 show_hidden_pga_param.sqlは以下のようなクエリ。

select
a.ksppinm
,b.ksppstvl
,b.ksppstdf
from
x$ksppi a join x$ksppcv b
on a.indx = b.indx
where
a.ksppinm like '%pga%'
order by
a.ksppinm
/

次回へつづく。


前回までのあらすじ・・・
Mac De Oracle なんですが、Windows(32bit)でのOracleな話
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19
_pga_max_sizeってOracle11gではどうなったっけ? という確認。
_pga_max_sizeってOracle11gではどうなったっけ? という確認。シーズン2

| | | コメント (0) | トラックバック (0)

2010年9月21日 (火)

続・Client result cache (クライアント結果キャッシュ) #1 w

最終回とおまけで終了させてしまったので、”続”にしてみたw


まずは、Oracle11 r2のマニュアル(原文)を。(Oracle11g r1でも同じなので)

2

マニュアルには、シノニム経由の場合、クライアント結果キャッシュされないという記載はない…

ところが…

デモプログラムでアクセスするqctable表をOCITESTユーザではなくSCOTTユーザに作成し
パブリックシノニムを経由してOCITESTユーザからアクセスするよう環境を変更し〜て〜み〜る〜と〜


なんと〜〜〜〜〜〜〜〜クライアント結果キャッシュ対象外になるではありませんか〜〜〜。:)

なぜ、この手の見つけるとニッコリしちゃうんでしょw

11:21:52 SYS> conn ocitest/ocitest
接続されました。
11:22:23 OCITEST> drop table qctable purge;

表が削除されました。

経過: 00:00:00.55
11:22:33 OCITEST> desc qctable
ERROR:
ORA-04043: オブジェクトqctableは存在しません。


11:24:32 OCITEST> conn scott/tiger
接続されました。
11:26:50 SCOTT> CREATE TABLE qctable (empno NUMBER, ename VARCHAR2(20), sal NUMBER);

表が作成されました。

経過: 00:00:00.16
11:26:57 SCOTT> conn / as sysdba
接続されました。
11:27:39 SYS> grant select, insert, delete, update on scott.qctable to ocitest;

権限付与が成功しました。

経過: 00:00:00.03
11:27:54 SYS> create public synonym qctable for scott.qctable;

シノニムが作成されました。

経過: 00:00:00.12
11:28:15 SYS> conn ocitest/ocitest
接続されました。
11:29:30 OCITEST> desc qctable
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NUMBER
ENAME VARCHAR2(20)
SAL NUMBER

11:29:33 OCITEST> exec insert_val;

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

経過: 00:00:00.36
11:29:39 OCITEST> commit;

コミットが完了しました。

経過: 00:00:00.01
11:29:41 OCITEST>

という準備の後に、前回改造した(オリジナルのcdemoqc.cでも確認できます。)デモプログラムを実行中にclient_result_cache_stats$ビュ−を覗いて見ると〜

シノニム経由だとキャッシュされなくなることが確認できる。


11:33:22 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
140 1 Block Size 256
140 2 Block Count Max 4096
140 3 Block Count Current 128
140 4 Hash Bucket Count 1024
140 5 Create Count Success 0
140 6 Create Count Failure 0
140 7 Find Count 0
140 8 Invalidation Count 0
140 9 Delete Count Invalid 0
140 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00
11:33:48 SYS>

あと一つぐらいはエントリ書くかも、(書かないかも)




Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #4
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #5 (最終回)
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #おまけ

| | | コメント (0) | トラックバック (0)

2010年9月14日 (火)

Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #おまけ

前回、最終回と言っておきながらおまけを付けるのもMac De Oracle流w

client result cacheの効果を見る方法はclient_result_cache_stats$ビューだけじゃないんですよ。

おなじみのSQLトレースを使っても確認できます。

・クライアント結果キャッシュなしのSQLトレース

SQL ID: 6xq85x8zzu4wf
Plan Hash: 1630726318
SELECT empno, ename, sal
FROM
qctable


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 11 34 0 0
Execute 5 0.00 0.00 0 0 0 0
Fetch 10 0.00 0.00 6 40 0 5
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 16 0.00 0.00 17 74 0 5

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 82 (OCITEST)

Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS FULL QCTABLE (cr=8 pr=6 pw=0 time=0 us cost=3 size=12 card=1)


Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
1 TABLE ACCESS MODE: ANALYZED (FULL) OF 'QCTABLE' (TABLE)


Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 15 0.00 0.00
SQL*Net message from client 15 0.00 0.00
db file sequential read 1 0.00 0.00
db file scattered read 1 0.00 0.00


・クライアント結果キャッシュありのSQLトレース

SQL ID: 6gsb66qbaqg37
Plan Hash: 1630726318
SELECT /*+ result_cache */ empno, ename, sal
FROM
qctable


call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.02 10 34 0 0
Execute 1 0.00 0.02 0 0 1 0
Fetch 2 0.00 0.00 6 8 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.04 16 42 1 1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 82 (OCITEST)

Rows Row Source Operation
------- ---------------------------------------------------
1 RESULT CACHE 35dnz5hwwxb2k5f5b2ucfcff1d (cr=8 pr=6 pw=0 time=0 us)
1 TABLE ACCESS FULL QCTABLE (cr=8 pr=6 pw=0 time=0 us cost=3 size=12 card=1)


Rows Execution Plan
------- ---------------------------------------------------
0 SELECT STATEMENT MODE: ALL_ROWS
1 RESULT CACHE OF '35dnz5hwwxb2k5f5b2ucfcff1d'
column-count=3; dependencies=(OCITEST.QCTABLE); name="SELECT /*+
result_cache */ empno, ename, sal FROM qctable"
1 TABLE ACCESS MODE: ANALYZED (FULL) OF 'QCTABLE' (TABLE)


Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 3 0.00 0.00
log file sync 1 0.00 0.00
SQL*Net message from client 3 0.00 0.00
db file sequential read 1 0.00 0.00
db file scattered read 1 0.00 0.00




Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #4
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #5 (最終回)

| | | コメント (0) | トラックバック (0)

2010年9月12日 (日)

Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #5 (最終回)

これってクライアント結果キャッシュをちゃんと動作させる為じゃなく、cdemoqc.cってクライアント結果キャッシュのデモを実行した時に、別クライアントからclient_result_cache_stats$ビューの作成、参照件数等をチェックすることで動作確認できるようにするための改造なので、動作確認できたらdual表を無理矢理問い合わせるなんてぇロジック不要ですから、お間違いのないように。m(_ _)m 2010/9/13追記。

さて、Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係も今回が最終回.

最終回なのでOracleのバージョン情報も載せておきますね。

19:54:51 SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

経過: 00:00:00.00
19:55:56 SYS>

Client Result Cacheを有効化する為のプログラミング上のポイント!
・OCIStmtPrepare2()を使う。

マニュアルにも記載されてますが、Client Result Cacheを有効かするためにはStatement cache(文キャッシュ)を有効化している必要がある。
 OCIStmtPrepare()を使ってしまうと文キャッシュされないのでClient result cacheが効かない。

・OCIStmtFetch2()でOCI_NO_DATAまでフェッチする。

例えば、1行しかないからOCIStmtExecute()の後、OCIStmtFetch2()を1度しか行っていないと、OCI_NO_DATAが発生しないのでClient Result Cacheに問合せ結果が乗らない。

その他、初期化パラメータや /*+ RESULT_CACHE */ ヒントを利用する等といった前提はマニュアルを読んでね。

最後に総まとめとして、cdemoqc.cを思いっきり修正し必要最低限かつ、cdemoqc.c内でclient_result_cache_stats$を確認するという怪しい作りじゃなく、別途、SQL*Plusからclient_result_cache_stats$ビューを問い合わせ、Client result cache(クライアント結果キャッシュ)が出来ているか確認できるように改造しちゃいました。

但し、削除次いでにwindows対応の部分までも削ぎ落としてしまいました。ごめんなさい。ごめんなさい。

以下、Mac De Oracle版 cdemoqc.c (除くWindows)のコード。

[oracle@lampeye demo]$ cat $ORACLE_HOME/rdbms/demo/cdemoqc.c
/* Copyright (c) 2007, Oracle. All rights reserved. */

/*
NAME
cdemoqc - Basic OCI Query Cache(result cache) functionality

DESCRIPTION
This program demonstrate the working of Query cache.
To use the query cache feature (and hence this program), database
should have been brought up with client side result cache enabled. To bring
the database with result cache enabled, add the following lines in
initialization parameter file,
client_result_cache_size=<cache size in bytes>
client_result_cache_lag=<timeout value for cache in ms>
compatible=11.0.0.0.0
and bring up the database.

*/


# include <oci.h>

# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <time.h>

#include <unistd.h>

#define EMPLOYEE 0

/* Function prototypes */
static void query_tab();
static void dummy_query();
static void dbLogon();
static void dbLogoff();
static void Checkerr(OCIError *errhp, sword status, text *msg);

int main();

static sword status = 0;
static OCISvcCtx *svchp;
static OCIError *errhp;
static OCIEnv *envhp;

/* Queries with result cache hints */
static text *cache_query=
(text *)"SELECT /*+ result_cache */ empno, ename, sal FROM qctable";
//(text *)"SELECT empno, ename, sal FROM qctable";

static text *dummy= (text *)"SELECT COUNT(*) FROM DUAL";
/* - main -------------------------------------------------------------------*/
int main ()
{
long t;
time(&t);
printf ("Start -- %s",ctime(&t));
printf ("Query cache is enabled by using result_cache hints\n\n");

/* Logging on to multiple sessions */
dbLogon ();

printf ("Employee: Execute will fetch rows from server\n");
query_tab(EMPLOYEE);
printf ("\n\nEmployee: Execute will fetch rows from local cache, 4 times\n");
query_tab(EMPLOYEE);
query_tab(EMPLOYEE);
query_tab(EMPLOYEE);
query_tab(EMPLOYEE);
printf ("\n\nTotal query 5 times\nSleeping...30sec..\n");
sleep(30);
time(&t);
dummy_query(EMPLOYEE);
printf("dummyクエリ実行済み、10秒待機中。\n");
printf("この間にclient_result_cache_stats$ビューを他端末からチェック!\n\n%s",
ctime(&t));
sleep(10);

dbLogoff ();
return 0;
}

static void dummy_query ()
{
OCIStmt *stmthp = (OCIStmt *)0;
OCIDefine *def1hp = (OCIDefine *)0;
ub4 ctr;
sb4 ctrSz = sizeof(ctr);
ub2 datelen=0;
ub4 prefetch = 0;

Checkerr (errhp,
OCIStmtPrepare2 ((OCISvcCtx *)svchp,(OCIStmt **)&stmthp,
(OCIError *)errhp, (text *)dummy, (ub4)strlen((char *)dummy),
(oratext *)NULL, (ub4) 0, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT),
(oratext *)"OCIStmtPrepare");

/* Setting the prefetch count = 0 */
Checkerr(errhp,
OCIAttrSet((OCIStmt *) stmthp, OCI_HTYPE_STMT, (dvoid *)&prefetch,
sizeof(prefetch), OCI_ATTR_PREFETCH_ROWS, (OCIError *)errhp),
(oratext *) "OCIAttrSet-prefetch");

Checkerr (errhp,
OCIDefineByPos ((OCIStmt *)stmthp, (OCIDefine **)&def1hp,
(OCIError *)errhp, (ub4)1, (dvoid *)&(ctr), (sb4)ctrSz, (ub2)SQLT_INT,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT),
(oratext *)"OCIDefByPos");

if ((status = OCIStmtExecute ((OCISvcCtx *)svchp, (OCIStmt *)stmthp,
(OCIError *)errhp, (ub4)0, (ub4)0, (OCISnapshot *)0,
(OCISnapshot *)0, (ub4)OCI_DEFAULT)) != OCI_SUCCESS )
{
printf ("OCIStmtExecute for Query Dual - Fail\n" );
Checkerr (errhp, status,(oratext *)"Stmt Execute");
}
else
{
status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
(ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);

if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
{
Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
return;
}
else if (status != OCI_NO_DATA)
{
printf("Dual selected.\n");
}
}

Checkerr (errhp,
OCIStmtRelease ((OCIStmt *)stmthp, (OCIError *)errhp,(dvoid *)NULL, 0,
OCI_DEFAULT), (oratext *)"StmtRelease");
}

/* - Logon to the DB in two sessions ----------------------------------------*/
static void dbLogon ()
{
ub4 cachesize=10;
OraText *connStr = (text *)"";
OraText *username = (text *)"ocitest";
OraText *password = (text *)"ocitest";
OCIAuthInfo *authhp = (OCIAuthInfo *)0;

OCIEnvCreate ((OCIEnv **)&envhp, (ub4)OCI_DEFAULT, (dvoid *)0,
(dvoid * (*)(dvoid *, size_t))0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void (*)(dvoid *, dvoid *))0, (size_t)0, (dvoid **)0);

OCIHandleAlloc ((dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR,
(size_t) 0, (dvoid **) 0);

OCIHandleAlloc ((dvoid *)envhp, (dvoid **)&authhp,
(ub4)OCI_HTYPE_AUTHINFO, (size_t)0, (dvoid **)0);

OCIAttrSet ((dvoid *)authhp, (ub4)OCI_HTYPE_AUTHINFO, (dvoid *)username,
(ub4)strlen((char *)username), (ub4)OCI_ATTR_USERNAME,
(OCIError *)errhp);

OCIAttrSet ((dvoid *)authhp, (ub4)OCI_HTYPE_AUTHINFO, (dvoid *)password,
(ub4)strlen((char *)password), (ub4)OCI_ATTR_PASSWORD,
(OCIError *)errhp);

Checkerr (errhp,
OCISessionGet ((OCIEnv *)envhp, (OCIError *)errhp,
(OCISvcCtx **)&svchp, (OCIAuthInfo *)authhp, (OraText *)connStr,
(ub4)strlen((char *)connStr), (OraText *)NULL, (ub4)0, (OraText **)0,
(ub4 *)0, (boolean *)0,(ub4)OCI_DEFAULT),
(oratext *)"OCISessionGet");

printf ("Connected to Employee Session\n");

OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)&cachesize,
(ub4)0,OCI_ATTR_STMTCACHESIZE,errhp);

}

/* - Execute SQL query and prints the data ----------------------------------*/
static void query_tab ()
{
OCIStmt *stmthp = (OCIStmt *)0;
OCIDefine *def1hp = (OCIDefine *)0;
OCIDefine *def2hp = (OCIDefine *)0;
OCIDefine *def3hp = (OCIDefine *)0;
ub4 empno;
text ename[100];
ub4 sal;
sb4 empnoSz = sizeof (empno);
sb4 enameSz = sizeof (ename);
sb4 salSz = sizeof (sal);
ub2 datelen=0;
ub4 prefetch = 0;

Checkerr (errhp,
OCIStmtPrepare2 ((OCISvcCtx *)svchp,(OCIStmt **)&stmthp,
(OCIError *)errhp, (text *)cache_query, (ub4)strlen((char *)cache_query),
(oratext *)NULL, (ub4) 0, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT),
(oratext *)"OCIStmtPrepare");

/* Setting the prefetch count = 0 */
Checkerr(errhp,
OCIAttrSet((OCIStmt *) stmthp, OCI_HTYPE_STMT, (dvoid *)&prefetch,
sizeof(prefetch), OCI_ATTR_PREFETCH_ROWS, (OCIError *)errhp),
(oratext *) "OCIAttrSet-prefetch");

Checkerr (errhp,
OCIDefineByPos ((OCIStmt *)stmthp, (OCIDefine **)&def1hp,
(OCIError *)errhp, (ub4)1, (dvoid *)&(empno), (sb4)empnoSz, (ub2)SQLT_INT,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT),
(oratext *)"OCIDefByPos");

Checkerr (errhp,
OCIDefineByPos ((OCIStmt *)stmthp, (OCIDefine **)&def2hp,
(OCIError *)errhp, (ub4)2, (dvoid *)&(ename), (sb4)enameSz, (ub2)SQLT_STR,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT),
(oratext *)"OCIDefByPos2");

Checkerr (errhp,
OCIDefineByPos ((OCIStmt *)stmthp, (OCIDefine **)&def3hp,
(OCIError *)errhp, (ub4)3, (dvoid *)&(sal), (sb4)salSz, (ub2)SQLT_INT,
(dvoid *)0, (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT),
(oratext *)"OCIDefByPos3");

if ((status = OCIStmtExecute ((OCISvcCtx *)svchp, (OCIStmt *)stmthp,
(OCIError *)errhp, (ub4)0, (ub4)0, (OCISnapshot *)0,
(OCISnapshot *)0, (ub4)OCI_DEFAULT)) != OCI_SUCCESS )
{
printf ("OCIStmtExecute for SELECT - Fail\n" );
Checkerr (errhp, status,(oratext *)"Stmt Execute");
}
else
{
do
{
status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
(ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);

if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
{
Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
break;
}
else if (status != OCI_NO_DATA)
{
printf("\nEMPNO is %d, ENAME is %s, SAL is %d\n", empno, ename, sal);
}
}while(status != OCI_NO_DATA);
}

Checkerr (errhp,
OCIStmtRelease ((OCIStmt *)stmthp, (OCIError *)errhp,(dvoid *)NULL, 0,
OCI_DEFAULT), (oratext *)"StmtRelease");
}

/* - Session Logoff --------------------------------------------------------*/
static void dbLogoff ()
{
printf ("\nLogging off the connected session.\n");

Checkerr (errhp,
OCISessionRelease(svchp, errhp, 0,0, OCI_DEFAULT),
(oratext *) "Session-Release");
}

/* - Error checking routing -------------------------------------------------*/
void Checkerr(OCIError *errhp, sword status, text *msg)
{
text msgbuf[512];
sb4 errcode = 0;

memset((void *) msgbuf, (int)'\0', (size_t)512);
if(status!=OCI_SUCCESS)
{
printf("error msg: %s\n",msg);
}

switch (status)
{
case OCI_SUCCESS: break;
case OCI_SUCCESS_WITH_INFO:
printf("status = OCI_SUCCESS_WITH_INFO\n");
OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
printf("ERROR CODE = %d\n", errcode);
printf("%.*s\n", 512, msgbuf);
if (errcode == 436 || errcode == 437 || errcode == 438 || errcode == 439)
exit(1);
break;
case OCI_NEED_DATA:
printf("status = OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
printf("status = OCI_NO_DATA\n");
break;
case OCI_ERROR:
printf("status = OCI_ERROR\n");
OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
printf("ERROR CODE = %d\n", errcode);
printf("%.*s\n", 512, msgbuf);
if (errcode == 436 || errcode == 437 || errcode == 438 || errcode == 439)
exit(1);
break;
case OCI_INVALID_HANDLE:
OCIErrorGet((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
msgbuf, (ub4) sizeof(msgbuf), (ub4) OCI_HTYPE_ERROR);
printf("ERROR CODE = %d\n", errcode);
printf("%.*s\n", 512, msgbuf);
printf("status = OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
printf("status = OCI_STILL_EXECUTE\n");
break;
case OCI_CONTINUE:
printf("status = OCI_CONTINUE\n");
break;
default:
break;
}
return;
}


64bit 環境なので以下のように demo_rdbms64.mkでmakeしま〜す。


[oracle@lampeye demo]$ make -f demo_rdbms64.mk build EXE=cdemoqc OBJS="cdemoqc.o"
/usr/bin/gcc -fPIC -c -I/opt/u01/app/oracle/product/11.1.0/db_1/rdbms/demo
-I/opt/u01/app/oracle/product/11.1.0/db_1/rdbms/public
-I/opt/u01/app/oracle/product/11.1.0/db_1/plsql/public -I/opt/u01/app/oracle/product/11.1.0/db_1/network/public
-I/opt/u01/app/oracle/product/11.1.0/db_1/precomp/public cdemoqc.c -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
/usr/bin/gcc -L/opt/u01/app/oracle/product/11.1.0/db_1/lib/
-L/opt/u01/app/oracle/product/11.1.0/db_1/rdbms/lib/ -o cdemoqc cdemoqc.o -lclntsh
`cat /opt/u01/app/oracle/product/11.1.0/db_1/lib/sysliblist` -ldl -lm -lpthrea


実行!!! 同一表(1行だけ登録されてます)を5回問合せ、うち4回はClient result cacheにヒットさせます。
Sleeping...30sec..の待機は、オリジナルのコードでは60秒待機させていましたが私の環境だと30秒待機でOKでした。
dummyクエリ実行済み、10秒待機中。のメッセージが表示されたら、予め起動していたSQL*Plusからclient_result_cache_stats$を問い合わせます。クライアント結果キャッシュが効いているか確認できるはずです。

[oracle@lampeye demo]$ ./cdemoqc
Start -- Thu Sep 9 19:54:09 2010
Query cache is enabled by using result_cache hints

Connected to Employee Session
Employee: Execute will fetch rows from server

EMPNO is 1, ENAME is EMP_1, SAL is 900


Employee: Execute will fetch rows from local cache, 4 times

EMPNO is 1, ENAME is EMP_1, SAL is 900

EMPNO is 1, ENAME is EMP_1, SAL is 900

EMPNO is 1, ENAME is EMP_1, SAL is 900

EMPNO is 1, ENAME is EMP_1, SAL is 900


Total query 5 times
Sleeping...30sec..
Dual selected.
dummyクエリ実行済み、10秒待機中。
この間にclient_result_cache_stats$ビューを他端末からチェック!

Thu Sep 9 19:54:39 2010

Logging off the connected session.
[oracle@lampeye demo]$

SQL*Plusからの確認!

・デモプログラム起動直後の状態
19:39:02 SYS> select * from client_result_cache_stats$;

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
111 1 Block Size 0
111 2 Block Count Max 0
111 3 Block Count Current 0
111 4 Hash Bucket Count 0
111 5 Create Count Success 0
111 6 Create Count Failure 0
111 7 Find Count 0
111 8 Invalidation Count 0
111 9 Delete Count Invalid 0
111 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

この間にclient_result_cache_stats$ビューを他端末からチェック!が表示された時点の状態
19:54:13 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
111 1 Block Size 256
111 2 Block Count Max 4096
111 3 Block Count Current 128
111 4 Hash Bucket Count 1024
111 5 Create Count Success 1
111 6 Create Count Failure 0
111 7 Find Count 4
111 8 Invalidation Count 0
111 9 Delete Count Invalid 0
111 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

・デモプログラム終了直後の状態
19:54:40 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.00




Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #4

| | | コメント (0) | トラックバック (0)

2010年9月11日 (土)

Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #4

前回のつづきです。


前回は、OCIStmtPreare2()まで実行させた。
OCIStmtExecute()かOCIStmtFetch2()が実行されたタイミングでclient_result_cache_stats$ビューへ該当クライアントから統計情報がアップされているように見える! という動きは確認。

今回は、OCIStmtExecute()まで実行させ、OCIStmtFetch2()をコメントアウトしてみた。

[oracle@lampeye demo]$ diff $ORACLE_HOME/rdbms/demo/cdemoqc.c.org $ORACLE_HOME/rdbms/demo/cdemoqc.c
138d137
< /*
144d142
< */
431,452c429,450
< else
< {
< printf("Contents of CLIENT_RESULT_CACHE_STATS$\n");
< printf("STAT_ID NAME OF STATISTICS VALUE CACHE_ID\n");
< printf("======= ================== ===== ========\n");
< do
< {
< status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
< (ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);
<
< if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
< {
< Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
< break;
< }
< else if (status != OCI_NO_DATA)
< {
< printf("%5d %-20s %8d %6d\n", statid, name, value, cacheid);
< }
< }while(status != OCI_NO_DATA);
<
< }
---
> // else
> // {
> // printf("Contents of CLIENT_RESULT_CACHE_STATS$\n");
> // printf("STAT_ID NAME OF STATISTICS VALUE CACHE_ID\n");
> // printf("======= ================== ===== ========\n");
> // do
> // {
> // status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
> // (ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);
> //
> // if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
> // {
> // Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
> // break;
> // }
> // else if (status != OCI_NO_DATA)
> // {
> // printf("%5d %-20s %8d %6d\n", statid, name, value, cacheid);
> // }
> // }while(status != OCI_NO_DATA);
> //
> // }
457a456,458
> printf("Sleep 10sec...\n");
> sleep (10);
>
[oracle@lampeye demo]$

mekeして実行!!!

[oracle@lampeye demo]$ ./cdemoqc
Query cache is enabled by using result_cache hints

Connected to Employee Session
Connected to HR Session

Employee: Execute will fetch rows from server
Employee: Execute will fetch rows from local cache
HR: Execute will cause a roundtrip during first execute, but the same result
set created in Employee Session will be shared thereafter
HR: Execute will fetch rows from local cache

HR: Updating the table

Employee: Execute will fetch rows from server and hence the local result set
will be updated
HR: Execute will fetch rows from updated local cache
Employee: Execute will fetch rows from local cache

Sleeping for few seconds to let the stat table to get updated

Please enter password for sys user to continue:
xxxxxxxx!
Sleep 10sec...

Logging off all the connected sessions.
[oracle@lampeye demo]$

やった〜〜〜、見えた〜〜〜〜〜。OCIStmtExecute()が実行され、その要求がサーバまで到達する場合に、client_result_cache_stats$へ統計情報が反映されているように見える。
(ちなみに、ログは載せていないが、sleep(60)待機後、もう一度、クライアント結果キャッシュ対象のクエリを実行しても別クライアントからclient_result_cache_stats$から統計情報を参照することはできなかった)

・デモプログラム実行前の状態
21:59:31 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.00

・デモプログラム実行直後の状態
21:59:32 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
116 1 Block Size 0
116 2 Block Count Max 0
116 3 Block Count Current 0
116 4 Hash Bucket Count 0
116 5 Create Count Success 0
116 6 Create Count Failure 0
116 7 Find Count 0
116 8 Invalidation Count 0
116 9 Delete Count Invalid 0
116 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

・Please enter password for sys user to continue:が表示され、待機している状態
21:59:36 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
116 1 Block Size 0
116 2 Block Count Max 0
116 3 Block Count Current 0
116 4 Hash Bucket Count 0
116 5 Create Count Success 0
116 6 Create Count Failure 0
116 7 Find Count 0
116 8 Invalidation Count 0
116 9 Delete Count Invalid 0
116 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

・Sleep 10sec...が表示され10秒待機している状態
22:00:54 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
116 1 Block Size 256
116 2 Block Count Max 4096
116 3 Block Count Current 128
116 4 Hash Bucket Count 1024
116 5 Create Count Success 2
116 6 Create Count Failure 0
116 7 Find Count 4
116 8 Invalidation Count 1
116 9 Delete Count Invalid 0
116 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

・デモプログラム終了直後の状態
22:01:00 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.00
22:01:23 SYS>

次回へつづく〜。




Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2
・Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3

| | | コメント (0) | トラックバック (0)

Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #3

前回のつづきです。

前回は、print_stats()のOCIStmtRelease()とOCISessionEnd()の間にsleepを追加し、sleepしている間(つまり、OCISessionEnd()が実行される前であれば、client_result_cache_stats$ビューに反映されたクライアント結果キャッシュの統計情報が参照できることを確認したところまでだった。

今回は、さらに掘り下げてみます。OCISessionEnd()で統計情報が破棄されるので、破棄されるタイミングは分りました。が、では、その統計情報は、どのタイミングで反映されるのでしょう。
ログはありませんが、cdemoqc.cにもともと実装されているsleep(60)をsleep(180)としても、他のクライアントの別セッションからclient_result_cache_stats$の統計情報を除いて覗いても反映されることはありませんでした。

いままでの結果から、sleep(60)〜OCISessionEnd()の間行われているということは想像できます。ということで、OCIStmtExecute()とOCIStmtFetc2()部分をコメントアウトし、OCIStmtPrepare2()だけ実行される状態にしてみました。

[oracle@lampeye demo]$ diff $ORACLE_HOME/rdbms/demo/cdemoqc.c.org $ORACLE_HOME/rdbms/demo/cdemoqc.c
138d137
< /*
144d142
< */
423,452c421,450
< if ((status = OCIStmtExecute ((OCISvcCtx *)syssvchp, (OCIStmt *)stmthp,
< (OCIError *)errhp, (ub4)0, (ub4)0,
< (OCISnapshot *)0, (OCISnapshot *)0,
< (ub4)OCI_DEFAULT)) != OCI_SUCCESS )
< {
< printf ("OCIStmtExecute for SELECT - Fail\n" );
< Checkerr (errhp, status,(oratext *)"Stmt Execute");
< }
< else
< {
< printf("Contents of CLIENT_RESULT_CACHE_STATS$\n");
< printf("STAT_ID NAME OF STATISTICS VALUE CACHE_ID\n");
< printf("======= ================== ===== ========\n");
< do
< {
< status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
< (ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);
<
< if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
< {
< Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
< break;
< }
< else if (status != OCI_NO_DATA)
< {
< printf("%5d %-20s %8d %6d\n", statid, name, value, cacheid);
< }
< }while(status != OCI_NO_DATA);
<
< }
---
> // if ((status = OCIStmtExecute ((OCISvcCtx *)syssvchp, (OCIStmt *)stmthp,
> // (OCIError *)errhp, (ub4)0, (ub4)0,
> // (OCISnapshot *)0, (OCISnapshot *)0,
> // (ub4)OCI_DEFAULT)) != OCI_SUCCESS )
> // {
> // printf ("OCIStmtExecute for SELECT - Fail\n" );
> // Checkerr (errhp, status,(oratext *)"Stmt Execute");
> // }
> // else
> // {
> // printf("Contents of CLIENT_RESULT_CACHE_STATS$\n");
> // printf("STAT_ID NAME OF STATISTICS VALUE CACHE_ID\n");
> // printf("======= ================== ===== ========\n");
> // do
> // {
> // status = OCIStmtFetch2((OCIStmt *)stmthp, (OCIError *)errhp, (ub4)1,
> // (ub2)OCI_FETCH_NEXT, (sb4)0, (ub4)OCI_DEFAULT);
> //
> // if (status == OCI_ERROR || status == OCI_INVALID_HANDLE)
> // {
> // Checkerr(errhp, status, (oratext *)"OCIStmtFetch2");
> // break;
> // }
> // else if (status != OCI_NO_DATA)
> // {
> // printf("%5d %-20s %8d %6d\n", statid, name, value, cacheid);
> // }
> // }while(status != OCI_NO_DATA);
> //
> // }
457a456,458
> printf("Sleep 10sec...\n");
> sleep (10);
>
[oracle@lampeye demo]$

makeして実行!!!!!

[oracle@lampeye demo]$ ./cdemoqc
Query cache is enabled by using result_cache hints

Connected to Employee Session
Connected to HR Session

Employee: Execute will fetch rows from server
Employee: Execute will fetch rows from local cache
HR: Execute will cause a roundtrip during first execute, but the same result
set created in Employee Session will be shared thereafter
HR: Execute will fetch rows from local cache

HR: Updating the table

Employee: Execute will fetch rows from server and hence the local result set
will be updated
HR: Execute will fetch rows from updated local cache
Employee: Execute will fetch rows from local cache

Sleeping for few seconds to let the stat table to get updated

Please enter password for sys user to continue:
xxxxxxxx!
Sleep 10sec...

Logging off all the connected sessions.
[oracle@lampeye demo]$

Sleep 10sec...中に、他クライアントからclient_result_cache_stats$ビューを覗いて見ると…

お〜〜〜〜〜〜〜〜〜〜〜〜〜、一度も統計情報が反映されません!!!!! ;)

・デモプログラム実行前の状態
21:52:37 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.01


・デモプログラム実行直後の状態

21:52:39 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00


・Please enter password for sys user to continue:が表示されている時点の状態
21:52:44 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

・Sleep 10sec...が表示されている時点の状態
21:53:44 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00
21:53:52 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
115 1 Block Size 0
115 2 Block Count Max 0
115 3 Block Count Current 0
115 4 Hash Bucket Count 0
115 5 Create Count Success 0
115 6 Create Count Failure 0
115 7 Find Count 0
115 8 Invalidation Count 0
115 9 Delete Count Invalid 0
115 10 Delete Count Valid 0

10行が選択されました。

経過: 00:00:00.00

・デモプログラム終了後の状態
21:53:54 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.00
21:54:00 SYS>

徐々に、ポイントが見えてきました。次回へつづく。




Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1
Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2

| | | コメント (0) | トラックバック (0)

2010年9月10日 (金)

Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #2

前回の続きです。

最初に前回のまとめから。

client_result_cache_stats$の内容に関して以下3点が確認できました。

・client_result_cache_stats$ヘ該当クライアントから統計情報が反映されるまでタイムラグがある。
 (cdemoqc.cでは、60秒も待機してからclient_result_cache_stats$を問い合わせている)
・client_result_cache_stats$に表示されるCACHE_ID列値は、cdemoqc.cが表示している内容に一致する。
・cdemoqc.c内の別セッションを使った問い合わせでは、client_result_cache_stats$の値が取得できている。

いろいろと考え込んでいて閃いたのが、クライアント結果キャッシュってクライアントとサーバ間のラウンドトリップを減らすことも目的なわけだから、キャッシュを保持しているクライアントから、キャッシュの統計情報がサーバに渡るタイミングが非常に限られているんじゃないか……と。
ということで、クライアント結果キャッシュが効いているクエリではサーバまで行かないので、後続のOCIでサーバまで行かないと処理が終わらないタイプのOCIをコールしたついでにclient_result_cache_stats$に表示する統計情報を送るんじゃないだろーかー。ということ。

OCISessionEnd()で、統計情報が破棄されているんだろーという推測の元、クライアント結果キャッシュに載せないSQL文のPrepare,ExecuteやFetchのいずれかのタイミングで送っているんだろうという切り分けのため、print_stats()のOCIStmtRelease()とOCISessionEnd()の間にsleepを追加した。

[oracle@lampeye demo]$ diff cdemoqc.c.org cdemoqc.c
138d137
< /*
144d142
< */
457a456,458
> printf("Sleep 10sec...\n");
> sleep (10);
>
[oracle@lampeye demo]$

実行結果は以下の通り。

[oracle@lampeye demo]$ ./cdemoqc
Query cache is enabled by using result_cache hints

Connected to Employee Session
Connected to HR Session

Employee: Execute will fetch rows from server
Employee: Execute will fetch rows from local cache
HR: Execute will cause a roundtrip during first execute, but the same result
set created in Employee Session will be shared thereafter
HR: Execute will fetch rows from local cache

HR: Updating the table

Employee: Execute will fetch rows from server and hence the local result set
will be updated
HR: Execute will fetch rows from updated local cache
Employee: Execute will fetch rows from local cache

Sleeping for few seconds to let the stat table to get updated

Please enter password for sys user to continue:
xxxxxxxx
Contents of CLIENT_RESULT_CACHE_STATS$
STAT_ID NAME OF STATISTICS VALUE CACHE_ID
======= ================== ===== ========
1 Block Size 256 114
2 Block Count Max 4096 114
3 Block Count Current 128 114
4 Hash Bucket Count 1024 114
5 Create Count Success 2 114
6 Create Count Failure 0 114
7 Find Count 4 114
8 Invalidation Count 1 114
9 Delete Count Invalid 0 114
10 Delete Count Valid 0 114
Sleep 10sec...

Logging off all the connected sessions.
[oracle@lampeye demo]$


事前に起動していたSQL*Plusからclient_result_cache_stats$ビューを確認してみると…
お〜〜〜〜〜〜〜っ!、ちゃんと表示されています!!!!!。

感があたりました〜〜〜〜〜〜! :)

・cdemoqc実行前
21:41:48 SYS> select * from client_result_cache_stats$;

レコードが選択されませんでした。

・cdemoqc実行直後
経過: 00:00:00.00
21:41:49 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
114 1 Block Size 0
114 2 Block Count Max 0
114 3 Block Count Current 0
114 4 Hash Bucket Count 0
114 5 Create Count Success 0
114 6 Create Count Failure 0
114 7 Find Count 0
114 8 Invalidation Count 0
114 9 Delete Count Invalid 0
114 10 Delete Count Valid 0

10行が選択されました。


・60秒間待機している状態の時
経過: 00:00:00.00
21:41:54 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
114 1 Block Size 0
114 2 Block Count Max 0
114 3 Block Count Current 0
114 4 Hash Bucket Count 0
114 5 Create Count Success 0
114 6 Create Count Failure 0
114 7 Find Count 0
114 8 Invalidation Count 0
114 9 Delete Count Invalid 0
114 10 Delete Count Valid 0

10行が選択されました。

・cdemoqcが、client_result_cache_stats$を表示した直後の10秒待機の時
経過: 00:00:00.00
21:42:53 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
114 1 Block Size 256
114 2 Block Count Max 4096
114 3 Block Count Current 128
114 4 Hash Bucket Count 1024
114 5 Create Count Success 2
114 6 Create Count Failure 0
114 7 Find Count 4
114 8 Invalidation Count 1
114 9 Delete Count Invalid 0
114 10 Delete Count Valid 0

10行が選択されました。

・cdemoqcが終了した直後
経過: 00:00:00.00
21:42:59 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.00
21:43:09 SYS>

次回はさらに絞りこんで確認します。つづく〜




Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1

| | | コメント (0) | トラックバック (0)

2010年9月 9日 (木)

Client result cache (クライアント結果キャッシュ)と client_result_cache_stats$の怪しい関係 #1

pga_aggregate_targetネタをやる予定が…client result cache(クライアント結果キャッシュ)ネタを先にやることにw

なにそれ? 美味しいのって感じの人はググって調べてもらうにしても

以下の辺りを見るとざっとなにが嬉しいのか分るかも :)
http://www.ooug.org/presentations/2010slides/Oracle_11g_Results_Cache.ppt

環境は、CentOS5.5 - Oracle11g R1 11.1.0.7.0 EEで、examplesを追加インストールして $ORACLE_HOME/rdbms/demo以下にcdemoqc.c及びcdemoqc.sqlをインストールしてあります。


あ、そうそう、今回の中心人物は、client_result_cache_stats$ビュー。クライアント結果キャッシュがどの程度効いているか客観的に判断するための統計情報が表示される。
http://download.oracle.com/docs/cd/E16338_01/server.112/b56311/statviews_2150.htm

さて、やっと本題です。

クライアント結果キャッシュがどの程度嬉しいのか確認する意味もあり、examplesをインストールして試し始めて、一番最初に悩みました。

examplesをインストールすると、クライアント結果キャッシュ用のOCIのデモプログラム cdemoqc.cを実行しても、client_result_cache_stats$ビューに該当クライアントのクライアント結果キャッシュの統計情報が表示されません。(表示されないというのは0件という意味ではなく、有るみたいなんだけど、値が0のままということなんです。見た瞬間人柱確定コースw)


クライアント結果キャッシュにクエリ結果がキャッシュされ、サーバとのラウンドトリップが無くなっているか確認したいだけなに、なんでハマるんじゃ〜w

と、叫びつつ。

cdemoqc.cのprint_stats()とその前に60秒スリープする部分のコメントを削除しました。

cdemoqc.cのオリジナルをcdemoqc.c.orgとしてdiffした結果。(とりあえず載せておきますねw)

[oracle@lampeye demo]$ diff cdemoqc.c.org cdemoqc.c
138d137
< /*
144d142
< */
[oracle@lampeye demo]$


実行した結果(makeし忘れないでね)。cdemoqc中からは60秒後にclient_result_cache_stats$の統計情報が確認できています。しか〜〜〜〜し!
(尚、事前に別xtermからSQL*Plusでsysユーザに接続、cdemoqc実行中に、client_reslut_cache_stats$ビューを確認します。)

[oracle@lampeye demo]$ ./cdemoqc
Query cache is enabled by using result_cache hints

Connected to Employee Session
Connected to HR Session

Employee: Execute will fetch rows from server
Employee: Execute will fetch rows from local cache
HR: Execute will cause a roundtrip during first execute, but the same result
set created in Employee Session will be shared thereafter
HR: Execute will fetch rows from local cache

HR: Updating the table

Employee: Execute will fetch rows from server and hence the local result set
will be updated
HR: Execute will fetch rows from updated local cache
Employee: Execute will fetch rows from local cache

Sleeping for few seconds to let the stat table to get updated

Please enter password for sys user to continue:
xxxxxxx

Contents of CLIENT_RESULT_CACHE_STATS$
STAT_ID NAME OF STATISTICS VALUE CACHE_ID
======= ================== ===== ========
1 Block Size 256 113
2 Block Count Max 4096 113
3 Block Count Current 128 113
4 Hash Bucket Count 1024 113
5 Create Count Success 2 113
6 Create Count Failure 0 113
7 Find Count 4 113
8 Invalidation Count 1 113
9 Delete Count Invalid 0 113
10 Delete Count Valid 0 113

Logging off all the connected sessions.
[oracle@lampeye demo]$

同じ時間で他のxtermの別セッションからclient_result_cache_stats$ビューを一生懸命問い合わせましたが、一度も統計情報にお目にかかれませんでした。
(以下のログからもわかるように、0件なのではなく同一CHACHE_IDの各列はリストされてはいるのですが、値が常に0のままなんです。)

・cdemoqc起動前
21:33:37 SYS> select * from client_result_cache_stats$;

レコードが選択されませんでした。

・cdemoqc起動直後
経過: 00:00:00.00
21:33:39 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
113 1 Block Size 0
113 2 Block Count Max 0
113 3 Block Count Current 0
113 4 Hash Bucket Count 0
113 5 Create Count Success 0
113 6 Create Count Failure 0
113 7 Find Count 0
113 8 Invalidation Count 0
113 9 Delete Count Invalid 0
113 10 Delete Count Valid 0

10行が選択されました。

・cdemoqc側でclient_result_cache_stats$が表示された直後
経過: 00:00:00.00
21:33:46 SYS> /

CACHE_ID STAT_ID NAME VALUE
---------- ---------- ------------------------------ ----------
113 1 Block Size 0
113 2 Block Count Max 0
113 3 Block Count Current 0
113 4 Hash Bucket Count 0
113 5 Create Count Success 0
113 6 Create Count Failure 0
113 7 Find Count 0
113 8 Invalidation Count 0
113 9 Delete Count Invalid 0
113 10 Delete Count Valid 0

10行が選択されました。

・cdemoqc正常終了後
経過: 00:00:00.00
21:35:05 SYS> /

レコードが選択されませんでした。

経過: 00:00:00.00
21:35:12 SYS>


これでは、クライアント結果キャッシュが作成され、利用されているのか判断しにくいですよね〜。なんで他プロセスの別セッションからclient_result_cache_stats$の内容が見えないのでしょう?
(cdempqc.cの作りからして、きな臭い匂いがしませんか〜w マニュアルにも書かれていないけど〜いろんな仕掛けがありそーですぞ〜。)

ということで、原因を突き止めたので、次回からじわじわ追いつめていきますw

つづく。

| | | コメント (0) | トラックバック (0)

2010年8月22日 (日)

WindowsXP and CentOS5.5 on VirtualBox3.2.8 on CentOS5.5 x86_64

結局Oracle VirtualBoxをCentOS5.5 x86_64へインストール。
必要な数だけVMを作成してOracle11g R2など入れてみたり、WindowsXP ProにCPU思いっきり割り当てて遊んでみたりと、リアルなPCでやっていた事以上のことは可能な状況までになった(まだ終わってないところもありますが…)

いろいろやって行きますよ〜Macから繋いでw

Myvms

以下、GuestOSをCentOS5.5(x86)としてOracle11gR2のインストールを試しているところ :)
Centos_x86_on_vm_ora11g2

以下、GuestOS:WindowsXP Proで試しに12CPUにしてみたところ
Winxp_on_vm_with_12cpus

| | | コメント (0) | トラックバック (0)

2010年8月 6日 (金)

VM用のPCとうちゃ〜く

Intel Core i7 980x Extreme Editionを1つ。6CoreでHTを有効にしてあれば12Coreに見える。そうそう最新のMacProに2つ搭載されたCPUね。あちらはHT有効化すれば24Coreになる〜w でこちらはメモリを12GBつんで、同時に5台分のPC相当のVMが起動できれば不都合はないのでこんな構成でWindowsとLinux環境をまるっと1台のリアルPC上に。。これからいろいろ準備しまっす。

VMは何にするかまだ悩んでるけど、やりたい事はVMをいじるというよりGuestOSの方がメインなのでVirtualPCに近い使い勝手が気に入っている元はSun Microsystems今は、OracleのVirtualBoxを使おうかと考えているところ。VMWareやXenベースのOracleVMなんかもダウンロードはしてあるんだけどね。



Img_0120

| | | コメント (0) | トラックバック (0)

2010年6月 1日 (火)

IEって遅いんだよー。てことをあまり気にしてない方へ。のおまけ

昨日、「IEって遅いんだよー。ってことをあまり気にしない方へ」ってエントリを書いたんだけど、その遅さも影響しているだろうと思われるニュースもあるね。原文はこちら。

以下の部分がそう。(techcrunch japanより引用)

Google AppsはChromeでは快調だが市職員の多くが今はMicrosoftのInternet ExplorerまたはFirefoxを使用していることが挙げられる。

実は私も経験したことがある。信じられないようなホントの話なんだけど、Core2 Duo 3GhzぐらいのPCでChrome/Safariなら0.3秒ぐらいで実行できるjavascriptの処理が、同じPCのIE6/7だと9倍ぐらい遅いという経験をしたこともある。それぐらいインパクトのある話なんですよん。パフォーマンス命またはそこそこ命なサービスではね。
なので、クライアントPCのスペック(ブラウザは何を使ってるとか、ブラウザの縛りはあるかとかも)を事前に確認しないでそーゆーサービスを作ってしまうと、もーたーいへん。

| | | コメント (0) | トラックバック (0)

2010年5月31日 (月)

IEって遅いんだよー。ってことをあまり気にしてない方へ。

speed/validity selectors test for frameworks.っていう有名なサイトがあるんだけど、具体的にどのぐらいの差になんの? なんてあまり情報が載ってるところはないので自分で確認できる範囲で新旧CPUとブラウザで比較してみました。なにかの参考になるとは思います。jQueryでだけですけどね。


12


IE6/7のデータを載せてないのですが、jQuery1.2.6(Slicktestのオリジナルでテストされてるやつね)で、他のプラウザと処理結果の違うところがいくつか発生するので載せるかどうか考えてるところ。注釈付きで載せるかな〜。まあ、IE8ですらこの遅さだからIE6/7はもっと遅いんだけどね。 2010/5/31追記
8-Jun-2010:Safari5及びChrome5リリースされたのでデータ追記。また、Safari5はMacOS X 10.5以上でリリースされたためMacOS X 10.4では同時期のWebkitで計測したでたを追加
9-Jun-2010:MacOS X 10.6.3/Chrome5.0.375.70にアップデートされたので結果を追加。
9-Jun-2010:Intel MacOS X Safari5がインストール直後にSafari4より遅かったが、cacheクリア、resetで早くなったので追記


注)各ブラウザで同テストを10回実行して、最大値、最小値を除いた平均値を載せてあります。

CPU毎にいろいろなブラウザでSlickSpeed TestのjQueryのライブラリを1.3以降にして比較してみた。
IEは8.0でもダントツで遅いのがはっきり分かりますね。またOSの影響よりCPUのクロック数での違いが大きい事も分かりますよね。
1CPUのクロック数が早いほうが処理速度がいいって結果からも分かります。実際、Windowsだと、IEでテスト中にタスクマネージャを見ると1CPUが100%になるのが確認できますよー。(ネタが集まったらまた情報を載せる予定。)

CPU/OS Browser Version jQuery1.3.2 jQuery1.4.2
Intel Core2 Duo 2Ghz /
WindowsXP
4.0.5 36ms 43ms
3.6.3 61ms 80ms
10.52 50ms 50ms
8.0 277ms 375ms
IBM PowerPC G4 1Ghz /
MacOS X 10.5.8
4.0.5 102ms 148ms
5.0 81ms 99ms
3.6.3 139ms 131ms
10.52 127ms 124ms
Intel Core2 duo 2.2Ghz /
MacOS X 10.6.3
4.0.5 35ms 44ms
5.0
(6533.16)
Install直後
40ms 49ms
5.0
(6533.16)
clear cache and reset後
34ms 38ms
5.0beta 39ms 40ms
5.0.375.55 49ms 47ms
5.0.375.70 39ms 38ms
3.6.3 63ms 63ms
10.52 57ms 54ms
IBM PowerPC G5 2.7Ghz /
MacOS X 10.4.11
4.0.5 42ms 54ms
Webkit r60742(5-Jun) 38ms 43ms
3.6.3 52ms 48ms
10.52 45ms 46ms
AMD Athlon XP 2200+ /
Windows XP
4.0.5 96ms 114ms
5.0 85ms 110ms
4.1 64ms 60ms
5.0 67ms 66ms
3.6.3 95ms 95ms
10.52 65ms 63ms
8.0 255ms 238ms
AMD Athlon MP 2800+ /
Windows XP
4.0.5 73ms 89ms
5.0 68ms 84ms
4.1 49ms 46ms
5.0 47ms 45ms
3.6.3 73ms 72ms
10.52 56ms 53ms
8.0 240ms 255ms
Intel Pentium M 1Ghz /
CentOS 5.4
3.6.3 101ms 100ms
10.10 118ms 117ms

| | | コメント (0) | トラックバック (0)

2010年5月22日 (土)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #19

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その19回目、


そして、あっという間に、Oracle11g R2の自動メモリー管理を無効、自動PGAメモリー管理有効状態での確認も最終回!
前回、_pga_max_sizeの50%になってしまったpga_aggregate_targetを16GB/4095GBに設定した場合のテストを_pga_max_sizeを調整してpga_aggregate_targetの20%が利用される状態にして再び確認して終わりにしたいと思います。

SYS> alter system set "_pga_max_size"=6554m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 6554M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14721.3281
global memory bound 3276.7998

SYS> alter system set "_pga_max_size"=1677313m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 1677313M
pga_aggregate_target big integer 4095G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773918.79
global memory bound 838656

SYS>


・・・中略・・・

SCOTT> @test4

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 30000 SORT (v2) 1171.63
0 order by code

SCOTT>

Oracle10g R2以降は32bitでも64bitでも、自動メモリー管理が無効で、自動PGAメモリー管理が有効ならば、かつNon parallelならば、LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5)とう条件で作業域を割り当てているのは確からしい。

次回は、ちょっと別の角度から。ということで次回へつづく。


前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18

| | | コメント (0) | トラックバック (0)

2010年5月21日 (金)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #18

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その18回目、


Oracle11g R2での検証の続き。まいどおなじみ、_pga_max_sizeを大きな値にして、pga_aggregate_targetの20%がglobal memory boundに設定されるようにして確認。

SYS> alter system set "_pga_max_size"=3840m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=256m;

システムが変更されました。

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 256M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 256
aggregate PGA auto target 206.173828
global memory bound 51.1992188

SYS>
SYS> alter system set pga_aggregate_target=512m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 512M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 512
aggregate PGA auto target 436.869141
global memory bound 102.399414

SYS> alter system set pga_aggregate_target=768m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 768M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 768
aggregate PGA auto target 667.212891
global memory bound 153.599609

SYS>
SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 1G
SYS> @pgastat


NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 897.591797
global memory bound 204.799805

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 2G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1820.0127
global memory bound 409.599609

SYS>
SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 4G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3662.25293
global memory bound 819.199219

SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 8G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7349.43164
global memory bound 1638.39941

やはりここで変化あり!

SYS> 
SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14722.1543
global memory bound 1920

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 4095G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773917.1
global memory bound 1920

SYS>

Oracle11g R1と同じ結果になりましたね。LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5) ということね。Oracle11g R2でも。
次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17

| | | コメント (0) | トラックバック (0)

2010年5月20日 (木)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #17

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その17回目、


Oracle11g R2 自動メモリー管理は無効、自動PGAメモリー管理は有効な状態での検証スタート!

いつものように、_pga_max_sizeはデフォルトの200MBで、pga_aggregate_targetを10MBから4095MBまで増加させてglobal memory boundがどのように変化するか確認します!

SYS> alter system set pga_aggregate_target=10m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 10M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SYS> alter system set pga_aggregate_target=20m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 20M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 20
aggregate PGA auto target 4
global memory bound 4

SYS> alter system set pga_aggregate_target=40m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 40M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 40
aggregate PGA auto target 12.8583984
global memory bound 8

SYS> alter system set pga_aggregate_target=256m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 256M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 256
aggregate PGA auto target 207.263672
global memory bound 51.1992188

SYS> alter system set pga_aggregate_target=512m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 512M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 512
aggregate PGA auto target 436.851563
global memory bound 100

SYS>

お、変化ありました。Oracle11g R2でも自動PGAメモリー管理の動きは同じみたいね。

どんどんやっつけちゃいましょー

SYS> alter system set pga_aggregate_target=768m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 768M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 768
aggregate PGA auto target 667.283203
global memory bound 100

SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 1G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 897.688477
global memory bound 100

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 2G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1819.87207
global memory bound 100

SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3662.25293
global memory bound 100

SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 8G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7349.43164
global memory bound 100

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14721.3457
global memory bound 100

SYS> alter system set pga_aggregate_target=2095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 2095G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2145280
aggregate PGA auto target 1930719.63
global memory bound 100

SYS>


そして、念のため実際にソート! glolbal memory boundに設定されたサイズになってますね〜。

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 100.02 409993216 409993216
0 order by code

SCOTT>


次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16

| | | コメント (0) | トラックバック (0)

2010年5月19日 (水)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #16

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その16回目、

今回からOracle11g R2 for Windows 32bit環境での検証です。なお、自動メモリー管理(AMM)はOFFで自動SGAメモリー管理(ASMM)、自動PGAメモリー管理(APMM)は有効になっています。
この状態でOracle11g R1までと動きに違いがないかみてみることにします。

SYS> select * from v$version;

BANNER
----------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SYS>

ダブルアンダースコアの隠しパラメータがが気味悪いw ですが、たぶん影響しないんじゃないかと。もともとOracle側で制御しているパラメータだし。

SYS> @show_param

KSPPINM KSPPSTVL KSPPSTDF
-------------------------------- -------------------------------- --------------------------------
_4031_sga_dump_interval 3600 TRUE
_4031_sga_max_dumps 10 TRUE
__pga_aggregate_target 79691776 TRUE
__sga_target 239075328 TRUE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_ldr_pga_lim 0 TRUE
_lock_sga_areas 0 TRUE
_memory_imm_mode_without_autosga TRUE TRUE
_memory_initial_sga_split_perc 60 TRUE
_memory_nocancel_defsgareq FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 TRUE
_pgactx_cap_stacks FALSE TRUE
_sga_clear_dump FALSE TRUE
_sga_early_trace 0 TRUE
_sga_locking none TRUE
_use_ism_for_pga TRUE TRUE
lock_sga FALSE TRUE
memory_max_target 0 TRUE
memory_target 0 TRUE
pga_aggregate_target 78643200 FALSE
pre_page_sga FALSE TRUE
sga_max_size 239075328 TRUE
sga_target 239075328 FALSE

25行が選択されました。

SYS>
SYS> show parameter workarea_size_policy

NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
workarea_size_policy string AUTO
SYS>


次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15

| | | コメント (0) | トラックバック (0)

2010年5月18日 (火)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #15

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その15回目、

さて、Oracle11g R1での検証もいよいよ最終回。 
前回、_pga_max_sizeが3840MBで、pga_aggregate_targetを16GB/4095GBとしたところで、_pga_max_sizeの50%がglobal memory boundとして設定されていました。
じゃ、最後の2でもpga_aggregate_targetの20%をglobal memory boundとして利用するようにしちゃえ!

ということで、_pga_max_sizeを6554MB/1677313MB、pga_aggregate_targetを16GB/4096GBとしてギリギリでpga_aggregate_targetの20%が利用されるように設定してみました。
以下の通り、global memory boundは、pga_aggregate_targetの20%である、3276.8MB/838656MBになってます!

SYS> alter system set "_pga_max_size"=6554m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 6554M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14720.7744
global memory bound 3276.7998

SYS>


SYS> alter system set "_pga_max_size"=1677313m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 1677313M
pga_aggregate_target big integer 4095G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773917.72
global memory bound 838656

SYS>

最後に、実メモリ768MBしか積んでないマシンなのに無理矢理、1GB越えのPGAを利用してもらっちゃいます。
当然ですが、swapしまくりなので、普通の時間でレスポンスなんて戻ってきませんから真似しないようにw swapを使ってDISKガリガリいってましたがOracle上ではちゃんとOPTIMALとなっておりますはい!。

SCOTT> @test4

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 30000 SORT (v2) 1171.63
0 order by code

SCOTT>


ということで、次回、Oracle11g R2 for Linux x86の自動メモリー管理(AMM)下でどうなるか確認と、思ったのですが、ちょうど Oracle11g R2 for Windows (32bit)がダウンロードできるようになっていたので、急遽、Oracle11g R2 for Windows(32bit)かつ、自動メモリー管理をオフにした状態ではどうなるか確認してみましょう。なを32bitのWindowsなのでSGA/PGA合わせて2GB超えないような範囲で遊びマッス!。

なんか久々に1ヶ月ものぐらいのネタに膨らまそうか考えてたりして・・・・。

次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14

| | | コメント (0) | トラックバック (0)

2010年5月17日 (月)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #14

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

_pag_max_sizeに大きな値を設定し、LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5)という条件で割り当てられていることを確認してみます!

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set "_pga_max_size"=3840m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=256m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 256M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 256
aggregate PGA auto target 205.734375
global memory bound 51.1992188

SYS> alter system set pga_aggregate_target=512m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 512M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 512
aggregate PGA auto target 435.700195
global memory bound 102.399414

SYS> alter system set pga_aggregate_target=768m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 768M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 768
aggregate PGA auto target 666.518555
global memory bound 153.599609

SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 1G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 896.52832
global memory bound 204.799805

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 2G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1818.44824
global memory bound 409.599609

SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 4G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3735.43555
global memory bound 819.199219

SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 8G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7347.50684
global memory bound 1638.39941



まちがいなく、pga_aggregate_targetの20%がglobal memory boundに設定されてます!

さて、pga_aggregate_targetを16GB以上に設定すると、_pga_max_sizeの50%より、pga_aggregate_targetの20%の方が大きくなるため、_pga_max_sizeパラメータの50%のサイズがglobal memory boundに設定されるはず! ではやってみよう!

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 15023.2441
global memory bound 1920

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 4095G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773917.55
global memory bound 1920

SYS>

予想通り、_pga_max_sizeの50%がglobal memory boundに設定されてますね。
Oracle11g R1での検証もいよいよ次回が最終回。ということで、次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13

| | | コメント (0) | トラックバック (0)

2010年5月16日 (日)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #13

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その13回目、

_pga_max_sizeはデフォルトのままで、pga_aggregate_targetを増加させていくと、Oracle10g R2と同様に、LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5)という条件で割り当てられてるようだ。ということでその確認のつづき。

pga_aggregate_targetが512MBになったところで、_pga_max_sizeの200MBの50%のサイズがglobal memory boundとして設定されるようになった。さらに増加させてその割合に変化がないか確認していく。

SYS> alter system set pga_aggregate_target=768m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 768M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 768
aggregate PGA auto target 666.720703
global memory bound 100

SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 1G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 896.677734
global memory bound 100

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 2G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1818.26367
global memory bound 100

SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3661.89258
global memory bound 100

SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 8G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7348.25391
global memory bound 100

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14720.5371
global memory bound 100

pga_aggregate_targetを16GBにしても、_pga_max_sizeの50%のサイズである100MBがglobal memory boundに設定されていますね。

最後に、pga_aggregate_targetを4095GBにしてみると〜

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4095G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773918.45
global memory bound 100

SYS>

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 100.02 409993216 409993216
0 order by code

SCOTT>

やはり、global memory boundは、_pga_max_sizeの50%のままですね。_pga_max_sizeを大きなサイズにし、pga_aggregate_targetの20%が利用されるかを確認しますよ〜。ということで次回へつづく。


前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12

| | | コメント (0) | トラックバック (0)

2010年5月15日 (土)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #12

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その12回目、

さて、Oracle11g R1 for Linux x86を利用した検証を始めるよ〜 :)

これまでと同様に、まず、_pga_max_sizeはデフォルトの200MBのままで、pga_aggregate_targetを10MB/20MB/40MB/256MB/512MBと増加させてglobal memory boundがどう変化するか確認していく。

SYS> alter system set pga_aggregate_target=10m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 10M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SYS> alter system set pga_aggregate_target=20m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 20M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 20
aggregate PGA auto target 4
global memory bound 4

SYS> alter system set pga_aggregate_target=40m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 40M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 40
aggregate PGA auto target 11.3720703
global memory bound 8

SYS>

ここまでのところ、 pga_aggregate_targetの20%がglobal memory boundとして設定されている。

次ぎいってみよー!

SYS> alter system set pga_aggregate_target=256m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 256M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 256
aggregate PGA auto target 205.479492
global memory bound 51.1992188

SYS> alter system set pga_aggregate_target=512m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 512M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 512
aggregate PGA auto target 436.31543
global memory bound 100

お、やはり、変化しました。 512MBの20%は、102.4MBですが、global memory boundに設定された値は、100MB。 _pga_max_sizeの50%ですね〜。
おそらく、Oracle10g R1と同じ割当条件なんでしょうね。

次回はpga_aggregate_targetパラメータをさらに増加させてみますよ。。つづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11

| | | コメント (0) | トラックバック (0)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #11

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その11回目、

さて、Oracle10g R2までは試したので、今回からはOracle11g R1で試します。利用したのはOracle11g R1 for Linux x86.

いつものように現状確認と、登録済みデータの確認から。自動メモリー管理が有効は無効にしてあります。自動SGA管理と自動PGA管理は有効になってますよー。
というか少なくとも自動PGA管理は有効にしておかないとこの検証自体が・・・・w

dSYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SYS>
SYS> @show_param

KSPPINM KSPPSTVL KSPPSTDF
-------------------------------- ------------------------------ ------------------------------
_4031_sga_dump_interval 3600 TRUE
_4031_sga_max_dumps 10 TRUE
__pga_aggregate_target 104857600 FALSE
__sga_target 352321536 FALSE
_kdli_sio_pga FALSE TRUE
_kdli_sio_pga_top FALSE TRUE
_lock_sga_areas 0 TRUE
_memory_initial_sga_split_perc 60 TRUE
_memory_nocancel_defsgareq FALSE TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 FALSE
_sga_clear_dump FALSE TRUE
_sga_early_trace 0 TRUE
_sga_locking none TRUE
_use_ism_for_pga TRUE TRUE
lock_sga FALSE TRUE
memory_max_target 0 TRUE
memory_target 0 TRUE
pga_aggregate_target 104857600 FALSE
pre_page_sga FALSE TRUE
sga_max_size 352321536 TRUE
sga_target 352321536 FALSE

22行が選択されました。

SYS> show parameter workarea_size_policy

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy string AUTO
SYS>

とりあえず、200000万件、1.6GBほどのデータを登録してあります。

SCOTT> select count(*) from code;

COUNT(*)
----------
200000

SCOTT> l
1 select
2 blocks*block_size/1024/1024 as "table_size(MB)"
3 from
4 user_tables ut join user_tablespaces uts
5 on ut.tablespace_name = uts.tablespace_name
6* and ut.table_name = 'CODE'
SCOTT> /

table_size(MB)
--------------
1600.625

SCOTT>

次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10

| | | コメント (0) | トラックバック (0)

2010年5月13日 (木)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #10

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その10回目、

前回までで、Oracle10g R2では、LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5)という条件でPGAの作業領域を割り当てているらしいというところまでは確認できた。
今回は、隠しパラメータ、 _pga_max_sizeパラメータを3840MBという大きな値に設定し、 pga_aggregate_targetの20%が利用されるか確認してみた。

_pga_max_sizeを3840MBと設定し、pga_aggregate_targetを256MB/512MB/768MB/1G/2G/4G/8G/16Gと増加させた場合、常に1920MB(_pga_max_size*0.5)より小さくなるのでpga_aggregate_target*0.2のサイズがglobal memory boundとして設定されるはず。

では、早速確認してみる。

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set "_pga_max_size"=3840m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=256m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 256M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 256
aggregate PGA auto target 213.75
global memory bound 51.1992188

SYS> alter system set pga_aggregate_target=512m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 512M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 512
aggregate PGA auto target 444.155273
global memory bound 102.399414

SYS> alter system set pga_aggregate_target=768m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 768M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 768
aggregate PGA auto target 685.213867
global memory bound 153.599609

SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 1G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 919.334961
global memory bound 204.799805

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 2G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1826.8418
global memory bound 409.599609

SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 4G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3669.74121
global memory bound 819.199219

SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 8G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7472.14941
global memory bound 1638.39941

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14729.168
global memory bound 1920

SYS>


実メモリ2GBしか積んでないので3.2GB近くのPGAサイズが割り当てられるか実際のテストはちょいとだけ無理をして1GBぐらいを目指してみた…

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=6g;

システムが変更されました。

SYS>
SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 3840M
pga_aggregate_target big integer 6G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 6144
aggregate PGA auto target 5513.83594
global memory bound 1228.7998

SYS>

・・・中略・・・

SCOTT> @test4

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 30000 SORT (v2) 1171.63
0 order by code

1GB以上のPGAが利用されたところまでは確認できた〜〜。ということで、

Oracle10g R2において、1セッションでパラレルクエリでなければ、LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5)という条件でPGAを割り当てているのは確からしい。

今回で、Oracle10g R2 for MacOS X Server x86-64での検証はおわり、Oracle11g R1 for Linux x86で試してみようと思う。なお自動メモリー管理(AMM)は利用していない構成にしてある。ということで次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9

| | | コメント (0) | トラックバック (0)

2010年5月12日 (水)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #9

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その9回目、

_pga_max_sizeはデフォルトの200MBのままで、pga_aggregate_targetを256MB/512MB/768MB/1GB/2GB/4GB/8GB/16GB/4095GBと増加させてみる。

Oracle10g R2 for MacOS X x86_64版では、Oracle10g R1までと違い、pga_aggregate_target * 0.2を割り当てているということまでは見る事ができた。
以前のリリースのように _pga_max_size * 0.5と比べて小さい値を使うのだと仮定すれば、 LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5)となっているんでしょうね。きっと。

とすると… 256MB/512MB/768MB/1GB/2GB/4GB/8GB/16GB/4095GBとpga_aggregate_targetを増加させると、256MBの場合だけ _pga_max_size * 0.5 を下回る。pga_aggregate_targetが512MB以上、かつ_pga_max_sizeがデフォルトの200MBの場合、global memory boundは常に100MBになるはず。

じゃ、確かめてみよう!

SYS> alter system set pga_aggregate_target=256m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 256M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 256
aggregate PGA auto target 213.855469
global memory bound 51.1992188

SYS>

SYS> alter system set pga_aggregate_target=512m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 512M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 512
aggregate PGA auto target 443.979492
global memory bound 100

やはり、ここで変化しましたね!

SYS> alter system set pga_aggregate_target=768m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 768M
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 768
aggregate PGA auto target 674.384766
global memory bound 100

SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 1G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 905.053711
global memory bound 100

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 2G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1826.63965
global memory bound 100

SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3669.82031
global memory bound 100

SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 8G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7356.19043
global memory bound 100

SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 16G
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14728.9131
global memory bound 100

SYS>

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 100.02 409993216 409993216
0 order by code

SCOTT>

・・・中略・・・

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4095G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773925.04
global memory bound 100

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 100.02 409993216 409993216
0 order by code

SCOTT>

予想通り、 LEAST(pga_aggregate_target * 0.2, _pga_max_size * 0.5) となっている模様〜。まだまだつづきますよ〜 :)



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8

| | | コメント (0) | トラックバック (0)

2010年5月11日 (火)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #8

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その8回目、

Oracle10g R1の場合と同様に、_pga_max_sizeパラメータはデフォルト(200BMMB)のまま、pga_aggregate_targetを10MBスタートして増加させて確認していきますよ〜。

SYS> alter system set pga_aggregate_target=10m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 10M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound 2

SYS>

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 2.01 409993216 409993216
0 order by code

SCOTT>

あれ、Oracle10g R1までの頃と割り当てられてるサイズが違う! pga_aggregate_targetが10MBなのに0.5MBではなく、2MB。つまり20%が割り当てられてます。

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=20m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 20M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 20
aggregate PGA auto target 4
global memory bound 4

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 4.04 409993216 409993216
0 order by code

SCOTT>

・・・中略・・・

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=40m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 40M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 40
aggregate PGA auto target 18.4570313
global memory bound 8

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT (v2) 8.04 409993216 409993216
0 order by code

SCOTT>

Oracle10g R1までの頃より、pgaの作業領域が大きく確保されるようになってるということもある程度見えましたが、まだばだ続きます。

注)パラレルクエリの場合はちょいと違いますからご注意を。余裕があったらやるかもしれないけど。:)


前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7

| | | コメント (0) | トラックバック (0)

2010年5月10日 (月)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #7

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その7回目、

今回からOracle10g R2での検証、環境は以下。

Oracle10g R2 for MacOS X Server (x86_64) / MacOS X 10.6.3 Core2 Duo 2.2Ghz RAM:2GB

手順はOracle10g R1の場合と同じだが、多少順番が前後したり設定するサイズは変更しながら行うかもしれないのであしからず。

SYS> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for MacOS X Server: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SYS>

Oracle10g R1 for MacOS X Serverの場合と同じテスト表とデータを用意してっ、と。

SCOTT> 
SCOTT> create table code (code varchar2(4000));

表が作成されました。

SCOTT>
SCOTT> begin for i in 1..100000 loop insert into code values(lpad('#',4000,'#')); end loop; commit; end;
2 /

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

SCOTT> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'CODE',degree=>2,estimate_percent=>100);

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

SCOTT>
SCOTT> l
1 select
2 blocks*block_size/1024/1024 as "table_size(MB)"
3 from
4 user_tables ut join user_tablespaces uts
5 on ut.tablespace_name = uts.tablespace_name
6* and ut.table_name = 'CODE'
SCOTT> /

table_size(MB)
--------------
788.101563

SCOTT>


テスト開始まえの関連パラメータの値は以下のような状態になってます。

SYS> @show_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
_4031_sga_dump_interval 3600 TRUE
_4031_sga_max_dumps 10 TRUE
_lock_sga_areas 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 FALSE
_use_ism_for_pga TRUE TRUE
lock_sga FALSE TRUE
pga_aggregate_target 104857600 FALSE
pre_page_sga FALSE TRUE
sga_max_size 612368384 TRUE
sga_target 612368384 FALSE

11行が選択されました。

SYS> show parameter workarea_size

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy string AUTO
SYS>


引っ張るメソッドはいつもと同じということで、Oracle10g R2編、次回へつづく。 :)


前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6

| | | コメント (0) | トラックバック (0)

2010年5月 9日 (日)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #6

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その6回目、

前回までで、Oracle10g R1 (32bit)がpga_aggregate_targetパラメータと_pga_max_sizeパラメータをどのように使ってpgaの作業領域を割り当てているか見えたのですが、念押しでもういっちょw.

_pga_max_size * 50% が使われるというところをデフォルトの200MB以外でも確認して、Oracle10g R1 (32bit)での検証はおわりにしたい。:)

_pga_max_sizeパラメータは隠しパラメータなのでOracle Supportの指示なしには変更しないパラメータ、遊ぶ場合は、趣味の環境等でやってね :)

_pga_max_sizeを400MB/800MBと変更し、pga_aggregate_targetも4GB/8GBと設定する。Oracleがきまぐれで割り当てていないのであれば、 LEAST(_pga_max_size*0.5, pga_aggregate_target*0.05)より、200MB/400MBがglobal memory boundとして設定されるはず。

SYS> alter system set "_pga_max_size" = 400m;

システムが変更されました。

SYS> alter system set pga_aggregate_target = 4g;

システムが変更されました。

SYS> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 293601280 bytes
Fixed Size 778888 bytes
Variable Size 116137336 bytes
Database Buffers 176160768 bytes
Redo Buffers 524288 bytes
データベースがマウントされました。
データベースがオープンされました。
SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 400M
pga_aggregate_target big integer 4G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3673.17773
global memory bound 200

SYS>

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT 172.89 409993216 409993216
0 order by code

・・・中略・・・

SYS> alter system set "_pga_max_size" = 800m;

システムが変更されました。

SYS> alter system set pga_aggregate_target = 8g;

システムが変更されました。

SYS> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 293601280 bytes
Fixed Size 778888 bytes
Variable Size 116137336 bytes
Database Buffers 176160768 bytes
Redo Buffers 524288 bytes
データベースがマウントされました。
データベースがオープンされました。
SYS>
SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 800M
pga_aggregate_target big integer 8G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7359.09961
global memory bound 400

SYS>

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT 370.66 409993216 409993216
0 order by code

ということで、Oracle10g R2 編へつづく。




前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5

| | | コメント (0) | トラックバック (0)

2010年5月 8日 (土)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #5

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その5回目、

Oracle10g R1 (32bit)で、pga_aggregate_targetを40MBから一気に上限に近い4095GBに増加させたところで、global memory boundへの割当割合が変化した。

今回は、pga_aggregate_targetを1GBから16GBそして、後半では、_pga_max_sizeも増加させてどう変化するか確認してみることに。

_pga_max_sizeパラメータは隠しパラメータなのでOracle Supportの指示なしには変更しないパラメータ、遊ぶ場合は、趣味の環境等でやってね :)

あ、ところで、なんでPGAネタを始めたかって? 知りたいですか? 

実は、先日、インフラ担当(Oracleにはかなり詳しいと思われる)の方と話していて、pga_aggregate_targetの話題になったとき、その方が、「そーゆー、都市伝説みたいな話があるよね〜、キッパリ!」、みたいなノリで話していたので、私:「そんな事ないよー、都市伝説みたいじゃなくて都市伝説だよ(ウソウソ)、ほんととうにそう動いてるよ〜」、という話をしていて、どーしても書かなきゃ!、という気持ちになったのでした〜。それ以外に、第一回目でもちょっと書きましたが、10g r2ではちょいと変わったとか...いう話もあったし。(マニュアルにも書いてないし、Oracleに完全お任せでいいかというと、性能問題に絡んでくるちょいといやらしいとこなので)

余談はこのくらいにして、実験再開。

実際にソート処理をさせなくても、いままでの結果から、global memory boundの値が自動PGAメモリー管理では重要な意味があることは確認できたと思うので、毎回ソート処理を行わないで進めます。(適当な所で実際にソートしてみます!)

Oracle10g R1も9iと同様に、MIN(pga_aggregate_target * 0.05, _pga_max_size * 0.5)という条件で割り当てているのはほぼ確実なので、_pga_max_size=200MB (デフォルト)のままで、pga_aggregate_targetを1GB/2GB/4GB/8GB/16GBと増加させた場合、_pga_max_size * 0.5 = 100MBを下回るのは、pga_aggregate_targetに1GBを指定した場合のみなので、Oracleが気まぐれにglobal memory boundを設定しているのでなければ、global memory boundは、51.2BM/100MB/100MB/100MB/100MBという変化になるはず!


2010/5/8追記:
MIN(pga_aggregate_target * 0.05, _pga_max_size * 0.5)という表現よりSQLなら
LEAST(pga_aggregate_target * 0.05, _pga_max_size * 0.5)こっちの方がいいな次ぎからLEASTにする。


ということを脳のcacheにKEEPした上で、以下をご覧ください。
SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 1G

SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 908.4375
global memory bound 51.1992188

SYS>
SYS>
SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS>
SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 2G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1830.2168
global memory bound 100

SYS>
SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3673.33594
global memory bound 100

SYS>
SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 8G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7359.69727
global memory bound 100

SYS>
SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 16G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14732.2793
global memory bound 100

SYS>
SYS>

・・・中略・・・

SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT 97.58 409993216 409993216
0 order by code

やった〜!、予想通り!!! :)

さらに念押し、pga_aggregate_target * 5%が _pga_max_size * 50% より小さくなるようにして、さらに変化を見る。

16GB * 5% = 819.2MB なので 820MB * 2 = 1640MB を _pga_max_sizeパラメータに設定すればいろいろと見えるよね。たぶん。

MacOS X版Oracle10g R1だけかもしれないけど?(未確認なので)、動的に変わるはず(と思っている)_pga_max_sizeがどうも静的なので、Oracle10g R1では _pga_max_sizeを変更した場合は必ず、インスタンスを再起動しています。 (^^;;;;

_pga_max_sizeを1640MBに設定後、pga_aggregate_targetを1GB/2GB/4GB/8GB/16GBと増加させます。Oracleが気まぐれでglobal memory boundを設定していなければ、global memory boundの値は、51.2MB/102.4MB/204.8MB/409.6MB/819.2MBという変化を見せてくれるはず。

SYS> alter system set "_pga_max_size"=1640m;

システムが変更されました。

SYS> alter system set pga_aggregate_target=1g;

システムが変更されました。

SYS> shutdown
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SYS> startup
ORACLEインスタンスが起動しました。

Total System Global Area 293601280 bytes
Fixed Size 778888 bytes
Variable Size 116137336 bytes
Database Buffers 176160768 bytes
Redo Buffers 524288 bytes
データベースがマウントされました。
データベースがオープンされました。
SYS>
SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 1640M
pga_aggregate_target big integer 1G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 1024
aggregate PGA auto target 907.892578
global memory bound 51.1992188

SYS> alter system set pga_aggregate_target=2g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 1640M
pga_aggregate_target big integer 2G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 2048
aggregate PGA auto target 1829.30273
global memory bound 102.399414

SYS>
SYS> alter system set pga_aggregate_target=4g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 1640M
pga_aggregate_target big integer 4G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4096
aggregate PGA auto target 3672.4834
global memory bound 204.799805

SYS>
SYS> alter system set pga_aggregate_target=8g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 1640M
pga_aggregate_target big integer 8G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 8192
aggregate PGA auto target 7358.87988
global memory bound 409.599609

SYS>
SYS> alter system set pga_aggregate_target=16g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 1640M
pga_aggregate_target big integer 16G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 16384
aggregate PGA auto target 14731.6289
global memory bound 819.199219

SYS>

データ量を倍にして、実際にソートしてみると。。。700MB以上のPGAを使ってくれました〜パチパチ。

SCOTT> 
SCOTT> begin for i in 1..100000 loop insert into code values(lpad('#',4000,'#')); end loop; commit; end;
2 /

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

SCOTT> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'CODE',degree=>2,estimate_percent=>100);

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

SCOTT> alter system flush shared_pool;

システムが変更されました。

SCOTT> @test3

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
------------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 20000 SORT 781.26
0 order by code


SCOTT>

もうここまででもOracle10g R1での検証は十分かと思いますが、さらに念押しで確認してみますよ〜(趣味の世界w) 次回へつづく。




前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4

| | | コメント (0) | トラックバック (0)

2010年5月 7日 (金)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #4

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その4回目、

Oracle10g R1 (32bit)で、pga_aggregate_targetを徐々に増加させ、PGAの使われ方がどう変わるかの確認のつづき。


pga_aggregate_targetを10MB、20MBと増加させてきたが、今回は、40MB、そして 4095GBと上限値近くまで増やしてみる。

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=40m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 40M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 40
aggregate PGA auto target 22.5527344
global memory bound 2

・・・中略・・・

SCOTT>
SCOTT> -- test #3 _pga_max_size=200m (default) / pga_aggregate_target=40m
SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT 1.92 409993216 409993216
0 order by code

SCOTT>

pga_aggregate_targetを10MB、20MB、40MBと増加させてみたところ、Oracle9i R2までと同じく、pga_aggregate_targetの5%をglobal memory boundとし、その値を上限にオペレーションしていることは確からしい。

次ぎは、_pga_max_sizeパラメータのデフォルト値である200MBを元にしてPGAサイズが決定されるようにしてみる。
pga_aggregate_targetを4095GBにする必要は全くないのだけれどね、ほんとうは。 :)

SYS> 
SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=4095g;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 4095G
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 4193280
aggregate PGA auto target 3773929.32
global memory bound 100

SYS>

・・・中略・・・

SCOTT>
SCOTT> -- test #4 _pga_max_size=200m (default) / pga_aggregate_target=4095G
SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT 97.58 409993216 409993216
0 order by code

SCOTT>

お〜〜〜っと、ここで変化が現れました。

これまでのテストでは、pga_aggregate_targetの5%がglobal memory boundとして調整されていましたが、5%より随分小さい値が設定されています。これもOracle9i R2と同様に、_pga_max_sizeの50%という値が設定されていると考えてよさそう。 pga_aggregate_target * 5% か _pga_max_size * 50% のいずれか小さい方が利用されていますよね。

次回はその辺りをもう少し細かく確認してみよと思います。つづく…




前回までのあらすじ・・・

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3

| | | コメント (0) | トラックバック (0)

2010年5月 6日 (木)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #3

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その3回目、

まずは、pga_aggregate_targetパラメータを変更し、PGAがどのように利用されるかみていく。10MBからはじめ、徐々に増加させてみる。
(なお、Oracleのバックグラウンドプロセス以外のセッションは以後のテストで接続している1セッションのみ。同時に複数のセッションがあると自動PGAメモリー管理が働きすぎて困るのでw)

SYS>
SYS> alter system set pga_aggregate_target=10m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 10M

SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 10
aggregate PGA auto target 4
global memory bound .5

SYS>

前述の情報を見ただけでもわかる方はもう気づいたと思いますが、実際にソート処理を行わせてPGAのサイズなどもみておきますね。(その方が面白いしw)

SCOTT> --test #1 _pga_max_size=200m(default) / pga_aggregate_target=10m
SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT .44 409993216 409993216
0 order by code

SCOTT>

前述の結果から見ると、ソート処理は、0.44MBのPGAを利用していることが確認でき、そのサイズは、global memory bound以下のサイズであり、global memory boundは、pga_aggregate_targetパラメータで指定したサイズ(10MB)の5%である0.5MBであることがわかる。

では次ぎに、20MBに増加させて試してみると…

SYS> alter system flush shared_pool;

システムが変更されました。

SYS> alter system set pga_aggregate_target=20m;

システムが変更されました。

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 20M

SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 20
aggregate PGA auto target 4.36816406
global memory bound 1

・・・中略・・・

SCOTT>
SCOTT> -- test #2 _pga_max_size=200m(default) / pga_aggregate_target=20m
SCOTT> @test2

SQL_TEXT OPERATION_TYPE last_mem(MB) LAST_TEMPSEG_SIZE MAX_TEMPSEG_SIZE
---------------------------------------- -------------------- ------------ ----------------- ----------------
select * from code where rownum <= 10000 SORT .97 409993216 409993216
0 order by code

SCOTT>


pga_aggregate_targetパラメータが10MBの場合と同様に、pga_aggregate_target5%がglobal memory boundのサイズとして調整され、ソート処理を行わせてもその範囲以下を上限としてメモリソート+DISKソートが行われていることがわかる。

Oracle10g R1は、Oracle9i R2のまでと同じ割当方法だよね〜。

ここまでに利用したスクリプトは以下。(今回使った分ね。)
・test2.sql

set term off
select * from code where rownum <= 100000 order by code
/
set term on
@show_workarea2

・show_workarea2.sql

col sql_text for a40
col operation_type for a20
select
sql_text
,operation_type
,round(last_memory_used/1024/1024,2) as "last_mem(MB)"
,last_tempseg_size
,max_tempseg_size
from
v$sql vs join v$sql_workarea vsw
on vs.sql_id = vsw.sql_id
where
sql_text='select * from code where rownum <= 100000 order by code'
/

ということで、次回へつづく。 :)



前回までのあらすじ・・・

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2

| | | コメント (0) | トラックバック (0)

2010年5月 5日 (水)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #2

2010/11/25追記
実は_pga_max_sizeの扱いがOracle10g R2以降ひっそりと変更されていた!という事実。Season2という後付けのタイトルで後日談を書いておきましたので次いでに見ておくとちょっとは幸せになるかも…
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? Season2 #1

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? その2回目、

自動PGAメモリー管理下ではどのようにPGAが割り当てられているのか確認して見ることに…

はじめは、

Oracle10g R1 for MacOS X Server (32bit) / MacOS X 10.4.11 Server PPC G5 Dual 2.7Ghz RAM:1GB

という環境から。

SYS> select * from v$version;

BANNER
----------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
PL/SQL Release 10.1.0.3.0 - Production
CORE 10.1.0.3.0 Production
TNS for MacOS X Server: Version 10.1.0.3.0 - Production
NLSRTL Version 10.1.0.3.0 - Production

SYS>

以下、隠しパラメータも含めて(多めに表示してますが気にしないで・・)確認!
赤字のパラメータはいろいろ関わってくるから気にしておくと吉だけど、隠しパラメータは基本的にユーザがかってに変更するパラメータではないので、Oracle社さんからの指示に従ってね :-)

ちなみに、隠しパラメータは、パラメータ名称の先頭が "_"になっているパラメータのこと。かってに変更されては困るからマニュアルにも記載されていないパラメータのこと。
英語圏のブログを検索するときは、hidden parameters なんてキーワード含めるといいよ!

SYS> @show_param

KSPPINM KSPPSTVL KSPPSTDF
------------------------------ ------------------------------ ------------------------------
_4031_sga_dump_interval 3600 TRUE
_4031_sga_max_dumps 10 TRUE
_lock_sga_areas 0 TRUE
_pga_large_extent_size 1048576 TRUE
_pga_max_size 209715200 FALSE
_use_ism_for_pga TRUE TRUE
lock_sga FALSE TRUE
pga_aggregate_target 104857600 FALSE
pre_page_sga FALSE TRUE
sga_max_size 293601280 TRUE
sga_target 293601280 FALSE

11行が選択されました。

SYS>
SYS> show parameter workarea_size_policy

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
workarea_size_policy string AUTO
SYS>


隠しパラメータは通常はshow parameterコマンドでは表示されないけど一旦設定してあげると表示されるようになるんだよ〜。
_pga_max_size隠しパラメータのデフォルト値は200MBなんだけどあえて設定してやることでshow parameterコマンドで確認できるようにしてあります。
マネしないでね、してもいいけど自己責任でお願いします (^^;;;

SYS> show parameter pga

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
_pga_max_size big integer 200M
pga_aggregate_target big integer 100M
SYS>
SYS> @pgastat

NAME size(MB)
-------------------------------------------------- ----------
aggregate PGA target parameter 100
aggregate PGA auto target 76.6142578
global memory bound 5

SYS>

最後の結果は、v$pgastatビューを問い合わせているんですが、一番のポイントは赤字部分のglobal memory boundなのでよ〜〜〜〜く覚えておいてね (^^

以下、ここまでで使ったスクリプト。

show_param.sql

set linesize 200
col ksppinm for a30
col ksppstvl for a30
col ksppstdf for a30
select
a.ksppinm
,b.ksppstvl
,b.ksppstdf
from
x$ksppi a join x$ksppcv b
on a.indx = b.indx
where
a.ksppinm like '%pga%'
or a.ksppinm like '%sga%'
or a.ksppinm like 'memory%'
order by
a.ksppinm
/

pgastat.sql

set linesize 200
col name for a50
select
name
,value/1024/1024 "size(MB)"
from
v$pgastat
where
name in (
'aggregate PGA target parameter'
,'aggregate PGA auto target'
,'global memory bound'
)
/


というこで、引っぱりまくってますが、Oracle10g R1 (32bit)編、次回へつづく。



前回までのあらすじ・・・
pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1

| | | コメント (0) | トラックバック (0)

pga_aggregate_targetでPGA?、_pga_max_sizeでPGA? #1

かな〜り間が空きましたが、久々にMac De Oracleっぽいネタにしました〜w

pga_aggregate_targetというか_pga_max_sizeパラメータというかPGAに割り当てられるSORTやhash-joinなどのサイズ絡みの話をいくつかのプロジェクトでしてたらOracle10g R2以降は割当る割合が変わったよね〜なんて話が出てた事もあり、実際はどーなーのよー。という事で調べてみる事にした。

Oracle9i R2までのお話は、過去記事や国内外のブログでも沢山書かれているのでそちらも参考にしてもらうよろしいかと…

sizing pga_aggregate_target and pga_max_size for Oracle
The _PGA_MAX_SIZE hidden parameter
新・ソートに関する検証
32bitと64bitのOracle10gでも_pga_max_sizeの値は同じ。
Mac De Oracle なんですが、Windows(32bit)でのOracleな話 #2

確認方法は、前述した新・ソートに関する検証の検証方法を参考に進めて行くことにした。
pga_aggregate_target関連の話でかつ、日本語の記事だとここが一番分かりやすい。感謝。

今回対象としたのは以下のプラットフォームとリリースのOracle

・Oracle10g R1 for MacOS X Server (32bit) / MacOS X 10.4.11 Server PPC G5 Dual 2.7Ghz RAM:1GB
・Oracle10g R2 for MacOS X Server (64bit) / MacOS X 10.6.3 Core2 Duo 2.2Ghz RAM:2GB
・Oracle11g R1 for Linux x86 (32bit) / CentOS 5.4 Pentium M 1Ghz RAM:768MB
・Oracle11g R2 for Linux x86 (32bit) / CentOS 5.4 Pentium M 1Ghz RAM:768MB


まず、検証対象の全データベースのSCOTTスキーマに以下の表とデータを登録しておく! :)

SCOTT> create table code (code varchar2(4000));

表が作成されました。

SCOTT> begin for i in 1..100000 loop insert into code values(lpad('#',4000,'#')); end loop; commit; end;
2 /

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

SCOTT> exec dbms_stats.gather_table_stats(ownname=>'SCOTT',tabname=>'CODE',estimate_percent=>100);

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

SCOTT>
SCOTT> l
1 select
2 blocks*block_size/1024/1024 as "table_size(MB)"
3 from
4 user_tables ut join user_tablespaces uts
5 on ut.tablespace_name = uts.tablespace_name
6* and ut.table_name = 'CODE'
SCOTT> /

table_size(MB)
--------------
782.101563

SCOTT>

ということで、次回へつづく。 (^^

| | | コメント (0) | トラックバック (0)

2009年11月29日 (日)

CentOS5.4で無線LAN

先日、転居に伴い自宅のLAN環境を変えたついでに、それまでケーブル接続していたCentOS5を入れていたお遊び用Toshiba Dynabook SS SX/210LNLW RAM:768MBを無線LAN接続で使う事にした。rootユーザの言語をJapanseにしていた関係で「ワイヤレスでバイス設定」を使って少々ハマってしまったので、何にハマったのかも備忘録として書いてあります。

尚、無線LAN設定時はCentOS5.4。

Wlan_centos54_001_2

まず、無線LANアダプターの確認。

[root@corydoras ˜]# lspci | grep Ether
01:05.0 Ethernet controller: Atheros Communications Inc. Atheros AR5001X+ Wireless Network Adapter (rev 01)
01:08.0 Ethernet controller: Intel Corporation 82801DB PRO/100 VE (MOB) Ethernet Controller (rev 83)
[root@corydoras ˜]#

wpa_supplicant関係の確認.

[root@corydoras ˜]# rpm -q wpa_supplicant
wpa_supplicant-0.5.10-8.el5
[root@corydoras ˜]# rpm -ql wpa_supplicant
/etc/dbus-1/system.d/wpa_supplicant.conf
/etc/logrotate.d/wpa_supplicant
/etc/rc.d/init.d/wpa_supplicant
/etc/sysconfig/wpa_supplicant
/etc/wpa_supplicant
/etc/wpa_supplicant/wpa_supplicant.conf
/usr/sbin/wpa_cli
/usr/sbin/wpa_passphrase
/usr/sbin/wpa_supplicant
/usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service
/usr/share/doc/wpa_supplicant-0.5.10
/usr/share/doc/wpa_supplicant-0.5.10/COPYING
/usr/share/doc/wpa_supplicant-0.5.10/ChangeLog
/usr/share/doc/wpa_supplicant-0.5.10/README
/usr/share/doc/wpa_supplicant-0.5.10/eap_testing.txt
/usr/share/doc/wpa_supplicant-0.5.10/examples
/usr/share/doc/wpa_supplicant-0.5.10/examples/ieee8021x.conf
/usr/share/doc/wpa_supplicant-0.5.10/examples/plaintext.conf
/usr/share/doc/wpa_supplicant-0.5.10/examples/wep.conf
/usr/share/doc/wpa_supplicant-0.5.10/examples/wpa-psk-tkip.conf
/usr/share/doc/wpa_supplicant-0.5.10/examples/wpa2-eap-ccmp.conf
/usr/share/doc/wpa_supplicant-0.5.10/todo.txt
/usr/share/doc/wpa_supplicant-0.5.10/wpa_supplicant.conf
/usr/share/man/man5/wpa_supplicant.conf.5.gz
/usr/share/man/man8/wpa_background.8.gz
/usr/share/man/man8/wpa_cli.8.gz
/usr/share/man/man8/wpa_passphrase.8.gz
/usr/share/man/man8/wpa_supplicant.8.gz
/var/run/wpa_supplicant
[root@corydoras ˜]#

以下、関連configファイルをダラダラと。。この辺りの設定方法はググルと山ほど出て来るのでほんと助かりまっす!

[root@corydoras ˜]# cat /etc/sysconfig/network-scripts/ifcfg-wlan0
# Atheros Communications Inc. Atheros AR5001X+ Wireless Network Adapter
DEVICE=wlan0
BOOTPROTO=none
ONBOOT=yes
#HWADDR=XX:XX:XX:XX:XX:XX
NETMASK=255.255.255.0
DHCP_HOSTNAME=
IPADDR=192.168.1.20
DOMAIN=
GATEWAY=192.168.1.1
TYPE=Wireless
USERCTL=no
IPV6INIT=no
PEERDNS=yes
ESSID=MyAirPortExpress
CHANNEL=1
MODE=Managed
SECURITYMODE=Restricted
RATE=Auto
[root@corydoras ˜]#


パスフレーズを設定して…

[root@corydoras ˜]# wpa_passphrase MyAirPortExpress hogehoge >> /etc/wpa_supplicant/wpa_supplicant.conf
[root@corydoras ˜]# cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

#network={
# ssid="any"
# key_mgmt=NONE
#}

network={
scan_ssid=1
proto=WPA2
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
ssid="MyAirPortExpress"
psk=4151a3813315d0175c7cd157a3afbb27ae50b9f466608687a60c0514ef0ec427
}
[root@corydoras ˜]#


/etc/sysconfig/wpa_supplicantは以下のように設定した

[root@corydoras ˜]# cat /etc/sysconfig/wpa_supplicant
# Use the flag "-i" before each of your interfaces, like so:
# INTERFACES="-i eth1 -i wlan0"
INTERFACES="-i wlan0"


# Use the flag "-D" before each driver, like so:
# DRIVERS="-D wext"
DRIVERS="-D wext"


# Other arguments
# -u Enable the D-Bus interface (required for use with NetworkManager)
# -f Log to /var/log/wpa_supplicant.log
OTHER_ARGS="-f /var/log/wpa_supplicant.log"

[root@corydoras ˜]#


/etc/rc.d/init.d/wpa_supplicantは/etc/rc.d/init.d/networkより前に起動するように

[root@corydoras ˜]# grep -w "# chkconfig" /etc/rc.d/init.d/network
# chkconfig: 2345 10 90
[root@corydoras ˜]# grep -w "# chkconfig" /etc/rc.d/init.d/wpa_supplicant
# chkconfig: 2345 09 88
[root@corydoras ˜]# chkconfig wpa_supplicant on
[root@corydoras ˜]#


ここで再起動

繋がってるか確認。

[root@corydoras ˜]# 
[root@corydoras ˜]# ping -c 3 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=2.29 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.58 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=1.58 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 1.588/1.825/2.298/0.334 ms
[root@corydoras ˜]#


MacOS X側からもアクセスしてみる、試しにOracle Instant ClientでCentOS5.4上のOracle11g R1へ接続。

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 11月 29 16:43:02 2009

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

> conn sys@lampeye as sysdba
パスワードを入力してください:
接続されました。
SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SYS>



おまけ
上記だけ載せてしまうと順調に進んだように見えますがハマった所もありました。
GUI上で「ネットワーク設定」や「ワイヤレスデバイス設定」を利用して各種構成が行えるのだが、rootユーザの言語設定が日本語になっていると「ワイヤレスデバイス設定」で”自動”と設定したパラメータが構成ファイル上でも”自動”と設定され起動時にエラーになってしまった。これに気付くのに手間取り少々ハマったのでご注意を。

以下、「ワイヤレスデバイス設定」で”自動”とした場合の内容(これじゃうまく行かないよね。w)


Wlan_centos54_003_2


[root@corydoras ˜]# cat /etc/sysconfig/network-scripts/ifcfg-wlan0 
# Atheros Communications Inc. Atheros AR5001X+ Wireless Network Adapter
DEVICE=wlan0
BOOTPROTO=none
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX
NETMASK=255.255.255.0
DHCP_HOSTNAME=
IPADDR=192.168.1.20
DOMAIN=
GATEWAY=192.168.1.1
TYPE=Wireless
USERCTL=no
IPV6INIT=no
PEERDNS=no
ESSID=MyAirPortExpress
CHANNEL=自動
MODE=Auto
SECURITYMODE=
RATE=自動
[root@corydoras ˜]#

| | | コメント (0) | トラックバック (0)

2009年9月16日 (水)

Cross Platform Transportable Tablespace #11

twitterで呟かれていたリトルエンティアン、ビッグエンディアンで思い出したので、久々にトランスポータブル表領域について。
Oracle database 11gが登場したり、MacがPowerPCからIntelに移行したりしたのでその辺りの情報も追加されているんだろうな〜。と思い$transportable_platformの内容を比較してみた。

まず、Oracle10g R2の頃のv$transportable_platformの情報。(以前載せたものを再掲載

SYS> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for Linux: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

SYS> SYS> l
1 select
2 endian_format
3 ,platform_name
4 from
5* v$transportable_platform
SYS> /

ENDIAN_FORMAT PLATFORM_NAME
---------------------------- -----------------------------------------
Big Solaris[tm] OE (32-bit)
Big Solaris[tm] OE (64-bit)
Little Microsoft Windows IA (32-bit)
Little Linux IA (32-bit)
Big AIX-Based Systems (64-bit)
Big HP-UX (64-bit)
Little HP Tru64 UNIX
Big HP-UX IA (64-bit)
Little Linux IA (64-bit)
Little HP Open VMS
Little Microsoft Windows IA (64-bit)
Big IBM zSeries Based Linux
Little Linux 64-bit for AMD
Big Apple Mac OS
Little Microsoft Windows 64-bit for AMD
Little Solaris Operating System (x86)
Big IBM Power Based Linux

17行が選択されました。

SYS>


次に、Oracle11g R2のv$transportable_platformの内容
黒太字部分は名称が変っただけですね。for AMDからx86と変更されている。
また、赤太字のHP IA Open VMSとSolaris Operating System (x86-64)が追加されている。

SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
PL/SQL Release 11.1.0.7.0 - Production
CORE 11.1.0.7.0 Production
TNS for Linux: Version 11.1.0.7.0 - Production
NLSRTL Version 11.1.0.7.0 - Production

SYS> l
1 select
2 endian_format
3 ,platform_name
4 from
5* v$transportable_platform
SYS> /

ENDIAN_FORMAT PLATFORM_NAME
-------------- --------------------------------------------------
Big Solaris[tm] OE (32-bit)
Big Solaris[tm] OE (64-bit)
Little Microsoft Windows IA (32-bit)
Little Linux IA (32-bit)
Big AIX-Based Systems (64-bit)
Big HP-UX (64-bit)
Little HP Tru64 UNIX
Big HP-UX IA (64-bit)
Little Linux IA (64-bit)
Little HP Open VMS
Little Microsoft Windows IA (64-bit)
Big IBM zSeries Based Linux
Little Linux x86 64-bit
Big Apple Mac OS
Little Microsoft Windows x86 64-bit
Little Solaris Operating System (x86)
Big IBM Power Based Linux
Little HP IA Open VMS
Little Solaris Operating System (x86-64)

19行が選択されました。


SYS>


最後は、先日リリースされたOracle11g R2のv$transportable_platformの内容。
赤太字で示した通り、Intel Macが追加されている。PowerPC版のMacはBig eneianだったがIntel版ではLittle endian。

SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SYS>
SYS> l
1 select
2 endian_format
3 ,platform_name
4 from
5* v$transportable_platform
SYS> /

ENDIAN_FORMAT PLATFORM_NAME
-------------- --------------------------------------------------
Big Solaris[tm] OE (32-bit)
Big Solaris[tm] OE (64-bit)
Little Microsoft Windows IA (32-bit)
Little Linux IA (32-bit)
Big AIX-Based Systems (64-bit)
Big HP-UX (64-bit)
Little HP Tru64 UNIX
Big HP-UX IA (64-bit)
Little Linux IA (64-bit)
Little HP Open VMS
Little Microsoft Windows IA (64-bit)
Big IBM zSeries Based Linux
Little Linux x86 64-bit
Big Apple Mac OS
Little Microsoft Windows x86 64-bit
Little Solaris Operating System (x86)
Big IBM Power Based Linux
Little HP IA Open VMS
Little Solaris Operating System (x86-64)
Little Apple Mac OS (x86-64)

20行が選択されました。

SYS>

| | | コメント (0) | トラックバック (0)

2009年9月15日 (火)

Oracle database 11g release 2 for Linux x86 Install #2

前回に引き続きOracle database 11g release 2 for Linux x86のインストールです。

前回は単にOUIによるインストールの模様だけでしたが、今回はOracle database 11g release 1までのインストーラーには無かった動きや発生したエラー等の解説を。


まず最初はSYS/SYSTEM/SYSMAN/DBSNMPのパスワード設定が6.7.3 Unlocking and Changing Passwordsに記載されているガイドラインに従っているかチェックされること。以下ステップ15/20ではガイドラインに従っていないパスワードなのでエラーと警告メッセージが表示されている。

Install_o11gr2_oui_025_2

二つ目は、インストールの最低要件がチェックされ要件を満たしていなければ以下のような画面でレポートされる。同画面より修正スクリプトの生成、実行方法までが表示されるようになったこと。インストール実施中に修正できるカーネルパラメータについては「修正可能」欄に”はい”と表示される。

Install_o11gr2_oui_029
今回はインストーラの問題と思われる点が2カ所確認できる。1点目はスワップサイズで必要サイズを確保しているはずだが「ステータス」欄には”失敗”と表示されている。2点目は、CentOS5.3なので必要なパッケージにpdksh-5.2.14は含まれていないはずだが、pdkshがインストールされていないとレポートされている。ちなみにpdkshが必要なディストリビューションはCentOS4.xの場合のはずだが、、まあ、影響は特にないし、未サポートなCentOSですから。。
Install_o11gr2_oui_030_2

「修正及び再チェック」ボタンをクリックするとカーネルパラメータの修正スクリプトが自動生成され実行手順までガイドされる。指示に従いスクリプトを実行後、「OK」ボタンをクリックすると条件の再チェックが実行される。

Install_o11gr2_oui_031_1_2

Install_o11gr2_oui_032_3_2

最終的にステップ17/20の画面では、前述した2点の誤認識と物理メモリ不足(1GBのところ768MB)で、以下の3件が要件を満たしていないとレポートされた。メモリは少々不安だったが、その他の2つは問題ないので「すべて無視」をチェックして「次へ」ボタンをクリックした。

Install_o11gr2_oui_035_1_2


3つ目に、以下のアラートで表示されているエラーがDBCAで発生したこと。(OUIでデータベース作成も行ったが、DBCA単体ではどうなのかは試していない。。。。なんで???って感じ。。)

Install_o11gr2_oui_040_2 Install_o11gr2_oui_041_2

DBCAのログを調べて分かったことなのだが、これはOracle TextのオーナーCTXSYSユーザのアンロックとパスワード設定のためのalert user文が失敗(ORA-00922)し、CTXSYSユーザへconnectできず(ORA-28000が発生)にOracle Textの Default lexerや wordlist stoplist default policyの削除とデフォルト言語でそれらを作成するという処理ができなかっただけなのでインストールそのものには影響はなかったようだ。
[oracle@corydoras glassfish]$ cat postScripts.log
1
1
alter user CTXSYS account unlock identified by ******
*
行1でエラーが発生しました。:
ORA-00922: オプション指定されていないか、または無効です。


ERROR:
ORA-28000: the account is locked


警告: Oracleにはもう接続されていません。
dropping default lexer preference...
SP2-0640: 接続されていません。
dropping default wordlist preference...
SP2-0640: 接続されていません。
dropping default stoplist preference...
SP2-0640: 接続されていません。
dropping default policy...
SP2-0640: 接続されていません。
SP2-0640: 接続されていません。
lang_abbrに値を入力してください: SP2-0310: ファイル
"/u01/app/oracle/product/11.2.0/dbhome_1/ctx/admin/defaults/drdefset.sql"を
オープンできません。
[oracle@corydoras glassfish]$




関連エントリー

Oracle Database 11g Release 2 の de-install tool
Oracle Database 11g Release 2 の de-install tool #2
Oracle Database 11g Release 2 の de-install tool #3

| | | コメント (0) | トラックバック (0)

2009年9月14日 (月)

Oracle database 11g release 2 for Linux x86 Install #1

さて、インストールより先にDe-installに関して試してしまったのですが、この辺りでOracle database 11g release 2のインストールの模様でも。

以前も書きましたが、OSはCentoOS5.3、RAM:768MB、CPU:Pentium M 1GhzのDynabook SS SX/210LNLWというnote pc(OSは当時からupdateしていますがそれ以外は同じです。)を使います。
(メモリは推奨されている最低サイズより小さいく、OSは推奨されているものではありませんがRedhat EnterPrise Linux 5とは互換性が高いOSですが。。)


いつものようにインストレーションガイドに従い環境確認とカーネルパラーメータを設定しますが今回はあえてカーネルパラメータの一部を推奨値より少なくしてあります。

2.2.1 Memory Requirements

[root@corydoras ˜]# grep MemTotal /proc/meminfo
MemTotal: 758184 kB
[root@corydoras ˜]# grep SwapTotal /proc/meminfo
SwapTotal: 1540088 kB
[root@corydoras ˜]#

2.2.3 Disk Space Requirements

[root@corydoras ˜]# df  -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
35G 21G 13G 63% /
/dev/hda1 99M 17M 78M 18% /boot
tmpfs 371M 0 371M 0% /dev/shm
[root@corydoras ˜]#


2.3.1 Operating System Requirements

[root@corydoras ˜]# uname -m -r -s -v
Linux 2.6.18-128.7.1.el5 #1 SMP Mon Aug 24 08:20:55 EDT 2009 i686
[root@corydoras ˜]#
[root@corydoras ˜]# java -version
java version "1.6.0_06"
Java(TM) SE Runtime Environment (build 1.6.0_06-b02)
Java HotSpot(TM) Client VM (build 10.0-b22, mixed mode, sharing)
[root@corydoras ˜]#
[root@corydoras ˜]$ cat /etc/redhat-release
CentOS release 5.3 (Final)
[root@corydoras ˜]$


2.3.3 Package Requirements

2.3.4 Compiler Requirements


[root@corydoras ˜]# rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel elfutils-libelf-devel-static gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libgomp libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel
binutils-2.17.50.0.6-9.el5
compat-libstdc++-33-3.2.3-61
elfutils-libelf-0.137-3.el5
elfutils-libelf-devel-0.137-3.el5
elfutils-libelf-devel-static-0.137-3.el5
gcc-4.1.2-44.el5
gcc-c++-4.1.2-44.el5
glibc-2.5-34.el5_3.1
glibc-common-2.5-34.el5_3.1
glibc-devel-2.5-34.el5_3.1
glibc-headers-2.5-34.el5_3.1
kernel-headers-2.6.18-128.7.1.el5
ksh-20080202-2.el5_3.1
libaio-0.3.106-3.2
libaio-devel-0.3.106-3.2
libgcc-4.1.2-44.el5
libgomp-4.3.2-7.el5
libstdc++-4.1.2-44.el5
libstdc++-devel-4.1.2-44.el5
make-3.81-3.el5
sysstat-7.0.2-3.el5
unixODBC-2.2.11-7.1
unixODBC-devel-2.2.11-7.1
[root@corydoras ˜]#


2.3.5.4 Browser Requirements
マニュアルの推奨値より少ない設定のままにしているパラメータあり。


[root@corydoras ˜]# /sbin/sysctl -a | grep -E '(sem|shmall|shmmax|shmmni|file-max|ip_local_port_range|mem_default|mem_max|vmem_default|vmen_max|aio-max-nr)'
net.ipv4.ip_local_port_range = 1024 65000
net.core.optmem_max = 10240
net.core.rmem_default = 4194304
net.core.wmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_max = 262144
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 268435456
kernel.shmmax = 4294967295
fs.aio-max-nr = 65536
fs.file-max = 6553600
[root@corydoras ˜]#


2.10.1 Oracle Base Directory

[oracle@corydoras ˜]$ env | grep ORA
ORACLE_SID=glassfish
ORACLE_BASE=/u01/app/oracle
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$ echo $TMP $TMP_DIR
/tmp /tmp
その他のインストール事前準備等はインストールガイドの指示に従い実施しておく。


なお、OUIの起動はMacOS XのX11 xtermからssh -Y username@hostで接続して行っています。xtermからOUIを起動した場合、xterm上に出力される日本語メッセージは文字化けするもののOUIには影響なし。また、インストール中いくつかのエラーや、CVUのチェックエラーを無視してインストールを進めている箇所がありますが、それらについては別エントリで書く事にして今回はインストールの模様のみ公開しておきます。

SYS> !sqlplus -v

SQL*Plus: Release 11.2.0.1.0 Production


SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SYS>



関連エントリー

Oracle Database 11g Release 2 の de-install tool
Oracle Database 11g Release 2 の de-install tool #2
Oracle Database 11g Release 2 の de-install tool #3

| | | コメント (0) | トラックバック (0)

2009年9月10日 (木)

Oracle Database 11g Release 2 の de-install tool #3

Oracle database 11g R2ではde-install commandeで製品をアンインストールするようマニュアルに書いてあるのに、$ORACLE_HOMEにインストールされるOUIを起動してみると・・・「製品のアンインストール」ボタンがあるじゃないか。。。削除できるか試してみたら。。。orz... こんなオチだったとは。。。「製品のアンインストール」ボタンごと削除してても良かったのでは?とも思うが、オンラインヘルプと考えれば親切なのかもしない。

ただ、クリックした瞬間に腹を抱えて笑ってしまったのは言うまでもない。。。最初から笑いを取るためのネタかw


7

| | | コメント (0) | トラックバック (0)

Oracle Database 11g Release 2 の de-install tool #2

前回、Oracle11g R2のde-install tool commandを試してみたが、OUI等のマニュアルを見る限りdeinsatallはdeinstallコマンドを使うように書かれているのだが、Oracle databavse 11g release 2でインストールされたOUIで確認したところrelase 2のOUIでも「削除」機能が残っているようだ。しかも「製品のアンインストール」ボタンで。(試していないけど使えるのかな??? マニュアルには特にどちらでも使えるとは記載されていないというOracleマジックに悩み中www。使うかどうか迷うよ〜。でもマニュアルに従うならdeinstall command使うかな。)

以下、Oracle database 11g release 1のOUIの削除。($ORACLE_HOME/oui/bin/runInstallerを起動)

1

2

4_2

5


Oracle database 11g release 2ではマニュアルを見る限りOUIから削除できなくなったかのように読み取れたのだが、インストールされたOUIを実行してみるとrelease 1と同じように削除ボタンがあり実際に削除でそうに見える。(削除は試してないけど)以下の画像は$ORACLE_HOME/oui/bin/runInstallerを起動したもの。見た目はほとんとrelease 1のOUIと同じだね。
1_2

2_2

11_2

4_4

| | | コメント (0) | トラックバック (0)

Oracle Database 11g Release 2 の de-install tool

Oracle Database 11g Release 2 for Linuxがリリースされたので早速インストールしたがすぐ削除した。このリリースからOracleのアンインストールはOUIから分離されDeinstall toolとして提供されているのでDeinstall toolを先に試してみたかったので。

環境はDynabook SS SX/210LNLW RAM:768MBのCentOS5.3(そう1GBのメモリを要求されていますがRelease 1の時と同様になんとかインストールは可能なようです。お遊びとしてならギリギリ使えそうな環境。

でマニュアルを見てビックリ、commandだけなんですよ。なんとなくOUI以前のインストールを思い出しちゃいますが使い方は凄く簡単でした。削除する$ORACLE_HOMEのパスを指定して別途ダウンロードしておいたdeinstallを実行するか、$ORACLE_HOME/deinstallに移動して引数無しでdeinstallを実行するかの二通り


今回は、deinstall toolを別途ダウンロードし、$ORACLE_HOMEのパスを指定してde-installしてみた。尚、deinstallコマンド実行時listenerとoracle instanceは起動させたままで試してみた。(起動していなくてもいいのだがどうなるか試してみたかったので。)
また例によってLinuxへはMacOS XのTerminalからssh接続して実行。

[oracle@corydoras oracle11gr2]$ ll
合計 32
drwxr-xr-x 8 oracle oinstall 4096 8月 19 04:54 database
drwxr-xr-x 19 oracle oinstall 4096 8月 19 04:51 deinstall
drwxr-xr-x 6 oracle oinstall 4096 8月 19 04:53 examples
drwxr-xr-x 7 oracle oinstall 4096 8月 19 04:58 gateways
[oracle@corydoras oracle11gr2]$ cd deinstall
[oracle@corydoras deinstall]$ deinstall -home /u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1
Location of logs /u01/app/oraInventory/logs/

############ ORACLE DEINSTALL & DECONFIG TOOL START ############


######################## CHECK OPERATION START ########################
インストールの構成確認の開始


Oracleホームの場所が存在するかどうかを確認しています /u01/app/oracle/product/11.2.0/dbhome_1
選択された削除対象のOracleホームのタイプ: SIDB
選択された削除対象のOracleベース: /u01/app/oracle
中央インベントリの場所が存在するかどうかを確認しています /u01/app/oraInventory

インストールの構成確認の終了


ネットワーク構成チェック構成START

ネットワーク構成解除トレース・ファイルの場所: /u01/app/oraInventory/logs/netdc_check46396.log

構成解除するすべての単一インスタンス・リスナーを指定してください[LISTENER]:

ネットワーク構成チェック構成END

データベース・チェック構成START

データベース構成解除トレース・ファイルの場所: /u01/app/oraInventory/logs/databasedc_check46397.log

値のリストを入力として指定する場合、セパレータとしてカンマを使用してください

このOracleホームで構成されているデータベース名のリストを指定してください []: glassfish

###### データベース'glassfish' ######

単一インスタンス・データベース
データベースの診断先の場所: /u01/app/oracle/diag/rdbms/glassfish
データベースによって使用される記憶域タイプ: FS
データベース・ファイルの場所: /u01/app/oracle/oradata/glassfish,/u01/app/oracle/flash_recovery_area/glassfish
フラッシュ・リカバリ領域の場所: /u01/app/oracle/flash_recovery_area/GLASSFISH
データベースのspfileの場所: /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfileglassfish.ora

データベースglassfishの詳細は自動的に検出されました。glassfishデータベースの詳細を変更しますか。 [n]:

データベース・チェック構成END

Enterprise Manager Configuration Assistant START

EMCA構成解除トレース・ファイルの場所: /u01/app/oraInventory/logs/emcadc_check.log

データベースglassfishの構成を確認しています
Enterprise Manager Configuration Assistant END
Oracle Configuration Manager check START
OCM check log file location : /u01/app/oraInventory/logs//ocm_check3797.log
Oracle Configuration Manager check END

######################### CHECK OPERATION END #########################


####################### CHECK OPERATION SUMMARY #######################
選択された削除対象のOracleホーム: /u01/app/oracle/product/11.2.0/dbhome_1
Oracleホームが登録されているインベントリの場所: /u01/app/oraInventory
次の単一インスタンス・リスナーが構成解除されます: LISTENER
次のデータベースが構成解除対象として選択されました: glassfish
一意のデータベース名: glassfish
使用済記憶域: FS
次のデータベースのEnterprise Managerの構成を更新しますか: glassfish
更新するEnterprise Manager ASMターゲットはありません
移行するEnterprise Managerのリスナー・ターゲットはありません
Checking the config status for CCR
Oracle Home exists with CCR directory, but CCR is not configured
CCR check is finished
続行しますか (y - はい、n - いいえ)[n]: y
このセッションのログは/u01/app/oraInventory/logs/deinstall_deconfig2009-09-10_01-48-33-AM.outに書き込まれます
このセッションのすべてのエラー・メッセージは/u01/app/oraInventory/logs/deinstall_deconfig2009-09-10_01-48-33-AM.errに書き込まれます

######################## CLEAN OPERATION START ########################

Enterprise Manager Configuration Assistant START

EMCA構成解除トレース・ファイルの場所: /u01/app/oraInventory/logs/emcadc_clean.log

データベースglassfishのEnterprise Manager Database Controlの構成の更新
Enterprise Manager ASMターゲットを更新しています(ある場合)
Enterprise Managerのリスナー・ターゲットを更新しています(ある場合)
Enterprise Manager Configuration Assistant END
データベース構成解除トレース・ファイルの場所: /u01/app/oraInventory/logs/databasedc_clean46398.log
データベース・クリーンアップ構成START glassfish
この操作には数分かかります。

データベース・クリーンアップ構成END glassfish

ネットワーク構成クリーニング構成START

ネットワーク構成解除トレース・ファイルの場所: /u01/app/oraInventory/logs/netdc_clean46399.log

単一インスタンス・リスナーの構成解除: LISTENER

リスナーの構成解除: LISTENER
リスナーを停止しています: LISTENER
リスナーの停止に成功しました。
リスナーを削除しています: LISTENER
リスナーは正常に削除されました。
リスナーは正常に構成解除されました。

ネーミング・メソッド構成ファイルの構成解除中です...
ネーミング・メソッド構成ファイルが正常に構成解除されました。

バックアップ・ファイルの構成解除中です...
バックアップ・ファイルが正常に構成解除されました。

ネットワーク構成が正常にクリーンアップされました。

ネットワーク構成クリーニング構成END

Oracle Configuration Manager clean START
OCM clean log file location : /u01/app/oraInventory/logs//ocm_clean3797.log
Oracle Configuration Manager clean END
Oracle Universal Installerクリーンアップの開始

Oracleホーム'/u01/app/oracle/product/11.2.0/dbhome_1'をローカル・ノードの中央インベントリからデタッチします : 終了

ローカル・ノードのディレクトリ'/u01/app/oracle/product/11.2.0/dbhome_1'を削除します : 終了

ローカル・ノード上でOracleベース・ディレクトリ'/u01/app/oracle'は削除されません。ディレクトリはOracleホーム'/u01/app/oracle/product/11.1.0/db_1'で使用中です。

Oracle Universal Installerのクリーンアップが成功しました。

Oracle Universal Installerクリーンアップの終了


Oracleインストール・クリーンアップの開始

インストールのクリーンアップ操作により、ノードcorydorasの一時ディレクトリ/tmp/installを削除しています

Oracleインストール・クリーンアップの終了

デフォルト・プロパティ・ファイル/home/oracle/Desktop/oracle11gr2/deinstall/response/deinstall_OraDb11g_home2.rspを/home/oracle/Desktop/oracle11gr2/deinstall/response/deinstall_OraDb11g_home2.rsp0として移動しました

######################### CLEAN OPERATION END #########################


####################### CLEAN OPERATION SUMMARY #######################
データベースglassfishのEnterprise Managerの構成を更新しました
次のデータベース・インスタンスが正常に構成解除されました: glassfish
次の単一インスタンス・リスナーが正常に構成解除されました: LISTENER
Cleaning the config for CCR
As CCR is not configured, so skipping the cleaning of CCR configuration
CCR clean is finished
Oracleホーム'/u01/app/oracle/product/11.2.0/dbhome_1'がローカル・ノードの中央インベントリから正常にデタッチされました。
ローカル・ノードのディレクトリ'/u01/app/oracle/product/11.2.0/dbhome_1'が正常に削除されました。
Oracle Universal Installerのクリーンアップが成功しました。

Oracleインストールにより、一時ディレクトリが正常にクリーンアップされました。
#######################################################################


############# ORACLE DEINSTALL & DECONFIG TOOL END #############

[oracle@corydoras deinstall]$

でもOUIで削除していたものをなんでcommandとして分離させたのだろう。

マニュアルには理由は書いてくれないので想像するしかないけど。。white paperとか見れば書いてるのかな?

command化されたことによりどんな場面でうれしくなるんだろう。。。。

今回使った感想は、OUIから分離されcommand化されたことによるうれしさは無かったが、OUIの削除ボタンよりは分かりやすいかも。。。

でもやっぱり、deinstall commandってどんな時にうれしく感じるんだろう。。。command化されて良かった!と感じる場面って。

| | | コメント (0) | トラックバック (0)

2009年9月 6日 (日)

PL/SQL で Python Challenge Level 18 - 完

ということで、Python Challenge Level18の最終回。
前回報告した通り level 18 はPL/SQLだけで解けます。今回は問題の元ネタの抽出と回答を抽出した後の確認はOSに付属している機能を使ったが大切なのは問題の元ネタから解答を抽出する所なので。

SQL*Plusから実行したストアドプロシージャで問題を解いたところ....例によってヒントになりそうな部分はもやもやさせてます。 :)


Level18_exec

ヒントになりまくりの答えのスナップショット。(これ以外にも私のブログにヒントになる記事もあるのだが・・・・・それは書きませんよ。。。。)

ちなみに絵を見れば分かると思いますが、MacOS XからX11のX forwordingを使って今回利用したLinuxのDesktopを表示/操作しています。X11のxtermからssh -Y user@hostで接続してgnome-sessionを実行しているだけ。


Level18_eureka

Python Challenge Level19へつづく!(?)

| | | コメント (0) | トラックバック (0)

2009年9月 2日 (水)

PL/SQL で Python Challenge Level 18 解けた

一年以上間が空いてしまったが・・・Python Challenge Level18はPL/SQLだけで解けますよん。ヒントになるようなならないようなモヤモヤした記事は明日にでも。。

| | | コメント (2) | トラックバック (0)

2009年8月31日 (月)

PL/SQL de O(ND) Difference Algorithm

かなり久々ですが、まあ、シリーズもののネタを毎日アップするのもなかなか難しい状況なので単発ネタでも。

ということで今回は、PL/SQLでAn O(ND) Difference Algorithmを実装して頭の体操。

文書比較のアルゴリズムとしてはAn O(NP) Sequence Comparison Algorithmが効率は良いのだが、先日javascriptで書かれたO(ND)のコードを見つけたことをキッカケにPL/SQLで写経したくなったというわけ。

文書比較アルゴリズムは2、3年くらい前、文書比較アブゴリズムdiff(1)/diff(2)/diff(3)等をみたことがあったが、最近pyhthonやらjavascriptのコードを目にするようになり (^^) な顔して眺めていて時間があったらPL/SQLで遊んでみようと思っていた。。他の言語でやってもMac De Oracle的にはおもしろくないので。

ちなみに、pythonだどdifflib使えば文書比較はできるので実際新たに書く必要はそんなにないんじゃなかろうかとも思うわけですが、私のようにわざわざPL/SQLで書いてみようと思う人間もいるわけで、頭の体操にはいいと思います!。理解するのは大変だったけど。wwww

最近見つけたO(ND)やO(NP)に関するブログ等のリンクは以下。

レコメンデーションとエディットグラフ
diff O(np) javascript implementation
"An O(NP) Sequence Comparison Algorithm" with Python
"An O(NP) Sequence Comparison Algorithm" with Python の添削
Javascriptでdiffる ( with 形態素解析 )
google-diff-match-patch


今回はレコメンデーションとエディットグラフにあるO(ND)コードを写経してPL/SQLでやってみた。O(NP)も集中できる時間があったらやってみたい。。。脳トレにも丁度いいかもよ。。。
※Oracle11g 11.1.0.7.0を使ったが、Oracle10g 10.1.0.3.0以上なら動作するはず。。。。(^^;;;

まずは、結果からどうぞ。O(ND)をPL/SQLストアドファンクション化し、SQLから実行できるようにしてあります。また、pythonのdifflibにあるdifferクラスで利用されている差異コード('?'を除く)を出力するようにしてあります。)

SCOTT> set timi on
SCOTT> l
1 SELECT
2 '"' || diffs.code || diffs.string || '"' AS "diff O(ND) results"
3 FROM
4 TABLE(
5 SELECT diffOND('BFEABD', 'ABCDA') from dual
6 ) diffs
7 ORDER BY
8* diffs.seq DESC
SCOTT> /

diff O(ND) results
--------------------------------------------------------------------------------
"- B"
"- F"
"- E"
" A"
" B"
"+ C"
" D"
"+ A"

8行が選択されました。

経過: 00:00:00.00

SCOTT>
SCOTT> l
1 SELECT
2 '"' || diffs.code || diffs.string || '"' AS "diff O(ND) results"
3 FROM
4 TABLE(
5 SELECT diffOND('aaebdd ', 'aedajkd') from dual
6 ) diffs
7 ORDER BY
8* diffs.seq DESC
SCOTT> /

diff O(ND) results
--------------------------------------------------------------------------------
" a"
"- a"
" e"
"- b"
" d"
"+ a"
"+ j"
"+ k"
" d"
"- "

10行が選択されました。

経過: 00:00:00.00

SCOTT>
SCOTT> l
1 SELECT
2 '"' || diffs.code || diffs.string || '"' AS "diff O(ND) results"
3 FROM
4 TABLE(
5 SELECT diffOND('ABCDE', 'ABCDE') from dual
6 ) diffs
7 ORDER BY
8* diffs.seq DESC
SCOTT> /

diff O(ND) results
--------------------------------------------------------------------------------
" A"
" B"
" C"
" D"
" E"

経過: 00:00:00.00

SCOTT>
SCOTT> l
1 SELECT
2 '"' || diffs.code || diffs.string || '"' AS "diff O(ND) results"
3 FROM
4 TABLE(
5 SELECT diffOND('あいうえお','かきくけこ') from dual
6 ) diffs
7 ORDER BY
8* diffs.seq DESC
SCOTT> /

diff O(ND) results
--------------------------------------------------------------------------------
"- あ"
"- い"
"- う"
"- え"
"- お"
"+ か"
"+ き"
"+ く"
"+ け"
"+ こ"

10行が選択されました。

経過: 00:00:00.00

SCOTT>

PL/SQLのコードは以下の通り。

SCOTT> !cat ond.sql

CREATE OR REPLACE TYPE vRecType AS OBJECT
(
x NUMBER
,y NUMBER
,parent ANYDATA
);
/
show errors

BEGIN
FOR functionNames
IN (SELECT object_name FROM USER_OBJECTS WHERE object_name='DIFFOND' AND OBJECT_TYPE='FUNCTION')
LOOP
EXECUTE IMMEDIATE 'DROP FUNCTION ' || functionNames.object_name;
END LOOP;

FOR typeNames
IN (SELECT type_name FROM USER_TYPES WHERE type_name='DIFFLISTTYPE')
LOOP
EXECUTE IMMEDIATE 'DROP TYPE ' || typeNames.type_name;
END LOOP;
END;
/

CREATE OR REPLACE TYPE diffType AS OBJECT
(
seq NUMBER
,code CHAR(2)
,string VARCHAR2(32767)
);
/
show errors

CREATE OR REPLACE TYPE diffListType AS TABLE OF diffType;
/
show errors

CREATE FUNCTION diffOND
(
str1 IN VARCHAR2
,str2 IN VARCHAR2
)
RETURN diffListType
IS
STAT_INIT CONSTANT PLS_INTEGER := 0;
STAT_X CONSTANT PLS_INTEGER := 1;
STAT_Y CONSTANT PLS_INTEGER := 2;

TYPE vType IS TABLE OF vRecType;
v vType := vType();

FUNCTION isVRecNotEmpty(
vRec IN vRecType
)
RETURN BOOLEAN
IS
BEGIN
RETURN (CASE WHEN vRec.x IS NULL AND vRec.y IS NULL AND vRec.parent IS NULL THEN FALSE ELSE TRUE END);
END isVRecNotEmpty;

FUNCTION getDirection
(
vMinus IN vRecType
,vPlus IN vRecType
)
RETURN PLS_INTEGER
IS
BEGIN
IF NOT isVRecNotEmpty(vMinus) AND NOT isVRecNotEmpty(vPlus) THEN
RETURN STAT_INIT;
END IF;

IF NOT isVRecNotEmpty(vMinus) THEN
RETURN STAT_X;
END IF;

IF NOT isVRecNotEmpty(vPlus) THEN
RETURN STAT_Y;
END IF;

RETURN (CASE WHEN vMinus.x < vPlus.x THEN STAT_X ELSE STAT_Y END);
END getDirection;

FUNCTION OND
(
str1 IN VARCHAR2
,str2 IN VARCHAR2
)
RETURN vRecType
IS
offset PLS_INTEGER;
kMax PLS_INTEGER;
kMin PLS_INTEGER;
k PLS_INTEGER;
vIndex PLS_INTEGER;
x PLS_INTEGER;
y PLS_INTEGER;
str1Len PLS_INTEGER;
str2Len PLS_INTEGER;
parent vRecType;
BEGIN
str1Len := LENGTH(str1);
str2Len := LENGTH(str2);
v.EXTEND(str1Len + str2Len + 3);
offset:= str2Len + 2;

FOR d IN 0..str1Len + str2Len LOOP
kMax := (CASE WHEN d <= str1Len THEN d ELSE str1Len - (d - str1Len) END);
kMin := (CASE WHEN d <= str2Len THEN d ELSE str2Len - (d - str2Len) END);

k := kMin * -1;
WHILE k <= kMax LOOP
vIndex := offset + k;
CASE getDirection(v(vIndex-1), v(vIndex+1))
WHEN STAT_INIT THEN
x := 0;
y := 0;
parent := vRecType(0, 0, NULL);
WHEN STAT_X THEN
x := v(vIndex+1).x;
y := v(vIndex+1).y + 1;
parent := v(vIndex+1);
WHEN STAT_Y THEN
x := v(vIndex-1).x + 1;
y := v(vIndex-1).y;
parent := v(vIndex-1);
END CASE;

-- snake
WHILE (x < str1Len AND y < str2Len)
AND (SUBSTR(str1, x+1, 1) = SUBSTR(str2, y+1, 1))
LOOP
x := x + 1;
y := y + 1;
END LOOP;
v(vIndex) := vRecType(x, y, ANYDATA.ConvertObject(parent));

IF str1Len <= x AND str2Len <= y THEN
RETURN v(vIndex);
END IF;

k := k + 2;
END LOOP;
END LOOP;
END OND;

FUNCTION diff
(
str1 IN VARCHAR2
,str2 IN VARCHAR2
)
RETURN diffListType
IS
endPoint vRecType;
parent vRecType;
diff_x PLS_INTEGER;
diff_y PLS_INTEGER;
same_len PLS_INTEGER;
isSuccessGetObject PLS_INTEGER;
diffs diffListType := diffListType();
seq PLS_INTEGER := 0;
BEGIN
endPoint := OND(str1, str2);
WHILE endPoint.parent IS NOT NULL LOOP
IF ANYDATA.getObject(endPoint.parent, parent) != DBMS_TYPES.SUCCESS THEN
RAISE_APPLICATION_ERROR(-20000,'DBMS_TYPES.NO_DATA');
END IF;

diff_x := endPoint.x - parent.x;
diff_y := endPoint.y - parent.y;
same_len := CASE WHEN diff_x <= diff_y THEN diff_x ELSE diff_y END;

FOR i IN 0..same_len-1 LOOP
-- common
diffs.EXTEND();
seq := seq + 1;
diffs(diffs.COUNT()) := diffType(seq, ' ', SUBSTR(str1, endPoint.x-i, 1));
END LOOP;

IF diff_y != diff_x THEN
diffs.EXTEND();
seq := seq + 1;
IF diff_y < diff_x THEN
-- del
diffs(diffs.COUNT()) := diffType(seq, '- ', SUBSTR(str1, parent.x+1, 1));
ELSE
-- add
diffs(diffs.COUNT()) := diffType(seq, '+ ', SUBSTR(str2, parent.y+1, 1));
END IF;
END IF;

endPoint := parent;
END LOOP;

RETURN diffs;
END diff;
BEGIN
RETURN diff(str1, str2);
END diffOND;
/
show errors

Enjoy PL/SQL! というより Enjoy Programming! のほうがいいか。。

| | | コメント (0) | トラックバック (0)

2009年4月 2日 (木)

ちょいと迷惑だったストアドファンクション(おまけ)

〜〜〜〜し〜〜し〜〜でぃ〜〜っ。む、ぶん!
やけに耳の残っちゃうんだよな〜。あの声とアクセント

なんて関係ない話はおいといて。。と



以前、
ちょいと迷惑だったストアドファンクション
ちょいと迷惑だったストアドファンクション(つづき)

ということを書いていたが、ちょいと迷惑だったストアドファンクションの例外ハンドラーで問題解決の手がかりとするためログ出力が実装されていたらどうするの? っていうこともあるのでおまけのおまけということで書いておきます。

以前の例では例外ハンドラーをバッサリ切り捨ててしまったのですが、例外ハンドラーで問題解決の手がかりとするためのログ出力が実装されていて例外ハンドラーを取り除くことが出来ない場合、例外名無しのRAISE文を使えば解決できますよ。:)

ちょいと迷惑だったストアドファンクションの例外ハンドラーで問題解決の手がかりとするためのログ出力を実装していたらという例・・・・(赤太字部分)

尚、この例ではオープンソースのPL/SQL向けロギングフレームワークLog4PLSQLを利用している。

CREATE OR REPLACE
PACKAGE inconvenient_package
AS
TYPE employeesType IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
TYPE membersType IS RECORD (
deptNo dept.deptNo%TYPE
,deptName dept.dName%TYPE
,employees employeesType
);
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType;
END inconvenient_package;
/
show errors


CREATE OR REPLACE
PACKAGE BODY inconvenient_package
AS
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType
AS
members membersType;
Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE); -- Log4PLSQL setting
BEGIN
SELECT
deptNo
,dName
INTO
members.deptNo
,members.deptName
FROM
dept
WHERE
deptNo = iDeptNo
;
--
SELECT *
BULK COLLECT INTO
members.employees
FROM
emp
WHERE
deptno = iDeptNo
;
RETURN members;
EXCEPTION
WHEN NO_DATA_FOUND THEN
plog.warn(Log4PlsqlCtx, sqlerrm()); -- Log4PLSQL warnning
RETURN NULL;
END inconvenient_function;
END inconvenient_package;
/
show errors


変更前ファンクションの例外ハンドラー部分にある"RETURN NULL;"を"RAISE;"(例外名無しのRAISE文)に変更するだけ。

CREATE OR REPLACE
PACKAGE BODY inconvenient_package
AS
FUNCTION inconvenient_function(iDeptNo IN dept.deptNo%TYPE)
RETURN membersType
AS
members membersType;
Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE); -- Log4PLSQL setting
BEGIN
SELECT
deptNo
,dName
INTO
members.deptNo
,members.deptName
FROM
dept
WHERE
deptNo = iDeptNo
;
--
SELECT *
BULK COLLECT INTO
members.employees
FROM
emp
WHERE
deptno = iDeptNo
;
RETURN members;
EXCEPTION
WHEN NO_DATA_FOUND THEN
plog.warn(Log4PlsqlCtx, sqlerrm()); -- Log4PLSQL warnning
RAISE;
END inconvenient_function;
END inconvenient_package;
/


例外ハンドラー内で例外名を省略すると該当する例外がさらに外側のブロックへスローされます。詳細はマニュアル(Oracle Database PL/SQL Language Reference 11g Release 1 : RIASE statement)及び、Oracle Database PL/SQL Language Reference 11g Release 1 : How PL/SQL Exceptions Propagate参照のこと。

SCOTT> set linesize 132
SCOTT> set serveroutput on
SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE);
4 BEGIN
5 BEGIN
6 members := inconvenient_package.inconvenient_function(99);
7 DBMS_OUTPUT.PUT_LINE(
8 'Dept name/id:'
9 ||members.deptname
10 ||'/'||TO_CHAR(members.deptno)
11 );
12 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
13 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
14 END LOOP;
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 plog.warn(Log4PlsqlCtx, sqlerrm());
18 END;
19* END;
SCOTT> /
12:35:27:02-WARN-block-->SCOTT.INCONVENIENT_PACKAGE ORA-01403: データが見つかりません。
12:35:27:03-WARN-block ORA-01403: データが見つかりません。

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

SCOTT> l
1 DECLARE
2 members inconvenient_package.membersType;
3 Log4PlsqlCtx plogparam.log_ctx := plog.init(pDBMS_OUTPUT => TRUE);
4 BEGIN
5 BEGIN
6 members := inconvenient_package.inconvenient_function(10);
7 DBMS_OUTPUT.PUT_LINE(
8 'Dept name/id:'
9 ||members.deptname
10 ||'/'||TO_CHAR(members.deptno)
11 );
12 FOR i IN members.employees.FIRST..members.employees.LAST LOOP
13 DBMS_OUTPUT.PUT_LINE(' -- '||members.employees(i).ename);
14 END LOOP;
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 plog.warn(Log4PlsqlCtx, sqlerrm());
18 END;
19* END;
SCOTT> /
Dept name/id:ACCOUNTING/10
-- CLARK
-- KING
-- MILLER

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

SCOTT>

| | | コメント (0) | トラックバック (0)

2009年3月 4日 (水)

Oracle SQL Developer 1.5.4 がリリースされたので早速入れ替えてみた


S/N Ratio:Oracle SQL Developer 1.5.4 リリース

のアナウンスがあったので早速Linux(CentOS5)/WindowsXP Professional(Vista入れてないの〜)/MacOSX Tiger/Leopardの各プラットフォームで旧リリースをアップグレードしてみた。
取りあえず入れ替えて起動〜Oracle11gへ接続(TNS接続)できるところまで確認。
小さいな問題なのだが英語版では気付かなかったが日本語にローカライズされ文字列が長くなってしまった為にデータベース接続の作成/選択ダイアログで「ネットワーク別名」とドロップダウンメニューの表示がオーバーラップしている。私が使っている範囲ではそれ以外に問題はさそう。。もうちょっと本気で使うと何か出てくるかもしれないけどね。:)


12

まず、MacOSX Tiger/Leopardのデータベース接続の作成/選択ダイアログ。赤丸部分で表示がオーバーラップしてしまっている。
尚、MacOSXのOracle SQL DeveloperでTNSを利用する方法は「Oracle SQL Developer for MacOSX で Oracle Instant Clientを使ってみる」を参照のこと。


7


次はLinux(CentOS5)で起動したSQL Developerの同ダイアログ。(同じくオーバーラップしている)
ちなみに以下はMacOSX側でX11 forwardingを利用してCentOS側のOracle SQL Developerを起動している。


5


WindowsXP Professionalで起動したSQL Developer1.5.4の同ダイアログでも現象は同じ。(ダイアログのスナップショットではわからないですが、Remote Desktop Connection for MacOSX経由でWindowsのSQL Developerを起動している。うちではまだリアルな環境しかないので・・w)

6

Linux環境で以下の様なメッセージで起動できない場合

Type the full pathname of a J2SE installation (or Ctrl-C to quit), the path will be stored in ˜/.sqldeveloper/jdk
JDKのインストール先へのフルパスを.bashrc等でJAVA_HOME環境変数に設定してやればOK。以下の例ではJava SE6 update 12へのフルパスを設定している。
[oracle@corydoras ˜]$ echo $JAVA_HOME
/usr/java/jdk1.6.0_12

| | | コメント (0) | トラックバック (0)

2009年2月 6日 (金)

In Oracle Database 11g, native dynamic SQL now supports statements bigger than 32K characters

久々にOracleネタ。

Oracle11gのPL/SQLのDynamic SQLでCLOBが使えるようになったようなので試してみた。
10gまではexecute immediate文で使えるのは最大でVARCHAR2(32767)までだったワケで、ど〜〜〜〜〜〜しても(書きたくないけど・・)巨大なSQL文をダイナミックに実行しなきゃいけない人には朗報?なんでしょうね。(DWH系ではCLOBが必要なくらい巨大なクエリをダイナミックに生成するなんてこともあるんでしょうね。私は今のところ32Kを超えるクエリは書いたことないけどそれに近いのは過去1度あったかな?! という程度。)

ということで10gと11g for linux(x86)を使って確認!(ClientはMacOSX(PPC)版Instant Clientですよん

まず最初はOracle10g
execute immediate文に利用できるのはVARCHAR2(32767)が最大サイズなのでダイナミックに生成するSQL文もそのサイズに制限されちゃう。VARCHAR2(32767)を超えるとORA-06502が発生する。(尚、10gの場合でもDBMS_SQLを使えばもっと大きいサイズの動的SQLも使用できる。)

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 金 2月 6 1:19:22 2009

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

> conn scott@catfish
パスワードを入力してください:
接続されました。
SCOTT> set serveroutput on
SCOTT> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
PL/SQL Release 10.1.0.3.0 - Production
CORE 10.1.0.3.0 Production
TNS for Linux Server: Version 10.1.0.3.0 - Production
NLSRTL Version 10.1.0.3.0 - Production

SCOTT> l
1 CREATE OR REPLACE PROCEDURE dynamic_sql_test10g(iLength IN NUMBER)
2 IS
3 vSQL VARCHAR2(32767);
4 vResult NUMBER;
5 BEGIN
6 vSQL := 'SELECT 1';
7 FOR i IN 1.. iLength LOOP
8 vSQL := vSQL || '+1';
9 END LOOP;
10 vSQL := vSQL || ' FROM DUAL';
11 EXECUTE IMMEDIATE vSQL INTO vresult;
12 DBMS_OUTPUT.PUT_LINE('Result:'||TO_CHAR(vresult));
13* END;
SCOTT> /

プロシージャが作成されました。

SCOTT> exec dynamic_sql_test10g(16374);
Result:16375

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

SCOTT> exec dynamic_sql_test10g(16375);
BEGIN dynamic_sql_test10g(16375); END;

*
行1でエラーが発生しました。:
ORA-06502: PL/SQL: 数値または値のエラー:
文字列バッファが小さすぎます。が発生しました ORA-06512:
"SCOTT.DYNAMIC_SQL_TEST10G", 行10
ORA-06512: 行1

SCOTT>

11gの場合
execute immediate文にCLOBが使えるようになったことで以下のように32K超えの動的SQLも実行できちゃうのだ。

注)
以下のコードで遊ぶときは個人で遊べるデータベースでやってくださいね。(本番データベースや多数の開発者で共有しているテスト/開発データベースでとんでもなく巨大なクエリを実行すると他の方の迷惑になるので・・・・・)

SCOTT> 
SCOTT> conn scott@lampeye
パスワードを入力してください:
接続されました。
SCOTT>
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT>
SCOTT> l
1 CREATE OR REPLACE PROCEDURE dynamic_sql_test11g(iLength IN NUMBER)
2 IS
3 vSQL CLOB;
4 vResult NUMBER;
5 BEGIN
6 vSQL := 'SELECT 1';
7 FOR i IN 1.. iLength LOOP
8 vSQL := vSQL || '+1';
9 END LOOP;
10 vSQL := vSQL || ' FROM DUAL';
11 EXECUTE IMMEDIATE vSQL INTO vresult;
12 DBMS_OUTPUT.PUT_LINE('Result:'||TO_CHAR(vresult));
13* END;
SCOTT> /

プロシージャが作成されました。

SCOTT> set serveroutput on
SCOTT> exec dynamic_sql_test11g(32767);
Result:32768

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

SCOTT>
SCOTT> set timi on
SCOTT> exec dynamic_sql_test11g(1000000);
Result:1000001

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

経過: 00:06:25.93
SCOTT>

| | | コメント (0) | トラックバック (0)

2009年1月26日 (月)

10日後は何日?、翌月末日って何日?

ichii386さん「相対的な日付って」記事に背骨というか脊髄反応的にコメントした勢いで、今日の10日後は何日?翌月末日って何日?の算出を幾つかやってみた。(「オリジナルの記事は今月末を求めているんですけど・・・・」・・・・ハイ、私が読み間違えて”翌月末”と勘違いしてました。今気付いたよ。w)

なんでgnuとphpだけなの? という突っ込みはなしで…。
なんでFirebirdが無いのかとか、CachéでSQLを使わないでMUMPSというかM言語というかCaché ObjectScriptなのかとか、Oracle11gなのに、MySQLは5.0PostgreSQLは7.4.9なのかとか、というツッコミはなしで...w

前提:
今日は1月24日として、10日後、翌月末日を算出します。

まずはPowerPC版のは古いのしかなかったのでCaché 5.2 for MacOSX(PowerPC)
MUMPS(M言語)がCachéで拡張?されてObjectiveになっちゃってObjectScriptと呼ばれているのには少々戸惑うけど、そこは昔取った杵柄。SQLも使えるけどM言語の方が作り易かったので。。w
ObjectScriptだと日付レベルで何日前とか何日後という計算は簡単なのだが、何ヶ月後とかいう計算は面倒なので。
(算出方法は翌々月の1日の前日が翌月末という考え方です。)

G5Server:˜ discus$ csession cache -U user

USER>
USER>w !,$zversion

Cache for UNIX (Mac OS X/32-bit) 5.2 (Build 329U_su) Wed Jun 21 2006 11:29:29 EDT
USER>
USER>
USER>w !,$zd($h+10,3)

2009-02-03
USER>s now=$h, y=$e($zd(now),7,10), m=$e($zd(now),1,2) w !,$zd($zdh($s(m<11:y_m+2_"01", m>10:y+1_m-10_"01"),5)-1,3)

2009-02-28
USER>
USER>halt
G5Server:˜ discus$

次は、Oracle11g EE 11.1.0.6.0 for Linux(x86)
OracleのSQLだとlast_day()や期間リテラルで簡単に算出できる。お気楽モード :-)

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 土 1月 24 13:53:33 2009

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

> conn scott/tiger@lampeye
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT>
SCOTT> alter session set nls_date_format = 'yyyy-mm-dd';

セッションが変更されました。

SCOTT> select sysdate + interval '10' day from dual;

SYSDATE+IN
----------
2009-02-03

SCOTT> select last_day(sysdate + interval '1' month) from dual;

LAST_DAY(S
----------
2009-02-28

SCOTT>
SCOTT> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
G5Server:˜ discus$

お次は、MySQL Community Server 5.0.67 for MacOSX(PowerPC)版
MySQL5.0でもOracleと同様にlast_day()と期間リテラルだけで算出できます。こちらもOracle同様、余計なことを悩まなくてすみますね。(^^)

G5Server:˜ discus$ mysql --version
mysql Ver 14.12 Distrib 5.0.67, for apple-darwin8.11.0 (powerpc) using readline 5.1
G5Server:˜ discus$ mysql -u scott -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 177
Server version: 5.0.67 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> select curdate() + interval 10 day;
+-----------------------------+
| curdate() + interval 10 day |
+-----------------------------+
| 2009-02-03 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select last_day(curdate() + interval 1 month);
+----------------------------------------+
| last_day(curdate() + interval 1 month) |
+----------------------------------------+
| 2009-02-28 |
+----------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> exit
Bye
G5Server:˜ discus$

最後にPosgreSQL 7.4.9 for MacOSX(PowerPC)版
10日後は期間リテラルで単純に算出可能だが、OracleやMySQLとは異なりlast_day()のような関数が無い(マニュアルをみたけど該当する関数が見当たらない)ので翌々月1日の前日で算出してみた。

G5Server:˜ discus$ psql -U scott postgresql749
Password:
Welcome to psql 7.4.9, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit

postgresql749=#
postgresql749=# select version();
version
-------------------------------------------------------------------------------------------------------------------------
PostgreSQL 7.4.9 on powerpc-apple-darwin8.3.0, compiled by GCC gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1809)
(1 row)

postgresql749=# select cast(current_date + interval '10 day' as date);
date
------------
2009-02-03
(1 row)

postgresql749=# select cast(to_date(to_char(current_date + interval'2 months','yyyymm')||'01','yyyymmdd') - interval '1 day' as date);
date
------------
2009-02-28
(1 row)


postgresql749=# \q
G5Server:˜ discus$


CachéではObjectScript(M言語)を使ったので脇に置いといて、他の3つのデータベースのSQLでは期間リテラル(interval)の書き方が微妙に異なる点は知っておいたほうがいいかも。



今日も息子は保育園でバイバイせず結構泣いてた、最近、保育園にくるとパパもママもSee Ya! といっていなくなってしまうことに気付いた模様。いずれ慣れるだろうけど。。

| | | コメント (0) | トラックバック (0)

2008年12月 4日 (木)

Sun Tech Days 2008 in Tokyo 2日目

Sun Tech Days 2008 in Tokyo 2日目は(J)Ruby and Railsにだけ。JRuby関連で知らなかったことと知っているところ半々という内容だったので今後の参考になる内容だった、私にとってはいろいろな遊びのネタになりそう。

ところで、Sunの方のMac率、かなり高いよね。GoslingからしてMacBookだし(^^)

頂いたノベルティは「ブログ de ノベルティ」にて。

| | | コメント (0) | トラックバック (0)

2008年10月20日 (月)

Mac de Oracle - 10万円未満 de RAC (11g編)#28

今回はTransparent Application Failover (TAF)を簡単な方法で確認

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)☆項番19.で確認してしまったので削除



22.簡単なTransparent Application Failover (TAF)の確認

1.TAFの設定。
Oracle Database Net Servicesリファレンス 11g リリース1(11.1) - FAILOVER_MODE等のマニュアル参照のこと。(11/30:リンク先変更。オラクルさんのオンラインマニュアルのURL変更が激し過ぎ。なんとかして〜
USのOTNのマニュアルはリンク切れしてないのに...)
G5Server:˜ discus$ tail -16 $TNS_ADMIN/tnsnames.ora
RACTAF =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)

)
)
2.scottユーザでログインして表などを問い合わせておく。
G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 月 10月 20 01:08:31 2008

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

> conn scott/tiger@orcl
接続されました。
SCOTT>
SCOTT> select count(*) from user_objects;

COUNT(*)
----------
5

ここでorcl2をabortで停止(その間に行っていた操作は「3.orcl2の強制停止と接続先の確認」を参照のこと)。

orcl2に接続されていたscottユーザでは特にエラーもなくクエリを発行できる。この時既にfailoverしorcl1からorcl2へセッションが引き継がれている。

SCOTT> select count(*) from user_objects;

COUNT(*)
----------
5

SCOTT>
3.orcl2の強制停止と接続先の確認

orcl2をabortで強制停止、scootの接続がfailoverしたことを確認。
[oracle@discus1 ˜]$ 
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 月 10月 20 01:14:52 2008

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

SQL> conn sys@orcl1 as sysdba
パスワードを入力してください:
接続されました。
SQL>
SYS> l
1 select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11* sess.username = 'SCOTT'
SYS> /

INSTANCE_NAME USERNAME FAILOVER_TYPE FAILOVER_M FAI
---------------- ------------------------------ ------------- ---------- ---
orcl2 SCOTT SELECT BASIC NO

SYS> !srvctl status database -d orcl
インスタンスorcl1はノードdiscus1で実行中です。
インスタンスorcl2はノードdiscus2で実行中です。

SYS> !srvctl stop instance -d orcl -i orcl2 -o abort

SYS> !srvctl status database -d orcl
インスタンスorcl1はノードdiscus1で実行中です。
インスタンスorcl2はノードdiscus2で実行されていません。

SYS> l
1 select
2 instance_name
3 ,username
4 ,failover_type
5 ,failover_method
6 ,failed_over
7 from
8 gv$session sess join gv$instance inst
9 on sess.inst_id = inst.inst_id
10 where
11* sess.username = 'SCOTT'
SYS> /

INSTANCE_NAME USERNAME FAILOVER_TYPE FAILOVER_M FAI
---------------- ------------------------------ ------------- ---------- ---
orcl1 SCOTT SELECT BASIC YES

SYS>


Oracle11g for Linux x86(CentOS5.2)とiSCSI(Openfiler2.3)を使った安価なOracle11g R1 RAC構築完

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#27

今回はOracle Clusterwareプロセス・モニター・デーモンの構成

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)☆項番19.で確認してしまったので削除



21.Oracle Clusterwareプロセス・モニター・デーモンの構成

以下のマニュアルを参考に。
Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux
 - 7.1.2 Configure Input/Output Fencing

Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux
 - 7.1.2.3 Configuring Oracle Clusterware Process Monitor Daemon
Cluster Database/ASMなどを停止(全ノード)
G5Server:˜ discus$ ssh root@discus1
root@discus1's password:
Last login: Sat Oct 18 18:32:53 2008 from 192.168.1.19
[root@discus1 ˜]# su - oracle
[oracle@discus1 ˜]$ srvctl stop database -d orcl
[oracle@discus1 ˜]$ srvctl stop asm -n discus2
[oracle@discus1 ˜]$ srvctl stop asm -n discus1
[oracle@discus1 ˜]$ srvctl stop nodeapps -n discus2
[oracle@discus1 ˜]$ srvctl stop nodeapps -n discus1
[oracle@discus1 ˜]$ echo $ORA_CRS_HOME
/u01/app/crs
[oracle@discus1 ˜]$ exit
logout
rootユーザでRACの停止を確認(全てOFFLINEであればOK)
[root@discus1 ˜]# 
[root@discus1 ˜]# /u01/app/crs/bin/crs_stat
NAME=ora.discus1.ASM1.asm
TYPE=application
TARGET=OFFLINE
STATE=OFFLINE

NAME=ora.discus1.LISTENER_DISCUS1.lsnr
TYPE=application
TARGET=OFFLINE
STATE=OFFLINE

NAME=ora.discus1.gsd
TYPE=application
TARGET=OFFLINE
STATE=OFFLINE

・・・・中略・・・・

NAME=ora.orcl.db
TYPE=application
TARGET=OFFLINE
STATE=OFFLINE

NAME=ora.orcl.orcl1.inst
TYPE=application
TARGET=OFFLINE
STATE=OFFLINE

NAME=ora.orcl.orcl2.inst
TYPE=application
TARGET=OFFLINE
STATE=OFFLINE
crsの状態確認
[root@discus1 ˜]# 
[root@discus1 ˜]# /u01/app/crs/bin/crsctl check cluster
discus1 ONLINE
discus2 ONLINE
[root@discus1 ˜]#
crsの停止(RAC全ノードのrootユーザで実施)
[root@discus1 ˜]# 
[root@discus1 ˜]# /u01/app/crs/bin/crsctl check crs
Cluster Synchronization Services appears healthy
Cluster Ready Services appears healthy
Event Manager appears healthy
[root@discus1 ˜]#
[root@discus1 ˜]#
[root@discus1 ˜]# /u01/app/crs/bin/crsctl stop crs
Stopping resources.
This could take several minutes.
Successfully stopped Oracle Clusterware resources
Stopping Cluster Synchronization Services.
Shutting down the Cluster Synchronization Services daemon.
Shutdown request successfully issued.
[root@discus1 ˜]#
[root@discus1 ˜]#
[root@discus1 ˜]# /u01/app/crs/bin/crsctl check crs
Failure 1 contacting Cluster Synchronization Services daemon
Cannot communicate with Cluster Ready Services
Cannot communicate with Event Manager
[root@discus1 ˜]#
oprocdの停止手順が書いてあるがcrsを停止するとoprocdも停止するのでこの操作は不要なのでは?(マニュアルバグ?)とりあえずマニュアル通りにやったが・・・。(RAC全ノードのrootユーザで実施)
[root@discus1 ˜]# 
[root@discus1 ˜]# /u01/app/crs/bin/oprocd stop
Oct 20 02:53:05.858 | ERR | failed to connect to daemon, errno(111)
[root@discus1 ˜]#
[root@discus1 ˜]#
[root@discus1 ˜]# ps -ef | grep oprocd
root 23327 21934 0 02:54 pts/1 00:00:00 grep oprocd
[root@discus1 ˜]#
diagwaitパラメータを13秒に変更する。(この操作はRACを構成する1ノードから行う。)
[root@discus1 ˜]# /u01/app/crs/bin/crsctl set css diagwait 13 -force
Configuration parameter diagwait is now set to 13.
[root@discus1 ˜]#
crsの起動(RAC全ノードのrootユーザで実施)
[root@discus1 ˜]# 
[root@discus1 ˜]# /u01/app/crs/bin/crsctl start crs
Attempting to start Oracle Clusterware stack
The CRS stack will be started shortly
[root@discus1 ˜]#
[root@discus1 ˜]# /u01/app/crs/bin/crsctl check crs
Cluster Synchronization Services appears healthy
Cluster Ready Services appears healthy
Event Manager appears healthy
[root@discus1 ˜]#
[root@discus1 ˜]# ps -ef | grep oprocd
root 24758 22215 0 02:56 ? 00:00:00 /bin/sh /etc/init.d/init.cssd oprocd
root 25125 24758 0 02:56 ? 00:00:00 /u01/app/crs/bin/oprocd run -t 1000 -m 10000 -hsi 5:10:50:75:90 -f
root 26140 21934 0 02:57 pts/1 00:00:00 grep oprocd
[root@discus1 ˜]#
[root@discus1 ˜]# /u01/app/crs/bin/oprocd check
Oct 19 03:16:49.630 | INF | daemon running in fatal mode
[root@discus1 ˜]#

次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月19日 (日)

Mac de Oracle - 10万円未満 de RAC (11g編)#26

今回はClusterの開始と停止の確認

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)☆項番19.で確認してしまったので削除



20.Clusterの開始と停止の確認

下記はdiscus1で実施例。(ついでなのでEnterprise Manager Enterprise Managerの停止、起動も確認。)
[oracle@discus1 ˜]$ 
[oracle@discus1 ˜]$ emctl stop dbconsole
Oracle Enterprise Manager 11g Database Control Release 11.1.0.6.0
Copyright (c) 1996, 2007 Oracle Corporation. All rights reserved.
https://discus1.macdeoracle.jp:1158/em/console/aboutApplication
Stopping Oracle Enterprise Manager 11g Database Control ...
... Stopped.
[oracle@discus1 ˜]$ srvctl stop database -d orcl
[oracle@discus1 ˜]$ srvctl status database -d orcl
インスタンスorcl1はノードdiscus1で実行されていません。
インスタンスorcl2はノードdiscus2で実行されていません。
[oracle@discus1 ˜]$ srvctl stop asm -n discus2
[oracle@discus1 ˜]$ srvctl status asm -n discus2
ASMインスタンス+ASM2はノードdiscus2で実行されていません。
[oracle@discus1 ˜]$ srvctl stop asm -n discus1
[oracle@discus1 ˜]$ srvctl status asm -n discus1
ASMインスタンス+ASM1はノードdiscus1で実行されていません。
[oracle@discus1 ˜]$ srvctl stop nodeapps -n discus2
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus2
VIPはノードで実行されていません: discus2
GSDはノードで実行されていません: discus2
リスナーはノードで実行されていません:discus2
ONSデーモンはノードで実行されていません: discus2
[oracle@discus1 ˜]$ srvctl stop nodeapps -n discus1
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus1
VIPはノードで実行されていません: discus1
GSDはノードで実行されていません: discus1
リスナーはノードで実行されていません:discus1
ONSデーモンはノードで実行されていません: discus1
[oracle@discus1 ˜]$ exit
logout
Connection to discus1 closed.
G5Server:˜ discus$
G5Server:˜ discus$ ssh root@discus1
root@discus1's password:
Last login: Sun Oct 19 12:17:45 2008 from 192.168.1.19
[root@discus1 ˜]# shutdown -r now

Broadcast message from root (pts/1) (Sun Oct 19 18:33:05 2008):

The system is going down for reboot NOW!
[root@discus1 ˜]# exit
logoutConnection to discus1 closed.
G5Server:˜ discus$ ssh root@discus2
root@discus2's password:
Last login: Sun Oct 19 12:17:55 2008 from 192.168.1.19
[root@discus2 ˜]# shutdown -r now

Broadcast message from root (pts/1) (Sun Oct 19 18:33:19 2008):

The system is going down for reboot NOW!
[root@discus2 ˜]# exit
logout
Connection to discus2 closed.
G5Server:˜ discus$
リブート中〜〜〜〜〜〜そしてリブート後、
Connection to discus2 closed.
G5Server:˜ discus$ ssh oracle@discus1
oracle@discus1's password:
Last login: Sun Oct 19 15:47:12 2008 from 192.168.1.19
[oracle@discus1 ˜]$ srvctl status database -d orcl
インスタンスorcl1はノードdiscus1で実行中です。
インスタンスorcl2はノードdiscus2で実行中です。
[oracle@discus1 ˜]$ srvctl status asm -n discus2
ASMインスタンス+ASM2はノードdiscus2で実行中です。
[oracle@discus1 ˜]$ srvctl status asm -n discus1
ASMインスタンス+ASM1はノードdiscus1で実行中です。
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus2
VIPはノードで実行中です: discus2
GSDはノードで実行中です: discus2
リスナーはノードで実行中です: discus2
ONSデーモンはノードで実行中です: discus2
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus1
VIPはノードで実行中です: discus1
GSDはノードで実行中です: discus1
リスナーはノードで実行中です: discus1
ONSデーモンはノードで実行中です: discus1
[oracle@discus1 ˜]$

次回へつづく

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#25

今回はOralce RAC ClusterとDatabase構成の確認

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)☆項番19.で確認してしまったので削除



20.Oralce RAC ClusterとDatabase構成の確認

[oracle@discus1 ˜]$ srvctl status database -d orcl
インスタンスorcl1はノードdiscus1で実行中です。
インスタンスorcl2はノードdiscus2で実行中です。
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus1
VIPはノードで実行中です: discus1
GSDはノードで実行中です: discus1
リスナーはノードで実行中です: discus1
ONSデーモンはノードで実行中です: discus1
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus2
VIPはノードで実行中です: discus2
GSDはノードで実行中です: discus2
リスナーはノードで実行中です: discus2
ONSデーモンはノードで実行中です: discus2
[oracle@discus1 ˜]$ srvctl status asm -n discus1
ASMインスタンス+ASM1はノードdiscus1で実行中です。
[oracle@discus1 ˜]$ srvctl status asm -n discus2
ASMインスタンス+ASM2はノードdiscus2で実行中です。
[oracle@discus1 ˜]$ srvctl config database
orcl
[oracle@discus1 ˜]$ srvctl config database -d orcl
discus1 orcl1 /u01/app/oracle/product/11.1.0/db_1
discus2 orcl2 /u01/app/oracle/product/11.1.0/db_1
[oracle@discus1 ˜]$ srvctl config nodeapps -n discus1 -a -g -s -l
VIPが存在します。: /discus1-vip/192.168.1.100/255.255.255.0/eth0
GSDが存在します。
ONSデーモンが存在します。
リスナーが存在します。
[oracle@discus1 ˜]$ srvctl config nodeapps -n discus2 -a -g -s -l
VIPが存在します。: /discus2-vip/192.168.1.101/255.255.255.0/eth0
GSDが存在します。
ONSデーモンが存在します。
リスナーが存在します。
[oracle@discus1 ˜]$ srvctl config asm -n discus1
+ASM1 /u01/app/oracle/product/11.1.0/db_1
[oracle@discus1 ˜]$ srvctl config asm -n discus2
+ASM2 /u01/app/oracle/product/11.1.0/db_1

[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 日 10月 19 15:57:38 2008

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

SQL> conn sys@orcl as sysdba
パスワードを入力してください:
接続されました。
SQL> l
1 select name from v$datafile
2 union
3 select member from v$logfile
4 union
5 select name from v$controlfile
6 union
7* select name from v$tempfile
SQL> /

NAME
--------------------------------------------------------------------------------
+FLASH_RECOVERY_AREA/orcl/controlfile/current.268.667323469
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.269.667323483
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.270.667323497
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.271.667336061
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.272.667336077
+ORCL_DATA1/orcl/controlfile/current.295.667323465
+ORCL_DATA1/orcl/datafile/apex.302.667323623
+ORCL_DATA1/orcl/datafile/example.303.667323669
+ORCL_DATA1/orcl/datafile/sysaux.299.667323543
+ORCL_DATA1/orcl/datafile/system.298.667323505
+ORCL_DATA1/orcl/datafile/undotbs1.300.667323559

NAME
--------------------------------------------------------------------------------
+ORCL_DATA1/orcl/datafile/undotbs2.304.667323685
+ORCL_DATA1/orcl/datafile/users.305.667323705
+ORCL_DATA1/orcl/datafile/xmldb.306.667323705
+ORCL_DATA1/orcl/onlinelog/group_1.296.667323473
+ORCL_DATA1/orcl/onlinelog/group_2.297.667323489
+ORCL_DATA1/orcl/onlinelog/group_3.307.667336051
+ORCL_DATA1/orcl/onlinelog/group_4.308.667336067
+ORCL_DATA1/orcl/tempfile/temp.301.667323579

19行が選択されました。

SQL>

あとは問題はないだろうね。次回へつづく。

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#24

今回はOracle Net Serviceの確認

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)☆項番19.で確認してしまったので削除



19.Oracle Net Serviceの確認

まずRAC側のtnsnames.oraの内容確認から。ORCL2以下の内容をMacOSXのOracle Instant Client 10g R1のtnsnames.oraへコピーする。
[oracle@discus1 ˜]$ cat $TNS_ADMIN/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.1.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENERS_ORCL =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
)

ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl2)
)
)

ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl1)
)
)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
)
)

[oracle@discus1 ˜]$


コピー内容を確認。
G5Server:˜ discus$ tail -31 $TNS_ADMIN/tnsnames.ora
ORCL2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl2)
)
)

ORCL1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
(INSTANCE_NAME = orcl1)
)
)

ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.macdeoracle.info)
)
)

G5Server:˜ discus$

次にOracle Instant Client 10g R1 for MacOSX(PPC)から接続テストを行う。
G5Server:˜ discus$ sqlplus -version

SQL*Plus: Release 10.1.0.3.0 - Production

G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 10月 19 10:37:35 2008

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

> !sw_vers
ProductName: Mac OS X Server
ProductVersion: 10.4.11
BuildVersion: 8S169

> !/usr/sbin/system_profiler SPHardwareDataType SPSoftwareDataType | grep -E '((System|Kernel) Version|CPU)'
CPU Type: PowerPC G5 (3.1)
Number Of CPUs: 2
CPU Speed: 2.7 GHz
L2 Cache (per CPU): 512 KB
System Version: Mac OS X Server 10.4.11 (8S169)
Kernel Version: Darwin 8.11.0

>
> conn sys@orcl1 as sysdba
パスワードを入力してください:
接続されました。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SYS> conn sys@orcl2 as sysdba
パスワードを入力してください:
接続されました。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SYS> conn sys@orcl as sysdba
パスワードを入力してください:
接続されました。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl1

SYS> conn sys@orcl as sysdba
パスワードを入力してください:
接続されました。
SYS>: --ロードバランシングされて次はorcl2へ繋がるだろうな・・・・・多分。
SYS> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SYS> -- gv$instanceビューでracの全インスタンスのチェック
SYS> select
2 inst_id
3 ,instance_number
4 ,instance_name
5 ,host_name
6 ,version
7 ,status
8 ,parallel
9 from
10 gv$instance;

INST_ID INSTANCE_NUMBER INSTANCE_NAME HOST_NAME VERSION STATUS PAR
---------- --------------- ---------------- ------------------------ ----------------- ------------ ---
1 1 orcl1 discus1.macdeoracle.jp 11.1.0.6.0 OPEN YES
2 2 orcl2 discus2.macdeoracle.jp 11.1.0.6.0 OPEN YES

SYS>
SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SYS>
同様にintel x86版のMacOSXからも接続確認(^^)。intel x86 mac向けにはOracle Instant Client 10g R2が利用できる。もちろんOracle Instant Client 10g R1(PPC)をRosetta上で動作させてもOKだが。
Macintosh:˜ discus$ sqlplus -version

SQL*Plus: Release 10.2.0.4.0 - Production

Macintosh:˜ discus$ sqlplus /nolog
¥
SQL*Plus: Release 10.2.0.4.0 - Production on 日 10月 19 11:31:45 2008

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

SQL> !sw_vers
ProductName: Mac OS X
ProductVersion: 10.5.5
BuildVersion: 9F33

SQL> !/usr/sbin/system_profiler SPHardwareDataType SPSoftwareDataType | grep -E '((System|Kernel) Version|Processor (Name|Speed))'
Processor Name: Intel Core 2 Duo
Processor Speed: 2.2 GHz
System Version: Mac OS X 10.5.5 (9F33)
Kernel Version: Darwin 9.5.0

SQL> conn sys@orcl as sysdba
Enter password:
Connected.
SQL> select
2 instance_number
3 ,instance_name
4 ,status
5 ,version
6 from
7 gv$instance;

INSTANCE_NUMBER INSTANCE_NAME STATUS VERSION
--------------- ---------------- ------------ -----------------
2 orcl2 OPEN 11.1.0.6.0
1 orcl1 OPEN 11.1.0.6.0

SQL>

Yahoo! 上手く行ったね〜。Oracle11g R1でお遊びRAC環境を構築するにも物理メモリ1GBは載せないとダメね。ということで次回へつづく

追記(2008/10/19)
しまった〜、一番最後に行う予定だったMacOSXのOracle Clientからの接続テストをやっちゃった。w
しかたないので項番24.は削除しておくか。。(^^;;

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#23

今回はOracle Cluster databaseの作成 その3

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1その2、その3
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



18.Oracle Cluster databaseの作成 その3

Cluster Database作成再々チャレンジ。3度目の正直ということで今度は大丈夫。w
iLifeで作成、BGMはGarage Bandのループの組み合わせだけで作成したものをYouTubeへ。。
高画質版はこちらから

ふ〜、上手く行った。(^^。次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月18日 (土)

Mac de Oracle - 10万円未満 de RAC (11g編)#22

今回はOracle Cluster databaseの作成 その2

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1、その2
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



18.Oracle Cluster databaseの作成 その2

さて、前回「ORA-00845: MEMORY_TARGET no support on this system」という既知の落とし穴に落ちてしまったがなんとか脱出、dbcaにて中途半端な状態のデータベースを削除後、Cluster databaseの作成を再開。
今回はASMの作成はすんなりできたものの・・・・こんどこそ物理メモリ512MBという最低限必要とされていた物理メモリサイズの半分ではRAC+ASMのインストールは無理だ・・・という結論に。・・・。
以前シングルインスタンスのOracle11g R1 EEを物理メモリ768MBのDynabookにインストールした経験からギリギリなんとかなるかもと思っていたが、512MBでは無理でしたね、さすがに...。www

Cre_ng_cd1

Cre_ng_cd2

Cre_ng_cd3

Cre_ng_cd4

Cre_ng_cd5

順調に見えたが上記の画面でステータスが全く進まなくなった(そのように見えるがハングしている訳ではない)。原因はORA-04031が連発、バッググラウンドプロセスもまともに動けずエラー終了と再起動を繰り返している様子がalert.logファイルから確認できた。
ということで各512MBのメモリを追加しRAC全ノードの物理メモリを1GBに。
カーネルパラメータshmmax調整後、dbcaにて中途半端な状態のデータベースを削除してからcluster database作成を再開。。結果は次回。。。(^^)
[root@discus1 ˜]# cat /proc/meminfo | grep MemTotal
MemTotal: 1033760 kB
[root@discus1 ˜]#
[root@discus1 ˜]# sysctl -a | grep shmmax
kernel.shmmax = 536870912
[root@discus1 ˜]#
ちなみにOracleの初期化パラメータsga_max_size/memory_max_target/memory_targetは各400M程度に設定する

Cluster Databaseの作成はまだつづく・・・・・・・。

| | | コメント (0) | トラックバック (0)

2008年10月17日 (金)

Mac de Oracle - 10万円未満 de RAC (11g編)#21

今回はOracle Cluster databaseの作成 その1

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成 その1
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



18.Oracle Cluster databaseの作成 その1

まず、dbca実行事前チェック。
CentOSで実行出来るよう構成ファイルをカスタマイズしたCVUを利用する。尚、事前にsshのユーザ等価関係を有効にしておくこと。(RACを構成する1ノードから実行する。)
[oracle@discus1 ˜]$ cd /home/oracle/orainstall/clusterware
[oracle@discus1 clusterware]$ ./bin/cluvfy stage -pre dbcfg -n discus1,discus2 -d ${ORACLE_HOME} -verbose

データベース構成の事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

管理権限をチェック中...

・・・・中略・・・・

チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus2:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus1:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

インタフェースがVIPの候補となるサブネット"192.168.1.0"で見つかりました:
discus2 eth0:192.168.1.4 eth0:192.168.1.101
discus1 eth0:192.168.1.3 eth0:192.168.1.100

インタフェースがプライベート・インタコネクトの候補となるサブネット"192.168.2.0"で見つかりました:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

・・・・中略・・・・

CRS状態をチェック中...

チェック: CRSの状態
ノード名 CRS OK?
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: CRS状態チェックに合格しました。

CRS整合性チェックに合格しました。

データベース構成の事前チェックは成功しました。
[oracle@discus1 clusterware]$
チェックOKなので、dbcaを起動しCluster database作成を作成する。
今回もMacOSXのxterm(X11)から行う。尚、sshのユーザ等価関係が有効になっていない場合は有効化しておくこと。
G5Server:˜ discus$ ssh -Y oracle@discus1
oracle@discus1's password:
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 ˜]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_rsa:
Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa)
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ dbca &

・・・中略・・・
あ〜〜〜〜、ダメか?、物理メモリ512MBでは・・・無理しているのは承知だが..?? ASMインスタンスを作成しようとしているところで以下のエラーが出て進む事ができない。。。ここまでか・・・。
ORA-00845: MEMORY_TARGET no support on this system

1

Asmng2

Asmng3

諦めずにログから調査していくと...ありました・・・既知の問題が・・・
どうやらtmpfsを大きく取ってやることで回避できるようだ。。以下のマニュアルを参照のこと。
Oracle Clusterware Installation Guide11g Release 1 (11.1) for Linux
- MEMORY_TARGET not supported on this system
なんとか回避できそうだな・・・ということで、早速tmpfsのサイズを増す。。
Connection to discus1 closed.
G5Server:˜ discus$ ssh root@discus1
root@discus1's password:
Last login: Sat Oct 4 04:08:21 2008 from 192.168.1.19
[root@discus1 ˜]# df -a
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
16790968 11316644 4607612 72% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/hda1 101086 11816 84051 13% /boot
tmpfs 256984 0 256984 0% /dev/shm
none 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs
configfs 0 0 0 - /sys/kernel/config
ocfs2_dlmfs 0 0 0 - /dlm
/dev/sdc1 2095648 335520 1760128 17% /u02
oracleasmfs 0 0 0 - /dev/oracleasm
[root@discus1 ˜]# umount tmpfs
[root@discus1 ˜]# mount -t tmpfs shmfs -o size=2g /dev/shm
[root@discus1 ˜]# df -a
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
16790968 11316648 4607608 72% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/hda1 101086 11816 84051 13% /boot
none 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs
configfs 0 0 0 - /sys/kernel/config
ocfs2_dlmfs 0 0 0 - /dlm
/dev/sdc1 2095648 335520 1760128 17% /u02
oracleasmfs 0 0 0 - /dev/oracleasm
shmfs 2097152 0 2097152 0% /dev/shm
[root@discus1 ˜]#
[root@discus1 ˜]# cat /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
LABEL=oracrsfiles /u02 ocfs2 _netdev,datavolume,nointr 0 0
shmfs /dev/shm tmpfs size=2g 0
[root@discus1 ˜]#

・・・・・一旦再起動・・・・・

[root@discus1 ˜]# df -ah
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
17G 11G 4.4G 72% /
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
devpts 0 0 0 - /dev/pts
/dev/hda1 99M 12M 83M 13% /boot
tmpfs 2.0G 0 2.0G 0% /dev/shm
shmfs 2.0G 0 2.0G 0% /dev/shm
none 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs
configfs 0 0 0 - /sys/kernel/config
ocfs2_dlmfs 0 0 0 - /dlm
/dev/sdd1 2.0G 328M 1.7G 17% /u02
oracleasmfs 0 0 0 - /dev/oracleasm
[root@discus1 ˜]#
注)上記操作はRAC全ノードのrootユーザで行った


Cluster Databaseの作成は次回へつづく・・・・・・・。

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#20

今回はTNS Listenerの構成

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



17.TNS Listenerの構成

netcaでの構成はRACの1ノードから実行する。
netcaもMacOSXのxterm(X11)から行う。尚、sshのユーザ等価関係が有効になっていない場合は有効化しておくこと。
G5Server:˜ discus$ ssh -Y oracle@discus1
oracle@discus1's password:
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 ˜]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_rsa:
Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa)
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ netca &

・・・中略・・・


久々にMovie化、iLifeで作成、BGMはGarage Bandのループの組み合わせだけで作成したものをYouTubeへ。。
高画質版はこちらから


確認はRAC全ノードのoracleユーザで実施する。(以下はdiscus1で実施した例)
[oracle@discus1 ˜]$ hostname
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_DISCUS1
[oracle@discus1 ˜]$ $ORA_CRS_HOME/bin/crs_stat ora.discus1.LISTENER_DISCUS1.lsnr
NAME=ora.discus1.LISTENER_DISCUS1.lsnr
TYPE=application
TARGET=ONLINE
STATE=ONLINE on discus1

[oracle@discus1 ˜]$

次回へつづく

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#19

今回はOracle11g R1 examplesのインストール

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



16.Oracle11g R1 examplesのインストール

OUIによるインストールはRACの1ノードから実行する。
Oracle11g R1 exapmlesのインストールもMacOSXのxterm(X11)からOUIを起動して行う。尚、sshのユーザ等価関係が有効になっていない場合は有効化しておくこと。
G5Server:~ discus$ ssh -Y oracle@discus1
oracle@discus1's password:
[oracle@discus1 ˜]$ cd /home/oracle/orainstall/examples
[oracle@discus1 examples]$
[oracle@discus1 examples]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 examples]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_rsa:
Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa)
[oracle@discus1 examples]$
[oracle@discus1 examples]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 examples]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 examples]$
[oracle@discus1 examples]$ ./runInstaller &

・・・中略・・・

Copyright (C) 1999, 2007, Oracle. All rights reserved.
MacOSXのxtermからOUIを起動した場合、xterm上のログは文字化けするが起動されるOUIは文字化けしないので特に困ることもない。
久々にMovie化、iLifeで作成、BGMはGarage Bandのループの組み合わせだけで作成したものをYouTubeへ。。

高画質版はこちらからどうぞ。
尚、他のインストールと同様にOUIが実行するCVUでは物理メモリチェック失敗となるが物理メモリ512MBで実行している影響なので無視して続行する。
次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月16日 (木)

Mac de Oracle - 10万円未満 de RAC (11g編)#18

今回はOracle11g R1 Database softwareのインストール

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



15.Oracle11g R1 Database softwareのインストール(ソフトウェアのみインストール)

Oracle databaseインストール事前チェックを手動実行する。CentOS向けに構成ファイルを変更したCVUで行う。物理メモリ及び物理メモリ(512MB)に合わせたカーネルパラメータshmmaxのチェックに失敗するが想定内のことなのでそれ以外のチェック失敗がなければインストールが行える。尚、チェック実施前にsshのユーザ等価関係は有効にしておくこと。
[oracle@discus1 &tilde]$ cd clusterware
[oracle@discus1 clusterware]$ ./bin/cluvfy stage -pre dbinst -n discus1,discus2 -r 11gR1 -verbose

データベース・インストールの事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

・・・中略・・・

システム要件をチェック中: 'database'...

チェック: メモリー合計
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 501.92MB (513968KB) 1GB (1048576KB) 失敗
discus1 501.92MB (513968KB) 1GB (1048576KB) 失敗
結果: メモリー合計チェックが失敗しました。

チェック: "/tmp"ディレクトリのディスク空き領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 10.5GB (11012728KB) 400MB (409600KB) 合格
discus1 8.01GB (8396028KB) 400MB (409600KB) 合格
結果: ディスク空き領域チェックに合格しました。

チェック: スワップ領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2GB (2097144KB) 1.5GB (1572864KB) 合格
discus1 2GB (2097144KB) 1.5GB (1572864KB) 合格
結果: スワップ領域チェックに合格しました。

・・・中略・・・

チェック: "shmmax"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 268435456 536870912 失敗
discus1 268435456 536870912 失敗
結果: "shmmax"のカーネル・パラメータチェックが失敗しました。

チェック: "shmall"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2097152 2097152 合格
discus1 2097152 2097152 合格
結果: "shmall"のカーネル・パラメータチェックに合格しました。


・・・中略・・・

チェック: CRSの状態
ノード名 CRS OK?
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: CRS状態チェックに合格しました。

CRS整合性チェックに合格しました。

データベース・インストールの事前チェックはすべてのノードで失敗しました。
[oracle@discus1 clusterware]$
物理メモリとshmmaxのチェックが失敗しているが、実メモリが少ないことによる影響なので無視して作業を進める。512BMの物理メモリでどこまでいけるか・・・
尚、OUI内のチェックでも同じポイントでチェックが失敗するが同じ問題なので無視してインストールを続ける。(^^)
OUIによるインストールはRACの1ノードから実行する。
Oracle databaseのインストールもMacOSXのxterm(X11)からOUIを起動して行う。尚、sshのユーザ等価関係が有効になっていない場合は有効化しておくこと。
G5Server:~ discus$ ssh -Y oracle@discus1
oracle@discus1's password:
[oracle@discus1 ˜]$ cd /home/oracle/orainstall/database
[oracle@discus1 database]$
[oracle@discus1 database]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 database]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_rsa:
Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa)
[oracle@discus1 database]$
[oracle@discus1 database]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 database]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 database]$
[oracle@discus1 database]$ ./runInstaller &

・・・中略・・・

Copyright (C) 1999, 2007, Oracle. All rights reserved.
MacOSXのxterm上では文字化けするがOUI自体は文字化けしないのでご心配なく。
Dbinst1

Dbinst2

Dbinst3

Dbinst4

Dbinst5

Dbinst6

Dbinst7

Dbinst8

Dbinst9

Dbinst10

Dbinst11

インストールの最後でのお約束! root.shの実行。RAC全ノードのrootユーザで実施後、OUIに戻りダイアログを閉じる。
[root@discus1 ~]# /u01/app/oracle/product/11.1.0/db_1/root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/product/11.1.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
Finished product-specif

Dbinst12

Dbinst13

次回へつづく

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#17

今回はOracle11g R1 Clusterwareのインストール

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



14.Oracle11g R1 Clusterwareのインストール

ということでやっとインストール作業。まずはOracle Clusterwareのインストール。OUIによるインストールはRACの1ノードから実行する。
今回もMacOSXのxterm(X11)でOUIを起動する。
G5Server:~ discus$ ssh -Y oracle@discus1
oracle@discus1's password:
[oracle@discus1 ˜]$ cd /home/oracle/orainstall/clusterware
[oracle@discus1 clusterware]$
[oracle@discus1 clusterware]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 clusterware]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_rsa:
Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa)
[oracle@discus1 clusterware]$
[oracle@discus1 clusterware]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 clusterware]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 clusterware]$
[oracle@discus1 clusterware]$ ./runInstaller &

・・・中略・・・

Copyright (C) 1999, 2007, Oracle. All rights reserved.
MacOSXのxterm上では文字化けするがOUI自体は文字化けしないのでご心配なく。
Ocwinst1

Ocwinst2

Ocwinst3

Ocwinst4

Ocwinst5

Ocwinst6

Ocwinst7

Ocwinst8

Ocwinst9

Ocwinst10

Ocwinst11

Ocwinst12

Ocwinst13

Ocwinst14

お約束のorainstRoot.sh及びroot.shスクリプトはRAC全ノードのrootユーザで実行する。
[root@discus1 ˜]# /u01/app/oraInventory/orainstRoot.sh
権限の変更:/u01/app/oraInventory : 770.
グループ名の変更:/u01/app/oraInventory : oinstall.
スクリプトの実行が完了しました
[root@discus1 ˜]# /u01/app/crs/root.sh
WARNING: directory '/u01/app' is not owned by root
Checking to see if Oracle CRS stack is already configured
/etc/oracle does not exist. Creating it now.

Setting the permissions on OCR backup directory
Setting up Network socket directories
Oracle Cluster Registry configuration upgraded successfully
The directory '/u01/app' is not owned by root. Changing owner to root
Successfully accumulated necessary OCR keys.
Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.
node <nodenumber>: <nodename> <private interconnect name> <hostname>
node 1: discus1 discus1-priv discus1
node 2: discus2 discus2-priv discus2
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Now formatting voting device: /u02/oradata/orcl/CSSFile
Now formatting voting device: /u02/oradata/orcl/CSSFile_mirror1
Now formatting voting device: /u02/oradata/orcl/CSSFile_mirror2
Format of 3 voting devices complete.
Startup will be queued to init within 30 seconds.
Adding daemons to inittab
Expecting the CRS daemons to be up within 600 seconds.
Cluster Synchronization Services is active on these nodes.
discus1
Cluster Synchronization Services is inactive on these nodes.
discus2
Local node checking complete. Run root.sh on remaining nodes to start CRS daemons.
[root@discus1 ˜]# ssh root@discus2
root@discus1's password:
[root@discus2 ˜]# /u01/app/oraInventory/orainstRoot.sh
権限の変更:/u01/app/oraInventory : 770.
グループ名の変更:/u01/app/oraInventory : oinstall.
スクリプトの実行が完了しました
[root@discus2 ˜]# /u01/app/crs/root.sh
WARNING: directory '/u01/app' is not owned by root
Checking to see if Oracle CRS stack is already configured
/etc/oracle does not exist. Creating it now.

・・・.中略・・・・

discus1
discus2
Cluster Synchronization Services is active on all the nodes.
Waiting for the Oracle CRSD and EVMD to start
Oracle CRS stack installed and running under init(1M)
Running vipca(silent) for configuring nodeapps

(2)ノードでVIPアプリケーション・リソースを作成しています...
(2)ノードでGSDアプリケーション・リソースを作成しています...
(2)ノードでONSアプリケーション・リソースを作成しています...
(2)ノードでVIPアプリケーション・リソースを起動しています...
(2)ノードでGSDアプリケーション・リソースを起動しています...
(2)ノードでONSアプリケーション・リソースを起動しています...


Done.
[root@discus2 ˜]#
Ocwinst16

Ocwinst17


OUIの最後のCVUでエラーが発生するが既知の問題(CentOS5.2がサポートされていないから)なので無視してOUIを進め、OTN USから別途ダウンロードしCentOS5でも実行できるようカスタマイズしたCVUをOUIを起動したノードで実行し正常であることの確認が取れればOK。
以下はOUIのログ。
-----------------------------------------------------------------------------
コンフィギュレーション・アシスタント"Oracle Cluster Verification Utility"から生成された出力:
Command = /u01/app/crs/bin/cluvfy stage -post crsinst -n discus1,discus2

ERROR:
オペレーティング・システムを識別できません。このオペレーティング・システムに対して正しいソフトウェアが実行中であることを確認してください。
検証を続行できません。


コンフィギュレーション・アシスタント"Oracle Cluster Verification Utility"が失敗しました。
-----------------------------------------------------------------------------
"/u01/app/crs/cfgtoollogs/configToolFailedCommands"スクリプトには、失敗したコマンド、スキップされたコマンド、または取り消されたコマンドがすべて含まれています。
このファイルは、OUI以外でコンフィギュレーション・アシスタントを実行するために使用される場合があります。このスクリプトを実行する前に、
(存在する場合は)パスワードを使用してスクリプトを更新する必要がある場合があります。
-----------------------------------------------------------------------------
[oracle@discus1 clusterware]$ ./bin/cluvfy stage -post crsinst -n discus1,discus2 -verbose

クラスタ・サービス設定の事後チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

クラスタ・マネージャ整合性をチェック中...


CSSデーモンをチェック中...
ノード名 ステータス
------------------------------------ ------------------------
discus2 実行中
discus1 実行中
結果: "CSS daemon"のデーモン・ステータスチェックに合格しました。

クラスタ・マネージャ整合性チェックに合格しました。

クラスタ整合性をチェック中...

ノード名
------------------------------------
discus1
discus2

クラスタ整合性チェックに合格しました


OCR整合性をチェック中...

非クラスタ構成がないことをチェック中...
すべてのノードにローカル専用の非クラスタ構成がありません。

OCRデバイスの一意性チェックに合格しました。

OCRのバージョンをチェック中...
OCRの正しいバージョン"2"が存在します。

OCRのデータ整合性をチェック中...
OCRのデータ整合性チェックに合格しました。

OCR整合性チェックに合格しました。

CRS整合性をチェック中...

デーモン活性をチェック中...

チェック: "CRS daemon"の活性

・・・・中略・・・・

GSDノード・アプリケーションの存在をチェック中です
ノード名 必須 ステータス コメント
------------ ------------------------ ------------------------ ----------
discus2 いいえ 存在します 合格
discus1 いいえ 存在します 合格
結果: チェックに合格しました。


クラスタ・サービス設定の事後チェックは成功しました。
[oracle@discus1 clusterware]$

最後に全ノードのOracleユーザで以下の確認を行ってOracle clusterwareのインストールは終了。
[oracle@discus1 ˜]$ $ORA_CRS_HOME/bin/olsnodes -n
discus1 1
discus2 2
[oracle@discus1 ˜]$ $ORA_CRS_HOME/bin/crs_stat -t -v
Name Type R/RA F/FT Target State Host
----------------------------------------------------------------------
ora....us1.gsd application 0/5 0/0 ONLINE ONLINE discus1
ora....us1.ons application 0/3 0/0 ONLINE ONLINE discus1
ora....us1.vip application 0/0 0/0 ONLINE ONLINE discus1
ora....us2.gsd application 0/5 0/0 ONLINE ONLINE discus2
ora....us2.ons application 0/3 0/0 ONLINE ONLINE discus2
ora....us2.vip application 0/0 0/0 ONLINE ONLINE discus2
[oracle@discus1 ˜]$ $ORA_CRS_HOME/bin/crsctl check crs
Cluster Synchronization Services appears healthy
Cluster Ready Services appears healthy
Event Manager appears healthy
[oracle@discus1 ˜]$ ls -l /etc/init.d/init.*
-rwxr-xr-x 1 root root 2236 10月 2 21:43 /etc/init.d/init.crs
-rwxr-xr-x 1 root root 5290 10月 2 21:43 /etc/init.d/init.crsd
-rwxr-xr-x 1 root root 49416 10月 2 21:43 /etc/init.d/init.cssd
-rwxr-xr-x 1 root root 3859 10月 2 21:43 /etc/init.d/init.evmd
[oracle@discus1 ˜]$


次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月15日 (水)

Mac de Oracle - 10万円未満 de RAC (11g編)#16

今回はOracle11g R1 インストール事前作業

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



13.Oracle11g R1 インストール事前作業

インストールするOracle製品は、
linux_x86_11gR1_database.zip / linux_x86_11gR1_clusterware.zip / linux_11gR1_examples.zip


及び、cvupack_Linux_x86.zip

CVUのFAQ:
http://www.oracle.com/technology/products/database/clustering/cvu/faq/cvufaq_11g.htmlを参照のこと。

2008/10/16追記
尚、DVDを利用する場合はcvupack_Linux_x86.zipだけを別途ダウンロードし適当なディレクトリで解凍して利用する。DVDを利用する場合、OUIはDatabase/Clusterware/Oracle Clientを選択してインストールすることができるが、本エントリではOracle Database及び、Clusterwareは個々のOUIで個別にインストールしているためrunInstallerのディレクトリが異なっていることに注意してください。
ちなみに1枚のDVDに纏まられているOUIを起動した場合は以下のような画面が現れ、インストールする製品を選択できる。
Oui_dvd

インストールするOracle製品をダウンロードする。
インストールは1つのノードから行うのでRACを構成するいずれか1ノードへダウンロードすればOK。だたDISK容量はそれほど多くないのでunzipしたファイルはどんどん削除。(こちらの事情ですのでインストール上必須ではありません。こんなこと書かなくても大丈夫だと思いますが。)
ただし、cvuqdisk-1.0.1-1.rpmだけはRAC全ノードにダウンロードして個別にインストールする。
[root@discus1 ˜]# su - oracle
[oracle@discus1 ˜]$ mkdir orainstall
[oracle@discus1 ˜]$ cd orainstall
[oracle@discus1 orainstall]$ pwd
/home/oracle/orainstall
[oracle@discus1 orainstall]$ ll
合計 2524844
-rw-r--r-- 1 oracle oinstall 36428926 10月 1 21:12 cvupack_Linux_x86.zip
-rw-r--r-- 1 oracle oinstall 457209469 10月 1 21:41 linux_11gR1_examples.zip
-rw-r--r-- 1 oracle oinstall 244660141 10月 1 21:20 linux_x86_11gR1_clusterware.zip
-rw-r--r-- 1 oracle oinstall 1844572234 10月 1 21:27 linux_x86_11gR1_database.zip
[oracle@discus1 orainstall]$ unzip linux_x86_11gR1_database.zip

・・・・中略・・・

[oracle@discus1 orainstall]$ rm linux_x86_11gR1_database.zip
[oracle@discus1 orainstall]$ unzip linux_11gR1_examples.zip

・・・・中略・・・

[oracle@discus1 orainstall]$ rm linux_11gR1_examples.zip
[oracle@discus1 orainstall]$unzip linux_x86_11gR1_clusterware.zip

・・・・中略・・・

[oracle@discus1 orainstall]$ rm linux_x86_11gR1_clusterware.zip
[oracle@discus1 orainstall]$ ll
合計 35644
drwxr-xr-x 8 oracle oinstall 4096 9月 19 2007 clusterware/
-rw-r--r-- 1 oracle oinstall 36428926 10月 1 21:12 cvupack_Linux_x86.zip
drwxr-xr-x 6 oracle oinstall 4096 9月 19 2007 database/
drwxr-xr-x 6 oracle oinstall 4096 8月 7 2007 examples/
[oracle@discus1 orainstall]$ mv cvupack_Linux_x86.zip ./clusterware
[oracle@discus1 orainstall]$ ll
合計 24
drwxr-xr-x 8 oracle oinstall 4096 9月 19 2007 clusterware/
drwxr-xr-x 6 oracle oinstall 4096 9月 19 2007 database/
drwxr-xr-x 6 oracle oinstall 4096 8月 7 2007 examples/
[oracle@discus1 orainstall]$ cd clusterware
[oracle@discus1 clusterware]$ unzip cvupack_Linux_x86.zip

・・・・中略・・・

inflating: lib/libsrvm11.so
replace rpm/cvuqdisk-1.0.1-1.rpm? [y]es, [n]o, [A]ll, [N]one, [r]ename: n
[oracle@discus1 clusterware]$ rm cvupack_Linux_x86.zip
[oracle@discus1 clusterware]$ ll
合計 112
drwxr-xr-x 2 oracle oinstall 4096 8月 19 15:34 bin/
drwxr-xr-x 6 oracle oinstall 4096 8月 19 15:34 cv/
drwxr-xr-x 8 oracle oinstall 4096 8月 7 2007 doc/
drwxr-xr-x 4 oracle oinstall 4096 8月 4 2007 install/
drwxr-xr-x 3 oracle oinstall 4096 8月 19 15:34 jdk/
drwxr-xr-x 2 oracle oinstall 4096 8月 19 15:34 jlib/
drwxr-xr-x 2 oracle oinstall 4096 8月 19 15:34 lib/
drwxr-xr-x 2 oracle oinstall 4096 9月 19 2007 response/
drwxr-xr-x 2 oracle oinstall 4096 8月 4 2007 rpm/
-rwxr-xr-x 1 oracle oinstall 2912 8月 4 2007 runInstaller*
-rwxr-xr-x 1 oracle oinstall 2990 8月 4 2007 runcluvfy.sh*
drwxr-xr-x 13 oracle oinstall 4096 8月 4 2007 stage/
drwxr-xr-x 2 oracle oinstall 4096 8月 4 2007 upgrade/
-rw-r--r-- 1 oracle oinstall 3824 7月 13 2007 welcome.html
この例ではRACを構成するdiscus1で解凍したcvuqdisk-1.0.1-1.rpmを残りのノードへコピー後、全ノードで個別にインストールする。
[oracle@discus1 clusterware]$ cd rpm
[oracle@discus1 rpm]$ ll
合計 12
-rw-r--r-- 1 oracle oinstall 5339 8月 4 2007 cvuqdisk-1.0.1-1.rpm
[oracle@discus1 rpm]$ scp cvuqdisk-1.0.1-1.rpm discus2:/home/oracle/orainstall/clusterware/rpm
Enter passphrase for key '/home/oracle/.ssh/id_rsa':
cvuqdisk-1.0.1-1.rpm 100% 5339 5.2KB/s 00:00
[oracle@discus1 rpm]$
[root@discus1 rpm]# export CVUQDISK_GRPP=oinstall
[root@discus1 rpm]# rpm -iv cvuqdisk-1.0.1-1.rpm
準備中...
cvuqdisk-1.0.1-1
今回利用するzipファイルを全て展開すると上記のようなdirectory構成になる。cvupack_Linux_x86.zipを利用する理由は、後続作業にてCentOS5.2上でCVUによる事前チェックが行えるようにすることが目的でcvu_configファイルのCV_ORACLE_RELEASEパラメータ及び、CV_ASSUME_DISTIDパラメータをカスタマイズするため。
CV_ORACLE_RELEASEパラメータはコメントアウトされているだけなので#を削除するだけ。
CV_ASSUME_DISTIDパラメータはCentOS5.2をRHEL5と思わせるためにRHEL5へ変更する。
前述の設定を怠ると....
[oracle@discus1 clusterware]$ ./bin/cluvfy stage -pre crsinst -n discus1,discus2 -verbose

ERROR:
オペレーティング・システムを識別できません。このオペレーティング・システムに対して正しいソフトウェアが実行中であることを確認してください。
検証を続行できません。

[oracle@discus1 clusterware]$
というエラーが発生するのでご注意を

[oracle@discus1 clusterware]$ cat ./cv/admin/cvu_config
# Configuration file for Cluster Verification Utility(CVU)
# Version: 011405
#
# NOTE:
# 1._ Any line without a '=' will be ignored
# 2._ Since the fallback option will look into the environment variables,
# please have a component prefix(CV_) for each property to define a
# namespace.
#


#Default Oracle release(10gR1/10gR2/11gR1). If specified here, this release
#will be assumed when -r option is not specified in the command line.
CV_ORACLE_RELEASE=11gR1

#Nodes for the cluster. If CRS home is not installed, this list will be
#picked up when -n all is mentioned in the commandline argument.
#CV_NODE_ALL=

#if enabled, cvuqdisk rpm is required on all nodes on RedHat 3 or Redhat 4
CV_RAW_CHECK_ENABLED=TRUE

# Fallback to this distribution id
CV_ASSUME_DISTID=RHEL5

# Whether X-Windows check should be performed for user equivalence with SSH
#CV_XCHK_FOR_SSH_ENABLED=TRUE

# To override SSH location
#ORACLE_SRVM_REMOTESHELL=/usr/bin/ssh

# To override SCP location
#ORACLE_SRVM_REMOTECOPY=/usr/bin/scp

[oracle@discus1 clusterware]$


さ事前チェックを行う前にsshのユーザ等価は確認しておく。
ここでpasswordを要求されるようならユーザ等価関係が有効になっていないので再度設定するべし。
[oracle@discus1 clusterware]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 clusterware]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 clusterware]$


・CVUによるOracle Clusterware事前チェック(RACを構成する1ノードのoracleユーザで実施すればOK)
[oracle@discus1 clusterware]$ pwd
/home/oracle/orainstall/clusterware
[oracle@discus1 clusterware]$ ./bin/cluvfy stage -pre crsinst -n discus1,discus2 -verbose

クラスタ・サービス設定の事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

管理権限をチェック中...

チェック: ユーザー"oracle"の存在
ノード名 ステータス ユーザーID
------------ ------------------------ ------------------------
discus2 存在します 601
discus1 存在します 601
結果: "oracle"のユーザーの存在チェックに合格しました。

チェック: グループ"oinstall"の存在
ノード名 ステータス グループID
------------ ------------------------ ------------------------
discus2 存在します 601
discus1 存在します 601
結果: "oinstall"のグループの存在チェックに合格しました。

チェック: グループ"oinstall"内のユーザー"oracle"[プライマリ]のメンバーシップ
ノード名 ユーザーが存在します グループが存在します グループ内のユーザー プライマリ コメント
---------------- ------------ ------------ ------------ ------------ ------------
discus2 はい はい はい はい 合格
discus1 はい はい はい はい 合格
結果: グループ"oinstall"内のユーザー"oracle"[プライマリ]のメンバーシップ・チェックに合格しました。

管理権限チェックに合格しました。

ノード接続性をチェック中...


・・・・中略・・・・


システム要件をチェック中: 'crs'...

チェック: メモリー合計
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 501.92MB (513968KB) 1GB (1048576KB) 失敗
discus1 501.92MB (513968KB) 1GB (1048576KB) 失敗
結果: メモリー合計チェックが失敗しました。

チェック: "/tmp"ディレクトリのディスク空き領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 11.2GB (11743644KB) 400MB (409600KB) 合格
discus1 8.56GB (8972272KB) 400MB (409600KB) 合格
結果: ディスク空き領域チェックに合格しました。

チェック: スワップ領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2GB (2097144KB) 1.5GB (1572864KB) 合格
discus1 2GB (2097144KB) 1.5GB (1572864KB) 合格
結果: スワップ領域チェックに合格しました。

チェック: システム・アーキテクチャ
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 i686 i686 合格
discus1 i686 i686 合格
結果: システム・アーキテクチャチェックに合格しました。

チェック: カーネル・バージョン
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2.6.18-92.el5 2.6.9 合格
discus1 2.6.18-92.el5 2.6.9 合格
結果: カーネル・バージョンチェックに合格しました。

・・・・中略・・・・

チェック: "glibc-headers-2.5-12"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 glibc-headers-2.5-24 合格
discus1 glibc-headers-2.5-24 合格
結果: "glibc-headers-2.5-12"のパッケージの存在チェックに合格しました。

チェック: "dba"のグループの存在
ノード名 ステータス グループID
------------ ------------------------ ------------------------
discus2 存在します 602
discus1 存在します 602
結果: "dba"のグループの存在チェックに合格しました。

チェック: "oinstall"のグループの存在
ノード名 ステータス グループID
------------ ------------------------ ------------------------
discus2 存在します 601
discus1 存在します 601
結果: "oinstall"のグループの存在チェックに合格しました。

チェック: "nobody"の既存ユーザー
ノード名 ステータス ユーザーID
------------ ------------------------ ------------------------
discus2 存在します 99
discus1 存在します 99
結果: "nobody"の既存ユーザーチェックに合格しました。

チェック: "オープン・ファイル・ディスクリプタ"のハード・リソース制限
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 65536 65536 合格
discus1 65536 65536 合格
結果: "オープン・ファイル・ディスクリプタ"のハード・リソース制限チェックに合格しました。

チェック: "オープン・ファイル・ディスクリプタ"のソフト・リソース制限
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 1024 1024 合格
discus1 1024 1024 合格
結果: "オープン・ファイル・ディスクリプタ"のソフト・リソース制限チェックに合格しました。

チェック: "最大ユーザー・プロセス"のハード・リソース制限
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 16384 16384 合格
discus1 16384 16384 合格
結果: "最大ユーザー・プロセス"のハード・リソース制限チェックに合格しました。

チェック: "最大ユーザー・プロセス"のソフト・リソース制限
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2047 2047 合格
discus1 2047 2047 合格
結果: "最大ユーザー・プロセス"のソフト・リソース制限チェックに合格しました。

システム要件が失敗しました 'crs'

クラスタ・サービス設定の事前チェックはすべてのノードで失敗しました。
[oracle@discus1 clusterware]$

NGなのはメモリだけなのでこのまま先へ進む。(実メモリが少ないのは承知の上で行っているので)


・CVUによるハードウェアとOSのセットアップチェック。(RACを構成する1ノードのoracleユーザで実施すればOK)
[oracle@discus1 clusterware]$ ./bin/cluvfy stage -post hwos -n discus1,discus2 -verbose

ハードウェアとオペレーティング・システム設定の事後チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

ノード接続性をチェック中...


ノード"discus2"のインタフェース情報
名前 IPアドレス サブネット ゲートウェイ デフォルト・ゲートウェイ HWアドレス MTU
------ --------------- --------------- --------------- --------------- ----------------- ------
eth0 192.168.1.4 192.168.1.0 0.0.0.0 192.168.1.1 00:08:74:B1:C4:4C 1500
eth1 192.168.2.4 192.168.2.0 0.0.0.0 192.168.1.1 00:01:8E:B3:6E:BA 1500


ノード"discus1"のインタフェース情報
名前 IPアドレス サブネット ゲートウェイ デフォルト・ゲートウェイ HWアドレス MTU
------ --------------- --------------- --------------- --------------- ----------------- ------
eth0 192.168.1.3 192.168.1.0 0.0.0.0 192.168.1.1 00:08:74:B1:C4:50 1500
eth1 192.168.2.3 192.168.2.0 0.0.0.0 192.168.1.1 00:01:8E:B3:76:A3 1500


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

インタフェースがVIPの候補となるサブネット"192.168.1.0"で見つかりました:
discus2 eth0:192.168.1.4
discus1 eth0:192.168.1.3

インタフェースがプライベート・インタコネクトの候補となるサブネット"192.168.2.0"で見つかりました:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

結果: ノード接続性チェックに合格しました。


共有記憶域アクセス可能性をチェック中...

Disk 共有ノード(数量: 2)
------------------------------------ ------------------------
/dev/sdc discus2
/dev/sda discus1

Disk 共有ノード(数量: 2)
------------------------------------ ------------------------
/dev/sdb discus2 discus1

Disk 共有ノード(数量: 2)
------------------------------------ ------------------------
/dev/sda discus2
/dev/sdd discus1

Disk 共有ノード(数量: 2)
------------------------------------ ------------------------
/dev/sdd discus2
/dev/sdc discus1

Disk 共有ノード(数量: 2)
------------------------------------ ------------------------
/dev/sde discus2 discus1


共有記憶域チェックはノード"discus2,discus1"で成功しました。

ハードウェアとオペレーティング・システム設定の事後チェックは成功しました。
[oracle@discus1 clusterware]$

ということでメモリ512MB以外は問題なし。想定通りなのでそのまま続行。

次回へつづく<

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#15

今回はOracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)

12.Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成

以下のRHEL5 x86用パッケージをインストールする。
oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm
oracleasm-support-2.0.4-1.el5.i386.rpm
oracleasmlib-2.0.3-1.el5.i386.rpm

インストールガイド:
http://oss.oracle.com/projects/oracleasm/dist/documentation/asm-install.txt

OCFS2の場合と同様に関連するパッケージを一旦MacOSXへダウンロード後、scpにてRAC全ノードへ配布してインストールする。

G5Server:˜ discus$ scp /Users/discus/Desktop/oracleasm-support-2.0.4-1.el5.i386.rpm oracle@discus1:/tmp
oracle@discus1's password:
oracleasm-support-2.0.4-1.el5.i386.rpm                                      100%   22KB  22.4KB/s   00:00   
G5Server:˜ discus$ scp /Users/discus/Desktop/oracleasm-support-2.0.4-1.el5.i386.rpm oracle@discus2:/tmp
oracle@discus2's password:
oracleasm-support-2.0.4-1.el5.i386.rpm                                      100%   22KB  22.4KB/s   00:00   
G5Server:˜ discus$ scp /Users/discus/Desktop/oracleasmlib-2.0.3-1.el5.i386.rpm oracle@discus1:/tmp
oracle@discus1's password:
oracleasmlib-2.0.3-1.el5.i386.rpm                                           100%   13KB  13.3KB/s   00:00   
G5Server:˜ discus$ scp /Users/discus/Desktop/oracleasmlib-2.0.3-1.el5.i386.rpm oracle@discus2:/tmp
oracle@discus2's password:
oracleasmlib-2.0.3-1.el5.i386.rpm                                           100%   13KB  13.3KB/s   00:00   
G5Server:˜ discus$ scp /Users/discus/Desktop/oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm oracle@discus1:/tmp
oracle@discus1's password:
oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm                                100%  122KB 122.2KB/s   00:00   
G5Server:˜ discus$ scp /Users/discus/Desktop/oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm oracle@discus2:/tmp
oracle@discus2's password:
oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm                                100%  122KB 122.2KB/s   00:00   
G5Server:˜ discus$

配布が完了したらRAC全ノードのrootユーザでインストール及び構成を行う。
(2010/10/13訂正)

[root@discus1 tmp]# ll *.rpm
-rw-r--r-- 1 oracle oinstall  125137 10月  2 00:51 oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm
-rw-r--r-- 1 oracle oinstall   22936 10月  2 00:50 oracleasm-support-2.0.4-1.el5.i386.rpm
-rw-r--r-- 1 oracle oinstall   13658 10月  2 00:51 oracleasmlib-2.0.3-1.el5.i386.rpm
[root@discus1 tmp]# rpm -qa | grep oracleasm | sort
[root@discus1 tmp]# rpm -Uvh oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm oracleasm-support-2.0.4-1.el5.i386.rpm oracleasmlib-2.0.3-1.el5.i386.rpm
準備中...                 ########################################### [100%]
1:oracleasm-support      ########################################### [ 33%]
2:oracleasm-2.6.18-92.el5########################################### [ 67%]
3:oracleasmlib           ########################################### [100%]
[root@discus1 tmp]# rpm -qa | grep oracleasm | sort
oracleasm-2.6.18-92.el5-2.0.4-1.el5
oracleasm-support-2.0.4-1.el5
oracleasmlib-2.0.3-1.el5
[root@discus1 tmp]#
[root@discus1 ˜]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver.  The following questions will determine whether the driver is
loaded on boot and what permissions it will have.  The current values
will be shown in brackets ('[]').  Hitting

without typing an
answer will keep that current value.  Ctrl-C will abort.

Default user to own the driver interface []: oracle
Default group to own the driver interface []: oinstall
Start Oracle ASM library driver on boot (y/n) [n]: y
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration:           [  OK  ]
Creating /dev/oracleasm mount point:                       [  OK  ]
Loading module "oracleasm":                                [  OK  ]
Mounting ASMlib driver filesystem:                         [  OK  ]
Scanning system for ASM disks:                             [  OK  ]
[root@discus1 ˜]#

 

asmディスク作成する。(iscsiとして作成したデバイスへ作成する)。以下の操作はRACを構成する1ノードのrootユーザで実行する。


[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL1 /dev/iscsi/asm1/part1
Marking disk "/dev/iscsi/asm1/part1" as an ASM disk:       [  OK  ]
[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL2 /dev/iscsi/asm2/part1
Marking disk "/dev/iscsi/asm2/part1" as an ASM disk:       [  OK  ]
[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL3 /dev/iscsi/asm3/part1
Marking disk "/dev/iscsi/asm3/part1" as an ASM disk:       [  OK  ]
[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL4 /dev/iscsi/asm4/part1
Marking disk "/dev/iscsi/asm4/part1" as an ASM disk:       [  OK  ]
[root@discus1 ˜]#

 

asmディスクの確認。以下の操作はRAC全ノードのrootユーザで実施する。

[root@discus1 ˜]# /etc/init.d/oracleasm scandisks
Scanning system for ASM disks:                             [  OK  ]
[root@discus1 ˜]# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
[root@discus1 ˜]#

次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月14日 (火)

Mac de Oracle - 10万円未満 de RAC (11g編)#14

今回はOracle Cluster File System (OCFS2)のインストール及び構成 その3

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1その2、その3
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



11.Oracle Cluster File System (OCFS2)のインストール及び構成 その3

・O2CBの構成
「10万円 de RAC」と同じH/WなのでO2CBのheartbeatのしきい値は以前と同じで81に設定する。configureだけで全て行えるのでocfs2 1.2.3のときより構成は楽。。(Heartbeat dead threshholdに関してはマニュアルP.18 Heartbeat Dead Threshold参照のこと。)
[root@discus1 ocfs2]# /etc/init.d/o2cb offline ocfs2
Stopping O2CB cluster ocfs2: OK
[root@discus1 ocfs2]#
[root@discus1 ocfs2]# /etc/init.d/o2cb unload
Unmounting ocfs2_dlmfs filesystem: OK
Unloading module "ocfs2_dlmfs": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK
[root@discus1 ocfs2]#
[root@discus1 ocfs2]# /etc/init.d/o2cb configure
Configuring the O2CB driver.

This will configure the on-boot properties of the O2CB driver.
The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets ('[]'). Hitting
<ENTER> without typing an answer will keep that current value. Ctrl-C
will abort.

Load O2CB driver on boot (y/n) [n]: y
Cluster stack backing O2CB [o2cb]:
Cluster to start on boot (Enter "none" to clear) [ocfs2]:
Specify heartbeat dead threshold (>=7) [31]: 81
Specify network idle timeout in ms (>=5000) [30000]:
Specify network keepalive delay in ms (>=1000) [2000]: 3000
Specify network reconnect delay in ms (>=2000) [2000]:
Writing O2CB configuration: OK
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Starting O2CB cluster ocfs2: OK
・OCFS2ファイルシステムのフォーマット
[root@discus1 ˜]# mkfs.ocfs2 -b 4K -C 32K -N 4 -L oracrsfiles /dev/iscsi/crs/part1
mkfs.ocfs2 1.4.1
Cluster stack: classic o2cb
Filesystem label=oracrsfiles
Block size=4096 (bits=12)
Cluster size=32768 (bits=15)
Volume size=2145943552 (65489 clusters) (523912 blocks)
3 cluster groups (tail covers 977 clusters, rest cover 32256 clusters)
Journal size=67108864
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 1 block(s)
Formatting Journals: done
Formatting slot map: done
Writing lost+found: done
mkfs.ocfs2 successful
事前に作成しておいたマウントポイント/u02へOCFS2ファイルシステムをマウントする。また、/etc/fstabも以下のようの編集する。
[root@discus1 ˜]# mount -t ocfs2 -o datavolume,nointr -L "oracrsfiles" /u02
[root@discus1 ˜]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
configfs on /sys/kernel/config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sde1 on /u02 type ocfs2 (rw,_netdev,datavolume,nointr,heartbeat=local)
[root@discus1 ˜]# vi /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
LABEL=oracrsfiles /u02 ocfs2 _netdev,datavolume,nointr 0 0
[root@discus1 ˜]#


最後に/etc/sysctl.confへ以下の2行を追加(詳細はマニュアルのP.19 Kernel Configuration 参照)。
kernel.panic_on_oops = 1
kernel.panic = 30
[root@discus1 ˜]# vi /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

・・・・中略・・・・
# for Oracle11g
kernel.sem = 250 32000 100 128
fs.file-max = 65536
kernel.shmall = 2097152
kernel.shmmax = 268435456
kernel.shmmni = 4096
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
kernel.panic_on_oops = 1
kernel.panic = 30

ここでRAC全ノードを再起動する。再起動後、mountコマンドで状態を確認する。
[root@discus1 ˜]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
configfs on /sys/kernel/config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sde1 on /u02 type ocfs2 (rw,_netdev,datavolume,nointr,heartbeat=local)
OCFS2のバージョン確認方法。以前とかわったようだ。以前は/proc/fs/ocfs2/versionで見る事ができたが1.4.1では以下のようにすると確認できる。
[root@discus1 ˜]# mkfs.ocfs2 -V
mkfs.ocfs2 1.4.1
[root@discus1 ˜]#


これでOCFS2に関する作業はひとまず終了。次回へつづく

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#13

今回はOracle Cluster File System (OCFS2)のインストール及び構成 その2

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1、その2
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



11.Oracle Cluster File System (OCFS2)のインストール及び構成 その2


・OCFS2の構成

ocfs2consoleというGUIツールが提供されているのでそれを利用する。この操作はRACを構成する全ノードで実施する。(OCFS2の構成もMacOSXのxtermから行う。お約束.w)

Ocfs2console1_2

Ocfs2console2_2

Ocfs2console3_2

Ocfs2console4

Ocfs2console5



2010/10/16訂正
Node Configurationダイアログの画像を訂正。private networkのホスト名として設定したdiscus1-priv/discus2-privではなく、public networkのホスト名として設定したdiscus1/discus2を設定するのが正しい。


Ocfs2console6_ng

Ocfs2console6_ok

Ocfs2console7

OCFS2コンソールで構成後には/etc/ocfs2/cluster.confが作成される。
[root@discus1 ˜]# cat /etc/ocfs2/cluster.conf
node:
ip_port = 7777
ip_address = 192.168.2.3
number = 0
name = discus1
cluster = ocfs2

node:
ip_port = 7777
ip_address = 192.168.2.4
number = 1
name = discus2
cluster = ocfs2

cluster:
node_count = 2
name = ocfs2

[root@discus1 ˜]#
簡単な状況確認及び動作確認。(これをやらなくてもインストール及び構成には支障はありませんが。。。念のため。)
後ほど調整するが、Heatbeat dead threshholdが31(デフォルト)になっていることが確認できる。
[root@discus2 ocfs2]# /etc/init.d/o2cb status
Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold = 31
Network idle timeout: 30000
Network keepalive delay: 2000
Network reconnect delay: 2000
Checking O2CB heartbeat: Not active
[root@discus2 ocfs2]#
[root@discus2 ocfs2]# /etc/init.d/o2cb offline ocfs2
Stopping O2CB cluster ocfs2: OK
[root@discus2 ocfs2]#
[root@discus2 ocfs2]# /etc/init.d/o2cb unload
Unmounting ocfs2_dlmfs filesystem: OK
Unloading module "ocfs2_dlmfs": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK
[root@discus2 ocfs2]#
[root@discus2 ocfs2]# /etc/init.d/o2cb load
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
[root@discus2 ocfs2]#
[root@discus2 ocfs2]# /etc/init.d/o2cb online ocfs2
Starting O2CB cluster ocfs2: OK
[root@discus2 ocfs2]#
[root@discus2 ocfs2]# /etc/init.d/o2cb status
Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Online
Heartbeat dead threshold = 31

Network idle timeout: 30000

Network keepalive delay: 2000
Network reconnect delay: 2000
Checking O2CB heartbeat: Not active
[root@discus2 ocfs2]#
その3へつづく。




(2010/10/17追記)
ちなみに、add nodeダイアログで「Name」欄にpublic networkに設定したhost名ではなく、private networkに設定したhost名を設定してしまうと、cluster file system(以下の例では “ocfs2”)をonlineにできずエラーが発生する。 add nodeダイアログでは、public networkに指定したhost名を設定しましょうね。(直感的に分かりにくいので注意しましょ!)

[root@discus1 ˜]# /etc/init.d/o2cb status
Driver for "configfs": Loaded
Filesystem "configfs": Mounted
Driver for "ocfs2_dlmfs": Loaded
Filesystem "ocfs2_dlmfs": Mounted
Checking O2CB cluster ocfs2: Offline

[root@discus1 ˜]# /etc/init.d/o2cb unload
Unmounting ocfs2_dlmfs filesystem: OK
Unloading module "ocfs2_dlmfs": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK

[root@discus1 ˜]# /etc/init.d/o2cb load
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK

[root@discus1 ˜]# /etc/init.d/o2cb online ocfs2
Starting O2CB cluster ocfs2: Failed
Cluster ocfs2 created
Node discus1-priv added
Node discus2-priv added
o2cb_ctl: Configuration error discovered while populating cluster ocfs2.
None of its nodes were considered local.
A node is considered local when its node name
in the configuration matches this machine's host name.

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#12

今回はOracle Cluster File System (OCFS2)のインストール及び構成 その1

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成 その1
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



11.Oracle Cluster File System (OCFS2)のインストール及び構成 その1

・Oracle Cluster File System (OCFS2)と関連ツールのダウンロード
約2年前はRHEL4向けのOCFS2 1.2.3-1を利用したが今回はCentOS5.2なのでRHEL5向け1.4.1-1を利用する。kernelのリリース毎に個別のパッケージが用意されているので対応するものを利用する。
[oracle@discus1 ˜]$ uname -r
2.6.18-92.el5
[oracle@discus1 ˜]$
今回インストールしたCentOS5.2のkernelは2.6.18-92.el5なので以下のパッケージをインストールする。尚、「10万円 de RAC #20」のようにRAC全ノードからwgetで直接ダウンロードすることも可能なのだが今回は一旦MacOSX側で全てダウンロード後、各RACノードへscpでコピーすることにした。(Macも絡めないとね・・・Mac De Oracleですから。wwww)
http://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL5/i386/1.4.1-1/2.6.18-92.el5/ocfs2-2.6.18-92.el5-1.4.1-1.el5.i686.rpm
http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/i386/1.4.1-1/ocfs2-tools-1.4.1-1.el5.i386.rpm
http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/i386/1.4.1-1/ocfs2console-1.4.1-1.el5.i386.rpm

OCFS2 1.4.1-1のドキュメント(USER'S GUIDE FOR RELEASE 1.4)は以下。
http://oss.oracle.com/projects/ocfs2/dist/documentation/v1.4/ocfs2-1_4-usersguide.pdf
MacでダンロードしたOCFS2関連パッケージをscpでRACの各ノードの/tmpへ配布。(以下はdiscus1の/tmpへscpしている例。)
Welcome to Darwin!
G5Server:˜ discus$
G5Server:˜ discus$ scp /Users/discus/Desktop/ocfs2-2.6.18-92.el5-1.4.1-1.el5.i686.rpm oracle@discus1:/tmp
oracle@discus1's password:
ocfs2-2.6.18-92.el5-1.4.1-1.el5.i686.rpm 100% 303KB 303.0KB/s 00:00
G5Server:˜ discus$ scp /Users/discus/Desktop/ocfs2-tools-1.4.1-1.el5.i386.rpm oracle@discus1:/tmp
oracle@discus1's password:
ocfs2-tools-1.4.1-1.el5.i386.rpm 100% 1396KB 1.4MB/s 00:00
G5Server:˜ discus$ scp /Users/discus/Desktop/ocfs2console-1.4.1-1.el5.i386.rpm oracle@discus1:/tmp
oracle@discus1's password:
ocfs2console-1.4.1-1.el5.i386.rpm 100% 306KB 306.5KB/s 00:00
G5Server:˜ discus$
RACの各ノードでOCFS2関連パーッケージをインストール
G5Server:˜ discus$ ssh root@discus1
root@discus1's password:
Last login: Mon Oct 1 21:00:10 2008 from 192.168.1.19
[root@discus1 ˜]#
[root@discus1 ˜]# cd /tmp
[root@discus1 tmp]# ll *.rpm
-rw-r--r-- 1 oracle oinstall 310243 10月 1 22:07 ocfs2-2.6.18-92.el5-1.4.1-1.el5.i686.rpm
-rw-r--r-- 1 oracle oinstall 1429676 10月 1 22:08 ocfs2-tools-1.4.1-1.el5.i386.rpm
-rw-r--r-- 1 oracle oinstall 313824 10月 1 22:10 ocfs2console-1.4.1-1.el5.i386.rpm
[root@discus1 tmp]# rpm -qa | grep ocfs2 | sort
[root@discus1 tmp]# rpm -Uvh ocfs2-tools-1.4.1-1.el5.i386.rpm
準備中... ########################################### [100%]
1:ocfs2-tools ########################################### [100%]
[root@discus1 tmp]# rpm -Uvh ocfs2-2.6.18-92.el5-1.4.1-1.el5.i686.rpm
準備中... ########################################### [100%]
1:ocfs2-2.6.18-92.el5 ########################################### [100%]
[root@discus1 tmp]# rpm -Uvh ocfs2console-1.4.1-1.el5.i386.rpm
準備中... ########################################### [100%]
1:ocfs2console ########################################### [100%]
[root@discus1 tmp]# rpm -qa | grep ocfs2 | sort
ocfs2-2.6.18-92.el5-1.4.1-1.el5
ocfs2-tools-1.4.1-1.el5
ocfs2console-1.4.1-1.el5
[root@discus1 tmp]#
ファイヤーウォール及びSELinux設定はCentOS5.2インストール後に行っているので特に行はないが、もう一度確認。
MacOSXのxterm(X11)から行っている。MacOSXのxtermから ssh -Y username@hostname でX forwardingが有効になる。

Sec_xterm1

Sec_xterm2

Sec_xterm3

ここで各RACノードを再起動。


長いので次回へ続く

| | | コメント (0) | トラックバック (0)

2008年10月13日 (月)

Mac de Oracle - 10万円未満 de RAC (11g編)#11

今回はOracle RACノード構成ファイルの確認

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)

10.Oracle RACノード構成ファイルの確認。

ここまでの作業で編集したり作成したRACノードの構成ファイル等の確認。内容の確認だけなのでさらりと・・・楽しい部分ではないのでね・・・w。(RACの全ノードで確認する。)

/etc/sysctl.conf
(2010/10/13訂正)

[root@discus1 ˜]#  cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

・・・・中略・・・・

# for Oracle11g
kernel.sem = 250 32000 100 128
fs.file-max = 6553600
fs.aio-max-nr = 1048576
kernel.shmall = 2097152
kernel.shmmax = 268435456
kernel.shmmni = 4096
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 = 1048576
[root@discus1 ˜]#

 

/etc/security/limits.conf

[root@discus1 ˜]# cat /etc/security/limits.conf | grep oracle
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

 

/etc/pam.d/login

[root@discus1 ˜]# cat /etc/pam.d/login | grep pam_limits.so
session  required  /lib/security/pam_limits.so
session  required  pam_limits.so

 

/etc/profile
(2010/10/13訂正)

[root@discus1  ˜]# tail -9 /etc/profile
if [ $USER = "oracle" ]; then
     if [ $SHELL = "/bin/ksh" ]; then
         ulimit -p 16384
         ulimit -n 65536
    else
         ulimit -u 16384 -n 65536
     fi
     umask 022
fi
[root@discus1  ˜]#

 

/etc/hosts

[root@discus1 ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost

# Public Networks - (eth0)
192.168.1.3     discus1.macdeoracle.jp  discus1
192.168.1.4     discus2.macdeoracle.jp  discus2
192.168.1.5     arowana.macdeoracle.jp  arowana

# Private Network - (eth1)
192.168.2.3     discus1-priv.macdeoracle.jp     discus1-priv
192.168.2.4     discus2-priv.macdeoracle.jp     discus2-priv
192.168.2.5     arowana-priv.macdeoracle.jp     arowana-priv

# Public Virtual IP(VIP) address for - (eth0)
192.168.1.100   discus1-vip.macdeoracle.jp      discus1-vip
192.168.1.101   discus2-vip.macdeoracle.jp      discus2-vip
[root@discus1 ˜]#

 

/etc/modprobe.conf

[root@discus1 ˜]# cat /etc/modprobe.conf | grep hangcheck-timer
options hangcheck-timer hangcheck_tick=1 hangcheck_margin=55 hangcheck_reboot=1
[root@discus1 ˜]#

 

/etc/rc.local

[root@discus1 ˜]# cat /etc/rc.local | grep hangcheck-timer
/sbin/modprobe hangcheck-timer
[root@discus1 ˜]#

 

/etc/udev/rules.d/55-openiscsi.rules

[root@discus1 ˜]# cat /etc/udev/rules.d/55-openiscsi.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"

 

/etc/udev/sripts/iscsidev.sh

[root@discus1 ˜]# cat /etc/udev/scripts/iscsidev.sh
#!/bin/sh

# FILE: /etc/udev/scripts/iscsidev.sh

BUS=${1}
HOST=${BUS%%:*}

[ -e /sys/class/iscsi_host ] || exit 1

file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"

target_name=$(cat ${file})

# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
   exit 1
fi

echo "${target_name##*.}"

 

/etc/iscsi/initiatorname.iscsi

[root@discus1 ˜]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.jp.macdeoracle:discus1
[root@discus1 ˜]# ssh root@discus2 cat /etc/iscsi/initiatorname.iscsi
root@discus2's password:
InitiatorName=iqn.1994-05.jp.macdeoracle:discus2
[root@discus1 ˜]#

 

iscsid及び、iscsiの自動起動設定の確認

[root@discus1 ˜]# chkconfig --list iscsid
iscsid          0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@discus1 ˜]# chkconfig --list iscsi
iscsi           0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@discus1 ˜]#

 

そして最後はOracleユーザの.bash_profile

[oracle@discus1  ˜]$ cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f  ˜/.bashrc ]; then
        .  ˜/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

alias ls="ls -FA"

export JAVA_HOME=/usr/local/java

# User specific environment and startup programs
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
export ORA_CRS_HOME=/u01/app/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin

# discus1の場合はorcl1 / discus2の場合はorcl2をセット
export ORACLE_SID=orcl1

export PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp

次回へつづく。

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#10

今回はOracle RACノード間リモートアクセスの構成

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



9.Oracle RACノード間リモートアクセスの構成。

行う操作はマニュアルに記載している内容に沿っているので詳細は以下マニュアルを参照のこと。
Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux - 2.11 Configuring SSH on All Cluster Nodes
RAC全ノードのoracleユーザで実施する。
[oracle@discus1 ˜]$ mkdir -p ˜/.ssh
[oracle@discus1 ˜]$ chmod 700 ˜/.ssh
[oracle@discus1 ˜]$ /usr/bin/ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/oracle/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
・・・・以下略・・・・


以下の操作はRACを構成する1ノードのoracleユーザで実施すればOK(この例ではdiscus1から)
[oracle@discus1 ˜]$ touch ˜/.ssh/authorized_keys
[oracle@discus1 ˜]$ cd ˜/.ssh
[oracle@discus1 .ssh]$ ls -l *.pub
-rw-r--r-- 1 oracle oinstall 411 10月 1 21:39 id_rsa.pub
[oracle@discus1 .ssh]$ ssh discus1 cat ˜/.ssh/id_rsa.pub >> ~˜.ssh/authorized_keys
The authenticity of host 'discus1 (192.168.1.3)' can't be established.
RSA key fingerprint is 4c:17:88:23:b0:40:3a:b2:cb:93:07:61:63:4d:12:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus1,192.168.1.3' (RSA) to the list of known hosts.
oracle@discus1's password:
[oracle@discus1 .ssh]$ ssh discus2 cat ˜/.ssh/id_rsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus2 (192.168.1.4)' can't be established.
RSA key fingerprint is 15:d7:fe:b0:dd:7f:42:cc:2d:5e:60:e8:a5:06:5b:d2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus2,192.168.1.4' (RSA) to the list of known hosts.
oracle@discus2's password:
[oracle@discus1 .ssh]$ scp ˜/.ssh/authorized_keys discus2:.ssh/authorized_keys
oracle@discus2's password:
authorized_keys 100% 822 0.8KB/s 00:00
[oracle@discus1 .ssh]$


RAC全ノードのoracleユーザで実施する。
[oracle@discus1 .ssh]$ chmod 600 ˜/.ssh/authorized_keys
[oracle@discus1 .ssh]$


以下の操作はRACを構成する1ノードのoracleユーザで実施すればOK(この例ではdiscus1から)
[oracle@discus1 ˜]$ ssh discus1 hostname
root@discus1's password:
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ssh discus2 hostname
root@discus2's password:
discus2.macdeoracle.jp
[oracle@discus1 ˜]$


sshユーザ等価関係の有効化。以下の操作はRACを構成する1ノードのoracleユーザで実施すればOK(この例ではdiscus1から)
RACのインストールではOUIを実行する前にsshユーザ等価関係の有効化を行っておく必要があるのでお忘れなく。
[oracle@discus1 ˜]$ 
[oracle@discus1 ˜]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 ˜]$ /usr/bin/ssh-add
Enter passphrase for /home/oracle/.ssh/id_rsa:
Identity added: /home/oracle/.ssh/id_rsa (/home/oracle/.ssh/id_rsa)
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus1 hostname
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 ˜]$

次回へつづく。

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#9

今回はhangcheck-timerカーネル・モジュールの構成

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



8.hangcheck-timerカーネル・モジュールの構成。

注)
現時点(2008年10月時点)で公開されているUS OTN:Oracle11gのRAC構築記事ではhangcheck-timerに関する設定は見当たらないのだが、どうもマニュアルバグがあり初期のマニュアルにはhangcheck-timerの構成は不要とされていたことが影響しているのかもしれない。(あくまで想像)
「10万円未満 de RAC (11g編)」では訂正された手順に従い構成することにする。


訂正されたマニュアルは以下。

Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux
 - 7.1.2.2 Configuring the Hangcheck-timer Module 日本語English
Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux
 - OPROCD and Hangcheck Timer Provide Fencing for Cluster Nodes : 日本語English


hangcheck-margin以外はマニュアルに記載されている内容と同じ値に設定した。少々非力なPCを利用しているので長目の設定。(CSS misscountはデフォルト値(60sec)を利用するのでhangcheck_tick+hangcheck_margin < CSS misscountとなるように設定した。)
この操作はRAC全ノードのrootユーザで実施する。
[root@discus1 ˜]# find /lib/modules -name "hangcheck-timer.ko"
/lib/modules/2.6.18-92.el5/kernel/drivers/char/hangcheck-timer.ko
[root@discus1 ˜]# echo "options hangcheck-timer hangcheck_tick=1 hangcheck_margin=55 hangcheck_reboot=1" >> /etc/modprobe.conf
[root@discus1 ˜]# cat /etc/modprobe.conf
alias eth0 e1000
alias eth1 r8169
alias scsi_hostadapter ata_piix
alias snd-card-0 snd-intel8x0
options snd-card-0 index=0
options snd-intel8x0 index=0
remove snd-intel8x0 { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0
options hangcheck-timer hangcheck_tick=1 hangcheck_margin=55 hangcheck_reboot=1
[root@discus1˜~]#
[root@discus1 ˜]# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local
[root@discus1 ˜]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/sbin/modprobe hangcheck-timer
[root@discus1 ˜]#

次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月12日 (日)

Mac de Oracle - 10万円未満 de RAC (11g編)#8

今回はOracle向けLinuxサーバーの構成(カーネルパラメータの設定)

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)

7.Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)。

Oracle Database Quick Installation Guide 11g Release 1 (11.1) for Linux x86 - 6 Configuring Kernel Parameters / Settting Shell limits for the oracle user

リブートするのが面倒なのでOSのリブートなしで変更したカーネルパラメータ値を反映させたついでに/etc/sysctl.confへも追加。
(2010/10/13訂正。)

[root@discus1 ˜]# sysctl -w fs.file-max=65536 >> /etc/sysctl.conf; tail -1 /etc/sysctl.conf;
fs.file-max = 65536

・・・・中略・・・・

[root@discus1 ˜]# sysctl -w net.core.wmem_max =
1048576 >> /etc/sysctl.conf; tail -1 /etc/sysctl.conf;
net.core.wmem_max =
1048576
[root@discus1 ˜]#

として、今回は以下のように設定。
物理メモリが少な過ぎる(512MBなので)ので・・・キツいかな・・・今回は・・DynaBookの時でさえ768MBだったからな・・)
(2010/10/13訂正。)

[root@discus1 ˜]# 
[root@discus1 ˜]# cat /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename
# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Controls the maximum size of a message, in bytes
kernel.msgmnb = 65536

# Controls the default maxmimum size of a mesage queue
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
#kernel.shmmax = 4294967295

# Controls the maximum number of shared memory segments, in pages
#kernel.shmall = 268435456

# for Oracle11g
kernel.sem = 250 32000 100 128
fs.file-max = 65536
fs.aio-max-nr = 1048576
kernel.shmall = 2097152
kernel.shmmax = 268435456
kernel.shmmni = 4096
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 = 1048576
[root@discus1 ˜]#

 

・Oracleユーザのshell limitの設定
(2010/10/13訂正。バックスラッシュを削除)

[root@discus1 ˜]# cat >> /etc/security/limits.conf <<EOF
> oracle soft nproc 2047
> oracle hard nproc 16384
> oracle soft nofile 1024
> oracle hard nofile 65536
> EOF
[root@discus1 ˜]#
[root@discus1 ˜]# cat >> /etc/pam.d/login  <<EOF
> # added for oracle shell limits
> session  required  /lib/security/pam_limits.so
> session  required  pam_limits.so
> EOF
[root@discus1 ˜]#
[root@discus1 ˜]# cat >> /etc/profile  <<EOF
> if [ $USER = "oracle" ]; then
>     if [ $SHELL = "/bin/ksh" ]; then
>         ulimit -p 16384
>         ulimit -n 65536
>     else
>         ulimit -u 16384 -n 65536
>     fi
>     umask 022
> fi
> EOF
[root@discus1 ˜]#

discus1からOracleのインストールを行うので他のノード時刻をduscus1より少々進めておく。今回はdiscus2を約40秒進めてある。(NTPによる時刻調整はRACインストール後に行えばよいので。)

[root@discus1 ˜]# date
2008年 10月  1日 水曜日 21:23:47 JST
[root@discus1 ˜]#

[root@discus2 ˜]# date
2008年 10月  1日 水曜日 21:24:28 JST
[root@discus2 ˜]#

次回へつづく。

| | | コメント (0) | トラックバック (0)

2008年10月11日 (土)

Mac de Oracle - 10万円未満 de RAC (11g編)#7

今回はOracle所有者と関連ディレクトリの作成及び環境変数の設定

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



6.Oracle所有者と関連ディレクトリの作成及び環境変数の設定。

この作業はインストレーションガイドに記載されているお約束の作業なので詳細はOracle Database Installation Guide 11g Release 1 (11.1) for Linux - 2 Oracle Database Preinstallation Requirements / Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux - 2 Oracle Clusterware Preinstallation Tasks / Oracle Clusterware Installation Guide 11g Release 1 (11.1) for Linux - 3 Oracle Real Application Clusters Preinstallation Tasksなどを参照のこと。

・Oracle用ユーザとグループの作成(RACの全ノードのrootユーザで実施)

[root@discus1 ˜]# groupadd -g 601 oinstall
[root@discus1 ˜]# groupadd -g 602 dba
[root@discus1 ˜]# groupadd -g 603 oper
[root@discus1 ˜]# groupadd -g 604 asm
[root@discus1 ˜]# groupadd -g 605 asmdba
[root@discus1 ˜]#
[root@discus1 ˜]# useradd -m -u 601 -g oinstall -G dba,oper,asm -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle
[root@discus1 ˜]# id oracle
uid=601(oracle) gid=601(oinstall) 所属グループ=601(oinstall),602(dba),603(oper),604(asm) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@discus1 ˜]#
[root@discus1 ˜]# id nobody
uid=99(nobody) gid=99(nobody) 所属グループ=99(nobody) context=root:system_r:unconfined_t:SystemLow-SystemHigh
[root@discus1 ˜]#

・Oracle Base向けディレクトリの作成(RACの全ノードのrootユーザで実施)

[root@discus1 ˜]# mkdir -p /u01/app/oracle
[root@discus1 ˜]# chown -R oracle:oinstall /u01/app
[root@discus1 ˜]# chmod -R 755 /u01/app
[root@discus1 ˜]#

・Oracle Clusterware向けホームディレクトリの作成(RACの全ノードのrootユーザで実施)

[root@discus1 ˜]# mkdir -p /u01/app/crs
[root@discus1 ˜]# chown -R oracle:oinstall /u01/app/crs
[root@discus1 ˜]# chmod -R 755 /u01/app/crs
[root@discus1 ˜]#

・Oracle Cluster File System 2 (OCSF2)のマウントポイントの作成(RACの全ノードのrootユーザで実施)

[root@discus1 ˜]# mkdir -p /u02
[root@discus1 ˜]# chown -R oracle:oinstall /u02
[root@discus1 ˜]# chmod -R 755 /u02
[root@discus1 ˜]#

尚、iSCSI共有ストレージの構成は以下のようにする。

共有ストレージの構成
ファイルシステム iSCSIターゲット名 サイズ(GB) マウントポイント ASMディスクグループ名 ファイルタイプ
OCFS2
crs
2
/u02/oradata/orcl
-
Oracle Cluster Registry - (100 MB)
Voting Disk - (20MB)
ASM
asm1
21.5
ORCL:VOL1 +ORCL_DISK_GRP1 Oracleデータベースファイル
ASM
asm2
21.5
ORCL:VOL2 +ORCL_DISK_GRP1 Oracleデータベースファイル
ASM
asm3
21.5
ORCL:VOL3 +FLASH_RECOVERY_AREA Flash recovery area
ASM
asm4
21.5
ORCL:VOL4 +FLASH_RECOVERY_AREA Flash recovery area
合計
-
88
-
-
-

・Oracleユーザのログインスクリプトの作成(RACの全ノードのoracleユーザで実施)

環境変数全般についてはOracle Database Administrator's Reference 11g Release 1 (11.1) for Linux and UNIX-Based Operating Systems - 1.2 Environment Variablesを参照のこと。

以下、viを利用する前後で環境変数LANGをja_JP.UTF-8からus_US.UTF-8そしてまたja_JP.UTF-8へ変更しているが、MacOSX10.4.11のTerminalからssh接続しているのだが、LANG=ja_JP.UTF-8のままだとviで編集する際、行のポジションがずれるなど問題が生じることからviを利用する前後でLANGの設定を変更している。MacOSX10.4.11のTerminalからssh接続しないのであれば特に行う必要はない。

[oracle@discus1 ˜]$ export LANG=us_US.UTF-8
[oracle@discus1 ˜]$ vi .bash_profile
[oracle@discus1 ˜]$ cat .bach_profile
# .bash_profile

# Get the aliases and functions
if [ -f ˜/.bashrc ]; then
. ˜/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

alias ls="ls -FA"

export JAVA_HOME=/usr/local/java

# User specific environment and startup programs
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
export ORA_CRS_HOME=/u01/app/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin

# discus1の場合はorcl1 / discus2の場合はorcl2をセット
export ORACLE_SID=orcl1

export PATH=.:${JAVA_HOME}/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
[oracle@discus1 ˜]$ export LANG=ja_JP.UTF-8
[oracle@discus1 ˜]$

次回へつづく

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#6

今回はOracle RACノード側でiSCSIボリュームの構成の後半。

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1、その2
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



5.Oracle RACノードでのiSCSIボリュームの構成のつづき。

udevに関連しない操作/確認は「10万円でRAC」の場合と同じなのでそちらも参照のこと。

・fdiskでSCSIデバイスにパーティション作成

/dev/iscsi/asm1/part、/dev/iscsi/asm2/part、/dev/iscsi/asm3/part、/dev/iscsi/asm4/part、/dev/iscsi/crs/partに対して1パーティションを作成し利用可能な全シリンダを割り当てる。
尚、この操作はRACを構成するノードの1ノードでrootユーザとして実施する。
[root@discus1 ˜]# fdisk /dev/iscsi/asm1/part
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 22016 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-22016, default 1): 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-22016, default 22016): 22016

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
[root@discus1 ˜]#

/dev/iscsi/asm2/part、/dev/iscsi/asm3/part、/dev/iscsi/asm3/partにも同様の操作を繰り返す。
・・・・中略・・・・

[root@discus1 ˜]#
[root@discus1 ˜]# fdisk /dev/iscsi/crs/part
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1009, default 1): 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1009, default 1009): 1009

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
[root@discus1 ˜]#

・確認

パーティションの作成が済んだらRACの全ノードでrootユーザとしてパーティションが認識されているか確認する。以下はdiscus1から実施したもの
[root@discus1 ˜]#
[root@discus1 ˜]# partprobe
[root@discus1 ˜]#
[root@discus1 ˜]# fdisk -l

Disk /dev/hda: 20.0 GB, 20020396032 bytes
255 heads, 63 sectors/track, 2434 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 2434 19446682+ 8e Linux LVM

Disk /dev/sda: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sda1 1 22016 22544368 83 Linux

Disk /dev/sdb: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdb1 1 22016 22544368 83 Linux

Disk /dev/sdc: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdc1 1 22016 22544368 83 Linux

Disk /dev/sdd: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdd1 1 22016 22544368 83 Linux

Disk /dev/sde: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = シリンダ数 of 4154 * 512 = 2126848 bytes

デバイス Boot Start End Blocks Id System
/dev/sde1 1 1009 2095662 83 Linux
[root@discus1 ˜]#
[root@discus1 ˜]# (cd /dev/disk/by-path; ls -l *openfiler* | awk '{FS=" "; print $9 " " $10 " " $11}')
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm1 -> ../../sdb
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm1-part1 -> ../../sdb1
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm2 -> ../../sdd
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm2-part1 -> ../../sdd1
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm3 -> ../../sdc
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm3-part1 -> ../../sdc1
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm4 -> ../../sda
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm4-part1 -> ../../sda1
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.crs -> ../../sde
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.crs-part1 -> ../../sde1
[root@discus1 ˜]#


udevが作成したパーティションに対して新たなデバイス名をruleに従い作成してくれている。(^^..

[root@discus1 ˜]# ls -l /dev/iscsi/*/*
lrwxrwxrwx 1 root root 9 9月 30 17:52 /dev/iscsi/asm1/part -> ../../sdd
lrwxrwxrwx 1 root root 10 9月 30 18:01 /dev/iscsi/asm1/part1 -> ../../sdd1
lrwxrwxrwx 1 root root 9 9月 30 17:52 /dev/iscsi/asm2/part -> ../../sde
lrwxrwxrwx 1 root root 10 9月 30 18:01 /dev/iscsi/asm2/part1 -> ../../sde1
lrwxrwxrwx 1 root root 9 9月 30 17:52 /dev/iscsi/asm3/part -> ../../sdb
lrwxrwxrwx 1 root root 10 9月 30 18:01 /dev/iscsi/asm3/part1 -> ../../sdb1
lrwxrwxrwx 1 root root 9 9月 30 17:52 /dev/iscsi/asm4/part -> ../../sda
lrwxrwxrwx 1 root root 10 9月 30 18:01 /dev/iscsi/asm4/part1 -> ../../sda1
lrwxrwxrwx 1 root root 9 9月 30 17:52 /dev/iscsi/crs/part -> ../../sdc
lrwxrwxrwx 1 root root 10 9月 30 18:01 /dev/iscsi/crs/part1 -> ../../sdc1
[root@discus1 ˜]#

特に問題もなく作成できたようだ。


次回へつづく

| | | コメント (0) | トラックバック (0)

Mac de Oracle - 10万円未満 de RAC (11g編)#5

つづきです。今回はOracle RACノード側でiSCSIボリュームの構成を行う。
  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成 その1
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)

5.Oracle RACノードでのiSCSIボリュームの構成 尚、iscsi-targetがOpenfiler2.3でもiscsi-initiator側の設定手順には違いはないのでUS OTNのBuild Your Own Oracle RAC Clusters on Oracle Enterprise Linux and iSCSI - 11.COnfigure iSCSI Volumes on Oracle Rac Nodesも参照のこと。 注)iscsi-initiatorの構成はOracle RACの全ノードで行うがパーティションの作成は1ノードだけで行う。 ・iscsi-initiator-utilsのインストール
rpmでやるのもいいが今回はyumを使ってiscsi-initiator-utilsパッケージをインストールする。Oracle RACの全ノードのrootユーザで実行する。(以下のdiscus1で実施したログ。)


(20101013訂正というか追記)
以下の例ではiscsidを自動起動にしていますが、CentOS5.5ではiscsiを自動起動にすればiscsi起動・停止時にiscsidの起動・停止も行っているのでCentOS5.5ではiscsidの自動起動は不要。CentOS5.4以前はどうか未確認なので、/etc/rc.d/init.d/iscsiを確認するか、service iscsi start/stopでiSCSI deamonが起動・停止されるか確認するよいかと。
[root@discus1 ˜]# yum list iscsi-initiator-utils
Available Packages
iscsi-initiator-utils.i386               6.2.0.868-0.7.el5      base            
[root@discus1 ˜]# yum -y install iscsi-initiator-utils
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package iscsi-initiator-utils.i386 0:6.2.0.868-0.7.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
iscsi-initiator-utils   i386       6.2.0.868-0.7.el5  base              550 k

Transaction Summary
=============================================================================
Install      1 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 550 k
Downloading Packages:
(1/1): iscsi-initiator-ut 100% |=========================| 550 kB    00:00    
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing: iscsi-initiator-utils        ######################### [1/1]

Installed: iscsi-initiator-utils.i386 0:6.2.0.868-0.7.el5
Complete!
[root@discus1 ˜]# service iscsid start
Turning off network shutdown. Starting iSCSI daemon: [  OK  ]
                                                     [  OK  ]

[root@discus1 ˜]# chkconfig iscsid on
[root@discus1 ˜]# chkconfig iscsi on
 
/etc/iscsi/initiatorname.iscsiの設定。
分かり易いIQNにしておいたほうがいいですよ。RACを構成する全ノードで実施
[root@discus1 ˜]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.jp.macdeoracle:discus1
[root@discus1 ˜]#

[root@discus2 ˜]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.jp.macdeoracle:discus2
[root@discus2 ˜]#
・iscsi-targetの検出
以下のコマンドでiscsi-targetの検出しそのIQNのリストしてくれる。-p にはiscsi-targetのip addressを指定する。以下の例はdiscus1からarowana-privに存在するiscsi-targetを検出した例。尚、この操作はRACの全ノードのrootユーザで実施する。
[root@discus1 ˜]# iscsiadm -m discovery -t sendtargets -p 192.168.2.5
192.168.2.5:3260,1 iqn.2006-01.com.openfiler:tsn.asm1
192.168.2.5:3260,1 iqn.2006-01.com.openfiler:tsn.asm2
192.168.2.5:3260,1 iqn.2006-01.com.openfiler:tsn.asm3
192.168.2.5:3260,1 iqn.2006-01.com.openfiler:tsn.asm4
192.168.2.5:3260,1 iqn.2006-01.com.openfiler:tsn.crs
・iscsi-targetへの手動接続
iscsi-target側では認証設定はしていないので以下のコマンドで手動ログインする。
-Tで接続するiscsi-targetのIQNを指定する。-pはiscsi-targetが起動しているホストのhostname又はip addressを指定する。詳細はこの操作はRACの全ノードのrootユーザで実施する。
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm1 -p 192.168.2.5 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm1, portal: 192.168.2.5,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm1, portal: 192.168.2.5,3260]: successful
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm2 -p 192.168.2.5 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm2, portal: 192.168.2.5,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm2, portal: 192.168.2.5,3260]: successful
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm3 -p 192.168.2.5 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm3, portal: 192.168.2.5,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm3, portal: 192.168.2.5,3260]: successful
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm4 -p 192.168.2.5 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm4, portal: 192.168.2.5,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm4, portal: 192.168.2.5,3260]: successful
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.crs -p 192.168.2.5 -l
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.crs, portal: 192.168.2.5,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.crs, portal: 192.168.2.5,3260]: successful
[root@discus1 ˜]#
・iscsi-targetへの自動ログインの構成
iscsiadmコマンドでiscsi-targetへの自動ログインができるようにしておく。この操作はRACの全ノードのrootユーザで実施する。
[root@discus1 ˜]# 
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm1 -p 192.168.2.5 --op update -n node.startup -v automatic
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm2 -p 192.168.2.5 --op update -n node.startup -v automatic
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm3 -p 192.168.2.5 --op update -n node.startup -v automatic
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.asm4 -p 192.168.2.5 --op update -n node.startup -v automatic
[root@discus1 ˜]# iscsiadm -m node -T iqn.2006-01.com.openfiler:tsn.crs -p 192.168.2.5 --op update -n node.startup -v automatic
[root@discus1 ˜]#
・ローカルデバイス名の作成
iSCSIでは再起動する度にiscsi-targetにマッピングされるSCSIデバイス名が変ってしまうことがある。(少々面倒)。
ということでudevを利用してデバイス名を固定しておきましょう。そのほうが使い易いですから。
たとえば、ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm1が /dev/sdaにマッピングされているが再起動すると/dev/sdbにマッピングされたりすることがある。
[root@discus1 ˜]# (cd /dev/disk/by-path; ls -l *openfiler* | awk '{FS=" "; print $9 " " $10 " " $11}')
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm1 -> ../../sda
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm2 -> ../../sdb
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm3 -> ../../sdc
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm4 -> ../../sdd
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.crs -> ../../sde
[root@discus1 ˜]#

udevについては以下のドキュメントが参考になるのではないだろうか。
Udev on Fedora(英語) - http://docs.fedoraproject.org/udev/
Writing udev rules(英語) - http://www.reactivated.net/writing_udev_rules.html
日本語訳も見つけたのでメモ代わりに・・(翻訳してくださっている方々に感謝!)
Udev on Fedora(日本語訳) - http://mux03.panda64.net/docs/udev_on_fedora_ja.html
Writing udev rules(日本語訳) - http://www.gentoo.gr.jp/transdocs/udevrules/udevrules.html

udevを利用して固定的なデバイス名をiscsi-targetに割り当てる。内容は元ネタと同じです。(以下の操作はRACの全ノードのrootユーザで実施する。
[root@discus1 ˜]# cat /etc/udev/rules.d/55-openiscsi.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"
[root@discus1 ˜]#
[root@discus1 ˜]# cd /etc/udev/scripts
[root@discus1 scripts]# ls -l iscsidev.sh
-rwxr-xr-x 1 root root 334  9月 30 17:50 iscsidev.sh
[root@discus1 scripts]# cat iscsidev.sh
#!/bin/sh

# FILE: /etc/udev/scripts/iscsidev.sh

BUS=${1}
HOST=${BUS%%:*}

[ -e /sys/class/iscsi_host ] || exit 1

file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"

target_name=$(cat ${file})

# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
   exit 1
fi

echo "${target_name##*.}"
[root@discus1 scripts]#
[root@discus1 scripts]# chmod 755 iscsidev.sh
[root@discus1 scripts]# cd
[root@discus1 ˜]# service iscsi stop
Logging out of session [sid: 1, target: iqn.2006-01.com.openfiler:tsn.asm1, portal: 192.168.2.5,3260]
Logging out of session [sid: 2, target: iqn.2006-01.com.openfiler:tsn.asm2, portal: 192.168.2.5,3260]
Logging out of session [sid: 3, target: iqn.2006-01.com.openfiler:tsn.asm3, portal: 192.168.2.5,3260]
Logging out of session [sid: 4, target: iqn.2006-01.com.openfiler:tsn.asm4, portal: 192.168.2.5,3260]
Logging out of session [sid: 5, target: iqn.2006-01.com.openfiler:tsn.crs, portal: 192.168.2.5,3260]
Logout of [sid: 1, target: iqn.2006-01.com.openfiler:tsn.asm1, portal: 192.168.2.5,3260]: successful
Logout of [sid: 2, target: iqn.2006-01.com.openfiler:tsn.asm2, portal: 192.168.2.5,3260]: successful
Logout of [sid: 3, target: iqn.2006-01.com.openfiler:tsn.asm3, portal: 192.168.2.5,3260]: successful
Logout of [sid: 4, target: iqn.2006-01.com.openfiler:tsn.asm4, portal: 192.168.2.5,3260]: successful
Logout of [sid: 5, target: iqn.2006-01.com.openfiler:tsn.crs, portal: 192.168.2.5,3260]: successful
Stopping iSCSI daemon: /etc/init.d/iscsi: line 33:  8989 強制終了            /etc/init.d/iscsid stop
[root@discus1 ˜]#                                          [  OK  ]
[root@discus1 ˜]#
[root@discus1 ˜]# service iscsi start
iscsid が停止していますが PID ファイルが残っています
Turning off network shutdown. Starting iSCSI daemon:       [  OK  ]
                                                           [  OK  ]
iSCSI ターゲットを設定中: Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm4, portal: 192.168.2.5,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm1, portal: 192.168.2.5,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm3, portal: 192.168.2.5,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm2, portal: 192.168.2.5,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:tsn.crs, portal: 192.168.2.5,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm4, portal: 192.168.2.5,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm1, portal: 192.168.2.5,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm3, portal: 192.168.2.5,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.asm2, portal: 192.168.2.5,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:tsn.crs, portal: 192.168.2.5,3260]: successful
                                                           [  OK  ]
[root@discus1 ˜]#
[root@discus1 ˜]# (cd /dev/disk/by-path; ls -l *openfiler* | awk '{FS=" "; print $9 " " $10 " " $11}')
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm1 -> ../../sda
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm2 -> ../../sdb
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm3 -> ../../sdc
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.asm4 -> ../../sdd
ip-192.168.2.5:3260-iscsi-iqn.2006-01.com.openfiler:tsn.crs -> ../../sde
[root@discus1 ˜]#
[root@discus1 ˜]# ls -l /dev/iscsi/*/*
lrwxrwxrwx 1 root root  9  9月 30 17:52 /dev/iscsi/asm1/part -> ../../sda
lrwxrwxrwx 1 root root  9  9月 30 17:52 /dev/iscsi/asm2/part -> ../../sdb
lrwxrwxrwx 1 root root  9  9月 30 17:52 /dev/iscsi/asm3/part -> ../../sdc
lrwxrwxrwx 1 root root  9  9月 30 17:52 /dev/iscsi/asm4/part -> ../../sdd
lrwxrwxrwx 1 root root  9  9月 30 17:52 /dev/iscsi/crs/part -> ../../sde
[root@discus1 ˜]#
これでiscsi-targetとローカルデバイス名の固定的なマッピングができた。
iscsi-targetとローカルデバイス名の対応
iscsi-target名ローカルデバイス名
iqn.2006-01.com.openfiler:tsn.asm1 /dev/iscsi/asm1/part
iqn.2006-01.com.openfiler:tsn.asm2 /dev/iscsi/asm2/part
iqn.2006-01.com.openfiler:tsn.asm3 /dev/iscsi/asm3/part
iqn.2006-01.com.openfiler:tsn.asm4 /dev/iscsi/asm4/part
iqn.2006-01.com.openfiler:tsn.crs /dev/iscsi/crs/part
chkconigで確認しておく。念のため。(RACの全ノードで)
(20101013訂正というか追記)
以下の例ではiscsidを自動起動にしていますが、CentOS5.5ではiscsiを自動起動にすればiscsi起動・停止時にiscsidの起動・停止も行っているのでCentOS5.5ではiscsidの自動起動は不要。CentOS5.4以前はどうか未確認なので、/etc/rc.d/init.d/iscsiを確認するか、service iscsi start/stopでiSCSI deamonが起動・停止されるか確認するよいかと。
[root@discus1 ˜]# chkconfig --list iscsid
iscsid          0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@discus1 ˜]# chkconfig --list iscsi
iscsi           0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@discus1 ˜]#
上記操作後openfiler storage control centerのiscsi-target-status画面では以下のようなに接続状況を確認できるようになる。

Iscsitargetstatus 次回へつづく 子供寝かしつけようと一緒に横に寝ていると、私が先に寝ちゃうんだなこれが・・・、予定していたことは早起きしてやるようになったりして。。w

| | | コメント (0) | トラックバック (0)

2008年10月10日 (金)

え、古いOSを下取り・・むむむ。

4

Miracle Linuxさんが「OS下取りキャンペーン」を行っている。古いOSを下取りしてMiracle Linux V5(Asianux Server 3)を実質値引きしてくれるんですと。
(ジャパネットなんとかさんの液晶/プラズマテレビの下取りキャンペーンに似てたりして。w)

Asianux Server 3 ==MIRACLE LINUX V5が
定価63,000円を古いOSを42,000円で下取り。
21,000円で購入できる.


Asianux Server 3 ==MIRACLE LINUX V5 バリューパック
低下定価220,500円なら、古いOSをなんと115,500円で下取り。
実質105、000円で購入できるとか。。

12月末までか。。。
ん〜〜、ジャパネットなんとかさんもよくやるけど、12月に入ったら、さらに1万円のスペシャル下取りなんてのもやってくれるのかな・・・・

うちには塩漬けのTurboLinux Enterprise Server 8 (もう伝説となった??のUnited Linux1.0版)があるのですよ・・・・。どうしよう。。21,000円なら・・・

| | | コメント (0) | トラックバック (0)

2008年10月 9日 (木)

Mac de Oracle - 10万円未満 de RAC (11g編)#4

つづきです。今回はOpenfiler2.3によるiSCSIボリュームの構成を行う。

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



4.Openfiler2.3によるiSCSIボリュームの構成

考え方はOpenfiler2.1と同じなのだが管理画面のレイアウトが少々変更されている。

https://hostname or ip address:446/

でOpenfiler Storage Control Centerへアクセスする。

・Openfiler Strorage Control Center へのLogin

Openfiler_login

・管理者パスワードの変更

管理者のアカウントは、openfiler、インストール直後のデフォルトパスワードは。passwordとなっている。(openfiler2.1と同じ。)
ログインするとSystem Overview画面が表示される。

Systemoverview

次にAccountsタブをクリック->Accounts SectionペインAdmin passwordをクリック->Change Administrator Password画面でパスワードを変更する。
Changeadministratorpassword1

Changeadministratorpassword2

Changeadministratorpassword3


・iSCSI target serverの有効化。

ここで一旦ログアウトし新しいパスワードでログインし直してからServicesタブをクリック->Manage Services画面iSCSI target serverModification列にあるEnableをクリックしてiSCSI target serverを起動する。
Manageservice

Manageservice2

iscsi-targetの状態を確認(rootユーザで)

[root@arowana ˜]# service iscsi-target status
ietd (pid 3354) is running...
[root@arowana ˜]#

・ネットワークアクセスの構成

Systemタブをクリック->System sectionペインのNetwork Setupをクリック->Network Access ConfigurationでiSCSIをアクセスするノードを定義する。
Name列には各ノードのhostnameを、Network/Host列にはインターコネクトに利用するIPアドレスを設定する。Netmaskは255.255.255.255、TypeはShareを設定する。

Networkaccessconfiguration1

Networkaccessconfiguration2


・ボリュームグループの構成

今回も以前のように1つのボリュームグループを作成し、そのグループにcrs用の論理ボリューム1つ、ASM用の論理ボリューム4つを作成する。
Volumeタブ->Volume sectionペインでBlock Device Management画面に遷移する

Volumeblockdevicemanagement1

IDEディスクが2本ありiSCSI向けに/dev/hda に69GB、/dev/hdb に19GBの空きがある。各パーティションのサイズは、69GB、19GB、合計で88GBをcrs用の論理ボリュームに2GB、ASM用の4つの論理ボリュームに各21.5GBを割り当てる。

Partitionの作成

/dev/hda に69GB、/dev/hdb に19GBの空きがあるのでそれぞれをパーティションとして割り当てる。
以下の例では/dev/hda4及び/dev/hdb1の2つのパーティションを割り当てた。
Block Device Management画面Edit Diskの各Diskをクリックしてパーティションを追加する。ちなみに、viewをクリックすると作成済みパーティションの一覧が確認できる。

Volumeblockdevicemangementpatitionv

/dev/hda4に約69GBのパーティションを作成している様子。同様の手順で/dev/hdb1に約19GBのパーティションを作成する。Editpartition1

Editpartition2

Editpartition3

Editpartition4

Editpartition5

Editpartition6


Volume Groupの作成

Volumes sectionペインVolume Groupをクリックしてボリュームグループを作成する。
今回はrac1というボリュームグループを作成し前ステップで割り当てた/dev/hda4と/dev/hdb1の2パーティションをボリュームグループrac1へ割り当てる。(どのボリュームグループにも属さないパーティションが自動的にリストされるので必要なパーティションを選択するだけ。)
※作成されたボリュームグループの容量が88GBあることが確認できる。

Createnewvolumegroup1

Createnewvolumegroup2

Createnewvolumegroup3


論理ボリュームの割当

Volumes sectionペインAdd Volumeをクリックして前ステップで作成したボリュームグループへ論理ボリュームを割り当てる。
ボリュームグループrac1に割り当てた88GBをcrs向け論理ボリューム(2GB)及び、ASM向け論理ボリューム(21.5GB*4ボリューム)の5つの論理ボリュームへ割り振る。
各論理ボリュームのFilesystem/Volume typeはiSCSIを選択する。

割り当てた論理ボリューム名及び名称は次の通り。crs:2GB/asm1:21.5GB/asm2:21.5GB/asm3:21.5GB/asm4:21.5GB
Addvolume1

Addvolume2

Addvolume3

Addvolume4

Addvolume5


iSCSI Target Qualified Name(IQN)の設定 (2010/10/4訂正)

今回はiqn.2006-01.com.oepnfiler:arowanaというiSCSI target rualified nameにした。今回は、iqn.2006-01.com.openfiler:tsn.crs/iqn.2006-01.com.openfiler:tsn.asm1/iqn.2006-01.com.openfiler:tsn.asm2/iqn.2006-01.com.openfiler:tsn.asm3/iqn.2006-01.com.openfiler:tsn.asm4という5つのiSCSI Targetを作成した。Volumeタブ->Volumes sectionペイン->iSCSI targets->Target Configurationタブで表示されるVolumes:iSCSI Targets画面で行う。
Setiqn1_ng


Setiqn2_ng


02_volume_iscsi_target


02_volume_iscsi_targets


Network ACLの設定

前操作で設定したIQNに対してNetwork ACLを設定する。ネットワークアクセスの構成で登録したノードがリストされているのでAccess列Allowに変更する。
設定はVolumeタブ->Volumes sectionペイン->iSCSI targets->Network ACLタブで表示される画面で行う。

Networkacl1

Networkacl2


LUN Mapping (2010/10/4訂正)

論理ボリュームの割当操作で割り当てた各論理ボリューム(crs/asm1/asm2/asm3/asm4)をiSCSI Target Qualified Name(IQN)の設定で作成した各iSCSI Target(iqn.2006-01.com.openfiler:tsn.crs/iqn.2006-01.com.openfiler:tsn.asm1/iqn.2006-01.com.openfiler:tsn.asm2/iqn.2006-01.com.openfiler:tsn.asm3/iqn.2006-01.com.openfiler:tsn.asm4)のLUN Id.=0にマッピングしていく、crs/asm1/asm2/asm3/asm4の順で割り当てる。する。

設定はVolumeタブ->Volumes sectionペイン->iSCSI targets->LUN Mappingタブで表示される画面で行う。Map New LUN to target:にリストされている論理ボリュームをMapボタンをクリックしてマッピングするだけ。簡単!。

Lunmapping1_ng


Lunmapping2_ng


03_volume_lun_iscsi_target_mapping_


04_volume_lun_iscsi_target_mapping_


05_volume_lun_iscsi_target_mapping_


06_volume_lun_iscsi_target_mapping_


07_volume_lun_iscsi_target_mapping_

最後にiscsi-targetを再起動して設定完了!


[root@arowana ˜]# service iscsi-target restart
Stopping iSCSI target service: ...... [ OK ]
Starting iSCSI target service: [ OK ]
[root@arowana ˜]# service iscsi-target status
ietd (pid 7455) is running...
[root@arowana ˜]#

再度、Openfiler storage Control Centerにログインし、Status->Status sectionペインiSCSI Targetをクリックすると以下のスクリーンショットのようになる。
これでiSCSI Target側の準備は完了。

Openfiler_fin


ふ〜〜今回は長かった〜〜。:) 次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月 8日 (水)

Mac de Oracle - 10万円未満 de RAC (11g編)#3

つづきです。今回はOpenfiler2.3をiscsi-targetにするPCへインストールする。

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



3.Openfiler2.3のインストール

Openfiler2.3は以下のisoイメージをダウンロードして利用する
openfiler-2.3-x86-disc1.iso

ダウンロードしたisoイメージをCDに焼く。MacでisoイメージをCDに焼く方法は以前の記事を参考に。


・インストール
Openfiler2.3のインストールもOpenfiler2.1のインストール手順と全く同じであった。インストールするPCも以前使用したであるためインストール及びネットワーク構成は「10万円 de RAC」のエントリを参照してもらいたい。

但し、以前と比べ改善点があった。Openfiler2.1では同一PCに複数のNICがある場合、より高速なNICをeth0として認識していたようなのだが(そのような結果になっていた)、Openfier2.3ではオンボードのNICをeth0、追加したNICをeth1と認識くれたのでお陰で、以前のように一度認識されたNICの構成を手動で入れ替えるという操作は不要だった。(^^)

参考:openfiler graphical installation


おっと、忘れるところだった。Openfilerをインストールしたマシンを再起動する前にやっておきたい事が1つ。それは・・・自動アップデートを止めておくこと。。
以前、自動更新されiscsi-targetが消えてしまうという事態が発生したためだ。今回も念のためconaryによる自動アップデートを行わないようにしておく。(現時点では自動アップデートは不要なので)

お手軽な方法は、/etc/conaryrcの定義を全てコメントアウトしてしまう方法。

[root@arowana ˜]# cat /etc/conaryrc
#commeted out
#installLabelPath openfiler.rpath.org@ofns:2 conary.rpath.com@rpl:1 raa.rpath.org@rpath:raa-2
#pinTroves kernel.*
#autoResolve True
#includeConfigFile /etc/conary/config.d/*
[root@arowana ˜]#

インストールに成功していれば、ブラウザでhttps://hostname or ip address:446/へアクセスすると以下のようなログイン画面を見る事ができるだろう。

Openfiler_login
次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月 7日 (火)

Mac de Oracle - 10万円未満 de RAC (11g編)#2

以下に示した内容に沿って書いていこうと考えているが、実際に行った作業で10万円 de RACで書いた内容と同じ部分がほとんど。結局、以前の記事参照なんて部分が多くなりそうだ。。。(^^
Openfiler2.3の管理画面が2.2の頃とは違っているのOpenfiler関連部分が中心になるかもしれません。

  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1とMac De Oracle - 10万円 de RAC #5参照のこと)
  2. Linux (CentOS 5.2)のインストール
  3. Openfiler2.3のインストール
  4. Openfiler2.3によるiSCSIボリュームの構成
  5. Oracle RACノードでのiSCSIボリュームの構成
  6. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  7. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  8. hangcheck-timerカーネル・モジュールの構成
  9. Oracle RACノード間リモートアクセスの構成
  10. Oracle RACノード構成ファイルの確認
  11. Oracle Cluster File System (OCFS2)のインストール及び構成
  12. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  13. Oracle11g R1 インストール事前作業
  14. Oracle11g R1 Clusterwareのインストール
  15. Oracle11g R1 Database softwareのインストール
  16. Oracle11g R1 examplesのインストール
  17. TNS Listenerの構成
  18. Oracle Cluster databaseの作成
  19. Oracle Net Serviceの確認
  20. Oralce RAC ClusterとDatabase構成の確認
  21. Clusterの開始と停止の確認
  22. Oracle Clusterwareプロセス・モニター・デーモンの構成
  23. 簡単なTransparent Application Failover (TAF)の確認
  24. MacOSXからの接続確認(Mac De Oracleではお約束!なので)



2.CentOS5.2のインストール

2台のDELL Optiplex GX260 CPU:P4 2.4Ghz/DISK:20GB(この時点では搭載メモリは512MB)へCentOS5.2をインストールしネットワークの構成まで行う。

・CentOS5.2のダウンロード(CDドライブしかない機種なのでISOイメージをダウンロード)
 CentOS-5.2-i386-bin-1of6.iso
 CentOS-5.2-i386-bin-2of6.iso
 CentOS-5.2-i386-bin-3of6.iso
 CentOS-5.2-i386-bin-4of6.iso
 CentOS-5.2-i386-bin-5of6.iso
 CentOS-5.2-i386-bin-6of6.iso

MacでISOイメージのCDを焼く方法は以前の記事を参考に。

Burn_cds

CentOS5.2になったからといっても特にインストール方法に大きな違いはなく、以前使っていたH/Wを流用していることもありパーティションサイズやネットワーク構成も以前書いた内容と全く同じなので詳細は以前の記事及び、US OTNの記事を参照のこと。
今回、CentOS5.2を使っているがUS OTNの記事ではOracle Enterprise Linuxを利用している。どちらもRHEL5互換なのでインストールするパッケージも同じようだ。まだOracle Enterprise Linuxをインストールした事がないので詳しく書くだけの知識はないのですがね・・・。)

ネットワーク構成について少々追記しておくと。RACを構成する2ノードとも、DHCPは利用せず、固定IP。また、gateway及び、DNSの ipアドレスは、192.168.1.1 とした。(配置図参照のこと。)また、IPv6はOFFにしてある。

RACを構成するノード1 (hostname=discus1.macdeoracle.jp)
device ip address sub-netmask 備考
eth0 192.168.1.3 255.255.255.0 パブリックネットワーク用、100メガビット
eth1 192.168.2.3 255.255.255.0 プライベートネットワーク用、ギガビット
RACを構成するノード2 (hostname=discus2.macdeoracle.jp)
device ip address sub-netmask 備考
eth0 192.168.1.4 255.255.255.0 パブリックネットワーク用、100メガビット
eth1 192.168.2.4 255.255.255.0 プライベートネットワーク用、ギガビット

リリースノートにも記載されているが、SELinuxはPermissiveモードにすること。
また、FirewallはDisableにしておく。


Firewall Selinux

Openfiler2.3をインストールするPCも含めたネットワークの構成は以下。(内容は以前と同じなのですが念のため)

[root@discus1 ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost

# Public Networks - (eth0)
192.168.1.3 discus1.macdeoracle.jp discus1
192.168.1.4 discus2.macdeoracle.jp discus2
192.168.1.5 arowana.macdeoracle.jp arowana

# Private Network - (eth1)
192.168.2.3 discus1-priv.macdeoracle.jp discus1-priv
192.168.2.4 discus2-priv.macdeoracle.jp discus2-priv
192.168.2.5 arowana-priv.macdeoracle.jp arowana-priv

# Public Virtual IP(VIP) address for - (eth0)
192.168.1.100 discus1-vip.macdeoracle.jp discus1-vip
192.168.1.101 discus2-vip.macdeoracle.jp discus2-vip
[root@discus1 ˜]#

次回へつづく

| | | コメント (0) | トラックバック (0)

2008年10月 6日 (月)

Mac de Oracle - 10万円未満 de RAC (11g編)#1

まずは環境から。
前回のシリーズの環境をそのまま流用。但し、各PCのメモリ不足が明確になった時点で各512MB増設し1GBとする。)

Hardware
PC2100 512MBのメモリ2枚(合計2,960円)以外は既存のH/Wを流用したので、現在の価値は5万円にも満たない。。。。はず?!

(1) PC - RAC用 - DELL Optiplex GX260 CPU:P4 2.4Ghz RAM:512MB * 1
  (尚、DBCA実行時にメモリ不足となったので。最終的には各1GBのメモリと搭載させる。)

(2) PC - iSCSI用 - DELL PowerEdge SC600 CPU : P4 1.8Ghz RAM:769MB * 1

(3) DISPLAY - DELL 15inch 液晶ディスプレイ * 1

(4) KEYBOARD, MOUSE -- DELL製 * 2セット

(5) HUB - Corega CG-SW05TXPL(100base for public)
  Corega CG-SW05GTPLB(1000base for interconnect) 各1

注)DISPLAY、Keyboard、mouseはPC数より少ないが必要に応じて繋ぎ替えて利用する。

Software
Oracle11g 11.1.0.6.0 EE for Linux x86
CentOS5.2 - 2.6.18-92.el5
Openfiler2.3 - Final Release
OCFS2(Oracle Cluster File System 2) - 1.4.1-1
Oracle Cluster Verification Utility - Linux x86(Aug 2008)
Oracle ASMLib2.0 for RHEL5
 (oracleasm-support-2.0.4-1.el5.i386
 oracleasmlib-2.0.3-1.el5.i386
 oracleasm-2.6.18-92.el5-2.0.4-1.el5.i686.rpm)


尚、Openfiler2.2(respin 2)及びOracle Enterprise Linuxを利用しているUS OTN記事ー「Build Your Own Oracle RAC Cluster on Oracle Enterprise Linux and iSCSI」も参考にしたが、Openfiler2.2と2.3では管理画面構成が異なる点、Oracle Enterprise Linuxは正式にサポートされているプラットフォームだがCentOS5.2はサポートされていないプラットフォームである点等は異なる。


そして・・・Mac De OracleですからLinuxのインストール以外はMacOSXのxtermから全て行う。(お約束)w

今回はPowerMac G5(PPC)とMacBook Pro(Intel)を利用するが、インストールなど構成はPowerMac G5から行う。
また、MacOSX用Oracle Clientは以下のOracle Instant Clientを利用する。
Oracle Instant Client for MacOSX (PPC) 10.1.0.3.0
Oracle Instant Client for MacOSX (Intel) 10.2.0.4.0

ClientにするMacも含めた配置図は以下の通り。


Racdeoracle11g




バックナンバー
10万円未満 de RAC (Oracle11g R1編)

| | | コメント (0) | トラックバック (0)

2008年10月 5日 (日)

10万円未満 de RAC (Oracle11g R1編)

いや〜予定外だ。。
キールズバーへベルギービールを飲みに行く予定だったのだが・・・。息子が風邪をひいたようでたまにミルクを咳と一緒に嘔吐してしまったり(実際は元気バリバリで少し大人しくしてろよ!という状態なので心配はなさそうなのですがね。)で予定はキャンセル。

ということで今日は予てより準備を進めていたOracle11g R1 for Linux x86Openfiler2.3OCFS2 1.4.1-1Oracle ASMLib 2.0、それにCentOS5.2を使ったRAC構築「10万円 de RAC」改め「10万円未満 de RAC (11g編)」として復活。w。

もちろんCentOS5.2でOracle11g for Linux x86がサポートされていないのはいつも承知のうえなのでサポートされているプラットフォーム以外では手を出したくない方はスルーしてくださいね。:)
また、簡単なテストや動作確認向けのRAC環境ですのでご注意ください。(推奨されない方法で無理矢理インストールしていますので..)

以前の環境と同じH/Wを再利用(但し、メモリだけはキツいので作業の途中で増設しました。)したので現在の価値では5万円もしない環境でRACを構築したことになりますね。


OpenFiler2.3/CentOS5.2/ASMLib 2.0.4を利用している上にマシンも非力なので、OTN USのBuild Your Own Oracle RAC Cluster on Oracle Enterprise Linux and iSCSIという記事より多少チャレンジングな内容になっているかもしれません。:)

今日はここまで。次回へつづく。

| | | コメント (0) | トラックバック (0)

2008年10月 1日 (水)

さて・・

Oracle11gMySQL5.0PostgreSQL8.3、(FireBird2.1もやるか)、それにOpenfiler2.3なども利用して旧リリースで試していたことを再度試しておこうかそろそろ。
たとえば、HeterogeneousRACのネタなど。まず、RACからやりますか..。

| | | コメント (0) | トラックバック (0)

2008年9月 5日 (金)

トリガーカスケード制限 #2

さて、前回のつづき。

今回は無限ループする(実際にはしませんけど)させずにトリガーカスケード制現値を確認する。(前回の実験でも十分なんですが。。)

環境は前回と同じです。

シナリオ1

32テーブルに1トリガー/表で32のINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの32連鎖では問題ないはず!)

33テーブルを作成しておく。

SCOTT> l
1 begin
2 for seq in 1..33 loop
3 execute immediate 'create table t'||to_char(seq,'FM09')|| ' (seq# number)';
4 end loop;
5* end;
SCOTT> /

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

SCOTT> select table_name from user_tables where table_name like 'T%' order by table_name;

TABLE_NAME
------------------------------
T01
T02
T03
T04

・・・・中略・・・・

T30
T31
T32
T33

33行が選択されました。

SCOTT>

作成した各表に1つづつ32のトリガーを定義する。
ちなみに、イメージとしては親表にINSERT文が発行されるとトリガーが起動し子表へデータをINSERTする。以下、子表へのINSERT文でトリガーが起動し孫表へINSERT....の繰り返しでトリガーを32回起動させる。

SCOTT> l
1 declare
2 ddlstr constant varchar2(1000)
3 := 'create or replace trigger trg__$$seq$$__'
4 || ' after insert on t__$$seq$$__ '
5 || ' for each row '
6 || 'begin'
7 || ' insert into t__$$nextSeq$$__ values(:new.seq# + 1); '
8 || 'end;';
9 wkstr varchar2(2000);
10 begin
11 for seq in 1..32 loop
12 wkstr := replace(
13 replace(
14 ddlstr,'__$$seq$$__',to_char(seq,'FM09')
15 ),
16 '__$$nextSeq$$__',
17 to_char(seq+1,'FM09')
18 );
19 -- dbms_output.put_line(wkstr);
20 execute immediate wkstr;
21 end loop;
22* end;
SCOTT> /

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

SCOTT>
SCOTT> l
1 select text
2 from all_source
3 where name like 'TRG__'
4 and type = 'TRIGGER'
5* order by name,line
SCOTT> /

TEXT
--------------------------------------------------------------------------------
trigger trg01 after insert on t01 for each row begin insert into t02 values(
:new.seq# + 1); end;

trigger trg02 after insert on t02 for each row begin insert into t03 values(
:new.seq# + 1); end;

trigger trg03 after insert on t03 for each row begin insert into t04 values(
:new.seq# + 1); end;

・・・・中略・・・・

trigger trg30 after insert on t30 for each row begin insert into t31 values(
:new.seq# + 1); end;

trigger trg31 after insert on t31 for each row begin insert into t32 values(
:new.seq# + 1); end;

trigger trg32 after insert on t32 for each row begin insert into t33 values(
:new.seq# + 1); end;


32行が選択されました。

SCOTT>

実行!

SCOTT> insert into t01 values(1);

1行が作成されました。

SCOTT>

正常にINSERTできたようですね。

SCOTT> set serveroutput on size 10000
SCOTT> l
1 declare
2 seq# number;
3 begin
4 for i in 1..33 loop
5 execute immediate 'select * from t'||to_char(i,'fm09') into seq#;
6 dbms_output.put_line('T'||to_char(i,'fm09')||':'||to_char(seq#));
7 end loop;
8* end;
SCOTT> /
T01:1
T02:2
T03:3

・・・・中略・・・・

T31:31
T32:32
T33:33

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

SCOTT>

シナリオ2

33テーブルに1トリガー/表で33のINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの33連鎖でも問題ないはず!)


さきほどのデータはじゃまなのでロールバックしておく。

SCOTT> rollback;

ロールバックが完了しました。


テーブルとトリガーを各1つ追加作成し、トリガーを33連鎖させる。

SCOTT> create table t34 as select * from t33;

表が作成されました。

SCOTT> l
1* create or replace trigger trg33 after insert on t33 for each row begin insert into t34 values(:new.seq# + 1); end;
SCOTT>

SCOTT> l
1 select text
2 from all_source
3 where name like 'TRG__'
4 and type = 'TRIGGER'
5* order by name,line
SCOTT> /

TEXT
--------------------------------------------------------------------------------
trigger trg01 after insert on t01 for each row begin insert into t02 values(
:new.seq# + 1); end;

trigger trg02 after insert on t02 for each row begin insert into t03 values(
:new.seq# + 1); end;


・・・・中略・・・・


trigger trg32 after insert on t32 for each row begin insert into t33 values(
:new.seq# + 1); end;

trigger trg33 after insert on t33 for each row begin insert into t34 values(:new
.seq# + 1); end;


33行が選択されました。

SCOTT>


どうなりますか!。実行してみる。

SCOTT> insert into t01 values(1);

1行が作成されました。

SCOTT>

トリガーの33連鎖は無事終了。

SCOTT> l
1 declare
2 seq# number;
3 begin
4 for i in 1..34 loop
5 execute immediate 'select * from t'||to_char(i,'fm09') into seq#;
6 dbms_output.put_line('T'||to_char(i,'fm09')||':'||to_char(seq#));
7 end loop;
8* end;
SCOTT> /
T01:1
T02:2
T03:3

・・・・中略・・・・

T31:31
T32:32
T33:33
T34:34

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

SCOTT>


シナリオ3

50テーブルに1トリガー/表でINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの50連鎖ではエラーがになるはず!)

SCOTT> rollback;

ロールバックが完了しました。

SCOTT> l
1 begin
2 for i in 35..52 loop
3 execute immediate 'create table t'||to_char(i,'fm09')|| ' as select * from t34';
4 end loop;
5* end;
SCOTT> /

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

SCOTT>
SCOTT> l
1 declare
2 ddlstr constant varchar2(1000)
3 := 'create or replace trigger trg__$$seq$$__'
4 || ' after insert on t__$$seq$$__ '
5 || ' for each row '
6 || 'begin'
7 || ' insert into t__$$nextSeq$$__ values(:new.seq# + 1); '
8 || 'end;';
9 wkstr varchar2(2000);
10 begin
11 for seq in 34..50 loop
12 wkstr := replace(
13 replace(
14 ddlstr,'__$$seq$$__',to_char(seq,'FM09')
15 ),
16 '__$$nextSeq$$__',
17 to_char(seq+1,'FM09')
18 );
19 -- dbms_output.put_line(wkstr);
20 execute immediate wkstr;
21 end loop;
22* end;
SCOTT> /

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

SCOTT>
SCOTT> l
1 select text
2 from all_source
3 where name like 'TRG__'
4 and type = 'TRIGGER'
5* order by name,line
SCOTT> /

TEXT
--------------------------------------------------------------------------------
trigger trg01 after insert on t01 for each row begin insert into t02 values(
:new.seq# + 1); end;

trigger trg02 after insert on t02 for each row begin insert into t03 values(
:new.seq# + 1); end;

trigger trg03 after insert on t03 for each row begin insert into t04 values(
:new.seq# + 1); end;

・・・・中略・・・・

trigger trg48 after insert on t48 for each row begin insert into t49 values(
:new.seq# + 1); end;

trigger trg49 after insert on t49 for each row begin insert into t50 values(
:new.seq# + 1); end;

trigger trg50 after insert on t50 for each row begin insert into t51 values(
:new.seq# + 1); end;


50行が選択されました。

SCOTT>


では実行!

SCOTT> insert into t01 values(1);
insert into t01 values(1)
*
行1でエラーが発生しました。:
ORA-00036: 再帰的SQLレベルの最大値(50)を超えました ORA-06512:
"SCOTT.TRG50", 行1
ORA-04088: トリガー'SCOTT.TRG50'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG49", 行1
ORA-04088: トリガー'SCOTT.TRG49'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG48", 行1
ORA-04088: トリガー'SCOTT.TRG48'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG47", 行1
ORA-04088: トリガー'SCOTT.TRG47'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG46", 行1
ORA-04088: トリガー'SCOTT.TRG46'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG45", 行1
ORA-04088: トリガー'SCOTT.TRG45'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG44", 行1
ORA-04088: トリガー'SCOTT.TRG44'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG43", 行1
ORA-04088: トリガー'SCOTT.TRG43'の実行中にエラーが発生しました ORA-06512:
"SCOTT.TRG42", 行1
ORA-04088: トリガ


SCOTT>

おおお〜〜〜。 :) でましたね。トリガーを50連鎖させたところで制限を超えたようだ。

最後に、トリガーを49連鎖させることが可能なことを確認しておく。

シナリオ4

49テーブルに1トリガー/表で49のINSERTトリガーを定義し正しく動作することを確認する。(カスケード制現値が49のようなのでトリガーの49連鎖は正常に実行できるはず!)

SCOTT> alter trigger trg50 disable;

トリガーが変更されました。

SCOTT>
SCOTT> l
1 select count(src.text)
2 from
3 all_source src join user_triggers trg
4 on src.name = trg.trigger_name
5 where
6 src.name like 'TRG__'
7 and src.type = 'TRIGGER'
8 and trg.status = 'ENABLED'
9 order by
10 src.name,
11* src.line
SCOTT> /

COUNT(SRC.TEXT)
---------------
49

SCOTT>
SCOTT> rollback;

ロールバックが完了しました。

SCOTT> insert into t01 values(1);

1行が作成されました。

SCOTT>

ということで、Linux(32bit)環境ではトリガーカスケード最大値は49ということになる。

Windowsや32bit/64bitで違いはあるのだろうか??? 違いが無かったらマニュアルが間違っているということか?!・・・・・・。別途調査予定。

| | | コメント (0) | トラックバック (0)

2008年9月 3日 (水)

トリガーカスケード制限 #1

やっと時間が取れるようになったのでしばらくは純粋にデータベースと戯れることができそうだ。w

ということで、キムラデービーブログ:徹底比較!! PostgreSQL vs MySQLパート2 with 勝手に vs Firebird (13)に面白そうなこと(以下の引用部分)が書いてあったので実際に試してみる事にした。

*2:  カスケードは、例えばOracleは32個に制限されており、それ以下に設定することも可能です。

 これは例えば、あるトリガーから発せられたSQLによりトリガーが発せらるような場合で、ヘタすると、それが無限ループになってしまう。それを防ぐような形で制限されている(のだと思います。それか、もしかしたら実装上の制限かもしれません)

 勇気ある人は、無限にお互いを呼び合うようなトリガーを書いて、ご自分のプラットフォームで実行させてみてください。そして結果を木村まで知らせてください(^_^;)


環境はOracle11g EE for Linux x86/CentOS5という組み合わせです。詳しい環境は以前の記事をご参考に。

Oracle de XMLDB #6 - Linux x86版再び。
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1

では実験開始。

今回はある表に定義したINSERTトリガーをカスケードさせ無限に起動する状況を作ってみた。

1)まず、トリガーを定義する以下のような単純な表を作成。

SCOTT> desc master
名前 NULL? 型
----------------------------------------- -------- ----------------------------
SEQ# NUMBER


2)定義するトリガーはmaster表へのINSERT文で起動しシーケンスから連番を取得し
  トリガーが定義されているmaster表へ再度INSERT文を発行する。(無限ループするカスケードを実装した)

SCOTT> select text      
2 from all_source
3 where name = 'INS_CASCADE_TEST'
4 order by line;

TEXT
--------------------------------------------------------------------------------
TRIGGER INS_CASCADE_TEST
after insert on master
begin
insert into master values(master_seq.nextval);
end;


上記トリガーを起動すれば、Oracleのマニュアル:論理データベースの制限のトリガー・カスケード制限に記載されている最大値に達すればエラーになるはず。無限ループするカスケードを実装したとしても実行途中でエラーとなり停止するはずだ。
マニュアルにはプラットーフォーム依存だが、通常は32と記載されている。私の記憶違いでなければ、この値はOracle7の頃から変っていない。


3)では実行!

・実行前のシーケンス値の確認!。

SCOTT> select last_number
2 from user_sequences
3 where sequence_name = 'MASTER_SEQ';

LAST_NUMBER
-----------
1


・実行!

SCOTT> insert into master values(-100);
insert into master values(-100)
*
行1でエラーが発生しました。:
ORA-00036: 再帰的SQLレベルの最大値(50)を超えました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:
"SCOTT.INS_CASCADE_TEST", 行2
ORA-04088: トリガー'SCOTT.INS_CASCADE_TEST'の実行中にエラーが発生しました ORA-06512:


予想通りエラーにはなったもののプラットフォーム依存と記載されている通り?、Linux(32bit)環境ではカスケードできる最大値は32ではなく、49というコンピュータの世界では半端な値になっているようだ。LinuxではなくWindowsでは32なのだろうか????

SCOTT> 
SCOTT> select last_number
2 from user_sequences
3 where sequence_name = 'MASTER_SEQ';

LAST_NUMBER
-----------
51

SCOTT>

次回は、linux(32bit)環境でトリガーカスケード制限が49であるということを無限ループするトリガーを使わずに確認してみることにする。

カスケードの制限値を超えた場合にどうなるのかなんて確認したことなど一度も無かったので面白い発見だ! :)

| | | コメント (0) | トラックバック (1)

2008年5月 7日 (水)

PL/SQL で Python Challenge Level 18 う〜〜〜ん。

やることは分かったのだがPL/SQLでは重要な部分(pythonなら一発だけど)を手作りしないとならない。。。とりあえず適当に作ってはみたもののまだ思うような結果にはなっていない。。だが、そこさえクリアできればlevel18はPL/SQLだけで解けるはず。。。。。ということで暇を見て実装中。といってもその暇がなかなか取れなくなりそうな予感も。。。まあ、今回のネタはおもしろそうなので、少しづつでも進めて行きますよ。。。w

| | | コメント (0) | トラックバック (0)

2008年5月 3日 (土)

少々前のネタで m(_ _)m

Sun Business Next 2008のコミュニティートラックのOpen Solaris関連セッション

Open SolarisってSolarisの良さとUbuntuの良さを合わせ持とうとしているのか〜〜。(自分用の備忘録)

Cimg1037

Cimg1038

Cimg1040

OpenSolars/Solaris Hot Topics セミナー #2なんてのもあるなぁ。行けるようなら参加してみるか。。

| | | コメント (0) | トラックバック (0)

2008年4月26日 (土)

PL/SQL で Python Challenge Level 18 わかちゃったかも・・

Level18は以外と簡単かも〜〜、Pythonならば。と。
当然だよね。Python ChallengeなんだからPythonを使って解くことを前提に作られてるのは。。。。

しかし、今回はもしかするとPL/SQLだけで全部解けちゃうかもしれない・・・久々だ〜。一部はかなり苦労してガリガリ作り込まなければならないと思われるのだが・・・その方法で上手く解けるという自信は70%。チャレンジしてみますよ〜〜。連休中にロジックを考えとく。。。

次回へつづく。;)

| | | コメント (0) | トラックバック (0)

2008年4月22日 (火)

PL/SQL で Python Challenge Level 17 - 完

さて、少々間があいてしまったが、Python Challenge Level17の最終回。

前回、つまらないところでモタモタしてしまったが、Oracle Application Express 3.0.xを使わず、単純に mod_plsqlを使えばいいじゃんと言うことで。。。。

Level17は、以前にも書いたがWeb Applicationを書いたことのある人なら簡単に解けると思います。
今回は一部を除き、約90%がPL/SQL、残りをJava stored procedureで処理した。;)

ということで答えを導きだしたスクリーンショット。(答えはぼかしてますよ!)

Python_level17

次回、Python Challenge Level 18はこれまた気が向いたときにても。。。Enjoy Python Challenge!

| | | コメント (0) | トラックバック (0)

2008年4月16日 (水)

Oracle11g R1 11.1.0.6.0 for Linux x86 and Oracle Application Express

Python Challenge Level17の記事を書く前に、やっておきたい事があったのでそちらを先に。

何をやりたかったのか? それは、APEX(Oracle Application Express)環境を作っておく事。

Python ChallengeではWeb Applicationとして処理して欲しそうな問題も多数存在する。Level17はそうしたほうが自然な感じをだと思ったので。。。(実際にはそこまでしなくても解けたのですが)
Oracle11gからApexがバンドルされたのと同時に、組み込みPL/SQL gateway機能も追加されたのでその辺りも含めて確認しておきたかった。

この組込PL/SQL Gatewayってなによ? って方もいると思うのだが、簡単に言うと、”Oracle11gのデータベース内部にHTTP Server+mod_plsqが内蔵されちゃっている”と思えばイメージしやすいんじゃないかと。

概要はこのあたりのマニュアルを読めば掴めると思います。はい。

マニュアル(英語)Understanding Oracle Application Express Architecture

データベースサーバがHTTPサーバを内蔵なんて言うといや〜な顔する人もいるだろうなぁ。なんて思ったりもします。(笑)
実際の所組込みPL/SQLゲートウェイは、外部に公開するというより開発目的など内部の閉じられた環境で利用されることがほとんどじゃないかなぁと個人的には思います。

Oracle11gをインストールした場合、OUIによるインストールでは明示的に除外しなければOracle Application Expressも同時にインストールされる。尚、埋込みPL/SQLゲートウェイを利用するためには、Oracle XML DBも必要。詳細はマニュアルに記載されているので、よ〜〜〜く読めば簡単に構成できます。
4.5 Postinstallation Tasks for Oracle Application Express

ちなみに、Oracle11g R1 1011.1.0.6.0に含まれるOracle Application Expressは、3.0.1.00.08とのこと、3.1が既にリリースされているのでアップグレードするのもいいが、今回は面倒なのでそのまま使うことにした。

では”素直に”マニュアルに従い作業を進める。。。(笑)

sysdbaで接続後、 $ORACLE_HOME/apex/apexconfを実行しadminユーザのパスワードとapexのport番号を設定してから、anonymousユーザをアンロックします。

G5Server:˜ discus$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Tue Apr 15 22:09:38 2008 from 192.168.1.19
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 火 4月 15 22:46:50 2008

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

> conn / as sysdba
接続されました。
SYS> spo apexconfig.log
SYS> @?/apex/apxconf

PORT
----------
8080

Enter values below for the XDB HTTP listener port and the password for the Application Express ADMIN user.
Default values are in brackets [ ].
Press Enter to accept the default value.


Enter a password for the ADMIN user [] apex
Enter a port for the XDB HTTP listener [ 8080]
...changing HTTP Port

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


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


セッションが変更されました。

...changing password for ADMIN

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


コミットが完了しました。

SYS> alter user anonymous account unlock;

ユーザーが変更されました。

SYS>

さて、お継ぎはマニュアルに記載されている通り(コピペでOKです。)外部のネットワークにアクセスする為にACLを変更しました。
(この例ではマニュアルと同様、どこでもアクセスできるようにしておきます。今回の場合は、python challengeのサイトだけアクセス許可しておけば問題ないのですが、いろいろと試したいことがあるので今回マニュアルの例をそのまま利用させてもらいました。)

SYS> l
1 DECLARE
2 ACL_PATH VARCHAR2(4000);
3 ACL_ID RAW(16);
4 BEGIN
5 -- Look for the ACL currently assigned to '*' and give FLOWS_030000
6 -- the "connect" privilege if FLOWS_030000 does not have the privilege yet.
7 SELECT ACL INTO ACL_PATH FROM DBA_NETWORK_ACLS
8 WHERE HOST = '*' AND LOWER_PORT IS NULL AND UPPER_PORT IS NULL;
9
10 -- Before checking the privilege, make sure that the ACL is valid
11 -- (for example, does not contain stale references to dropped users).
12 -- If it does, the following exception will be raised:
13 --
14 -- ORA-44416: Invalid ACL: Unresolved principal 'FLOWS_030000'
15 -- ORA-06512: at "XDB.DBMS_XDBZ", line ...
16 --
17 SELECT SYS_OP_R2O(extractValue(P.RES, '/Resource/XMLRef')) INTO ACL_ID
18 FROM XDB.XDB$ACL A, PATH_VIEW P
19 WHERE extractValue(P.RES, '/Resource/XMLRef') = REF(A) AND
20 EQUALS_PATH(P.RES, ACL_PATH) = 1;
21
22 DBMS_XDBZ.ValidateACL(ACL_ID);
23
24 IF DBMS_NETWORK_ACL_ADMIN.CHECK_PRIVILEGE(ACL_PATH, 'FLOWS_030000', 'connect')
25 IS NULL THEN
26 DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(ACL_PATH,
27 'FLOWS_030000', TRUE, 'connect');
28 END IF;
29
30 EXCEPTION
31 -- When no ACL has been assigned to '*'.
32 WHEN NO_DATA_FOUND THEN
33 DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('power_users.xml',
34 'ACL that lets power users to connect to everywhere',
35 'FLOWS_030000', TRUE, 'connect');
36 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('power_users.xml','*');
37* END;
SYS> /

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

SYS>
SYS> commit;

コミットが完了しました。

SYS>


apexの管理画面にログインするには...以下のような形式のURLでブラウザからアクセスする。もちろん、ホストはOracle11g Databaseインスタンスがあるサーバですよ。

http://host:port/apex/apex_admin

Apex_admin_1

Apex_admin_2

Apex_admin_3

Apex_admin_4

ここまでで、application expressは利用可能な状態なのだが1つ問題がある、それは英語版のままだということ。(これは以前のOracle Application Expressでも同じですね。)
ということで、日本語リソースをロードします。尚、環境変数NLS_LANGは、AL32UTF8である必要があります。(これも以前と同じなので利用したことがあれば間違うことは無いと思いますが、注意しなければならない点ですよ。うっかりミスというのもありますから。)

[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 火 4月 15 23:06:03 2008

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

> conn / as sysdba
接続されました。
SYS> !echo $NLS_LANG
japanese_japan.AL32UTF8

SYS> alter session set current_schema=FLOWS_030000;

セッションが変更されました。

SYS> @?/apex/builder/ja/load_ja
. ____ ____ ____ ____
. / \ | \ /\ / | /
.| || / / \ | | |
.| ||--- ---- | | |--
.| || \ / \ | | |
. \____/ | \/ \ \____ |____ \____
.
. Application Express Hosted Development Service Installation.
.........................................................

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

Install Application Express applications

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

APPLICATION 4420 - APEX - System Messages
Set Credentials...
Check Compatibility...
API Last Extended:20070525
Your Current Version:20070525
This import is compatible with version: 20070108
COMPATIBLE (You should be able to run this import without issues.)
Set Application ID...
...authorization schemes
...navigation bar entries
...application processes
...application items
...application level computations
...Application Tabs
...Application Parent Tabs
...Shared Lists of values
...Application Trees
...page groups
...PAGE 1.442: メッセージ
...lists
...breadcrumbs

中略

...PAGE 91.4009: 検証の作成 - 検証タイプ
...PAGE 92.4009: 標準タブの作成の確認
...PAGE 93.4009: 既存のタブ・セットの選択
...PAGE 94.4009: タブ情報の指定
...PAGE 95.4009: 親タブ・セット
...PAGE 96.4009: 新しいタブ名
...PAGE 97.4009: 表形式フォーム
...PAGE 98.4009: 検証の作成 - SQL検証
...PAGE 99.4009: SQLレポートの作成
...PAGE 100.4009: カレンダ・ページの作成
...PAGE 101.4009: ボタンのコピー
...PAGE 102.4009: リージョンの削除の確認
...PAGE 103.4009: ビルド・ステータス
...PAGE 104.4009: ビルド・チャート問合せ
...PAGE 105.4009: スクリプト・ファイルのエクスポート
...PAGE 106.4009: ビルド・チャート問合せ
...PAGE 107.4009: 作成ウィザード
...PAGE 108.4009: 作成ウィザード
...PAGE 109.4009: 作成ウィザード
...PAGE 110.4009: 作成ウィザード
...PAGE 111.4009: 作成ウィザード
...PAGE 112.4009: ツリー・ウィザード
...PAGE 113.4009: ツリー・ウィザード
...PAGE 114.4009: ツリー・ウィザード

中略

......scheme 108165525079033088.4709
...done
Adjust instance settings

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


最後に、job_queue_process初期化パラメータが1以上になっているか確認します。
私も初めて気付いたがデフォルトで1000になっているんですね。びっくり。以前は1桁か2桁だったようなきがするが。

SYS> 
SYS> show parameter job_queue_processes

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 1000
SYS>

尚、今回はSSLの設定は行わないので早速Apexの管理ユーザログインし直し開発用作業領域と開発ユーザを作っておく。

Apex_ja_1

Apex_ja_2

Apex_ja_3

Apex_ja_4

Apex_ja_7

Apex_ja_8

Apex_ja_10

Apex_ja_9

さて、準備もできたので次へ行くか!

| | | コメント (0) | トラックバック (0)

2008年4月13日 (日)

PL/SQL で Python Challenge Level 17 #2 - 解けた!

さて、前回、解き方は見えたような気がすると書いたがいろいろな罠?に見事に引っかかったが解けました。はい。
今、Level18の問題が見えたのだが、また画像問題なのかな?

Level17は、Web Applicationを作った経験のある方ならLevel17の質問の画像自体がヒント。
なんですが、2重、3重の仕掛けがあるのでイライラするよ。ですが、基本的にはいままでの問題を解いてきたテクニックやコードを再利用すれば十分なので特に新しいことが必要でもない。。。

ということで、次回のPL/SQL で Python ChallengeはLevel17のヒントにならないヒント。でLevel17を締めくくろう。


以下のスクリーンショットは、最後の仕掛けを通り抜ける為のヒントを取り出す事に成功した場面。Level18のURLを導きだした時のスクリーンショットではありません。:)
Level17_no2

| | | コメント (0) | トラックバック (0)

2008年3月31日 (月)

タイムゾーン de 自動調整のおまけ

今回はタイムゾーンネタというより、前回前々回のおまけネタ。

前回前々回ともほとんど解説なしにサンプルSQLを載せていたので、今回は表を利用せずにカレンダーを生成している部分の説明を少々。
 
前々回の例で利用した階層問合せによるカレンダー生成、前回の例で利用した集計関数cubeによるカレンダー生成いずれも連番を生成するとという点では同じなのですが、階層問合せとcube関数の性格の違いから使い方も少々異なる。いずれにしても知っていると便利なことも多々ありますよ。

では、まず最初は階層問合せから。

カレンダーを生成する前に階層と合わせで一連番号を生成するには、level疑似列を用いて必要なlevelまで階層を作り出せばOK。
(但し、Oracle9iまではこの方法は想定通りに動作しないのでご注意を。10g以降であれば想定通りの結果を返してくれます。)

以下の例では階層問合せを利用し1〜27までの一連番号を生成したものです。

SCOTT> select level
2 from dual
3 connect by level <= 27;

LEVEL
----------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

27行が選択されました。

SCOTT>

上記の一連番号を利用し、実行同日を含む27日前までの日付を求めてみます。

SCOTT> l
1 select trunc(sysdate) - (level-1)
2 from dual
3 connect by level <= 27
4* order by 1
SCOTT> /

TRUNC(SY
--------
08-03-05
08-03-06
08-03-07
08-03-08
08-03-09
08-03-10
08-03-11
08-03-12
08-03-13
08-03-14
08-03-15
08-03-16
08-03-17
08-03-18
08-03-19
08-03-20
08-03-21
08-03-22
08-03-23
08-03-24
08-03-25
08-03-26
08-03-27
08-03-28
08-03-29
08-03-30
08-03-31

27行が選択されました。

SCOTT>

できましたよね。簡単です。


次に集計関数cubeを利用する方法です。
cubeに関するマニュアルも事前に読んでおくといいですよ。

一連版を生成するために、cube関数の以下のような性質を利用しています。

SCOTT> select 1
2 from dual
3 group by cube(1);

1
----------
1
1

SCOTT> select 1
2 from dual
3 group by cube(1,1);

1
----------
1
1
1
1

SCOTT> select 1
2 from dual
3 group by cube(1,1,1);

1
----------
1
1
1
1
1
1
1
1

8行が選択されました。

SCOTT>

階層問合せのような柔軟性はないのですが、32件のデータを生成するには cube(1,1,1,1,1)とすればいいわけです。

SCOTT> select 1
2 from dual
3 group by cube(1,1,1,1,1);

1
----------
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

32行が選択されました。

SCOTT>

ただ一連番号にはなっていません。単に32行の結果を得たたけです。そこでronum疑似列を利用して1〜27までの一連番号を求めます。

SCOTT> select rownum
2 from (select 1 from dual group by cube(1,1,1,1,1))
3 where rownum <= 27;

ROWNUM
----------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

27行が選択されました。

SCOTT>


ここまでできればあとは簡単。階層問合せと同じように日付を生成してみましょう。

SCOTT> select trunc(sysdate) - (rownum-1)
2 from (select 1 from dual group by cube(1,1,1,1,1))
3 where rownum <= 27
4 order by 1;

TRUNC(SY
--------
08-03-05
08-03-06
08-03-07
08-03-08
08-03-09
08-03-10
08-03-11
08-03-12
08-03-13
08-03-14
08-03-15
08-03-16
08-03-17
08-03-18
08-03-19
08-03-20
08-03-21
08-03-22
08-03-23
08-03-24
08-03-25
08-03-26
08-03-27
08-03-28
08-03-29
08-03-30
08-03-31

27行が選択されました。

SCOTT>

cube関数はOracle9iから利用できる関数なのでOracle9iでこんなことを行いたい場合には前述した階層問い合せの代役にもなりますね。


Enjoy SQL!

| | | コメント (0) | トラックバック (0)

2008年3月29日 (土)

タイムゾーン de 自動調整 #2

タイムゾーン de 自動調整の続きです。 前回階層問合せを利用して実現した方法を集計関数cubeで置き換えた例。

クライアントのタイムゾーン(SESSIONTIMEZONE)を確認。(タイムゾーンはJST)。

SCOTT> select sessiontimezone from dual;

SESSIONTIMEZONE
-----------------------------------------------------------------
+09:00

SCOTT> l
1 select
2 cal."date",
3 nvl(logs."activity",0) as "activity"
4 from
5 (
6 select
7 "date",
8 count(ts_ltz) as "activity"
9 from
10 (
11 select
12 to_char(ts_ltz, 'YYYY/MM/DD') as "date",
13 ts_ltz
14 from
15 ts_test
16 )
17 group by
18 "date"
19 ) logs
20 right outer join
21 (
22 select
23 to_char(
24 trunc(sysdate) - (rownum - 1),
25 'YYYY/MM/DD'
26 ) as "date"
27 from
28 (
29 select 1
30 from
31 dual
32 group by
33 cube (1,1,1,1,1)
34 )
35 where
36 rownum <= 27
37 ) cal
38 on logs."date" = cal."date"
39 order by
40* cal."date"
SCOTT> /

date activity
---------- ----------
2008/03/02 2
2008/03/03 2
2008/03/04 2
2008/03/05 2
2008/03/06 2
2008/03/07 2
2008/03/08 2
2008/03/09 2
2008/03/10 2
2008/03/11 2
2008/03/12 2
2008/03/13 2
2008/03/14 2
2008/03/15 2
2008/03/16 2
2008/03/17 2
2008/03/18 2
2008/03/19 2
2008/03/20 2
2008/03/21 2
2008/03/22 2
2008/03/23 2
2008/03/24 0
2008/03/25 2
2008/03/26 2
2008/03/27 3
2008/03/28 0

27行が選択されました。

SCOTT>
<

クライアントのタイムゾーンをUTCへ変更

SCOTT> alter session set time_zone='UTC';

セッションが変更されました。

SCOTT>
SCOTT> l
1 select
2 cal."date",
3 nvl(logs."activity",0) as "activity"
4 from
5 (
6 select
7 "date",
8 count(ts_ltz) as "activity"
9 from
10 (
11 select
12 to_char(ts_ltz, 'YYYY/MM/DD') as "date",
13 ts_ltz
14 from
15 ts_test
16 )
17 group by
18 "date"
19 ) logs
20 right outer join
21 (
22 select
23 to_char(
24 trunc(sysdate) - (rownum - 1),
25 'YYYY/MM/DD'
26 ) as "date"
27 from
28 (
29 select 1
30 from
31 dual
32 group by
33 cube (1,1,1,1,1)
34 )
35 where
36 rownum <= 27
37 ) cal
38 on logs."date" = cal."date"
39 order by
40* cal."date"
SCOTT> /

date activity
---------- ----------
2008/03/02 2
2008/03/03 2
2008/03/04 2
2008/03/05 2
2008/03/06 2
2008/03/07 2
2008/03/08 2
2008/03/09 2
2008/03/10 2
2008/03/11 2
2008/03/12 2
2008/03/13 2
2008/03/14 2
2008/03/15 2
2008/03/16 2
2008/03/17 2
2008/03/18 2
2008/03/19 2
2008/03/20 2
2008/03/21 2
2008/03/22 2
2008/03/23 1
2008/03/24 1
2008/03/25 2
2008/03/26 2
2008/03/27 2
2008/03/28 0

27行が選択されました。

SCOTT>

階層問合せほどの柔軟性はないのですがcubeでも同様のことができるんですよ。

| | | コメント (0) | トラックバック (0)

2008年3月28日 (金)

タイムゾーン de 自動調整

Python Challengeは気が向いた時にやるとして、今日は、タイムゾーンで日時の自動調整をして楽をしようというお話。

Oracleには、timestamp with local time zone型(マニュアルの説明はわかりにくいかも)という便利な日時データ型があります。この日時データ型で日時を保存すると、クライアント側ではクライアントのタイムゾーンに調整された日時を参照することができるようになります。
timestamp with local time zone型はデータベースの作成時に指定されたタイムゾーンで日時データを保持(クライアント側とタイムゾーンが異なる場合はデータベース側のタイムゾーンへ自動調整されます)します。

言葉で言っても分かり憎いでしょうから、早速、例をお見せしましょう。 といっても少々変った例なので(Oracleの)SQL初心者向きではないですが。。

●●●この例の環境及び条件の説明●●●

データベース(この例の場合はOracle10g R1)のタイムゾーン(DBTIMEZONE)は、UTC。
クライアント(この例の場合はSQL*Plus)のタイムゾーン(SESSIONTIMEZONE)は、+9(つまりJST)とUTCをalter sessionにて変更する。
ts_test表には、TIMESTAMP WITH LOCAL TIME ZONE型(今回の場合はUTCで)で2/28から3/27までのあるアクティビティのログ(日時データのみ)が記録されている。(尚、アクティビティの無い日のログは記録されていない。)

というデータ、環境で、実行当日を含む直近27日分のアクティビティ数を日毎に集計して日付順に取得する。アクティビティが無い日はアクティビティ数を0として日付を表示する。
(但し、ts_test以外の表は使わずに実現する。必須じゃないけど、できればSQL1文で!)

では、早速。

 
データベースタイムゾーン(DBTIMEZONE)は、UTCであることを確認。

(ちなみに、データベースに既にTIMESTAMP WITH LOCAL TIME ZONE型を持つ表が存在しなければ、alter database文で変更可能。)
Last login: Fri Mar 28 05:01:29 on console
Welcome to Darwin!
G5Server:˜ discus$ su - oracle

Password:
G5Server:˜ oracle$
G5Server:˜ oracle$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 金 3月 28 07:52:49 2008

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

>
> conn scott/tiger@catfish
接続されました。
SCOTT> select dbtimezone from dual;

DBT
---
UTC

次にクライアントのタイムゾーン(SESSIONTIMEZONE)を確認。(JSTになっている)。

SCOTT> select sessiontimezone from dual;

SESSIONTIMEZONE
-----------------------------------------------------------------
+09:00


ts_test表の登録データを確認する。(クライアントのタイムゾーン(JST)へ自動調整されて表示される。)

TIMESTAMP WITH LOCAL TIME ZONE型として登録されている日時データはクライアントのタイムゾーンに自動調整されて表示される。
簡単に確認する方法としてCURRENT_TIMESTAMP疑似列を問い合わせて現状を確認することがもできる。

SCOTT> select current_timestamp from dual;

CURRENT_TIMESTAMP
-----------------------------------------------------------------
08-03-28 08:07:33.082296 +09:00

SCOTT> desc ts_test
名前 NULL? 型
-------------------------- -------- ----------------------------
TS_LTZ TIMESTAMP(6) WITH LOCAL TIME
ZONE


SCOTT> select * from ts_test order by ts_ltz;

TS_LTZ
-----------------------------------------------------------------
08-02-29 00:00:00.000000
08-02-29 23:59:59.999999
08-03-01 00:00:00.000000
08-03-01 23:59:59.999999
08-03-02 00:00:00.000000
08-03-02 23:59:59.999999
08-03-03 00:00:00.000000
08-03-03 23:59:59.999999
08-03-04 00:00:00.000000
08-03-04 23:59:59.999999
08-03-05 00:00:00.000000
08-03-05 23:59:59.999999
08-03-06 00:00:00.000000
08-03-06 23:59:59.999999
08-03-07 00:00:00.000000
08-03-07 23:59:59.999999
08-03-08 00:00:00.000000
08-03-08 23:59:59.999999
08-03-09 00:00:00.000000
08-03-09 23:59:59.999999
08-03-10 00:00:00.000000
08-03-10 23:59:59.999999
08-03-11 00:00:00.000000
08-03-11 23:59:59.999999
08-03-12 00:00:00.000000
08-03-12 23:59:59.999999
08-03-13 00:00:00.000000
08-03-13 23:59:59.999999
08-03-14 00:00:00.000000
08-03-14 23:59:59.999999
08-03-15 00:00:00.000000
08-03-15 23:59:59.999999
08-03-16 00:00:00.000000
08-03-16 23:59:59.999999
08-03-17 00:00:00.000000
08-03-17 23:59:59.999999
08-03-18 00:00:00.000000
08-03-18 23:59:59.999999
08-03-19 00:00:00.000000
08-03-19 23:59:59.999999
08-03-20 00:00:00.000000
08-03-20 23:59:59.999999
08-03-21 00:00:00.000000
08-03-21 23:59:59.999999
08-03-22 00:00:00.000000
08-03-22 23:59:59.999999
08-03-23 00:00:00.000000
08-03-23 23:59:59.999999
08-03-25 00:00:00.000000
08-03-25 23:59:59.999999
08-03-26 00:00:00.000000
08-03-26 23:59:59.999999
08-03-27 08:59:59.999999
08-03-27 09:00:00.000000
08-03-27 10:12:11.928490

55行が選択されました。

SCOTT>

では、上記のデータを直近27日分のアクティビティ数を日毎に集計。アクティビティの無い日はアクティビティ数を0として問い合わせるSQL文。

以下の例では、Oracle独自の階層問合せのlevel疑似列を利用しSYSDATEから27日分のカレンダーを生成しログと外部結合することで、ログデータが存在していない日の
アクティビティ数を0として取得している。

SCOTT> l
1 select
2 cal."date",
3 nvl(logs."activity",0) as "activity"
4 from
5 (
6 select
7 "date",
8 count(ts_ltz) as "activity"
9 from
10 (
11 select
12 to_char(ts_ltz, 'YYYY/MM/DD') as "date",
13 ts_ltz
14 from
15 ts_test
16 )
17 group by
18 "date"
19 ) logs
20 right outer join
21 (
22 select
23 to_char(trunc(sysdate) - (level - 1),
24 'YYYY/MM/DD') as "date"
25 from
26 dual
27 where
28 to_char(trunc(sysdate) - (level - 1),
29 'YYYY/MM/DD') <= trunc(sysdate)
30 connect by
31 level <= 27
32 ) cal
33 on logs."date" = cal."date"
34 order by
35* cal."date"
SCOTT> /

date activity
---------- ----------
2008/03/02 2
2008/03/03 2
2008/03/04 2
2008/03/05 2
2008/03/06 2
2008/03/07 2
2008/03/08 2
2008/03/09 2
2008/03/10 2
2008/03/11 2
2008/03/12 2
2008/03/13 2
2008/03/14 2
2008/03/15 2
2008/03/16 2
2008/03/17 2
2008/03/18 2
2008/03/19 2
2008/03/20 2
2008/03/21 2
2008/03/22 2
2008/03/23 2
2008/03/24 0
2008/03/25 2
2008/03/26 2
2008/03/27 3
2008/03/28 0

27行が選択されました。

SCOTT>


では、クライアントのタイムゾーンをJSTからUTCへ変更してみましょう。(表示しているデータは前述の例と同じts_test表の内容ですがUTCに自動調整されて表示されています。)

SCOTT> alter session set time_zone='UTC';

セッションが変更されました。

SCOTT> select * from ts_test order by ts_ltz;

TS_LTZ
-------------------------------------------------------
08-02-28 15:00:00.000000
08-02-29 14:59:59.999999
08-02-29 15:00:00.000000
08-03-01 14:59:59.999999
08-03-01 15:00:00.000000
08-03-02 14:59:59.999999
08-03-02 15:00:00.000000
08-03-03 14:59:59.999999
08-03-03 15:00:00.000000
08-03-04 14:59:59.999999
08-03-04 15:00:00.000000
08-03-05 14:59:59.999999
08-03-05 15:00:00.000000
08-03-06 14:59:59.999999
08-03-06 15:00:00.000000
08-03-07 14:59:59.999999
08-03-07 15:00:00.000000
08-03-08 14:59:59.999999
08-03-08 15:00:00.000000
08-03-09 14:59:59.999999
08-03-09 15:00:00.000000
08-03-10 14:59:59.999999
08-03-10 15:00:00.000000
08-03-11 14:59:59.999999
08-03-11 15:00:00.000000
08-03-12 14:59:59.999999
08-03-12 15:00:00.000000
08-03-13 14:59:59.999999
08-03-13 15:00:00.000000
08-03-14 14:59:59.999999
08-03-14 15:00:00.000000
08-03-15 14:59:59.999999
08-03-15 15:00:00.000000
08-03-16 14:59:59.999999
08-03-16 15:00:00.000000
08-03-17 14:59:59.999999
08-03-17 15:00:00.000000
08-03-18 14:59:59.999999
08-03-18 15:00:00.000000
08-03-19 14:59:59.999999
08-03-19 15:00:00.000000
08-03-20 14:59:59.999999
08-03-20 15:00:00.000000
08-03-21 14:59:59.999999
08-03-21 15:00:00.000000
08-03-22 14:59:59.999999
08-03-22 15:00:00.000000
08-03-23 14:59:59.999999
08-03-24 15:00:00.000000
08-03-25 14:59:59.999999
08-03-25 15:00:00.000000
08-03-26 14:59:59.999999
08-03-26 23:59:59.999999
08-03-27 00:00:00.000000
08-03-27 01:12:11.928490

55行が選択されました。

SCOTT>
SCOTT> l
1 select
2 cal."date",
3 nvl(logs."activity",0) as "activity"
4 from
5 (
6 select
7 "date",
8 count(ts_ltz) as "activity"
9 from
10 (
11 select
12 to_char(ts_ltz, 'YYYY/MM/DD') as "date",
13 ts_ltz
14 from
15 ts_test
16 )
17 group by
18 "date"
19 ) logs
20 right outer join
21 (
22 select
23 to_char(trunc(sysdate) - (level - 1),
24 'YYYY/MM/DD') as "date"
25 from
26 dual
27 where
28 to_char(trunc(sysdate) - (level - 1),
29 'YYYY/MM/DD') <= trunc(sysdate)
30 connect by
31 level <= 27
32 ) cal
33 on logs."date" = cal."date"
34 order by
35* cal."date"
SCOTT> /

date activity
---------- ----------
2008/03/02 2
2008/03/03 2
2008/03/04 2
2008/03/05 2
2008/03/06 2
2008/03/07 2
2008/03/08 2
2008/03/09 2
2008/03/10 2
2008/03/11 2
2008/03/12 2
2008/03/13 2
2008/03/14 2
2008/03/15 2
2008/03/16 2
2008/03/17 2
2008/03/18 2
2008/03/19 2
2008/03/20 2
2008/03/21 2
2008/03/22 2
2008/03/23 1
2008/03/24 1
2008/03/25 2
2008/03/26 2
2008/03/27 2
2008/03/28 0

27行が選択されました。

SCOTT>

はい、データベース側でクライアントのタイムゾーンに日時を自動調整してくれるお陰でタイムゾーンが変っても同一SQL文で処理できます。(楽でしょ。)

次回は、同じことを集計関数cubeを使って実現するSQL文の例をお見せします。(Oracle de Fizzbuzz #2を見れば想像できてしまうとは思いますが。。)


ところで、MySQLやPostgreSQLなど他のデータベースではどうするんだろう。。余裕があったら調べてみるか。。。。。

2008/3/29追記
当日から必要な日数分の過去日付を求める階層問合せ部分はもっと簡単にできることに今気付いた。帰宅したら改善したクエリも追加する予定!

ということで以下のように、階層問合せのwhere句の部分は無くてもOKということだったのです。はい。

SCOTT> l
1 select
2 cal."date",
3 nvl(logs."activity",0) as "activity"
4 from
5 (
6 select
7 "date",
8 count(ts_ltz) as "activity"
9 from
10 (
11 select
12 to_char(ts_ltz, 'YYYY/MM/DD') as "date",
13 ts_ltz
14 from
15 ts_test
16 )
17 group by
18 "date"
19 ) logs
20 right outer join
21 (
22 select
23 to_char(
24 trunc(sysdate) - (level - 1),
25 'YYYY/MM/DD'
26 ) as "date"
27 from
28 dual
29 connect by
30 level <= 27
31 ) cal
32 on logs."date" = cal."date"
33 order by
34* cal."date"
SCOTT> /

date activity
---------- ----------
2008/03/03 2
2008/03/04 2
2008/03/05 2
2008/03/06 2
2008/03/07 2
2008/03/08 2
2008/03/09 2
2008/03/10 2
2008/03/11 2
2008/03/12 2
2008/03/13 2
2008/03/14 2
2008/03/15 2
2008/03/16 2
2008/03/17 2
2008/03/18 2
2008/03/19 2
2008/03/20 2
2008/03/21 2
2008/03/22 2
2008/03/23 2
2008/03/24 0
2008/03/25 2
2008/03/26 2
2008/03/27 3
2008/03/28 0
2008/03/29 0

27行が選択されました。

SCOTT>

| | | コメント (0) | トラックバック (0)

2008年3月26日 (水)

PL/SQL で Python Challenge Level 17

さて、ココログのデータベースのデフラグ?作業でログインできなかったので今書いてますが。
Level 17、少々ハマったが解き方は見えた(ような気がする)ので次回はその経過でも。

Level 17は、Web Applicationを作った経験のあるかたなら案外すんなり解けるかもしれない。
問題の画像にそのすべてのヒントが!


Enjoy! Python Challenge!
(Python じゃなくても楽しめるのだ!)

| | | コメント (0) | トラックバック (0)

2008年3月24日 (月)

PL/SQL で Python Challenge Level 16完

前回の続きです

さて、Level 16のページには、"let me get this straight" というタイトルが付けられている。これ自体が大きなヒント。なのでこれ以上は何も言うまい。

問題の解くjavaアプリケーションの内容は、以前、Level 11の処理の流れを書いていたが、その3、4以外の部分は同じ。
但し、Level7で利用した Level7.getBfile()とLevel9で作成したLevel9.writeImageFile()というファンクションとプロシージャを以下のPL/SQLパッケージに纏めた。

CREATE OR REPLACE PACKAGE PYTHONCHALLENGE_UTL AS

FUNCTION getBfile
(
i_dir_name IN VARCHAR2,
i_file_name IN vARCHAR2
) RETURN BFILE;

PROCEDURE writeImageFile(
directoryName IN VARCHAR2,
fileName IN VARCHAR2,
srcImage IN OUT NOCOPY BLOB
);

END PYTHONCHALLENGE_UTL;

CREATE OR REPLACE PACKAGE BODY PYTHONCHALLENGE_UTL AS

FUNCTION getBfile
(
i_dir_name IN VARCHAR2,
i_file_name IN VARCHAR2
) RETURN bfile AS
v_file BFILE;
BEGIN
v_file := BFILENAME(UPPER(i_dir_name),i_file_name);
RETURN v_file;
END getBfile;

PROCEDURE writeImageFile(
directoryName IN VARCHAR2,
fileName IN VARCHAR2,
srcImage IN OUT NOCOPY BLOB
) IS
file utl_file.file_type;
BEGIN
file := UTL_FILE.FOPEN(UPPER(directoryName), fileName, 'w', 32767);
DBMS_LOB.OPEN(srcImage, DBMS_LOB.LOB_READONLY);

DECLARE
v_raw RAW(32767);
amount INTEGER;
offset INTEGER;
BEGIN
offset := 1;
LOOP
amount := 32767;
DBMS_LOB.READ(srcImage, amount, offset, v_raw);
UTL_FILE.PUT_RAW(file, v_raw, true);
offset := offset + amount;
END LOOP;
EXCEPTION
WHEN no_data_found THEN
NULL;
WHEN OTHERS THEN
UTL_FILE.FCLOSE(file);
DBMS_LOB.CLOSE(srcImage);
RAISE_APPLICATION_ERROR(-20001, sqlerrm());
END;

UTL_FILE.FCLOSE(file);
DBMS_LOB.CLOSE(srcImage);
END writeImageFile;

END PYTHONCHALLENGE_UTL;
/

上記のパッケージをJava Stored Procedureから利用するわけです。javaのソースコードは載せませんよ。ネタバレになっちゃいますから。

次に、デプロイしたjava classは以下のようにしてJava Stored Procedureとして定義します。

CREATE OR REPLACE PACKAGE LEVEL16 AS
FUNCTION getResult RETURN NUMBER AS
LANGUAGE JAVA NAME 'jp.macdeoracle.Level16.getResult() return java.lang.boolean';
END LEVEL16;

では、SQL*Plusから実行してみましょう!

Last login: Sun Mar 23 20:29:41 on ttyp2
Welcome to Darwin!
G5Server:˜ discus$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Sun Mar 23 20:31:49 2008 from 192.168.1.19
[oracle@corydoras ˜]$ cd python_challenge
[oracle@corydoras python_challenge]$ ll
合計 264
-rw-r--r-- 1 oracle oinstall 254006 3月 23 16:26 level16.gif

[oracle@corydoras python_challenge]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 日 3月 23 20:58:34 2008

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

> conn scott/tiger
接続されました。
SCOTT> l
1 select
2 case
3 when level16.getResult() = 1 then '成功!'
4 else '失敗!'
5 end as "Level16"
6* from dual
SCOTT> /

Level16
---------
成功!

SCOTT> !ls -l
合計 504
-rw-r--r-- 1 oracle oinstall 254006 3月 23 16:26 level16.gif
-rw-r--r-- 1 oracle oinstall 239515 3月 23 21:02 level16_result.png

SCOTT>

これだけでもかなりのヒントになっているような気もしますが。。。
MacOSXのChicken of the VNC(MacOSX向けのVNC Client)経由でLinux(CentOS5)にある結果を確認!


Level16_res1

Level16_res2


ということで、Python Challenge Level 16完。 Level 17は気が向いたら載せると思います。 
Enjoy Python Challenge!

| | | コメント (0) | トラックバック (0)

2008年3月23日 (日)

PL/SQL で Python Challenge Level 16 - 2年5ヶ月ぶり

そう、あれは、このブログをはじめたころ、Oracle10g R1 for MacOSX ServerとPL/SQL(画像処理関係はjava stored procedure)を利用し、Python Challengeに PL/SQLでチャレンジしていたっけ〜〜。遠い目。

アクセスログを見ていたら最近、またPython Challengeのキーワード検索が多くヒットしているのにびっくり!。
前述のエントリを書いていたのが約2年半前になるわけですから! ということで、久々にちょっとだけ再開してみようかと。。Level 16を見てみる。


Level 16の問題の画像を見ると、いかにもわざとらしい柄というか模様が目につく!。

で、Level 16のページタイトルもいつものようにヒントになっている。

画像にある模様を眺めつつ、ページタイトルの英文(簡単な英文です)を読み試しにJavaだけで作ってみると、考え方はいいと思うのだが全然答えにはなっていない。。。

こうか? ん、、、、それとも、こうか? でも違う。 あ、横にしてたよ。。。あはは。。(^^;;
と独り言を言いつつ何とか答えを見つけました。。は〜〜っ。暫くぶりだと疲れるわ。

次回は答えは書きませんが、Level 16の結果をぼかしたスナップショットを載せる予定。

ちなみに、今回の環境は以下。
Database Server : Oracle11g R1 EE for Linux x86

開発用クライアント:
JDeveloper10g 10.1.3 for MacOSX
Oracle SQL Developer 1.1.3 for MacOSX
(Java Stored Procedure、PL/SQL package、Java関連で利用した)

準備が整ったらMacOSXからsshでLinuxのOracle11gへ接続して実行!
結果確認は、MacOSXのVNCからLinuxへ接続して確認するという面倒なことまでしてMacを絡めている。
(Mac de Oracle ですから! 笑)

尚、以前のように、なるべくPL/SQLやSQLレベルで問題を解いて行くがPL/SQLやSQLでは不可能な処理はJava stored procedureで行う。Level 16もLevel14と同じような処理になっている。

| | | コメント (0) | トラックバック (0)

2008年3月20日 (木)

Installation of Oracle 11g R1 (11.1.0.6.0) on SuSE Linux Enteprise Server (SLES) 10 and OpenSuSE 10.3 (x86_64)

少々前に、Oracle10g R2 on OpenSuSE10.2に関するインストレーション手順のドキュメントがNovelのサイトから入手できることを書いたが、Oracle ACE Memberのivan kartik氏のサイトには、Oracle11g R1をSuSE Linux Enterprise Server(SLES) 10 及び OpenSuSE 10.3(但し今のところ、64ビットのみ)へインストールする際のHOW TOが紹介されている。近いうちに32ビット版のドキュメントも公開する予定とのこと。
前回の記事も含めて備忘録ということで。


Installation of Oracle 11g R1 (11.1.0.6.0) on SuSE Linux Enteprise Server (SLES) 10 and OpenSuSE 10.3

| | | コメント (0) | トラックバック (0)

2008年3月13日 (木)

Oracle10g R2 on OpenSuSE 10.2

少々前の事だが、OTN-JでOpenSuSEへOracleをインストールしたいという漠然とした質問があった。
OpenSUSEのバージョンやOracleのバージョンも記載さていない質問なので答える方も大変だと思うが、「サポートされた組み合わせではないから云々」と言うような後ろ向きなレスより、「こんなこと(方法で)すればできるようだ?!」というちょっとだけ前向きな回答が OTN-Jに多くなればいいなぁと日頃から感じていた私はOpenSuSE10.2へOracle10g R2をインストール参考になるドキュメントがあることをレスしておいた。

私も備忘録としてそれらのドキュメントのURLメモっておくとするか。
(SUSEを使うこともあるあもしれないし。)

Oracle Database10g R2 (10.2.0.1) on openSUSE 10.2 (PDF)


その他リリースに関連するドキュメントなどもある。

| | | コメント (0) | トラックバック (0)

2008年3月10日 (月)

Mac de Ruby on Rails - #8 - Oracleと遊ぶ #7

以前の記事で以下のように書いていたことを覚えていますか?

注)
赤太字で示したシンボリックリンクは今回事前に作成したもので、それらのシンボリックリンクは作成しなくても通常利用には問題ない。以前の記事参照のこと。
尚、今回は事前に参照していた資料にシンボリックリンクの作成に関する記述があったため前述のシンボリックリンクを作成した。
(ほんとうに必要なのか? という点については未検証であることを書き加えておく。余計なものだとしても悪さはしないでしょう。きっと。)


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4
Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5
Mac de Ruby on Rails - #7 - Oracleと遊ぶ #6

先日、興味本位で、もし、前述したシンボリックリンクを作成しなかったらどうなるかを試してみた。

Macintosh:ruby-oci8-1.0.0 discus$ make
ruby setup.rb config
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb
checking for load library path... (DYLD_LIBRARY_PATH)...
found: /Users/Shared/OracleInstantClient/libclntsh.dylib.10.1 looks like an instant client.
checking for cc... ok
checking for gcc... yes
checking for LP64... no
checking for ruby header... ok
---------------------------------------------------
error messages:
Could not compile with Oracle instant client.
/Users/Shared/OracleInstantClient/libclntsh.dylib could not be found.
You may need to make a symbolic link.
cd /Users/Shared/OracleInstantClient
ln -s libclntsh.dylib.10.1 libclntsh.dylib

---------------------------------------------------
See:
* http://ruby-oci8.rubyforge.org/ja/HowToInstall.html
* http://ruby-oci8.rubyforge.org/ja/ReportInstallProblem.html

*** /Users/discus/ruby-oci8-1.0.0/ext/oci8/extconf.rb failed ***

ご覧の通りエラーになりますし、シンボリックリンクが無いのが原因かもしれないと示唆される。分かり易くていいな〜。
当然、指摘された通りにシンボリックリンクを作成してあげれば問題は解消される。

| | | コメント (0) | トラックバック (0)

2008年3月 7日 (金)

Oracle de XMLDB #26 - XMLTYPEの更新

OTN-Jで、PL/SQLでXMLTYPEのあるの要素の値を変更したり、ある要素の値を参照したいというスレッドがあったのでレスしておいた。

そういえば、XQueryやXPathを使ったOracle XMLDBネタもやっているが更新系のはやってないな(というかまだ、XMLの更新、追加、削除に関する標準が定まっていないわけだから仕方ない。)

ということで、前述したOTN-Jのネタをもう少しフラッシュアップして?!(for updateなどが抜けていたので。。)残しておく事にした。

まず、hogehoge表に以下のようなXMLを登録する。

SCOTT> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SCOTT>
SCOTT> desc hogehoge
名前 NULL? 型
----------------------------------------- -------- ----------------------------
SEQNO NOT NULL NUMBER
XMLINFO XMLTYPE

SCOTT>
SCOTT> insert into hogehoge values(1,xmltype('<?xml version="1.0"?><addressbook>
<person id="1"><name>岡田</name><age>30</age>
<address zipcode="123456">東京都ホゲ市ホゲ町1−1</address></person><person id="2">
<name>安倍</name><age>50</age>
<address zipcode="1050011">東京都ホゲ区ホゲ田町1−1−1</address>
</person></addressbook>'));

1行が作成されました。

SCOTT> commit;

コミットが完了しました。

SCOTT>
SCOTT>
SCOTT> set timi on
SCOTT> set long 4000
SCOTT> col xmlinfo for a80
SCOTT> set linesize 132
SCOTT> set pagesize 1000
SCOTT> select * from hogehoge where seqno=1;

SEQNO XMLINFO
---------- ------------------------------------------------------------
1 <?xml version="1.0"?><addressbook><person id="1"><name>岡田<
/name><age>30</age><address zipcode="123456">東京都ホゲ市ホ
ゲ町1−1</address></person><person id="2"><name>安倍</name>
<age>50</age><address zipcode="1050011">東京都ホゲ区ホゲ田
町1−1−1</address></person></addressbook>


経過: 00:00:00.01
SCOTT>

上記のようなXML文書を対象に特定のid属性値を持つperson要素に含まれるname要素の値を変更するストアドファンクション。
(もうすこし平たく言うと、指定した名前を変更するストアドファンクション。略し過ぎか・・・)

XML文書の変更方法は他にもあるが、PL/SQLパッケージで行うにはDOM APIであるDBMS_XMLDOMパッケージを利用して行う。
尚、XMLTYPEをDBMS_XMLDOMパッケージで更新する際のポイントは、XMLTYPEインスタンスからDOMインスタンスを生成し、DOMインスタンに対して必要な更新操作行った上で、XMLTYPEインスタンスを表へ書き戻すという所。(該当部分は赤太字にしてあります。)

SCOTT> l
1 create or replace
2 function changePersonName
3 (
4 iKey in number,
5 iPersonId in varchar2,
6 iNewName in varchar2
7 ) return xmltype
8 is
9 xml xmlType;
10 personNodeList dbms_xmldom.DomNodeList;
11 personNode dbms_xmldom.DomNode;
12 nameNodeList dbms_xmldom.DomNodeList;
13 personAttrNodeMap dbms_xmldom.DomNamedNodeMap;
14 idAttrNode dbms_xmldom.DomNode;
15 wKey number;
16 wPersonId varchar2(38);
17 wNewName varchar2(60);
18 begin
19 wKey := iKey;
20 wPersonId := iPersonId;
21 wNewName := iNewName;
22
23 select xmlinfo into xml from hogehoge where seqno = wKey for update;
24
25 personNodeList := dbms_xmldom.getElementsByTagName(
26 dbms_xmldom.newDomDocument(xml)
27 ,'person'
28 );
29
30 if not dbms_xmldom.isNull(personNodeList) then
31 for i in 0..dbms_xmldom.getLength(personNodeList) loop
32 personNode := dbms_xmldom.item(personNodeList, i);
33 personAttrNodeMap := dbms_xmldom.getAttributes(personNode);
34 idAttrNode := dbms_xmldom.getNamedItem(personAttrNodeMap, 'id');
35 if dbms_xmldom.getNodeValue(idAttrNode) = wPersonId then
36 nameNodeList := dbms_xmldom.getChildrenByTagName(
37 dbms_xmldom.makeElement(personNode)
38 ,'name'
39 );
40 dbms_xmldom.setNodeValue(
41 dbms_xmldom.getFirstChild(dbms_xmldom.item(nameNodeList, 0))
42 ,wNewName
43 );
44 update hogehoge set xmlinfo = xml where seqno = wKey;
45 exit;
46 end if;
47 end loop;
48 end if;
49 return xml;
50* end;
SCOTT> /

ファンクションが作成されました。

経過: 00:00:00.04
SCOTT>
SCOTT>
SCOTT>
SCOTT> l
1 declare
2 xml xmlType;
3 begin
4 xml := changePersonName(1, '1', '福田ほげ蔵');
6 commit;
7* end;
SCOTT> /

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

経過: 00:00:00.03
SCOTT>
SCOTT>
SCOTT> select * from hogehoge where seqno=1;
SEQNO XMLINFO
---------- --------------------------------------------------------------------------------
1 <?xml version="1.0"?>
<addressbook>
<person id="1">
<name>福田ほげ蔵</name>
<age>30</age>
<address zipcode="123456">東京都ホゲ市ホゲ町1−1</address>
</person>
<person id="2">
<name>安倍</name>
<age>50</age>
<address zipcode="1050011">東京都ホゲ区ホゲ田町1−1−1</address>
</person>
</addressbook>


経過: 00:00:00.00
SCOTT>

もうお気づきだと思うが、Oracle11gでも発生しているこちらからは操作できないところでwhitespaceが追加されたり、されなかったりする。まあこれ自体は大抵の場合問題にはならないのだが。。

あともうひとつの話題は特定の要素の値を取り出したいということ。これだけならDBMS_XMLDOMパッケージを使わなくても、SQL/XMLを使えば簡単ですよね。
XMLQuery()関数を使って、id属性値が "1"であるperson要素以下にあるage要素の値を参照する例です。

SCOTT> set linesize 80
SCOTT> l
1 select
2 xmlquery(
3 'let $n := $xmldoc//person[@id="1"]/age/text()
4 return $n'
5 passing by value xmlinfo as "xmldoc"
6 returning content
7 ) as "age"
8* from hogehoge where seqno=1
SCOTT> /

age
--------------------------------------------------------------------------------
30

経過: 00:00:00.04
SCOTT>

ちなみに、Oracleのマニュアルは以下の辺りを参照するとよいと思いますが、DOM、XQueryやXPathに関してはXML関連のサイトもググって調べたほうがよいと思います。XMLの操作の基本を理解していれば、あとはどんなツールを使ってそれを行うかということだけですから。

マニュアル
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス 10g R2 - DBMS_XMLDOM
Oracle Database SQLリファレンス 10g R2 - XMLQUERY

Enjoy!

| | | コメント (0) | トラックバック (0)

2008年2月28日 (木)

Mac de Ruby on Rails - #7 - Oracleと遊ぶ #6

さて、前回まででRuby on Rails 2.0.2からOracle11g R1 11.1.0.6.0をアクセスするアプリケーションはできたのだが、まだ、幾つか手お加えたい箇所もある。例えばViewのタイトルやドロップダウンメニューが英語だとか、日付の表示が長過ぎるとか。

4


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4
Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5

そこで、indexページの日付フォーマットを変更してみることにする。(Viewというか、scaffoldでの日本語対応などまだまだ知らないことも多い。それらは次の機会のお楽しみということで・・・)

index.html.erbを以下のように変更して・・・・

pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$pb17:/Volumes/Repository/employee_list discus$ cd app/views/emps
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ cp index.html.erb index.html.erb.org
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ vi index.html.erb
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ diff index.html.erb.org index.html.erg
17c17,23
< <td><%=h emp.hiredate %></td>
---
> <td>
> <% if emp.hiredate %>
> <%=h emp.hiredate.to_formatted_s(:db) %>
> <% else %>
> <%=h emp.hiredate %>
> <% end %>
> </td>
pb17:/Volumes/Repository/employee_list/app/views/emps discus$
pb17:/Volumes/Repository/employee_list/app/views/emps discus$ cd $OLDPWD
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:19:46] INFO WEBrick 1.3.1
[2008-02-24 16:19:46] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:19:46] INFO WEBrick::HTTPServer#start: pid=702 port=3000
127.0.0.1 - - [24/Feb/2008:16:20:05 JST] "GET /emps HTTP/1.1" 500 15280
- -> /emps
127.0.0.1 - - [24/Feb/2008:16:20:26 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/emps -> /favicon.ico
^C[2008-02-24 16:20:59] INFO going to shutdown ...
[2008-02-24 16:20:59] INFO WEBrick::HTTPServer#start done.
pb17:/Volumes/Repository/employee_list discus$ cd app/views/emps

6

なんとか、出来ましたね。RubyもRuby on Railsも始めてですが、なんとかここまでできました〜 :)

”Ruby on Rails2.0.2とOracle11gでそこそこ遊べる環境を作る” ひとまず、完!

| | | コメント (0) | トラックバック (0)

2008年2月27日 (水)

Mac de Ruby on Rails - #6 - Oracleと遊ぶ #5

Ruby on RailsでOracleとそこそこ遊べる環境構築もそろそろ終盤。
今回は、Ruby on RailsでOracle11g R1のデータベースをアクセスする簡単なアプリケーションを作ってみる。
尚、アプリケーションで利用する表は事前に作成しておいた。(Oracleにアクセスできることが確認できれば十分なので)


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3
Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4

まず事前に、emp表を元にemps表を作り、数件データを追加しておきます。

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 2月 24 15:55:07 2008

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

SQL> conn scott/tiger@lampeye
接続されました。
SQL> create table emps as select * from emp;

表が作成されました。

SQL> alter table emps rename column empno to id;

表が変更されました。

SQL> alter table emps add constraint emp_pk primary key (id);

表が変更されました。

SQL> create sequence emps_seq;

順序が作成されました。

SQL> insert into emps(id,ename) values(8888,'ヌルポ');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> set linesize 132
SQL> set pagesize 1000
SQL> select * from emps order by id;

ID ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
8888 ヌルポ
9999 ほげ ENGINEER 7566 08-01-01 2500 20

14行が選択されました。

SQL> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsとの接続が切断されました。
pb17:˜ discus$
pb17:˜ discus$

次にOracleデータベースを利用するプロジェクトを作成します。
-d オプションを付けるとOracle向け構成ファイル:databaase.ymlを生成してくれます。

pb17:˜ discus$ cd /Volumes/Repository
pb17:˜ discus$
pb17:/Volumes/Repository discus$ rails -h
Usage: /opt/local/bin/rails /path/to/your/app [options]

Options:
-r, --ruby=path Path to the Ruby binary of your choice (otherwise scripts use env, dispatchers current path).
Default: /opt/local/bin/ruby
-d, --database=name Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite2/sqlite3).
Default: mysql
-f, --freeze Freeze Rails in vendor/rails from the gems generating the skeleton
Default: false

・・・・中略・・・・

Example:
rails ˜/Code/Ruby/weblog

This generates a skeletal Rails installation in ˜/Code/Ruby/weblog.
See the README in the newly created application to get going.

今回は、employee_listというプロジェクトを作ります。(コードとディレクトリーが自動的い生成されていく・・・)
database.ymlを環境の合わせ変更!

pb17:/Volumes/Repository discus$ rails -d oracle employee_list
create
create app/controllers
create app/helpers
create app/models

・・・・中略・・・・

create log/server.log
create log/production.log
create log/development.log
create log/test.log
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$ cd employee_list/config
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository discus$
pb17:/Volumes/Repository/employee_list/config discus$ vi database.yml
pb17:/Volumes/Repository/employee_list/config discus$ cat database.yml
# Oracle/OCI 8i, 9, 10g
#
# Requires Ruby/OCI8:
# http://rubyforge.org/projects/ruby-oci8/
#
# Specify your database using any valid connection syntax, such as a
# tnsnames.ora service name, or a sql connect url string of the form:
#
# //host:[port][/service name]
#
# By default prefetch_rows (OCI_ATTR_PREFETCH_ROWS) is set to 100. And
# until true bind variables are supported, cursor_sharing is set by default
# to 'similar'. Both can be changed in the configation below; the defaults
# are equivalent to specifying:
#
# prefetch_rows: 100
# cursor_sharing: similar
#

development:
adapter: oracle
database: lampeye
username: scott
password: tiger

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: oracle
database: lampeye
username: test
password: tiger

production:
adapter: oracle
database: lampeye
username: prod
password: tiger
pb17:/Volumes/Repository/employee_list/config discus$
pb17:/Volumes/Repository/employee_list/config discus$
pb17:/Volumes/Repository/employee_list/config discus$

ここまでできたら、emps表を操作、表示するためのscaffold(足場)を生成する。(あれまあ、簡単にできるんだなぁ)

pb17:/Volumes/Repository/employee_list/config discus$ cd ..
pb17:/Volumes/Repository/employee_list discus$ ruby script/generate scaffold Emp
exists app/models/
exists app/controllers/
exists app/helpers/

・・・・中略・・・・

create app/controllers/emps_controller.rb
create test/functional/emps_controller_test.rb
create app/helpers/emps_helper.rb
route map.resources :emps
pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$

ではテスト用サーバを起動して確認!

pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:10:11] INFO WEBrick 1.3.1
[2008-02-24 16:10:11] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:10:11] INFO WEBrick::HTTPServer#start: pid=683 port=3000
127.0.0.1 - - [24/Feb/2008:16:10:31 JST] "GET / HTTP/1.1" 200 7557
- -> /
127.0.0.1 - - [24/Feb/2008:16:10:32 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/ -> /favicon.ico

・・・・中略・・・・

127.0.0.1 - - [24/Feb/2008:16:11:35 JST] "GET /stylesheets/scaffold.css?1203836970 HTTP/1.1" 200 1152
http://localhost:3000/emps -> /stylesheets/scaffold.css?1203836970
^C[2008-02-24 16:12:35] INFO going to shutdown ...
[2008-02-24 16:12:35] INFO WEBrick::HTTPServer#start done.

あれ〜〜、表の中身が表示されていない? なんで〜〜〜〜!

3

調べてみると、Ruby on Rails 2.xでは、scaffoldの使い方に違いがあるからということが理由とのこと。
ということでrailsのscaffold利用方法をを参照
/opt/local/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/USAGE


では早速、作り直してみる。

pb17:/Volumes/Repository/employee_list discus$ 
pb17:/Volumes/Repository/employee_list discus$ ruby script/generate scaffold Emp ename:string job:string mgr:integer hiredate:date sal:integer
exists app/models/
exists app/controllers/

・・・・中略・・・・

exists test/functional/
exists test/unit/
overwrite app/views/emps/index.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/index.html.erb
overwrite app/views/emps/show.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/show.html.erb
overwrite app/views/emps/new.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/new.html.erb
overwrite app/views/emps/edit.html.erb? (enter "h" for help) [Ynaqdh] Y
force app/views/emps/edit.html.erb
identical app/views/layouts/emps.html.erb

・・・・中略・・・・

skip test/fixtures/emps.yml
exists db/migrate
Another migration is already named create_emps: db/migrate/001_create_emps.rb
pb17:/Volumes/Repository/employee_list discus$ ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-02-24 16:15:40] INFO WEBrick 1.3.1
[2008-02-24 16:15:40] INFO ruby 1.8.6 (2007-09-23) [powerpc-darwin8.11.0]
[2008-02-24 16:15:40] INFO WEBrick::HTTPServer#start: pid=696 port=3000
127.0.0.1 - - [24/Feb/2008:16:15:56 JST] "GET /emps HTTP/1.1" 200 12543
- -> /emps
127.0.0.1 - - [24/Feb/2008:16:16:17 JST] "GET /stylesheets/scaffold.css?1203836970 HTTP/1.1" 200 1152
http://localhost:3000/emps -> /stylesheets/scaffold.css?1203836970
127.0.0.1 - - [24/Feb/2008:16:16:17 JST] "GET /favicon.ico HTTP/1.1" 200 0
http://localhost:3000/emps -> /favicon.ico
^C[2008-02-24 16:17:22] INFO going to shutdown ...
[2008-02-24 16:17:22] INFO WEBrick::HTTPServer#start done.
pb17:/Volumes/Repository/employee_list discus$
pb17:/Volumes/Repository/employee_list discus$

お〜〜〜〜、できた〜! 

4

次回いよいよ、Ruby on RailsとOracleでそこそこ遊べる環境作りの最終回。日付の表示が気に入らないので少々コードを変更してみる。

| | | コメント (0) | トラックバック (0)

2008年2月26日 (火)

Mac de Ruby on Rails - #5 - Oracleと遊ぶ #4

まず、前回の復習。
前回は、rubyからruby-oci8さらにOracle Instant Client 10gを介してOracle11g R1 EE 11.1.0.6.0のデータベースへアクセスできることを確認した。

今回は、rubyからActiveRecordを利用してOracle11g R1のデータベースへアクセスできるか確認する。


バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2
Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3


コードは以下の通り。

pb17:˜ discus$
pb17:˜ discus$ cat test.rb
require 'rubygems'
require 'active_record'

class Emp < ActiveRecord::Base
set_table_name "EMP"
end

ActiveRecord::Base.establish_connection(
:adapter => "oracle",
:database => "lampeye",
:username => "scott",
:password => "tiger"
)

emp = Emp.find(:first,:conditions =>["ENAME = ?", "ほげ"])
puts "#{ emp.empno}, #{ emp.ename}, #{emp.job}, #{emp.hiredate}"

実行してみる!

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ ruby test.rb
/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters/abstract/connection_specification.rb:231
:in `establish_connection': Please install the oracle adapter: `gem install activerecord-oracle-adapter`
(no such file to load -- active_record/connection_adapters/oracle_adapter) (RuntimeError) from test.rb:8

あ〜〜なるほど、ActiveRecordからruby-oci8を利用するためには、oracle_adapter.rbが必要なんですね! 
ということでoracle_adapter.rbをダウンロードし、/opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters以下にコピーする。

pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ cd :/Volumes/Repository/temp
pb17:/Volumes/Repository/temp discus$ curl -O http://svn.rubyonrails.org/rails/adapters/oracle/lib/active_record/connection_adapters/oracle_adapter.rb
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27596 100 27596 0 0 25998 0 0:00:01 0:00:01 --:--:-- 43123
pb17:/Volumes/Repository/temp discus$
pb17:/Volumes/Repository/temp discus$
pb17:/Volumes/Repository/temp discus$ sudo cp oracle_adapter.rb /opt/local/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record/connection_adapters
Password:
pb17:/Volumes/Repository/temp discus$

再度実行してみる!

pb17:/Volumes/Repository/temp discus$ cd
pb17:˜ discus$
pb17:˜ discus$
pb17:˜ discus$ ruby test.rb
9999, ほげ, ENGINEER, Tue Jan 01 00:00:00 +0900 2008
pb17:˜ discus$

お〜〜〜、上手くいった!〜〜。

今日はここまで、次回へつづく。

| | | コメント (0) | トラックバック (0)

2008年2月25日 (月)

Mac de Ruby on Rails - #4 - Oracleと遊ぶ #3

Mac de Ruby on Rails、オラクルと遊ぶ その3回目は、ruby-oci8の動作確認の意味も含め、rubyからociを使ってOracle11g R1のscott.emp表をアクセスしてみる。



バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1
Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2


以下の操作は全て、Oracle Instant Client 10g R1 10.1.0.3.0 for MacOSX(PPC)をインストールしたPowerBook G4から行っている。

SQL*Plusを利用してSCOTTユーザのemp表の内容を確認しておく。

pb17:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 日 2月 24 15:47:19 2008

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

> conn scott/tiger@lampeye
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT> set linesize 132
SCOTT> set pagesize 1000
SCOTT> select * from emp order by empno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
9999 ほげ ENGINEER 7566 08-01-01 2500 20

13行が選択されました。

SCOTT> exit
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production

pb17:˜ discus$

rubyからruby-oci8、さらにOracle Clientを介して、Oracle11g R1のscott.emp表をempno順に問い合わせて動作確認した結果。

pb17:˜ discus$
pb17:˜ discus$ ruby -r oci8 -e "OCI8.new('scott','tiger','lampeye').exec('select * from emp order by empno') do |r| puts r.join(','); end"
7369,SMITH,CLERK,7902,1980/12/17 00:00:00,800.0,,20
7499,ALLEN,SALESMAN,7698,1981/02/20 00:00:00,1600.0,300.0,30
7521,WARD,SALESMAN,7698,1981/02/22 00:00:00,1250.0,500.0,30
7566,JONES,MANAGER,7839,1981/04/02 00:00:00,2975.0,,20
7654,MARTIN,SALESMAN,7698,1981/09/28 00:00:00,1250.0,1400.0,30
7698,BLAKE,MANAGER,7839,1981/05/01 00:00:00,2850.0,,30
7782,CLARK,MANAGER,7839,1981/06/09 00:00:00,2450.0,,10
7839,KING,PRESIDENT,,1981/11/17 00:00:00,5000.0,,10
7844,TURNER,SALESMAN,7698,1981/09/08 00:00:00,1500.0,0.0,30
7900,JAMES,CLERK,7698,1981/12/03 00:00:00,950.0,,30
7902,FORD,ANALYST,7566,1981/12/03 00:00:00,3000.0,,20
7934,MILLER,CLERK,7782,1982/01/23 00:00:00,1300.0,,10
9999,ほげ,ENGINEER,7566,2008/01/01 00:00:00,2500.0,,20
pb17:˜ discus$
pb17:˜ discus$

順調、順調! 

次回へつづく。

| | | コメント (0) | トラックバック (0)

2008年2月24日 (日)

Mac de Ruby on Rails - #3 - Oracleと遊ぶ #2

さて、前回予告した通り、MacOSXのRuby on Rails 2.0.2からOracle11g R1 EE 11.1.0.6.0 for Linux x86Oracle Instant Client 10g R1 for MacOSX(PPC)を利用し、そこそこ遊べる環境を作ってみる。



バックナンバー:
Mac de Ruby on Rails - #1
Mac de Ruby on Rails - #2 - Oracleと遊ぶ #1


2008/2/26追記-文字エンコーディングに関する情報を書き忘れていたので追記
Oracle DB character set : Japanese_Japan.AL32UTF8
Oracle Client NLS_LANG : Japanese_Japan.AL32UTF8
ということで全てUTF-8で統一してあります。


まずは、Ruby on Railsの開発環境にするPowerBook G4の情報から

H/W: Apple PowerBook G4 1Ghz / RAM:1GB
OS : MacOSX 10.4.11 Tiger (XCode 2.4.1インストール済み)
Oracle Instant Client : Oracle Instant Client 10g R1 for MacOSX(PPC)
Ruby : 1.8.6 (2007-09-23 patchlevel 110) [powerpc-darwin8.11.0]
RubyGems : 1.0.1
Ruby on Rails : 2.0.2
ruby-oci8 : 1.0.0
MacOSX 10.4.11 TigerへのRuby on Rails 2.0.2のインストールはこちら。

そして、Ruby on Railsから接続するOracleデータベースサーバは(サーバっていうと大げさ過ぎるノートPCですが・・・・)

H/W: Dynabook SS SX/210LNLW (RAM:768MB)
OS : CentOS 5
DB : Oracle11g R1 EE 11.1.0.6.0 for Linux x86

という構成です。配置はこんな感じ

Ruby on Rails 2.0.2からOracle11g R1 EE 11.1.0.6.0 for Linux x86へ接続するためのOracle Instant Client 10g R1 for MacOSX(PPC)関連の環境変数の設定は以下のようになっている。
(MySQLやGlassFish関連の環境変数も見えるが今回の内容には一切関係ないので気にしないでくださいませ。)

尚、Oracle Instant Client 10g R1 for MacOSX(PPC)をMacOSX 10.4.11 Tigerへインストールする例は以前の記事を参考にしてみてください。

pb17:˜ discus$ cat .bash_profile
export PATH=/usr/local/mysql/bin:$PATH

alias mysql='mysql --set autocommit=0'

# for GlassFish
export GLASSFISH_HOME=˜/glassfish/glassfish
export PATH=/opt/local/bin:$PATH:$GLASSFISH_HOME/bin

. .bashrc
pb17:˜ discus$ cat .bashrc
alias ll='ls -lv'

ORACLE_INSTANT_CLIENT_HOME=/Users/Shared/instantclient10_1
export ORACLE_HOME=$ORACLE_INSTANT_CLIENT_HOME
export NLS_LANG=Japanese_Japan.AL32UTF8
export DYLD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$ORACLE_HOME:$PATH
export TNS_ADMIN=$ORACLE_HOME


pb17:˜ discus$
pb17:˜ discus$ ls -l $ORACLE_HOME
total 182200
-r--r--r-- 1 discus orauser 21299 Apr 29 2004 README_IC.htm
-r--r--r-- 1 discus orauser 1461081 Jul 5 2004 classes12.jar
-r--r--r-- 1 discus orauser 1353 Oct 9 2003 glogin.sql
lrwxr-xr-x 1 discus orauser 20 Feb 16 12:43 libclntsh.dylib -> libclntsh.dylib.10.1
-rwxr-xr-x 1 discus orauser 14891264 Dec 13 2004 libclntsh.dylib.10.1
-rwxr-xr-x 1 discus orauser 27432 Oct 24 2004 libheteroxa10.dylib
-rw-r--r-- 1 discus orauser 1516340 Nov 16 2004 libnnz10.dylib
lrwxr-xr-x 1 discus orauser 18 Feb 16 12:44 libocci.dylib -> libocci.dylib.10.1
-rw-r--r-- 1 discus orauser 1841448 Oct 24 2004 libocci.dylib.10.1
-rwxr-xr-x 1 discus orauser 66160096 Dec 14 2004 libociei.dylib
-rwxr-xr-x 1 discus orauser 93028 Nov 9 2004 libocijdbc10.dylib
-rwxr-xr-x 1 discus orauser 744612 Oct 24 2004 libsqlplus.dylib
-r--r--r-- 1 discus orauser 54032 Jul 5 2004 ocrs12.jar
-r--r--r-- 1 discus orauser 1397543 Jul 5 2004 ojdbc14.jar
-r--r--r-- 1 discus orauser 5018319 Jul 7 2004 orai18n.jar
drwxr-xr-x 4 discus orauser 136 Dec 14 2004 sdk
-rwxr-xr-x 1 discus orauser 15660 Dec 13 2004 sqlplus
-rw-r--r-- 1 discus orauser 2072 Feb 16 13:19 tnsnames.ora
pb17:˜ discus$

注)
赤太字で示したシンボリックリンクは今回事前に作成したもので、それらのシンボリックリンクは作成しなくても通常利用には問題ない。以前の記事参照のこと
尚、今回は事前に参照していた資料にシンボリックリンクの作成に関する記述があったため前述のシンボリックリンクを作成した。
(ほんとうに必要なのか? という点については未検証であることを書き加えておく。余計なものだとしても悪さはしないでしょう。きっと。)


では、早速、Ruby on Rails 2.0.2からOracleへアクセスするための準備作業に取りかかることにする。
まず、RubyForgeからruby-oci8-1.0.0.tar.gzをダウンロード、解凍する。

pb17:/Volumes/Repository/temp discus$ curl -L -O http://rubyforge.org/frs/download.php/28396/ruby-oci8-1.0.0.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 104k 100 104k 0 0 41090 0 0:00:02 0:00:02 --:--:-- 77167
pb17:/Volumes/Repository/temp discus$ ll
-rw-r--r-- 1 discus admin 593589 Dec 17 14:57 MacPorts-1.6.0-10.4-Tiger.dmg
-rw-r--r-- 1 discus admin 239926399 Aug 14 2007 aug07_adc_refib_update.dmg
-rw-r--r-- 1 discus admin 326 Apr 28 2006 comics.sql
-rw-r--r-- 1 discus admin 107494 Nov 25 20:31 ruby-oci8-1.0.0.tar.gz
-rw-r--r-- 1 discus admin 204841 May 24 2007 rubygems-0.9.4.tgz
pb17:/Volumes/Repository/temp discus$ gzip -dc ruby-oci8-1.0.0.tar.gz | tar xvf -
ruby-oci8-1.0.0/
ruby-oci8-1.0.0/NEWS
ruby-oci8-1.0.0/ChangeLog
ruby-oci8-1.0.0/Makefile

・・・中略・・・

ruby-oci8-1.0.0/test/test_oci8.rb
ruby-oci8-1.0.0/test/test_oradate.rb
ruby-oci8-1.0.0/test/test_oranumber.rb
ruby-oci8-1.0.0/test/test_metadata.rb

解凍したらmakeする。Oracle Instant Clientをちゃんと認識しているのがわかる。

pb17:/Volumes/Repository/temp discus$ cd ruby-oci8-1.0.0
pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$ make
ruby setup.rb config
---> lib
---> lib/DBD
---> lib/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
/opt/local/bin/ruby /Volumes/Repository/temp/ruby-oci8-1.0.0/ext/oci8/extconf.rb
checking for load library path... (DYLD_LIBRARY_PATH)...
found: /Users/Shared/instantclient10_1/libclntsh.dylib.10.1 looks like an instant client.
checking for cc... ok
checking for gcc... yes
checking for LP64... no
checking for ruby header... ok
checking for OCIInitialize() in oci.h... yes
checking for OCIEnvCreate()... yes
checking for OCITerminate()... yes
checking for OCILobOpen()... yes
checking for OCILobClose()... yes
checking for OCILobCreateTemporary()... yes
checking for OCILobGetChunkSize()... yes
checking for OCILobLocatorAssign()... yes
creating ../../lib/oci8.rb from /Volumes/Repository/temp/ruby-oci8-1.0.0/ext/oci8/../../lib/oci8.rb.in
creating extconf.h
creating Makefile
<--- ext/oci8

・・・中略・・・

/usr/bin/gcc-4.0 -I. -I. -I/opt/local/lib/ruby/1.8/powerpc-darwin8.11.0 -I/Volumes/Repository/temp/ruby-oci8-1.0.0/ext/oci8 -DRUBY_EXTCONF_H=\"extconf.h\" -I/opt/local/include -fno-common -O2
-fno-common -pipe -fno-common -I/Users/Shared/instantclient10_1/sdk/include -Wall -c attr.c
cc -dynamic -bundle -undefined suppress -flat_namespace -o oci8lib.bundle oci8.o handle.o const.o env.o error.o svcctx.o server.o session.o stmt.o define.o bind.o describe.o descriptor.o
param.o lob.o oradate.o oranumber.o ocinumber.o attr.o -L"." -L"/opt/local/lib" -L. -L/opt/local/lib -lruby -L/Users/Shared/instantclient10_1 -lclntsh -lpthread -ldl -lobjc
<--- ext/oci8
<--- ext
pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$

makeが無事終了したらinstallする。(sudoで!)

pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$ sudo make install
Password:
ruby setup.rb install
---> lib
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/
install oci8.rb /opt/local/lib/ruby/site_ruby/1.8/
---> lib/DBD
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/DBD
---> lib/DBD/OCI8
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/DBD/OCI8
install OCI8.rb /opt/local/lib/ruby/site_ruby/1.8/DBD/OCI8
<--- lib/DBD/OCI8
<--- lib/DBD
<--- lib
---> ext
---> ext/oci8
mkdir -p /opt/local/lib/ruby/site_ruby/1.8/powerpc-darwin8.11.0/.
install oci8lib.bundle /opt/local/lib/ruby/site_ruby/1.8/powerpc-darwin8.11.0/.
<--- ext/oci8
<--- ext
pb17:/Volumes/Repository/temp/ruby-oci8-1.0.0 discus$

ということでruby-oci8のインストールまで無事に終了した。(Ruby初心者の私でもなんとかできました。。。。 :)

つづく・・・・




参考にしたサイトを以下に載せておきます。
OTN:Ruby on Rails on Oracle: A Simple Tutorial
OTN:Ruby on Rails with Oracle FAQ
(但し、RoRもruby-oci8関連の設定方法も参考にはなりますが古いバージョンを利用した解説なので注意が必要ですね。)

Connecting Ruby on Rails to Oracle on an Intel Mac in Leopard (Mac OSX 10.5)
上記サイトの情報は(2008/2/24時点では比較的あたらしい、しかもIntel Macのネタですね。。

ruby-oci8 - Oracle Instant Client
ruby-oci8インストール手順

Rails supports Oracle 8i, 9i, and 10g.
How to Connect To Oracle
ruby 2.xでoracleを利用する設定関連など

以下、Rails 2 と Oracleを接続するためのdatabase.ymlの設定例の引用

Database_ymd_rails_2_and_oracle

oracle_adapter.rb
oracle_adapter.rbのダウンロード先

| | | コメント (0) | トラックバック (0)

2008年2月21日 (木)

Oracle de XMLDB #25 - Relational dataをXMLへ #7のおまけ

1つ忘れていました。

何故、「Relational dataをXMLへ」というネタを取り上げようと思ったのか?

それはOTN-Jのこのスレに回答したことがきっかけだった。OTN-JのスレのネタはMacOSX環境下ではないのだけれど、Oracle XML DBを調べていたこともあり、その次いでに Eclipse for MacOSXではどうなるのか単純に知りたかっただけだった。そしてその準備段階のネタがMacOSXのEclipseを日本語化という記事だった。

ということで、前回はJDeveloperを使って試したことを書いた。今回はおまけとして、

Eclipse 3.3.1.1 for MacOSX(日本語化済み)

NetBeans IDE 6.0.1 for MacOSX

でやってみた。。(ただそれだけなんですけど・・・・)

利用したOracle JDBCドライバなどは前々回の記事を参照してください。

どれを使っても同じ結果にはなるのですが・・・・NetBeans6.0.1は随分といい感じに仕上がっているように感じた。(^^

Eclipse_s

Eclipse


Netbeans_s

Netbeans

| | | コメント (0) | トラックバック (0)

Oracle de XMLDB #25 - Relational dataをXMLへ #7のおまけ

1つ忘れていました。

何故、「Relational dataをXMLへ」というネタを取り上げようと思ったのか?

それはOTN-Jのこのスレに回答したことがきっかけだった。OTN-JのスレのネタはMacOSX環境下ではないのだけれど、Oracle XML DBを調べていたこともあり、その次いでに Eclipse for MacOSXではどうなるのか単純に知りたかっただけだった。そしてその準備段階のネタがMacOSXのEclipseを日本語化という記事だった。

ということで、前回はJDeveloperを使って試したことを書いた。今回はおまけとして、

Eclipse 3.3.1.1 for MacOSX(日本語化済み)

NetBeans IDE 6.0.1 for MacOSX

でやってみた。。(ただそれだけなんですけど・・・・)

利用したOracle JDBCドライバなどは前々回の記事を参照してください。

どれを使っても同じ結果にはなるのですが・・・・NetBeans6.0.1は随分といい感じに仕上がっているように感じた。(^^

Eclipse_s

Eclipse


Netbeans_s

Netbeans

| | | コメント (0) | トラックバック (0)

Oracle de XMLDB #24 - Relational dataをXMLへ #7

リレーショナルデータをXMLへ変換するシリーズもひとまず最終回ということで、最後は、Oracleデータベース側でXMLTypeインスタンスへ変換して、クライアントではXMLTypeインスタンスを受け取るだけの例を一つ。
環境は前回の記事を見てもらうとして早速試してみる。

Xmldb24_project Xmldb24_project_property


バックナンバー:
Oracle de XMLDB #18 - Relational dataをXMLへ #1

Oracle de XMLDB #19 - Relational dataをXMLへ #2
Oracle de XMLDB #20 - Relational dataをXMLへ #3
Oracle de XMLDB #21 - Relational dataをXMLへ #4
Oracle de XMLDB #22 - Relational dataをXMLへ #5
Oracle de XMLDB #23 - Relational dataをXMLへ #6


以下の例は、SQL/XMLとOracleが提供しているXQuery関数 ora:view()を利用し、リレーショナルデータからXMLTypeインスタンスを作るまでをOracleデータベース側で行い、クライアントではXMLTypeインスタンスを受け取るだけというもの。

package jp.macdeoracle.sample;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import oracle.jdbc.OracleResultSet;
import oracle.jdbc.pool.OracleDataSource;

import oracle.xdb.XMLType;


public class Table2Xml2
{
public Table2Xml2()
throws SQLException
{
OracleDataSource ods;
ods = new OracleDataSource();
ods.setURL(
"jdbc:oracle:thin:scott/tiger@192.168.1.20:1521:lampeye"
);

Connection conn = ods.getConnection();
Statement stmt = conn.createStatement();
OracleResultSet rs = (OracleResultSet)stmt.executeQuery(
"SELECT "
+ "XMLROOT("
+ "XMLQuery("
+ "'<ROWSET> {"
+ " for $d in ora:view(\"EMP\") "
+ " order by $d"
+ " return $d"
+ "} </ROWSET>'"
+ "RETURNING CONTENT), VERSION '1.0') "
+ "FROM dual"
);
DatabaseMetaData meta = conn.getMetaData();
System.out.println(meta.getDatabaseProductVersion());
System.out.println(meta.getDriverName()+":"+meta.getDriverVersion());
while(rs.next()) {
System.out.println(
"=======================\n"
+((XMLType)rs.getObject(1)).getStringVal()
);
}
rs.close();
stmt.close();
conn.close();
}

public static void main(String[] args) throws SQLException
{
Table2Xml2 dbXml = new Table2Xml2();
}
}


実行結果は以下の通り。

Oracle Database 11g Release 11.1.0.0.0 - Production
Oracle JDBC driver:10.1.0.3.0
=======================
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>1980-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>1981-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1982-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>2008-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>

プロセスが終了コード0で終了しました。


いろいろな方法があるので悩みそうな気もするなぁ。。。。やっぱり。。。

| | | コメント (0) | トラックバック (0)

2008年2月20日 (水)

Oracle de XMLDB #23 - Relational dataをXMLへ #6

さて、Oracleデータベース側だけでリレーショナルデータをXMLTypeインスタンスへ変換する方法は一通り試したので、今度はリレーショナルデータを取り出しクライアント側でXMLへ変換してみた。
接続するOracleデータベースはいままで通り、Oracle11g R1 EE 11.1.0.6.0 for Linux(x86)なのだが、クライアントとして利用するMacOSX 10.4.11の構成は多少異なるので以下に示しておく。

Jdeveloper1013png

IDE : Oracle JDeveloper10g Studio Edition 10.1.3.0.4 for MacOSX
Oracle XML Developer's Kit(XDK) for Java - 10.2.0.2.0 Linux Production
JDBCドライバ : Oracle Instant Client for MacOSX(PPC) 10.1.0.3.0付属の ojdbc14.jar
Oracle XML Parser : JDeveloper 10g Studio Edition for MacOSX version 10.1.3.0.4に付属するOracle XML Parser v2 (xmlparserv2.jar)
Oracle XML SQL Utility : JDeveloper 10g Studio Edition for MacOSX version 10.1.3.0.4に付属するOracle XML SQL Utiliry (xsu12.jar)

Xmldb23_project Xmldb23_project_property


バックナンバー:
Oracle de XMLDB #18 - Relational dataをXMLへ #1

Oracle de XMLDB #19 - Relational dataをXMLへ #2
Oracle de XMLDB #20 - Relational dataをXMLへ #3
Oracle de XMLDB #21 - Relational dataをXMLへ #4
Oracle de XMLDB #22 - Relational dataをXMLへ #5


以下の例では、emp表をempno順にソートして読み込み、Oracle XML SQL Utilityを利用して読み込んだResultsetからXMLへ変換。

package jp.macdeoracle.sample;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import oracle.jdbc.pool.OracleDataSource;

import oracle.xml.sql.query.OracleXMLQuery;

public class Table2Xml1
{
public Table2Xml1()
throws SQLException
{
OracleDataSource ods;
ods = new OracleDataSource();
ods.setURL(
"jdbc:oracle:thin:scott/tiger@192.168.1.20:1521:lampeye"
);

Connection conn = ods.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from emp order by empno");
OracleXMLQuery xmlqry = new OracleXMLQuery(conn, rs);

String xmlString = xmlqry.getXMLString();
DatabaseMetaData meta = conn.getMetaData();
System.out.println(meta.getDatabaseProductVersion());
System.out.println(meta.getDriverName()+":"+meta.getDriverVersion());
System.out.println("=====================\n"+xmlString);
rs.close();
stmt.close();
conn.close();
}

public static void main(String[] args) throws SQLException
{
Table2Xml1 Table2Xml1 = new Table2Xml1();
}
}


出力結果は以下の通り。ROW要素にnum属性がある以外、データベース側だけで変換した場合と内容的には変らない。
データベースサーバ側で変換まで行うか、クライアント側で変換するか、どちらが良いかといういうより、どのように負荷分散するかという戦略に合わせて考えればいいんじゃないかと思う。

Oracle Database 11g Release 11.1.0.0.0 - Production
Oracle JDBC driver:10.1.0.3.0
=====================
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>12/17/1980 0:0:0</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="2">
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>2/20/1981 0:0:0</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="3">
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>2/22/1981 0:0:0</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="4">
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>4/2/1981 0:0:0</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="5">
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>9/28/1981 0:0:0</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="6">
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>5/1/1981 0:0:0</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="7">
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>6/9/1981 0:0:0</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW num="8">
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>11/17/1981 0:0:0</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW num="9">
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>9/8/1981 0:0:0</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="10">
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>12/3/1981 0:0:0</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW num="11">
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>12/3/1981 0:0:0</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW num="12">
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1/23/1982 0:0:0</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW num="13">
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>1/1/2008 0:0:0</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>

プロセスが終了コード0で終了しました。

次回は、データベース側でXMLへの変換まで行いクライアント側ではその結果を受け取るだけの例を一つ。

| | | コメント (0) | トラックバック (0)

2008年2月19日 (火)

Oracle de XMLDB #22 - Relational dataをXMLへ #5

リレーショナルデータを取り出してからXMLへ変換する方法へ行く前にもう一つあるのを忘れてました。
SYS_XMLAGG()XMLELEMENT()XMLFOREST()関数を利用する方法。
Oracle9i R1から提供されていた関数だったが、古くから提供されていたので完璧に忘れてました。m(_ _)m
(マニュアルを調べた上でOracle9i R1から提供されていた関数と書いたが・・・もし、Oracle8i 8.1.7あたりからあったよ!というツッコミがあればご遠慮なく。)


バックナンバー:
Oracle de XMLDB #18 - Relational dataをXMLへ #1

Oracle de XMLDB #19 - Relational dataをXMLへ #2
Oracle de XMLDB #20 - Relational dataをXMLへ #3
Oracle de XMLDB #21 - Relational dataをXMLへ #4


2008/2/19 9:0:0
文字参照のミスを修正しました。


尚、他のXQueryの結果に関してはいままでもこちらでは制御できない改行が挿入された結果だったり、逆に取り除かれた結果が返されたりしていたが、前述の関数を利用した場合は全体に整形用改行が入るのではなく、SYS_XMLAGG()関数でマージされたXMLELEMENT()の結果からは改行は取り除かれているが、XML宣言やルート要素タグの後には何故か改行が付加される。(要素間の改行やインデントなどは目視する際に見やすくするためなので、あっても無くていいのだが、なんとも気持ちの悪い付け方をしてくれる。。。)

また、いままで実行してきた各SQL文は、それぞれ2回実行してからalter system flush shared_poolを1度実行した後に実行してある。(実行環境は以前と同じ

SQL*Plus: Release 10.1.0.3.0 - Production on 火 2月 19 00:00:09 2008

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

> conn scott/tiger@lampeye
接続されました。
SCOTT> set long 4000
SCOTT> set pagesize 1000
SCOTT> select
2 sys_xmlagg(
3 xmlelement("ROW",
4 xmlforest(
5 empno,
6 ename,
7 job,
8 mgr,
9 hiredate,
10 sal,
11 comm,
12 deptno
13 ))) xmldoc
14 from
15 emp
16 order by
17 empno;

XMLDOC
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW><EMPNO>9999</EMPNO><ENAME>ほげ</ENAME><JOB>ENGINEER</JOB><MGR>7566</MGR><HI
REDATE>2008-01-01</HIREDATE><SAL>2500</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>
7369</EMPNO><ENAME>SMITH</ENAME><JOB>CLERK</JOB><MGR>7902</MGR><HIREDATE>1980-12
-17</HIREDATE><SAL>800</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7499</EMPNO><EN
AME>ALLEN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02-20</HIREDAT
E><SAL>1600</SAL><COMM>300</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7521</EMPN
O><ENAME>WARD</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02-22</HIR
EDATE><SAL>1250</SAL><COMM>500</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7566</
EMPNO><ENAME>JONES</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-04-02<
/HIREDATE><SAL>2975</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7654</EMPNO><ENAME
>MARTIN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-09-28</HIREDATE>
<SAL>1250</SAL><COMM>1400</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7698</EMPNO
><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-05-01</HIRE
DATE><SAL>2850</SAL><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7782</EMPNO><ENAME>CLAR
K</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-06-09</HIREDATE><SAL>24
50</SAL><DEPTNO>10</DEPTNO></ROW><ROW><EMPNO>7839</EMPNO><ENAME>KING</ENAME><JOB
>PRESIDENT</JOB><HIREDATE>1981-11-17</HIREDATE><SAL>5000</SAL><DEPTNO>10</DEPTNO
></ROW><ROW><EMPNO>7844</EMPNO><ENAME>TURNER</ENAME><JOB>SALESMAN</JOB><MGR>7698
</MGR><HIREDATE>1981-09-08</HIREDATE><SAL>1500</SAL><COMM>0</COMM><DEPTNO>30</DE
PTNO></ROW><ROW><EMPNO>7900</EMPNO><ENAME>JAMES</ENAME><JOB>CLERK</JOB><MGR>7698
</MGR><HIREDATE>1981-12-03</HIREDATE><SAL>950</SAL><DEPTNO>30</DEPTNO></ROW><ROW
><EMPNO>7902</EMPNO><ENAME>FORD</ENAME><JOB>ANALYST</JOB><MGR>7566</MGR><HIREDAT
E>1981-12-03</HIREDATE><SAL>3000</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7934<
/EMPNO><ENAME>MILLER</ENAME><JOB>CLERK</JOB><MGR>7782</MGR><HIREDATE>1982-01-23<
/HIREDATE><SAL>1300</SAL><DEPTNO>10</DEPTNO></ROW></ROWSET>


経過: 00:00:00.41
SCOTT>


ちなみに、もうお気づきだと思うが、上記のようにorder by句を付けたとしてもエラーにはならないが指定した列でソートされることはないのでご注意を!
ソートした結果が欲しい場合には副問い合せを利用するとよいだろう。


SCOTT> select
2 sys_xmlagg(
3 xmlelement("ROW",
4 xmlforest(
5 empno,
6 ename,
7 job,
8 mgr,
9 hiredate,
10 sal,
11 comm,
12 deptno
13 ))) xmldoc
14 from
15 (select * from emp order by empno) alias_of_emp
16 /

XMLDOC
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW><EMPNO>7369</EMPNO><ENAME>SMITH</ENAME><JOB>CLERK</JOB><MGR>7902</MGR><HIRE
DATE>1980-12-17</HIREDATE><SAL>800</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>749
9</EMPNO><ENAME>ALLEN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02
-20</HIREDATE><SAL>1600</SAL><COMM>300</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPN
O>7521</EMPNO><ENAME>WARD</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>198
1-02-22</HIREDATE><SAL>1250</SAL><COMM>500</COMM><DEPTNO>30</DEPTNO></ROW><ROW><
EMPNO>7566</EMPNO><ENAME>JONES</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE
>1981-04-02</HIREDATE><SAL>2975</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7654</
EMPNO><ENAME>MARTIN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-09-2
8</HIREDATE><SAL>1250</SAL><COMM>1400</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO
>7698</EMPNO><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981
-05-01</HIREDATE><SAL>2850</SAL><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7782</EMPNO
><ENAME>CLARK</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-06-09</HIRE
DATE><SAL>2450</SAL><DEPTNO>10</DEPTNO></ROW><ROW><EMPNO>7839</EMPNO><ENAME>KING
</ENAME><JOB>PRESIDENT</JOB><HIREDATE>1981-11-17</HIREDATE><SAL>5000</SAL><DEPTN
O>10</DEPTNO></ROW><ROW><EMPNO>7844</EMPNO><ENAME>TURNER</ENAME><JOB>SALESMAN</J
OB><MGR>7698</MGR><HIREDATE>1981-09-08</HIREDATE><SAL>1500</SAL><COMM>0</COMM><D
EPTNO>30</DEPTNO></ROW><ROW><EMPNO>7900</EMPNO><ENAME>JAMES</ENAME><JOB>CLERK</J
OB><MGR>7698</MGR><HIREDATE>1981-12-03</HIREDATE><SAL>950</SAL><DEPTNO>30</DEPTN
O></ROW><ROW><EMPNO>7902</EMPNO><ENAME>FORD</ENAME><JOB>ANALYST</JOB><MGR>7566</
MGR><HIREDATE>1981-12-03</HIREDATE><SAL>3000</SAL><DEPTNO>20</DEPTNO></ROW><ROW>
<EMPNO>7934</EMPNO><ENAME>MILLER</ENAME><JOB>CLERK</JOB><MGR>7782</MGR><HIREDATE
>1982-01-23</HIREDATE><SAL>1300</SAL><DEPTNO>10</DEPTNO></ROW><ROW><EMPNO>9999</
EMPNO><ENAME>ほげ</ENAME><JOB>ENGINEER</JOB><MGR>7566</MGR><HIREDATE>2008-01-01<
/HIREDATE><SAL>2500</SAL><DEPTNO>20</DEPTNO></ROW></ROWSET>


経過: 00:00:00.41


さらに前回までに紹介した、DBMS_XMLGEN.GETXMLやDBMS_XMLGEN.GETXMLTYPE()では関数に渡すクエリーにorder by句を付加すればソートできる。

SCOTT> select
2 dbms_xmlgen.getxml(sqlQuery=>'select * from emp order by empno') xmldoc
3 from dual
4 /

XMLDOC
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>80-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>81-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>82-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>08-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>



経過: 00:00:00.65
SCOTT>


これは書く必要は無かったかもしれないが念のため。
XMLQuery()関数や、XMLTable()関数ではXQueryのFLWOR式でorder by句を使えばソートできる。

SCOTT> select
2 xmlroot(xmldoc.column_value, version '1.0')
3 from
4 xmltable(
5 '<ROWSET>{
6 for $d in ora:view("EMP")
7 order by $d
8 return $d
9 }</ROWSET>'
10 ) xmldoc
11 /

XMLROOT(XMLDOC.COLUMN_VALUE,VERSION'1.0')
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>1980-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>1981-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1982-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>2008-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
</ROWSET>


経過: 00:00:00.30
SCOTT>

次回へつづく。

| | | コメント (0) | トラックバック (0)

2008年2月13日 (水)

Oracle de XMLDB #21 - Relational dataをXMLへ #4

さて、リレーショナルデータをXMLへ変換する方法の4つ目は、以前から提供されているPL/SQLのDBMS_XMLGENパッケージのgetXML()関数を利用する例です。
前回利用したgetXMLType()関数がXMLTypeインスタンスを返してくるのに対して、こちらはCLOB型のインスタンスを返してきます。しかも一時LOBが生成されます。(一時LOBを作成しない関数もあります)




バックナンバー:

Oracle de XMLDB #18 - Relational dataをXMLへ #1
Oracle de XMLDB #19 - Relational dataをXMLへ #2
Oracle de XMLDB #20 - Relational dataをXMLへ #3


おお〜っ、XMLTypeインスタンスを返す他のどれよりも遅いですね。今回利用した関数は内部で一時LOBを作る為に負荷が高いのですかね??(あくまで個人的な推測です。)

SCOTT> select
2 dbms_xmlgen.getXML(sqlQuery=>'select * from emp') as xmldoc
3 from dual
4 /

XMLDOC
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>08-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>80-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>81-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>82-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
</ROWSET>



経過: 00:00:00.65
SCOTT>

今回まででOracle11gデータベース側だけでリレーショナルデータをXMLへ変換する方法の簡単な実験は終わりです。
次回はクライアント側でリレーショナルデータを取り出してからXMLへ変換する方法でも試してみますか・・・・

| | | コメント (0) | トラックバック (0)

2008年2月12日 (火)

Oracle de XMLDB #20 - Relational dataをXMLへ #3

さて前回に引き続きリレーショナルデータをXMLへ変換する方法の3つ目は、以前から提供されているPL/SQLのDBMS_XMLGENパッケージのgetXMLType()関数を利用する例です。



バックナンバー:

Oracle de XMLDB #18 - Relational dataをXMLへ #1

Oracle de XMLDB #19 - Relational dataをXMLへ #2


では早速取りかかる。

SCOTT> select
2 dbms_xmlgen.getXMLType(sqlQuery=>'select * from emp') as column_value
3 from dual
4 /

COLUMN_VALUE
--------------------------------------------------------------------------------
<ROWSET>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>08-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>80-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>81-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>82-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
</ROWSET>


経過: 00:00:00.46

おや〜、SQL/XMLXMLQUERY関数XMLTABLE関数だけを利用した結果とは決定的な違いが1つあるのにお気づきだろうか?

そう、この時点で既にインデントされ改行が付加され人が読み易い形式に整形されている。Oracleさんの気まぐれなのか・・・・・・

DBMS_XMLGEN.getXMLType()を利用した場合もXMLQUERY関数XMLTABLE関数だけを利用した場合同様XML宣言は無い。

いつものXMLROOT()関数でXML宣言を付加してみる。

SCOTT> select
2 xmlroot(
3 dbms_xmlgen.getXMLType(sqlQuery=>'select * from emp')
4 ,version '1.0'
5 ) as column_value
6 from dual
7 /

COLUMN_VALUE
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>08-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>80-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>81-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>81-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>81-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>81-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>82-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
</ROWSET>


経過: 00:00:00.58
SCOTT>

PL/SQLパッケージを利用している影響なのだろう。SQL/XML関数だけの場合よりは負荷はおおきいようだ。

ではまた。

| | | コメント (0) | トラックバック (0)

2008年2月11日 (月)

Oracle de XMLDB #19 - Relational dataをXMLへ #2

Relational dataからXMLを生成する方法の2つ目は、SQL/XMLXMLQUERY()とOracleが提供しているXQuery関数であるora:view()を組み合わせる方法。



バックナンバー:
Oracle de XMLDB #18 - Relational dataからXMLへ #1

では、早速試してみる。

SCOTT> select * from emp
2 /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
9999 ほげ ENGINEER 7566 08-01-01 2500 20
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10

13行が選択されました。

経過: 00:00:00.00
SCOTT>
SCOTT> select
2 xmlquery(
3 '<ROWSET>{
4 for $d in ora:view("EMP")
5 return $d
6 }</ROWSET>'
7 returning content
8 ) as COLUMN_VALUE
9 from dual
10 /

COLUMN_VALUE
--------------------------------------------------------------------------------
<ROWSET><ROW><EMPNO>9999</EMPNO><ENAME>ほげ</ENAME><JOB>ENGINEER</JOB><MGR>7566<
/MGR><HIREDATE>2008-01-01</HIREDATE><SAL>2500</SAL><DEPTNO>20</DEPTNO></ROW><ROW
><EMPNO>7369</EMPNO><ENAME>SMITH</ENAME><JOB>CLERK</JOB><MGR>7902</MGR><HIREDATE
>1980-12-17</HIREDATE><SAL>800</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7499</E
MPNO><ENAME>ALLEN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02-20<
/HIREDATE><SAL>1600</SAL><COMM>300</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>75
21</EMPNO><ENAME>WARD</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02
-22</HIREDATE><SAL>1250</SAL><COMM>500</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPN
O>7566</EMPNO><ENAME>JONES</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>198
1-04-02</HIREDATE><SAL>2975</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7654</EMPN
O><ENAME>MARTIN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-09-28</H
IREDATE><SAL>1250</SAL><COMM>1400</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>769
8</EMPNO><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-05-
01</HIREDATE><SAL>2850</SAL><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7782</EMPNO><EN
AME>CLARK</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-06-09</HIREDATE
><SAL>2450</SAL><DEPTNO>10</DEPTNO></ROW><ROW><EMPNO>7839</EMPNO><ENAME>KING</EN
AME><JOB>PRESIDENT</JOB><HIREDATE>1981-11-17</HIREDATE><SAL>5000</SAL><DEPTNO>10
</DEPTNO></ROW><ROW><EMPNO>7844</EMPNO><ENAME>TURNER</ENAME><JOB>SALESMAN</JOB><
MGR>7698</MGR><HIREDATE>1981-09-08</HIREDATE><SAL>1500</SAL><COMM>0</COMM><DEPTN
O>30</DEPTNO></ROW><ROW><EMPNO>7900</EMPNO><ENAME>JAMES</ENAME><JOB>CLERK</JOB><
MGR>7698</MGR><HIREDATE>1981-12-03</HIREDATE><SAL>950</SAL><DEPTNO>30</DEPTNO></
ROW><ROW><EMPNO>7902</EMPNO><ENAME>FORD</ENAME><JOB>ANALYST</JOB><MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE><SAL>3000</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMP
NO>7934</EMPNO><ENAME>MILLER</ENAME><JOB>CLERK</JOB><MGR>7782</MGR><HIREDATE>198
2-01-23</HIREDATE><SAL>1300</SAL><DEPTNO>10</DEPTNO></ROW></ROWSET>
経過: 00:00:00.10
SCOTT>

XMLTABLE()関数を使った場合と変るところはないが、関数本来の使い道からすればXMLQUERY()関数を使う方が自然に感じる。(まあ、どちらを使っても可能であることはまちがいないのですが。。)


最後に、前回も行ったようにXMLROOT()関数を利用しXML宣言を追加したXMLTypeインスタンスを取得してみた。

SCOTT> select
2 xmlroot(
3 xmlquery(
4 '<ROWSET>{
5 for $d in ora:view("EMP")
6 return $d
7 }</ROWSET>'
8 returning content
9 ),
10 version '1.0'
11 ) as column_value
12 from dual
13 /

COLUMN_VALUE
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>2008-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>1980-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>1981-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1982-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
</ROWSET>


経過: 00:00:00.58
SCOTT>

ではまた。

| | | コメント (0) | トラックバック (0)

2008年2月10日 (日)

Oracle de XMLDB #18 - Relational dataをXMLへ #1

Oracle XML DBリポジトリ関連の話はしばらく脇に置いておき、これから数回に分けてリレーショナル表からXMLを生成する方法について、備忘録の意味も含めて書いておくことにする。

● 環境データ

Server : Dynabook SS SX/210LNLW (RAM:768MB) 
CentOS5
Oracle11g EE R1 11.1.0.6.0 for Linux x86

Client : Apple PowerMac G5 Dual 2.7Ghz (RAM:1GB)
MacOSX Tiger 10.4.11 Server
Oracle10g Instant Client 10g R1 for MacOSX(PPC)

表を問い合わせXMLTypeインスタンスを返す方法は複数ある。まず最初に紹介するのは、XMLTABLE()関数のXqueryでora:view()関数を使う方法。

XMLTABLE()関数は、SQL/XMLで提供される標準関数で、本来はXMLデータをリレーショナルフォーマットへマッピングする為に利用する関数なのだが、今回は本来の目的とは異なる使い方をしてみた。
XMLTABLE()関数でリレーショナル表からXMLTypeインスタンスを取得するには、OracleがXXQuery向に提供している ora:view()関数を利用する。(Oracleが独自に拡張したXQuery向け関数の名前空間は、ora:)
ora:view()関数は、XQueryの標準関数であるfn:doc()関数を利用する感覚で利用できる。


以下の例では、XMLTABLE()関数でCOLUMNS句を指定していしないのがポイント。尚、COLUMN_VALUE疑似列を利用しています。

Last login: Sat Feb  9 06:46:43 on console
Welcome to Darwin!
G5Server:˜ discus$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 土 2月 9 15:30:44 2008

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

SCOTT> conn scott/tiger@lampeye
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT> set pagesize 1000
SCOTT> set long 4000
SCOTT> set sqlterm off
SCOTT> set linesize 80
SCOTT> l
1 select xmldoc.COLUMN_VALUE
2 from
3 xmltable(
4 '<ROWSET>{
5 for $d in ora:view("EMP")
6 return $d
7 }</ROWSET>'
8* ) xmldoc
SCOTT> /

COLUMN_VALUE
--------------------------------------------------------------------------------
<ROWSET><ROW><EMPNO>9999</EMPNO><ENAME>ほげ</ENAME><JOB>ENGINEER</JOB><MGR>7566<
/MGR><HIREDATE>2008-01-01</HIREDATE><SAL>2500</SAL><DEPTNO>20</DEPTNO></ROW><ROW
><EMPNO>7369</EMPNO><ENAME>SMITH</ENAME><JOB>CLERK</JOB><MGR>7902</MGR><HIREDATE
>1980-12-17</HIREDATE><SAL>800</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7499</E
MPNO><ENAME>ALLEN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02-20<
/HIREDATE><SAL>1600</SAL><COMM>300</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>75
21</EMPNO><ENAME>WARD</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-02
-22</HIREDATE><SAL>1250</SAL><COMM>500</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPN
O>7566</EMPNO><ENAME>JONES</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>198
1-04-02</HIREDATE><SAL>2975</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMPNO>7654</EMPN
O><ENAME>MARTIN</ENAME><JOB>SALESMAN</JOB><MGR>7698</MGR><HIREDATE>1981-09-28</H
IREDATE><SAL>1250</SAL><COMM>1400</COMM><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>769
8</EMPNO><ENAME>BLAKE</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-05-
01</HIREDATE><SAL>2850</SAL><DEPTNO>30</DEPTNO></ROW><ROW><EMPNO>7782</EMPNO><EN
AME>CLARK</ENAME><JOB>MANAGER</JOB><MGR>7839</MGR><HIREDATE>1981-06-09</HIREDATE
><SAL>2450</SAL><DEPTNO>10</DEPTNO></ROW><ROW><EMPNO>7839</EMPNO><ENAME>KING</EN
AME><JOB>PRESIDENT</JOB><HIREDATE>1981-11-17</HIREDATE><SAL>5000</SAL><DEPTNO>10
</DEPTNO></ROW><ROW><EMPNO>7844</EMPNO><ENAME>TURNER</ENAME><JOB>SALESMAN</JOB><
MGR>7698</MGR><HIREDATE>1981-09-08</HIREDATE><SAL>1500</SAL><COMM>0</COMM><DEPTN
O>30</DEPTNO></ROW><ROW><EMPNO>7900</EMPNO><ENAME>JAMES</ENAME><JOB>CLERK</JOB><
MGR>7698</MGR><HIREDATE>1981-12-03</HIREDATE><SAL>950</SAL><DEPTNO>30</DEPTNO></
ROW><ROW><EMPNO>7902</EMPNO><ENAME>FORD</ENAME><JOB>ANALYST</JOB><MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE><SAL>3000</SAL><DEPTNO>20</DEPTNO></ROW><ROW><EMP
NO>7934</EMPNO><ENAME>MILLER</ENAME><JOB>CLERK</JOB><MGR>7782</MGR><HIREDATE>198
2-01-23</HIREDATE><SAL>1300</SAL><DEPTNO>10</DEPTNO></ROW></ROWSET>


経過: 00:00:00.11
SCOTT>


これだとXML宣言が無い。ではどうやってXML宣言を付加するかと言えば、XMLRoot()関数を使う。
XMLRoot()関数は2005年まではSQL/XMLの標準関数だったが現在は標準関数ではない。但し、Oracleでは利用できるのでXMLRoot()関数を利用してXML宣言を付加することができる。

では早速試してみよう!。

SCOTT> select
2 xmlroot(xmldoc.column_value,version '1.0')
3 from
4 xmltable(
5 '<ROWSET>{
6 for $d in ora:view("EMP")
7 return $d
8 }</ROWSET>'
9 ) xmldoc
10 /

XMLROOT(XMLDOC.COLUMN_VALUE,VERSION'1.0')
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<ROWSET>
<ROW>
<EMPNO>9999</EMPNO>
<ENAME>ほげ</ENAME>
<JOB>ENGINEER</JOB>
<MGR>7566</MGR>
<HIREDATE>2008-01-01</HIREDATE>
<SAL>2500</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>1980-12-17</HIREDATE>
<SAL>800</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7499</EMPNO>
<ENAME>ALLEN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-20</HIREDATE>
<SAL>1600</SAL>
<COMM>300</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7521</EMPNO>
<ENAME>WARD</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-02-22</HIREDATE>
<SAL>1250</SAL>
<COMM>500</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7566</EMPNO>
<ENAME>JONES</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-04-02</HIREDATE>
<SAL>2975</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-28</HIREDATE>
<SAL>1250</SAL>
<COMM>1400</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7698</EMPNO>
<ENAME>BLAKE</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-05-01</HIREDATE>
<SAL>2850</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7782</EMPNO>
<ENAME>CLARK</ENAME>
<JOB>MANAGER</JOB>
<MGR>7839</MGR>
<HIREDATE>1981-06-09</HIREDATE>
<SAL>2450</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7839</EMPNO>
<ENAME>KING</ENAME>
<JOB>PRESIDENT</JOB>
<HIREDATE>1981-11-17</HIREDATE>
<SAL>5000</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
<ROW>
<EMPNO>7844</EMPNO>
<ENAME>TURNER</ENAME>
<JOB>SALESMAN</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-09-08</HIREDATE>
<SAL>1500</SAL>
<COMM>0</COMM>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7900</EMPNO>
<ENAME>JAMES</ENAME>
<JOB>CLERK</JOB>
<MGR>7698</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>950</SAL>
<DEPTNO>30</DEPTNO>
</ROW>
<ROW>
<EMPNO>7902</EMPNO>
<ENAME>FORD</ENAME>
<JOB>ANALYST</JOB>
<MGR>7566</MGR>
<HIREDATE>1981-12-03</HIREDATE>
<SAL>3000</SAL>
<DEPTNO>20</DEPTNO>
</ROW>
<ROW>
<EMPNO>7934</EMPNO>
<ENAME>MILLER</ENAME>
<JOB>CLERK</JOB>
<MGR>7782</MGR>
<HIREDATE>1982-01-23</HIREDATE>
<SAL>1300</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
</ROWSET>

経過: 00:00:00.33
SCOTT>

あれ、XMLRoot()関数に渡しているXMLTABLE()関数で取得したXMLTypeインスタンスには改行がありませんでしたが、XMLROOT()関数を利用すると改行が付加されたXMLTypeインスタンスが返されます。また、その影響だと思うが経過時間も増えている。

こりゃ参った〜という感じです。以前もOracle XML DBに関するエントリでwhitespaceのpreserve/stripは現時点のOracle XML DBでは明示的に制御できないということは書いていましたが思わぬところでwhitespaceかってに付加されるという動きには戸惑いますね。(利用する側で制御できるようにしてもらったほうがスッキリするように感じます。)


トレースして詳細に追跡したわけでは無いのであくまで想像の域を脱していないのですが、もしかすると、XMLROOT()関数はXMLTypeインスタンスを受け取りXML宣言を付加して返してくる際、XML宣言を追加したDOMを生成した上でXMLTypeインスタンスを返してくるのではないかと考えています。(くどいようですが、これは私の推測に過ぎませんので誤解なさらないようにしてください。)

時間があればもっと深〜〜〜く追っかけてみたい現象なのでとりあえず、TODOリストに追加しておきますかね。

では次回へつづく。

| | | コメント (0) | トラックバック (1)

2008年1月17日 (木)

Sun が MySQLを買収

Sun、MySQLを買収

いや〜、驚きましたね!
PostgreSQLのサポートを提供しているSunですがMySQLを買収するとは。

InnoDBなどがOracleに買収されてしまい、なんとなくいやな雰囲気(Oracleさんも買収買収でバックマンになりはじめたねぇ〜と感じ始めていた)を感じていた今日このごろ。Sunによる買収なのでデータベースの世界もおもしろい状況になりそうな雰囲気を感じます。Falconの開発にも拍車がかかる事でしょうね。期待していますよ〜。:)

Oracle AppsLabのエントリでも書かれてますね - Acquisition Wednesday

| | | コメント (0) | トラックバック (0)

2008年1月 2日 (水)

Oracle de XMLDB #17

「XMLマスター:プロフェッショナル(データベース) 試験」のサンプル問題がXML技術者育成推進委員会のサイトに掲載されている。
この問題の幾つかは直接XML DBを操作して確認することができる問題なのだが、それらの問題をOracle11g R1 11.1.0.6.0を利用して試す場合には次の2点には注意しておいたほうがよいだろう。

● 最初はSQL*Plusの仕様による影響。

SQL*PlusのXQueryコマンドで試す場合以下のように@がSQL*PlusのSTARTコマンとして実行されてしまう。
SCOTT> xquery
2 for $n in fn:doc("/public/scott/xml/example2.xml")/list
3 return
4 <codeList>
5 <code> {
6 @code
SP2-0310: ファイル"code.sql"をオープンできません。
6 .
SCOTT>

これを回避する方法は以前も紹介した方法でSQL*PlusのSTARTコマンドして実行されることを回避できる。

SCOTT> xquery
2 for $n in fn:doc("/public/scott/xml/example2.xml")/list
3 return
4 <codeList>
5 <code>{
6 (::) @code
7 }</code>
・・・以下省略・・・

「XMLマスター:プロフェッショナル(データベース) 試験のサンプル問題」の問題2をOracle11g R1 11.1.0.6.0で試す場合には忘れずに!


● もう一つはテキストノードのwhitespaceの取扱いに関するもの。

Oracle11g R1 11.1.0.6.0のXMLDBではテキストノードに対するwhitespaceの取扱いは常にstripであること。以下の例を見ていただければ一目瞭然。
ということで「XMLマスター:プロフェッショナル(データベース) 試験のサンプル問題」の問題3をOracle11g R1 11.1.0.6.0で実行した場合<space> </space>というノードの空白は削除されてしまうのでこれまたOracle11g R1ではそのような実装になっているということをお忘れなく。

SCOTT> !cat sample.xml
<?xml version="1.0" encoding="utf-8"?>
<space> </space>

SCOTT> declare
2 r boolean;
3 begin
4 r := dbms_xdb.createresource(
5 '/public/scott/xml/sample.xml',
6 bfilename('SCOTT_XMLDIR','sample.xml'),
7 nls_charset_id('AL32UTF8'));
8 commit;
9 end;
10 /

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

SCOTT>
SCOTT> xquery
2 fn:doc("/public/scott/xml/sample.xml")/space
3 /

Result Sequence
--------------------------------------------------------------------------------
<space/>

SCOTT>


ちなみにオープンソースのSaxon Bではテキストノードのwhitespaceの扱いは指定可能なのでXMLマスタープロフェッショナル(データベース)のようなベンダー比依存の試験勉強の為だけであればSaxon Bを使ったほうが無難かもしれない。ただ、プロジェクトでOracle11g R1のXML DBを利用するのであればOracle11g R1を利用して検証したほうがいいのは言うまでもない。

以下、saxon 9.0.0J(saxon B 9.0.0.2のjava版)を利用して上記2点に関連する部分を実行した例

環境:MacOSX Server 10.4.11 Tiger

● SAXON B 9.0.0.2(java版)をダウンロード、unzipする。

今回は/User/Sharedで作業を行うことにした。Webブラウザでダウンロードしてもいいのだが折角なので全部コマンドで行っちゃいましょう。
curlコマンドSAXON B 9.0.0.2(Java版)をダウンロード後、unzip。

G5Server:˜ oracle$ java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-241)
Java HotSpot(TM) Client VM (build 1.5.0_13-121, mixed mode)
G5Server:˜ oracle$
G5Server:˜ oracle$ cd /Users/Shared/
G5Server:/Users/Shared oracle$
G5Server:/Users/Shared oracle$ curl -L -o saxonb9-0-0-2j.zip http://prdownloads.sourceforge.net/saxon/saxonb9-0-0-2j.zip
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1862k 100 1862k 0 0 144k 0 0:00:12 0:00:12 --:--:-- 144k

G5Server:/Users/Shared oracle$ unzip saxonb9-0-0-2j.zip -d saxonb9-0-0-2j
Archive: saxonb9-0-0-2j.zip
inflating: saxonb9-0-0-2j/saxon9-ant.jar
inflating: saxonb9-0-0-2j/saxon9-dom.jar
inflating: saxonb9-0-0-2j/saxon9-dom4j.jar
inflating: saxonb9-0-0-2j/saxon9-jdom.jar
inflating: saxonb9-0-0-2j/saxon9-s9api.jar
inflating: saxonb9-0-0-2j/saxon9-sql.jar
inflating: saxonb9-0-0-2j/saxon9-xom.jar
inflating: saxonb9-0-0-2j/saxon9-xpath.jar
inflating: saxonb9-0-0-2j/saxon9-xqj.jar
inflating: saxonb9-0-0-2j/saxon9.jar
G5Server:/Users/Shared oracle$ cd saxonb9-0-0-2j


● XMLファイルとXQueryファイルを用意する。

前述したXMLマスタープロフェッショナル(データベース)試験のサンプル問題元にXMLファイルとXQueryファイルを準備しておく。
SAXON Bのコマンドラインでは直接XQueryを記述できずXQueryを記述したファイルを指定する必要がある為。)

G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ ll
total 10584
-rw-r--r-- 1 oracle wheel 444 Dec 31 17:38 example.xml
-rw-r--r-- 1 oracle wheel 40 Dec 31 17:38 query1.xql
-rw-r--r-- 1 oracle wheel 58 Dec 31 17:38 query2.xql
-rw-r--r-- 1 oracle wheel 199 Dec 31 17:38 query_a.xql
-rw-r--r-- 1 oracle wheel 188 Dec 31 17:38 query_b.xql
-rw-r--r-- 1 oracle wheel 204 Dec 31 17:38 query_c.xql
-rw-r--r-- 1 oracle wheel 189 Dec 31 17:38 query_d.xql
-rw-r--r-- 1 oracle wheel 57 Dec 31 17:38 result.xml
-rw-r--r-- 1 oracle wheel 108 Dec 31 17:38 sample.xml
-rw-r--r-- 1 oracle wheel 56 Dec 31 17:38 sample2.xml
-rw-r--r-- 1 oracle wheel 23963 Nov 30 14:35 saxon9-ant.jar
-rw-r--r-- 1 oracle wheel 110602 Nov 30 14:35 saxon9-dom.jar
-rw-r--r-- 1 oracle wheel 30000 Nov 30 14:35 saxon9-dom4j.jar
-rw-r--r-- 1 oracle wheel 32743 Nov 30 14:35 saxon9-jdom.jar
-rw-r--r-- 1 oracle wheel 110818 Nov 30 14:35 saxon9-s9api.jar
-rw-r--r-- 1 oracle wheel 45598 Nov 30 14:35 saxon9-sql.jar
-rw-r--r-- 1 oracle wheel 45218 Nov 30 14:35 saxon9-xom.jar
-rw-r--r-- 1 oracle wheel 43536 Nov 30 14:35 saxon9-xpath.jar
-rw-r--r-- 1 oracle wheel 173255 Nov 30 14:35 saxon9-xqj.jar
-rw-r--r-- 1 oracle wheel 4737705 Nov 30 14:35 saxon9.jar
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$


● SAXON BのXQueryのコマンド形式は以下のようにして確認できます。

G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query -?
Saxon 9.0.0.2J from Saxonica
Usage: java net.sf.saxon.Query [options] query {param=value}...
Options:
-cr:classname Use specified CollectionURIResolver class
-dtd:on|off Validate using DTD
-expand:on|off Expand defaults defined in schema/DTD
-explain[:filename] Display compiled expression tree
-ext:[on|off] Allow|Disallow external Java functions
-l:on|off Line numbering for source document
-mr:classname Use specified ModuleURIResolver class
-o:filename Send output to named file
-outval:recover|fatal Handling of validation errors on result document
-p Recognize Saxon file extensions and query parameters
-pipe:push|pull Execute internally in push or pull mode
-projection:[on|off] Use|Don't use source document projection
-r:classname Use URIResolver class
-repeat:N Repeat N times for performance measurement
-s:file|URI Provide initial context document
-sa Schema-aware query (requires Saxon-SA)
-strip:all|none|ignorable Strip whitespace text nodes
-t Display version and timing information
-tree:tiny|linked Select tree model
-T[:classname] Use TraceListener class
-TJ Trace calls to external Java functions
-u Names are URLs not filenames
-val:strict|lax Validate using schema
-wrap:on|off Wrap result sequence in XML elements
-x:classname Parser (XMLReader) used for source files
-xi:on|off Expand XInclude on all documents
-xmlversion:1.0|1.1 Version of XML to be handled
-? Display this message
param=value Set query string parameter
+param=value Set query document parameter
!option=value Set serialization option
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$

SAXON B「XMLマスター:プロフェッショナル(データベース) 試験のサンプル問題」の問題2を試す。

G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ cat example.xml
<?xml version="1.0" encoding="utf-8"?>
<logList>
<list code="w001" message="警告1"/>
<list code="w002" message="警告2"/>
<list code="e001" message="エラー1"/>
<list code="e002" message="エラー2"/>
<day date="2007-12-01">
<log time="10:00:00" code="w001"/>
<log time="14:00:00" code="e001"/>
</day>
<day date="2007-12-02">
<log time="13:00:00" code="e002"/>
<log time="15:00:00" code="e001"/>
</day>
</logList>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ cat -n query_a.xql
1 <result>{
2 let $doc := fn:doc("example.xml")
3 for $log in $doc//log
4 return
5 <log>{
6 $log/../@date,
7 $log/@time,
8 $doc//list[@code eq $log/@code]/@message
9 }</log>
10 }</result>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query query_a.xql
<?xml version="1.0" encoding="UTF-8"?>
<result>
<log date="2007-12-01" time="10:00:00" message="警告1"/>
<log date="2007-12-01" time="14:00:00" message="エラー1"/>
<log date="2007-12-02" time="13:00:00" message="エラー2"/>
<log date="2007-12-02" time="15:00:00" message="エラー1"/>
</result>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ cat -n query_b.xql
1 <result>{
2 let $doc := fn:doc("example.xml")
3 for $log in $doc//log
4 return
5 <log>{
6 ../@date,
7 @time,
8 ../../list[@code = $log/@code]/@message
9 }</log>
10 }</result>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query query_b.xql
Error on line 6 of file:/Users/Shared/saxonb9-0-0-2j/query_b.xql:
XPDY0002: The context item is not set
Query processing failed: Run-time errors were reported
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ cat -n query_c.xql
1 <result>{
2 let $doc := fn:doc("example.xml")
3 for $day in $doc//day
4 return
5 <log>{
6 $day/@date,
7 $day/log/@time,
8 $doc//list[@code eq $day/log/@code]/@message
9 }</log>
10 }</result>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query query_c.xql
Error on line 7 of file:/Users/Shared/saxonb9-0-0-2j/query_c.xql:
XQDY0025: Cannot create an element having two attributes with the same name: @time
Query processing failed: Run-time errors were reported
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ cat -n query_d.xql
1 <result>{
2 let $doc := fn:doc("example.xml")
3 for $day in $doc//day
4 return
5 <log>{
6 @date,
7 log/@time,
8 ../list[@code = $day/log/@code]/@message
9 }</log>
10 }</result>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query query_d.xql
Error on line 6 of file:/Users/Shared/saxonb9-0-0-2j/query_d.xql:
XPDY0002: The context item for axis step attribute::attribute(date, xs:anyAtomicType) is undefined
Query processing failed: Run-time errors were reported


SAXON Bではテキストノードのwhitespaceの取扱いを-stripオプションで指示できる。

G5Server:/Users/shared/saxonb9-0-0-2j oracle$ cat -n sample2.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <space> </space>
G5Server:/Users/shared/saxonb9-0-0-2j oracle$ cat -n query2.xql
1 fn:doc("sample2.xml")/space
G5Server:/Users/shared/saxonb9-0-0-2j oracle$
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query query2.xql
<?xml version="1.0" encoding="UTF-8"?>
<space> </space>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query -strip:all query2.xql
<?xml version="1.0" encoding="UTF-8"?>
<space/>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query -strip:none query2.xql
<?xml version="1.0" encoding="UTF-8"?>
<space> </space>
G5Server:/Users/Shared/saxonb9-0-0-2j oracle$ java -cp saxon9.jar net.sf.saxon.Query -strip:ignorable query2.xql
<?xml version="1.0" encoding="UTF-8"?>
<space> </space>




● バックナンバー
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?
Oracle de XMLDB #4
Oracle de XMLDB #5 - Oracle11g環境再構築完了
Oracle de XMLDB #6 - Linux x86版再び。
Oracle de XMLDB #7 - 何かが違う!?
Oracle de XMLDB #8 - またまた少々脱線
Oracle de XMLDB #9 - またまた少々脱線の続き
Oracle de XMLDB #10 - 三度脱線
Oracle de XMLDB #11 - 三度脱線のおまけ
Oracle de XMLDB #12
Oracle de XMLDB #13
Oracle de XMLDB #14
Oracle de XMLDB #15
Oracle de XMLDB #16

| | | コメント (0) | トラックバック (0)

2007年12月17日 (月)

Oracle de XMLDB #16

Oracle de XMLDB #13でも書いたxquery宣言のencodingがサポートされていないということも含めてOracle11g R1の以下マニュアルに記載されているので要確認。(備忘録)

Oracle® XML DB Developer's Guide 11g Release 1 (11.1) - Oracle XML DB Support for XQuery

前述のマニュアルにも記載されているが、boundary-spaceは未サポートとか。とりあえず試してみる。

Last login: Sun Dec 16 14:15:06 on console
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Sat Dec 15 19:59:13 2007 from 192.168.1.19
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 日 12月 16 18:03:04 2007

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

> conn scott/tiger
接続されました。
SCOTT> set sqlterm off
SCOTT> set long 4000
SCOTT> set pagesize 1000
SCOTT> xquery
2 declare boundary-space preserve;
3 <result>
4 {
5 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
6 return
7 <greeting> { fn:concat("Hello, ", $i/text())
8 } </greeting>
9* } </result>
10 /
ERROR:
ORA-19107: 無効なXQueryX - 構成がサポートされていません - boundary-space preserve declaration

SCOTT> edit
file afiedt.bufが書き込まれました。

1 xquery
2 declare boundary-space strip;
3 <result>
4 {
5 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
6 return
7 <greeting> { fn:concat("Hello, ", $i/text())
8 } </greeting>
9* } </result>
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>

Oracle11g R1 11.6.0.1.0のXQueryでは、boundary-space preserveが未サポートということでboundary-space stripで処理しているということなんだね。




● バックナンバー
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?
Oracle de XMLDB #4
Oracle de XMLDB #5 - Oracle11g環境再構築完了
Oracle de XMLDB #6 - Linux x86版再び。
Oracle de XMLDB #7 - 何かが違う!?
Oracle de XMLDB #8 - またまた少々脱線
Oracle de XMLDB #9 - またまた少々脱線の続き
Oracle de XMLDB #10 - 三度脱線
Oracle de XMLDB #11 - 三度脱線のおまけ
Oracle de XMLDB #12
Oracle de XMLDB #13
Oracle de XMLDB #14
Oracle de XMLDB #15

| | | コメント (0) | トラックバック (0)

2007年12月16日 (日)

Oracle de XMLDB #15

さて、まだ脱線は続きます。(いつ戻るんだ〜〜!)

Oracle de XMLDB #13でXqueryのencodingが指定できないと書いたが、どうしても文字コードを変えたい場合はどうするんだろうか?

思い出したのがOracle de XMLDB #7 - 何かが違うでも書いたクライアント側のNLS_LANG環境変数で制御する方法。




● バックナンバー
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?
Oracle de XMLDB #4
Oracle de XMLDB #5 - Oracle11g環境再構築完了
Oracle de XMLDB #6 - Linux x86版再び。
Oracle de XMLDB #7 - 何かが違う!?
Oracle de XMLDB #8 - またまた少々脱線
Oracle de XMLDB #9 - またまた少々脱線の続き
Oracle de XMLDB #10 - 三度脱線
Oracle de XMLDB #11 - 三度脱線のおまけ
Oracle de XMLDB #12
Oracle de XMLDB #13
Oracle de XMLDB #14


●このテスト環境の文字エンコーディングの概略図
NLS_LANG環境変数を変換したい文字コードへ変更すればうまく変換できるはず・・・・


Diagram_encoding

● まずは全てUTF-8で統一させている場合の例から。

MacOSXのterminalの文字エンコーディングもUTF-8にすることをお忘れなく。
Utf8


> conn scott/tiger
接続されました。
SCOTT> !echo $NLS_LANG
japanese_japan.AL32UTF8

SCOTT> set sqlterm off
SCOTT> set pagesize 1000
SCOTT> set long 4000
SCOTT>
SCOTT> select
2 xmlquery(
3 'xquery version "1.0";
4 <result>
5 {
6 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
7 return $i
8 }
9 </result>'
10 returning content
11 )
12 from
13* dual
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";<RESULT>{FOR$IINFN:DOC("/PUBLIC/SCOTT/XML/ADDRESSLI
--------------------------------------------------------------------------------
<result><電話番号 区分="自宅">03-1234-5555</電話番号>
<電話番号 区分="携帯">090-4321-7878</電話番号>
<電話番号 区分="携帯">070-7777-8798</電話番号>
<電話番号 区分="自宅">06-1234-5555</電話番号>
<電話番号 区分="会社">06-6860-0001</電話番号>
<電話番号 区分="携帯">090-6666-7878</電話番号>
<電話番号 区分="携帯">080-9999-8798</電話番号>
<電話番号 区分="会社">06-6860-0001</電話番号>
<電話番号 区分="携帯">090-0066-0108</電話番号>
<電話番号 区分="携帯">090-3020-2897</電話番号>
</result>

SCOTT> exit


● クライアント側のNLS_LANG=japanese_japan.JA16SJISTILDE、MacOSXのTerminalの文字エンコーディングもShift_JISへ変更して実行する。

Sjis

[oracle@corydoras ˜]$ export NLS_LANG=japanese_japan.JA16SJISTILDE
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 金 12月 14 23:10:29 2007

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

> conn scott/tiger
接続されました。

SCOTT> !echo $NLS_LANG
japanese_japan.JA16SJISTILDE

SCOTT> set sqlterm off
SCOTT> set pagesize 1000
SCOTT> set long 4000
SCOTT>
SCOTT> select
2 xmlquery(
3 'xquery version "1.0";
4 <result>
5 {
6 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
7 return $i
8 }
9 </result>'
10 returning content
11 )
12 from
13* dual
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";<RESULT>{FOR$IINFN:DOC("/PUBLIC/SCOTT/XML/ADDRESSLI
--------------------------------------------------------------------------------
<result><電話番号 区分="自宅">03-1234-5555</電話番号>
<電話番号 区分="携帯">090-4321-7878</電話番号>
<電話番号 区分="携帯">070-7777-8798</電話番号>
<電話番号 区分="自宅">06-1234-5555</電話番号>
<電話番号 区分="会社">06-6860-0001</電話番号>
<電話番号 区分="携帯">090-6666-7878</電話番号>
<電話番号 区分="携帯">080-9999-8798</電話番号>
<電話番号 区分="会社">06-6860-0001</電話番号>
<電話番号 区分="携帯">090-0066-0108</電話番号>
<電話番号 区分="携帯">090-3020-2897</電話番号>
</result>


これではなんとなく分かりずらいですね。ということで結果をHTMLへスプールして確認してみましょう。

SCOTT> set markup html on spool on
SCOTT> set echo off
<br>
SCOTT> spool result.html
<br>
SCOTT> /
<br>

・・・・・中略・・・・・

SCOTT> spo off
<br>
SCOTT> set markup html off
<br>
SCOTT> set echo on
SCOTT> !cat result.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
<meta name="generator" content="SQL*Plus 11.1.0">
<style type="text/css">
body {font:10pt Arial,Helvetica,sans-serif;
color:black; background:White;}
p {font:10pt Arial,Helvetica,sans-serif;
color:black; background:White;}
table,tr,td {font:10pt Arial,Helvetica,sans-serif;
color:Black; background:#f7f7e7;
padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;}
th {font:bold 10pt Arial,Helvetica,sans-serif;
color:#336699; background:#cccc99; padding:0px 0px 0px 0px;}
h1 {font:16pt Arial,Helvetica,Geneva,sans-serif;
color:#336699; background-color:White;
border-bottom:1px solid #cccc99;
margin-top:0pt; margin-bottom:0pt;
padding:0px 0px 0px 0px;}
h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif;
color:#336699; background-color:White;
margin-top:4pt; margin-bottom:0pt;}
a {font:9pt Arial,Helvetica,sans-serif;
color:#663300; background:#ffffff;
margin-top:0pt; margin-bottom:0pt; vertical-align:top;}
</style>
<title>
SQL*Plus レポート
</title>
</head>
<body>
SCOTT> /
<br>
<p>
<table border="1" width="90%" summary="Script output">
<tr>
<th scope="col">
XMLQUERY('XQUERYVERSION"1.0";<RESULT>{FOR$IINFN:DOC("/PUBLIC/SCOTT/XML/ADDRESSLI
</th>
</tr>
<tr>
<td>
<result><電話番号 区分="自宅">03-1234-5555</電話番号>
<電話番号 区分="携帯">090-
4321-7878</電話番号>
<電話番号 区分="携帯">070-7777-8798</電話番号>
<電話番号 区
分="自宅">06-1234-5555</電話番号>
<電話番号 区分="会社">06-6860-0001</電話番号>

<電話番号 区分="携帯">090-6666-7878</電話番号>
<電話番号 区分="携帯">080-9999-87
98</電話番号>
<電話番号 区分="会社">06-6860-0001</電話番号>
<電話番号 区分="携帯
">090-0066-0108</電話番号>
<電話番号 区分="携帯">090-3020-2897</電話番号>
</resu
lt>
</td>
</tr>
</table>
<p>

SCOTT> spo off
<br>
</body>
</html>

SCOTT>

SQL*PlusでHTMLとして結果をSPOOLするコマンドがありますが、その機能を利用して文字エンコーディングがShift_JISになっているか確認しています。(太字で赤色で強調してある部分)
うまくShift_JISへ変換できているようです。
NLS_LANG環境変数で制御するしかないのはかなりトリッキーではあるけれど・・・)

| | | コメント (0) | トラックバック (0)

2007年12月14日 (金)

Oracle de XMLDB #14

またXMLマスタープロフェッショナル(DB)試験ネタからは少々脱線している・・・。と気付きつつも、気になるとやらずに居られない性分なので。



● バックナンバー

Oracle de XMLDB #1

Oracle de XMLDB #2

Oracle de XMLDB #3 - Oracle10g XEではどうよ?

Oracle de XMLDB #4

Oracle de XMLDB #5 - Oracle11g環境再構築完了

Oracle de XMLDB #6 - Linux x86版再び。

Oracle de XMLDB #7 - 何かが違う!?

Oracle de XMLDB #8 - またまた少々脱線

Oracle de XMLDB #9 - またまた少々脱線の続き

Oracle de XMLDB #10 - 三度脱線

Oracle de XMLDB #11 - 三度脱線のおまけ

Oracle de XMLDB #12

Oracle de XMLDB #13


前々回にも書いたがSQL*Plusでは、";"を入力してしまうとそれまで入力したSQL文を実行してくれる。

ただ、SQL文や、XQueryコマンドの実行には問題ないのだが、SQL/XMLでは少々困った問題を引き起こすんです。

以下の例をご覧ください。

> conn scott/tiger
接続されました。
SCOTT>
SCOTT>
SCOTT> select
2 xmlquery(
3 'xquery version "1.0";
ERROR:
ORA-01756: 引用符付き文字列が正しく終了していません

そうなんです!。
xmlquery()関数内あっても ";"(セミコロン)を入力する必要があるのですが、入力した時点で実行しようとしてしまうんです。(><)

これには困りました!。

無理矢理な対処として、エラーになっても気にせず前述のように入力後、SQL*Plusのeditコマンドで編集する方法もありますが、今回はマニュアル Oracle® XML DB Developer's Guide 11g Release 1 (11.1) - Using Namespaces with XQueryにも書かれている方法でやってみましょう。

● ";"(セミコロン)の後にXQeuryのコメントを付加する方法

SCOTT> 
SCOTT> select
2 xmlquery(
3 'xquery version "1.0"; (::)
4 declare namespace mo = "http://192.168.1.20/my_namespace"; (::)
5 declare function mo:phoneNumber($phone)
6 {
7 $phone/text()
8 }; (::)
9 (: query body :)
10 <result>
11 {
12 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
13 return
14 <greeting>
15 { fn:concat("Hello, ", mo:phoneNumber($i)) }
16 </greeting>
17 }
18 </result>'
19 returning content
20 )
21 from
22 dual
23 .
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";(::)DECLARENAMESPACEMO="HTTP://192.168.1.20/MY_NAME
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>


● 次は、";"(セミコロン)を無視させる方法。

SCOTT> set sqlterm off
SCOTT> select
2 xmlquery(
3 'xquery version "1.0";
4 declare namespace mo = "http://192.168.1.20/my_namespace";
5 declare function mo:phoneNumber($phone)
6 {
7 $phone/text()
8 };
9 (: query body :)
10 <result>
11 {
12 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
13 return
14 <greeting>
15 { fn:concat("Hello, ", mo:phoneNumber($i)) }
16 </greeting>
17 }
18 </result>'
19 returning content
20 )
21 from
22 dual
23 .
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";DECLARENAMESPACEMO="HTTP://192.168.1.20/MY_NAMESPAC
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>

SQL/XMLやXQueryを実行する場合には、SET SQLTERMINATOR OFFを使って ";"を無視させた方が便利で簡単ですね。

| | | コメント (0) | トラックバック (0)

2007年12月13日 (木)

Oracle de XMLDB #13

● バックナンバー
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?
Oracle de XMLDB #4
Oracle de XMLDB #5 - Oracle11g環境再構築完了
Oracle de XMLDB #6 - Linux x86版再び。
Oracle de XMLDB #7 - 何かが違う!?
Oracle de XMLDB #8 - またまた少々脱線
Oracle de XMLDB #9 - またまた少々脱線の続き
Oracle de XMLDB #10 - 三度脱線
Oracle de XMLDB #11 - 三度脱線のおまけ
Oracle de XMLDB #12


さて、前回SQL*PlusのXQueryコマンドのXQuery宣言ではversion及びencodingが指定できなかったり、先頭行にコメントが書けなかったがSQL/XMLのxmlquery()関数内ではどうなのか確認しておく。
環境はいつものとおり、Oracle11g EE R1 11.1.0.6.0 for Linux x86へMacOSXのTerminalからssh接続して行った。

Last login: Thu Dec 13 07:54:08 on console
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Wed Dec 12 21:21:43 2007 from 192.168.1.19
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 木 12月 13 17:03:36 2007

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

> conn scott/tiger
接続されました。
SCOTT> l
1 select
2 xmlquery(
3 'xquery version "1.0" encoding "utf-8";
4 declare namespace mo = "http://192.168.1.20/my_namespace";
5 declare function mo:phoneNumber($phone)
6 {
7 $phone/text()
8 };
9 (: Query body :)
10 <result>
11 {
12 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
13 return
14 <greeting>
15 { fn:concat("Hello, ", mo:phoneNumber($i)) }
16 </greeting>
17 }
18 </result>'
19 returning content
20 )
21 from
22 dual
SCOTT> /
dual
*
行22でエラーが発生しました。:
ORA-19284: バージョン宣言におけるエンコーディング指定はサポートされていません

xmlquery()関数では、SQL*PlusのXQueryコマンドとは異なりencodingは指定できないがversionだけは指定できるようだ。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 select
2 xmlquery(
3 'xquery version "1.0";
4 declare namespace mo = "http://192.168.1.20/my_namespace";
5 declare function mo:phoneNumber($phone)
6 {
7 $phone/text()
8 };
9 (: Query body :)
10 <result>
11 {
12 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
13 return
14 <greeting>
15 { fn:concat("Hello, ", mo:phoneNumber($i)) }
16 </greeting>
17 }
18 </result>'
19 returning content
20 )
21 from
22* dual
SCOTT> /

XMLQUERY('XQUERYVERSION"1.0";DECLARENAMESPACEMO="HTTP://192.168.1.20/MY_NAMESPAC
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>


ではSQL*PlusのXQueryコマンドでは先頭行がコメントである場合、XQueryとは解釈されずSQL文として解釈されてしまっていたがxmlquery()関数ではそのような書き方でも問題はない。
SQL*PlusのXQueryコマンドは、XQuery宣言ではなく、SQL*PlusのXQueryコマンドだということを忘れないようにしたい。(混乱しそうだが。。。。)

SCOTT> edit
file afiedt.bufが書き込まれました。

1 select
2 xmlquery(
3 '(: コメントを先頭に :)
4 xquery version "1.0";
5 declare namespace mo = "http://192.168.1.20/my_namespace";
6 declare function mo:phoneNumber($phone)
7 {
8 $phone/text()
9 };
10 (: Query body :)
11 <result>
12 {
13 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
14 return
15 <greeting>
16 { fn:concat("Hello, ", mo:phoneNumber($i)) }
17 </greeting>
18 }
19 </result>'
20 returning content
21 )
22 from
23* dual
SCOTT> /

XMLQUERY('(:コメントを先頭に:)XQUERYVERSION"1.0";DECLARENAMESPACEMO="HTTP://192.
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>


SCOTT>

| | | コメント (0) | トラックバック (0)

Oracle de XMLDB #12

● バックナンバー
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?
Oracle de XMLDB #4
Oracle de XMLDB #5 - Oracle11g環境再構築完了
Oracle de XMLDB #6 - Linux x86版再び。
Oracle de XMLDB #7 - 何かが違う!?
Oracle de XMLDB #8 - またまた少々脱線
Oracle de XMLDB #9 - またまた少々脱線の続き
Oracle de XMLDB #10 - 三度脱線
Oracle de XMLDB #11 - 三度脱線のおまけ


DB Magazineに連載されていたXMLマスター実践講座 プロフェッショナル(DB)試験対応 第2回 XQueryの概要にあるLIST1:サンプルのXqueryとほぼ同じクエリをOracle11g R1(Linux x86)のSQL*Plusで試してみる。

Last login: Wed Dec 12 22:18:10 on ttyp1
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$
G5Server:˜ oracle$ ssh oracle@corydoras
oracle@corydoras's password:
Last login: Wed Dec 12 23:03:58 2007 from 192.168.1.19
[oracle@corydoras ˜]$
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 水 12月 12 23:04:46 2007

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

●まず、addresslist.xmlファイルをOracle XDBリポジトリへ事前に登録しておく。
簡単なXQueryで問い合わせ内容を確認しておきましょう。

> conn scott/tiger
接続されました。
SCOTT>
SCOTT> set long 4000
SCOTT> l
1 xquery
2 for $i in fn:doc("/public/scott/xml/addresslist.xml")
3 return $i
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><アドレスブック><連絡先><氏名><姓>赤坂</姓
><名>元</名></氏名><住所/><メール><アドレス 区分="プライベート">G.Akasaka@coldma
il.jp</アドレス><アドレス 区分="携帯">G.Akasaka@hardbank.ne.jp</アドレス><アドレ
ス 区分="携帯">G.Akasaka@dokodemo.ne.jp</アドレス></メール><電話><電話番号 区分=
"自宅">03-1234-5555</電話番号><電話番号 区分="携帯">090-4321-7878</電話番号><電
話番号 区分="携帯">070-7777-8798</電話番号></電話></連絡先><連絡先><氏名><姓>麻
布</姓><名>太郎</名></氏名><住所/><メール><アドレス 区分="会社">T.Azabu@taro.co.
jp</アドレス><アドレス 区分="プライベート">T.Azabu@coolmail.jp</アドレス><アドレ
ス 区分="携帯">T.Azabu@a_phone.ne.jp</アドレス><アドレス 区分="携帯">T.Azabu@bu.
ne.jp</アドレス></メール><電話><電話番号 区分="自宅">06-1234-5555</電話番号><電
話番号 区分="会社">06-6860-0001</電話番号><電話番号 区分="携帯">090-6666-7878</
電話番号><電話番号 区分="携帯">080-9999-8798</電話番号></電話></連絡先><連絡先><
氏名><姓>代々木</姓><名>武</名></氏名><住所/><メール><アドレス 区分="プライベー
ト">Y.Takeshi@ba-net.ne.jp</アドレス><アドレス 区分="携帯">Y.Takeshi@dokodemo.ne
.jp</アドレス><アドレス 区分="携帯">Y.Takeshi@bu.ne.jp</アドレス></メール><電話>
<電話番号 区分="会社">06-6860-0001</電話番号><電話番号 区分="携帯">090-0066-0108
</電話番号><電話番号 区分="携帯">090-3020-2897</電話番号></電話></連絡先></アド
レスブック>

● 本来なら問題ない構文から試してみると。。。

SCOTT> (: サンプル :)
2 xquery version "1.0" encoding "utf-8";
(: サンプル :)
*
行1でエラーが発生しました。:
ORA-00928: SELECTキーワードがありません。

あ〜〜〜、XQueryのコメントとして解釈されているのかと思ったが、SQL*PlusではXQueryのコメントから始めることはできないようだ。

NOTE 1)
SQL*PlusでXQueryを利用する場合、XQueryのコメント文から入力してしまうと通常のSQL文と判断してしてしまうので要注意!

NOTE 2)
SQL*Plusでは、";"は文を実行するという意味があるのでXQueryのPrologで入力してしまうとそこまで入力したXQueryを解析、実行してしまうので要注意!

SQL*PLusでXqueryを入力する際のちょっとしたテクニックとして、一旦前述のように入力後SQL*Plusのeditコマンドでviなどを起動し編集すればこの問題は回避できる。以下はeditコマンドを利用してviで入力した。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 (: サンプル :)
2 xquery version "1.0" encoding "utf-8";
3 declare namespace mo = "http://192.168.1.20/my_namespace";
4 declare function mo:phoneNumber($phone)
5 {
6 $phone/text()
7 };
8 (: Query Body :)
9 <result>
10 {
11 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
12 return
13 <greeting>
14 { fn:concat( "Hello, ", mo:phoneNumber($i)) }
15 </greeting>
16 }
17* </result>
18 /
SP2-0552: バインド変数"CONCAT"が宣言されていません。

やはり、XQueryのコメント(::)から開始するとSQL文だと判断されてしまうようだ。


XQueryコマンドの前にあるXQueryのコメントを削除する。XQueryとしては正しいのだが、SQL*Plusでは別のエラーが発生する。
以下のエラーメッセージから version "1.0" の部分が文法エラーとされてしまっている。恐らくencodeingも文法エラー扱いになるだろう。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 xquery version "1.0" encoding "utf-8";
2 declare namespace mo = "http://192.168.1.20/my_namespace";
3 declare function mo:phoneNumber($phone)
4 {
5 $phone/text()
6 };
7 (: Query Body :)
8 <result>
9 {
10 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
11 return
12 <greeting>
13 { fn:concat( "Hello, ",mo:phoneNumber($i)) }
14 </greeting>
15 }
16* </result>
SCOTT> /
ERROR:
ORA-19114: XPST0003 - XQuery式を解析中にエラーが発生しました: LPX-00801:
XQuery syntax error at '"1.0"'
1 version "1.0" encoding "utf-8";
- ^

ということで、versionとencodingを削除してみると、わ〜〜、パチパチ。上手くできました。
XQueryの文法では正しくてもSQL*PlusやOracle11gの実装により文法エラーとされてしまうケースもあるので、Oracle11gでXMLマスタープロフェッショナル(DB)の勉強をする際には要注意。

SCOTT> edit
file afiedt.bufが書き込まれました。

1 xquery
2 declare namespace mo = "http://192.168.1.20/my_namespace";
3 declare function mo:phoneNumber($phone)
4 {
5 $phone/text()
6 };
7 (: Query Body :)
8 <result>
9 {
10 for $i in fn:doc("/public/scott/xml/addresslist.xml")//電話番号
11 return
12 <greeting>
13 { fn:concat("Hello, ",mo:phoneNumber($i)) }
14 </greeting>
15 }
16* </result>
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<result><greeting>Hello, 03-1234-5555</greeting><greeting>Hello, 090-4321-7878</
greeting><greeting>Hello, 070-7777-8798</greeting><greeting>Hello, 06-1234-5555<
/greeting><greeting>Hello, 06-6860-0001</greeting><greeting>Hello, 090-6666-7878
</greeting><greeting>Hello, 080-9999-8798</greeting><greeting>Hello, 06-6860-000
1</greeting><greeting>Hello, 090-0066-0108</greeting><greeting>Hello, 090-3020-2
897</greeting></result>





Ang?lique Kidjo - Djin Djin - Gimme Shelter

話はがらりと変わり、昨日はAngelique Kidjoライブご招待へ当選したので、ウチのおチビちゃんのお守りは奥さんに任せてdrmarさんをとブルーノート東京へ(久々だな〜)

曲目全ては覚えていないのだが、

Gimme Shelterをはじめ (アルバムでは、Joss Stone Joss Stone - Introducing Joss Stone
をフィーチャーしている)アルバム Djin Djinからの曲。私もdrmarさん同様、全く知らなかったアーティストなのだが、グラミー賞には過去5回ノミネートされたことがある実力派。西アフリカはペナン共和国出身。その影響だろうか、日本はもう冬なのだが、曲は太陽を感じるような曲が多い。

アルバム Djin Djinでは、ビーター・ガブリエル、カルロス・サンタナ、ジョス・ストーンなど多彩なゲストをフィーチャーしている。

YouTube - Gimme Shelter(Feat. Joss Stone)
YouTube - Africa Calling
YouTube - Voodoo Child
YouTube - Tumba


Angelique_kidjo

| | | コメント (0) | トラックバック (0)

2007年12月12日 (水)

大規模Web サイトでのMySQL導入方法および事例紹介」セミナー

20071204001

先週のことだが、大規模Web サイトでのMySQL導入方法および事例紹介」セミナーが六本木にあるスウェーデン大使館内 オーデトリアムで開催されるということで行ってきた。MySQL Conference 2007の内容と多少重複する内容もあったが、DBマガジンでおなじみのMySQL 株式会社 松信 嘉範氏のセッションは興味深い内容だった。

会場となったスウェーデン大使館のオーデトリアムだけでは足りず、ロビーにも椅子とモニターが用意されていたが会場自体が小さいので全体で100名程度で満席となっていた。(オーデトリアム内で立ち見だったし。)

| | | コメント (0) | トラックバック (0)

2007年11月22日 (木)

Oracle de XMLDB #8 - またまた少々脱線

久々にOracle11gのXML DBネタなのだが、XQueryなどのXMLマスタープロフェッショナル(データベース)絡みのネタからはまた脱線。SQL/XMLネタを一つ。

以前、Oracle10g R1/R2上でRSS FEEDをPL/SQLで取得してOracle Application Expressで表示なんてことをやっていた。
(33回も連載してたっけ。。。。)

Mac De PL/SQL RSS Reader #1
Mac De PL/SQL RSS Reader #2

それらのエントリで、参照するXML文書の文字エンコーディングとデータベースキャラクタセットが異なると文字化けを起こしてしまうHttpUriType型の仕様?のことを書いていたのだが、先日リリースされたOracle11g R1ではどうなったのか?


確かめてみた! 

まずは、SQL/XMLを利用した例。(以下は、Oracle11g R1 for Linux x86を利用。)

XML文書の文字エンコーディングはUTF-8、Oracleデータベースのキャラクタセットは、JA16SJISTILDE。

SCOTT> r
1 select *
2 from
3 xmltable(
4 'for $i in //*
5 return $i'
6 passing httpuritype('https://discus-hamburg.cocolog-nifty.com/test/atom.xml').getXML()
7* )
passing httpuritype('https://discus-hamburg.cocolog-nifty.com/test/atom.xml').getXML()
*
行6でエラーが発生しました。:
ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00244: 小なり不等号 ('<')文字の使用が無効です。 (&lt;を使用します)
Error at line 30
中にエラーが発生しました
ORA-06512: "SYS.XMLTYPE", 行5
ORA-06512: "SYS.HTTPURITYPE", 行97


SCOTT>


あ〜〜〜〜やっぱり、ダメね〜。上記はXML文書のパースエラーとして現れているのだが、その原因は文字化けなのである。


XML文書とOracleデータベースのキャラクタセットが異なる場合(前述の例では、UTF-8とSJIS)にはHttpUriType型を利用せず、UTL_HTTPパッケージを利用し、

UTL_HTTP.SET_HEADER(v_req, 'Content-Type', 'text/xml;charset=UTF-8');

のようにすることで文字化けせずにXML文書を取込むことができる。
尚、XML文書、データベースキャラクタセットが同一である場合(XML文書がUTF-8でデータベースキャラクタセットがAL32UTF8のような場合)には文字化けは発生しない。これは私個人の想像なのだが、HttpUriType型が裏でHTTP通信する際に利用する文字エンコーディングはデータベースキャラクタセットから導出しているのだと思われる。今のところHttpUriType型には文字エンコーディングは指定できないのでオラクルさんが方針を変えない限り文字化けの回避策は前述の2つしかないだろう。

2007/11/28追記
もしどうしてもXML文書の文字エンコーディングとデータベースキャラクタセットが異なる環境でHTTPURITYPE型を使いたいということであれば、代替策としてUTL_HTTPパッケージを利用したユーザ定義型を作成すれば可能かもしれない。
(あくまで推測。。あとで試してみるか=>TODO)

以前、DBMS_XMLPARSER.PARSE(parser, uri)を使ってFEEDを直接参照した場合も同様のエラーだったが、UTL_HTTPパッケージを利用して文字化けを回避した。
以下URL参照のこと。(下記のエントリの内容はOracle10g R1/R2で試したものです。)

Mac De PL/SQL RSS Reader #3

SQL/XML機能が充実してきたので今後はあまり使わなくなるかもしれないが、次いでなのでDBMS_XMLPARSER.PARSER(parser,uri)でも試してみた。
DBMS_XMLPARSER.PARSER(parser, uri)でもHttpUriType型を利用しているだろうから結果は同じはずだ。
(また、XMLマスタープロフェッショナル(データベース)ネタからは離れてく〜〜。w)

以前作成したコードを少々手直してOracle11gで実行!(Oracle SQL Developer for MacOSXを利用した)
Xmldb8_jdev


● ソース

CREATE OR REPLACE PROCEDURE GET_FEED(i_url IN VARCHAR2)
AS
v_url VARCHAR2(32767);
v_myParser DBMS_XMLPARSER.Parser;
v_rssDoc DBMS_XMLDOM.DomDocument;
v_xml XMLTYPE;

PROCEDURE println(str IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(str);
END;

PROCEDURE println
(
i_text IN CLOB
)
IS
v_tempStr VARCHAR(32767);
v_numOfPieces PLS_INTEGER;
BEGIN
v_numOfPieces := CEIL(LENGTH(i_text)/1000);
FOR i IN 1..v_numOfPieces LOOP
DBMS_OUTPUT.PUT_LINE(SUBSTR(i_text, ((i-1)*1000), 1000));
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(
'println(CLOB) internal procedure:'
|| sqlerrm()
);
RAISE;
END println;

--****************************************************************************
--* Main
--****************************************************************************
BEGIN
DBMS_OUTPUT.ENABLE(200000);
println('begin...');


v_url := i_url;
IF v_url IS NULL THEN
RAISE_APPLICATION_ERROR(-20000, 'URLを指定してください。');
END IF;

v_myParser := DBMS_XMLPARSER.NEWPARSER();
DBMS_XMLPARSER.PARSE(v_myParser, v_url);
v_rssDoc := DBMS_XMLPARSER.GETDOCUMENT(v_myParser);
v_xml := DBMS_XMLDOM.GETXMLTYPE(v_rssDoc);
println('DBMS_XMLPARSERバージョン:'||DBMS_XMLPARSER.GETRELEASEVERSION());
println('DBMS_XMLDOMバージョン :'||DBMS_XMLDOM.GETVERSION(v_rssDoc));
println(' ');
println('=== パース済みDOMから取得したRSSソース ===');
println(XmlType.GETCLOBVAL(v_xml));
println('====================');
println(' ');
DBMS_XMLPARSER.FREEPARSER(v_myParser);

println('...End');

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(
'Main Procedure:'
|| sqlerrm()
);
RAISE;

END GET_FEED;


● 結果

RSS FEED(UTF-8)をデータベースキャラクタセット(JA16SJISTILDE)から取込んだ場合。
Connecting to the database Oracle11g R1 Scott(leaffish) - JA16SJISTILDE.
ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00244: 小なり不等号 ('<')文字の使用が無効です。 (&lt;を使用します)
Error at line 30
中にエラーが発生しました
ORA-06512: "SCOTT. GET_FEED", 行161
ORA-06512: 行6
begin...
Main Procedure:ORA-31011: XML解析に失敗しました
ORA-19202: XML処理
LPX-00244: 小なり不等号 ('<')文字の使用が無効です。 (&lt;を使用します)
Error at line 30
中にエラーが発生しました
Process exited.
Disconnecting from the database Oracle11g R1 Scott(leaffish) - JA16SJISTILDE.


RSS FEED(UTF-8)をデータベースキャラクタセット(AL32UTF8)から取込んだ場合。文字エンコーディングが同じ場合は問題なし!
ところで、Oracle11g R1でも、DBMS_XMLPARSERのパージョンは10.1.0.2.0なのね〜。(^^;;;

Connecting to the database Oracle11g R1 Scott(guppy) - AL32UTF8.
begin...
DBMS_XMLPARSERバージョン:10.1.0.2.0
DBMS_XMLDOMバージョン :1.0

=== パース済みDOMから取得したRSSソース ===
<?xml version="1.0" encoding="utf-8"?>

<feed xmlns="http://www.w3.org/2005/Atom">
<title>Mac De Oracle</title>
<link rel="alternate" type="text/html" href="https://discus-hamburg.cocolog-nifty.com/mac_de_oracle/" />
<link rel="service.post" type="application/x.atom+xml" href="http://app.cocolog-nifty.com/t/atom/weblog/blog_id=121907" title="Mac De Oracle" />
<id>tag:app.cocolog-nifty.com,2003:weblog-121907</id>
<updated>2007-11-19T09:16:39Z</updated>


・・・・中略・・・・


<summary>前回、何かが違うと感じたと書いたがそれはなにか? 実はwhitespaceに関す...</summary>
<author>
<name>discus</name>
</author>
<category term="Linux" />
<category term="Oracle" />
<category term="Oracle Database 11g" />
<category term="XML" />




</entry>

</feed>
====================

...End
Process exited.
Disconnecting from the database Oracle11g R1 Scott(guppy) - AL32UTF8.


尚、Oracle11g R1ではセキュリティが強化されている。(Oracle10g R2以前のセキュリティレベルにもできるようだが。。)上記のコードをそのまま実行しようとするとエラーになる。

ということで、セキュリティ関連も含めて続きは次回ということで。



おまけ

以下の資料はSQL/XMLって何? ってとこからスタートする方にはよいかも..。
オープンソースカンファレンス2007 .DBの資料「XQuery、XPath 及び SQL / XML に関する標準化動向と今後の取組み状況」 (PDF)

以下のサイトにはSQL/XML関連の情報がいろいろ(英語です。)
SQLX.org

その他、OTN-Jなどにもあったかも。。。(未確認)

| | | コメント (0) | トラックバック (0)

2007年10月31日 (水)

Oracle de XMLDB #7 - 何かが違う!?

前回、何かが違うと感じたと書いたがそれはなにか? 実はwhitespaceに関することだった。(OTN-Jへ投稿したものの、XMLの部屋の状況を見ているだけに、レスは付かないかもしれないな〜と思いつつも、ダメもとで、とりあえず尋ねてみた。)



バックナンバー:

Oracle de XMLDB #1

Oracle de XMLDB #2

Oracle de XMLDB #3 - Oracle10g XEではどうよ?

Oracle de XMLDB #4 - fizzbuzzから

Oracle de XMLDB #5 - Oracle11g環境再構築完了

Oracle de XMLDB #6 - Linux x86版再び。

前置きはこのくらいにして、
初めてこの違いに気付いたのはWindows環境で遊び始めたときだった。Windows環境ではデータベースキャラクタセットはAL32UTF8、SQL*Plusは当然ながらJA16SJISになっている。データベースキャラクタセットとClientのNLS_LANGが異なるとコード変換が発生して、XMLはUTF-8からSHIFT_JISへ変換されて帰ってくる。まあ、エンコードが違う程度なら驚かなかったと思うのだが、whitespace strip/preserveまで異なると、見た目が違うので、あれれ???? と驚いてしまったわけなのですよ。
Oracle10gでも似たような話はあったので理由は同じなのかもしれないですが・・

注)OTN-Jのフォーラムへ投稿した内容は、以降に記載した内容を再編集したものです。

まずは、XMLファイルの登録。(windows/Linux環境とも全く同じことをやってます。)
●test1.xml

<?xml version="1.0" encoding="UTF-8"?>
<テスト>
<内容>あいうえお</内容>
</テスト>

●test2.xml

<?xml version="1.0" encoding="UTF-8"?>
<test>
<content>abcdefg</content>
</test>

●上記XMLファイルを以下のようにしてXMLリポジトリへ登録。

SCOTT> l
1 declare
2 r boolean;
3 begin
4 r := dbms_xdb.createresource(
5 '/public/scott/xml/test1.xml',
6 bfilename('SCOTT_XMLDIR','test1.xml'),
7 nls_charset_id('AL32UTF8'));
8 r := dbms_xdb.createresource(
9 '/public/scott/xml/test2.xml',
10 bfilename('SCOTT_XMLDIR','test2.xml'),
11 nls_charset_id('AL32UTF8'));
12* end;
SCOTT> /

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

SCOTT> commit;

コミットが完了しました。


● Windows版Oracle11g(データベースキャラクタセット:AL32UTF8, NLS_LANG=japanese_japan.JA16SJIS)
文字エンコーディング以外は元のXMLファイルを再現している。

SCOTT> xquery
2 let $d := fn:doc("/public/scott/xml/test1.xml")
3 return $d
4 /

Result Sequence
------------------------------------------------------------------------------

<?xml version="1.0" encoding="SHIFT_JIS"?>
<テスト>
<内容>あいうえお</内容>
</テスト>


SCOTT> xquery
2 let $d := fn:doc("/public/scott/xml/test2.xml")
3 return $d
4 /

Result Sequence
------------------------------------------------------------------------------

<?xml version="1.0" encoding="SHIFT_JIS"?>
<test>
<content>abcdefg</content>
</test>

● Linux版Oracle11g(データベースキャラクタセット;AL32UTF8、NLS_LANG=japanese_japan.AL32UTF8)
文字エンコーディングは元のXMLファイルを再現しているが、whitespaceは取り除かれている。

SCOTT> l
1 xquery
2 let $d := fn:doc("/public/scott/xml/test1.xml")
3* return $d
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><テスト><内容>あいうえお</内容></テスト>

SCOTT> xquery
2 let $d := fn:doc("/public/scott/xml/test2.xml")
3 return $d
4 /

Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><test><content>abcdefg</content></test>

SCOTT>


ということは、Linux環境であってもデータベースキャラクタセットとクライアントの文字エンコーディングが異なれば同じ結果になるのでは???

試してみた!

[oracle@corydoras ˜]$ export NLS_LANG=american_america.JA16SJISTILDE
[oracle@corydoras ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on Mon Oct 29 22:45:09 2007

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

> conn scott/tiger
Connected.
SCOTT> set long 4000
SCOTT> l
1 xquery
2 let $d := doc("/public/scott/xml/test2.xml")
3* return $d
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="SHIFT_JIS"?>
<test>
<content>abcdefg</content>
</test>


XMLマスタープロフェッショナル(データベース)取得へ向けて勉強しようと思っていたのだが、なんだか、どんどん別な方向へ行っている気がするのでこの辺で止めておこうかと。
(XMLのデータの再現性という点についてはちょうどいいネタでしたけどね。。)

ちなみに、XQueryの勉強用には、結果が確認しやすくなるのでデータベースキャラクタセットとNLS_LANGのエンコードは変えておいたほういいかもしれないですね。

ということで、Windows版Oracle11gは不要なので即削除ということに。うちではLinux環境の方が便利なのでね。。。(明日にはOTN Professional版のOracle11gが届きそうなのでまた入れ直すだろうけど。。)

※尚、OTN-Jでレスが付いたらこのエントリに追記する予定。

| | | コメント (0) | トラックバック (0)

2007年10月28日 (日)

Oracle de XMLDB #6 - Linux x86版再び。

Windows版 Oracle Database 11g R1でXMLDB環境を再構築し、再度XQueryで遊び始めたのだが。。。。Linux版のOracle11g のXMLDBとは何かが違う。。。。。・・・・・・・



バックナンバー:

Oracle de XMLDB #1

Oracle de XMLDB #2

Oracle de XMLDB #3 - Oracle10g XEではどうよ?

Oracle de XMLDB #4 - fizzbuzzから

Oracle de XMLDB #5 - Oracle11g環境再構築完了

本当はXMLDBで遊びたいだけなのだが、、何となく気持ち悪い・・・・・

となれば、以前から計画していたLinux環境復活を先に! 

ということで、以前はOracle9i R2 for Linux x86Oracle10g R1 for Linux x86環境として利用していたToshiba Dynabook SS SX/210LNLW RAM:768MB - Turbolinux 8 Enterprise Server (United Linux 1.0)環境を潰し、CentOS5 + Oracle11g R1 for Linux x86環境として作り直して、その違いを確認してみようということに急遽決定!!!!

尚、Toshiba Dynabook SS SX/210LNLWは、FDもCD/DVDドライブも搭載していないのだが、FDブート可能なFDドライブさえあればLinuxのインストールは可能で、以前TurboLinux 8 Enterprise Serverをインストールした際もFDイメージからブートし、外付けCDドライブからインストールしたことがある。。。

今回はCentOS5をネットワークインストールし、その後Oracle11gをインストールしてみることにした。

Dynabook SS SX/210LNLWへ繋いだFDドライブはこれ。


尚、CentOS5にはFDイメージが無いということなので、CentOS3.8のFDイメージでブート。一旦、CentOS3.8をインストールしてからCentOS5をネットワークインストールでクリーンインストールするという方法を取った。

ありがたいことに、この方法を試してブログで公開されている方がいたので参考にさせてもらった。
(ありがとうございます。いろいろ調べる手間が省けて助かりました。)

● FDはあるけどCD-ROMドライブの無いノートPCに最新版Linuxをインストール(CentOS3.8)
ただ、私がインストールした際、以下の赤字部分を変えた。(それ以外は、前述のブログに書かれている通りで行えた。)
grub.confの編集
# vi /boot/grub/grub.conf

以下の項目を追加。
title CentOS 5.0 Install
root (hd0,0)
kernel /boot/centos/vmlinuz ramdisk_size=8192
initrd /boot/centos/initrd.img

● FDはあるけどCD-ROMドライブの無いノートPCに最新版Linuxをインストール2(CentOS5編)


では、Toshiba Dynabook SS SX/210LNLWでCentOS5が起動した画像を。
Cimg7335

ここまでできたら、Oracle Database 11gをインストールすればいい。手順は以前のエントリを
(尚、Oracle11gをインストールするためには最低1GBのメモリが推奨されているが、このDynabookに積めるメモリは最大768MBである為1280MBだが512MB一枚しかなかったので768MBと少なめ。OUIの物理メモリサイズに関する警告を無視することでインストールを行った。Swapが多くなりモタツキ感はあるもののOracle11gは無事にインストールできた。)

以下は、MacOSX TigerのxtermよりCentOS5(Dynabook SS SX/210)へssh接続して起動したOUIの画像。
Dynabook_ss_oracle11g

ということで、次回は、 何かが違う。。。と思った点について確認してみるか。

| | | コメント (0) | トラックバック (0)

2007年10月24日 (水)

Oracle Database 11g for Linux x86-64 and Windows

Oracle Database 11g R1のLinux x86-64とWindows版がUS OTNからダウンロード可能になった。

■[db] Oracle Database 11g R1、Windows版リリース - S/N Ratio より引用

手持ちのWindows PCでOracle Database 11gを試してみたい、という方など、Windows版を待っていた方も少なくないと思います。そんな方は、是非インストールを :-)

私の場合、Windows版を待っていたということは無いのだが、空いているのがWindows環境しか無くなってしまうので。。。。ダウンロード決定! (^^/

CentOS 5に構築したOracle Database 11gは、ノートPCを下取り処分することが決定しているので、ウチにある唯一のWindows XP Professionalマシンへインストールすることにした。ディスクスペースに余裕があるのでなんとかなるでしょう。多分。

Mac de Oracleですから、Windows でも Apple製品を絡めるということで、ブラウザは、Safari 3 for Windows (^^;;;

ちなみに、マシンはもう随分古いが、 Dual AthronMP 2800+ RAM:1GB + Windows XP Professional SP2(メモリが少ないのが少々キツいね。どっかで調達できるか捜してみるか。。。無い可能性のほうが高いが。。。)

Oracle11g_win_safari3beta_download

Oracle11g_win_safari3beta

PS.
DynabookをTurbolinuxからCentOSに切り替えるタイミングでOracle11gのLinux環境を再構築する予定。

| | | コメント (0) | トラックバック (0)

2007年10月22日 (月)

Oracle de XMLDB #4

データベースマガジンでもXQuery1.0は"習うより慣れろ"なんて書いてあったので、使って覚えるのが一番いいだろうなということで前々回に環境を構築したのだが、予想外の展開で、なかなか思うように試す時間がとれない・・・、それでも何とか時間を作らなきゃね。ということでやっとその続き。  

バックナンバー:
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?



最初はFizzBuzzからやってみた。(笑) さずがに、Hello Worldじゃつまらなかったので・・・・。

いつものように、Oracle Database 11g for Linux x86へMacOSXのTerminalからssh接続!

Last login: Sat Oct 20 02:18:51 on console
Welcome to Darwin!
G5Server:˜ discus$ su - oracle
Password:
G5Server:˜ oracle$
G5Server:˜ oracle$ ssh oracle@glasscatfish
oracle@glasscatfish's password:
Last login: Sat Oct 20 02:19:12 2007 from 192.168.1.19
[oracle@glasscatfish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 月 10月 20 14:13:23 2007

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

> conn scott/tiger@lampeye
接続されました。

SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

SCOTT> set timi on
SCOTT> l
1 xquery
2 for $n in 1 to 100
3 return
4 if ($n mod 15 eq 0) then 'fizzbuzz'
5 else if ($n mod 3 eq 0) then 'fizz'
6 else if ($n mod 5 eq 0) then 'buzz'
7* else $n
SCOTT> /
1
2
fizz
4
buzz
fizz
7
8
fizz
・・・・中略・・・・
fizz
97
98
fizz
buzz

100アイテムが選択されました。

経過: 00:00:00.06
SCOTT>


ついでなので、以前SQLでFizzBuzzしたものと処理時間を比較してみた。
お〜!、SQLでFizzBuzzしたほうが早いな〜!

SCOTT> with
2 t as (
3 select 1 from dual group by cube(1,1,1,1)
4 )
5 select
6 case 0
7 when mod(rownum,15) then 'fizzbuzz'
8 when mod(rownum,3) then 'fizz'
9 when mod(rownum,5) then 'buzz'
10 else to_char(rownum)
11 end as results
12 from
13 t a cross join t b
14 where
15 rownum <= 100;
1
2
fizz
4
buzz
fizz
7
8
・・・・中略・・・・
fizz
97
98
fizz
buzz

100行が選択されました。

経過: 00:00:00.03
SCOTT>


多分、どなたかXQueryでやっているんじゃないかな〜!? ということでググってみたら、ありました、User's Forum For DB2 Japanに。。(^^;;;

いや〜〜〜、目から鱗ですね。User's Forum For DB2 Japanのスレッドにある下記コードは、面白い。(私のコードは読みやすいかもしれないが、ストレート過ぎるかもね。ちょいと捻ったほうが、XQueryのトリッキーな動きも見えてくるというもの。)
以下のコードは、XPath2.0/XQuery1.0では、xs:booleanじゃなくても真理値として扱われる値やシーケンスにフィルタ式を用いているなどなど参考になります。m(_ _)m
(ただ、xs:booleanじゃなくても真理値として扱われるという性質を多用しるぎると難読化傾向はあるかもしれないですね。)

SCOTT> l
1 xquery
2 for $n in 1 to 100
3 return
4 fn:concat(
5 $n[($n mod 3 and $n mod 5)],
6 'fizz'[fn:not($n mod 3)],
7 'buzz'[fn:not($n mod 5)]
8* )
SCOTT> /
1
2
fizz
4
buzz
fizz
7
8
・・・・中略・・・・
97
98
fizz
buzz

100アイテムが選択されました。

経過: 00:00:00.06
SCOTT>


XQueryの条件式を少々書き換えてみた。私が最初に書いたXQueryより条件式の部分が読みにくくなりますよね、やはり。(実行速度に影響がなければ、読みやすい方がいいな。。)

SCOTT> l
1 xquery
2 for $n in 1 to 100
3 return
4 if (fn:not($n mod 15)) then 'fizzbuzz'
5 else if (fn:not($n mod 3)) then 'fizz'
6 else if (fn:not($n mod 5)) then 'buzz'
7* else $n
SCOTT> /
1
2
fizz
4
buzz
fizz
7
8
・・・・中略・・・・
97
98
fizz
buzz

100アイテムが選択されました。

経過: 00:00:00.06
SCOTT>

やはりxs:booleanじゃなくても真理値として扱われるという性質は、間違いやすいところなのでもうちょっと突っ込んで理解しておく必要があるなぁ。いい加減に覚えているとハマりそうな予感。

2007/10/23 追記
Oracle10g R2でもできますよ。

| | | コメント (0) | トラックバック (0)

2007年10月16日 (火)

Oracle de XMLDB #3 - Oracle10g XEではどうよ?

OracleのXMLDBを試す簡単な環境は? ということで、Oracle10g R2 Express Editionを試してみた。
だが・・・・・今のところ利用できないようだ。次のリリースに期待。

バックナンバー:
Oracle de XMLDB #1
Oracle de XMLDB #2


以下、前回、Oracle Database 11gを構築したPC(CentOS 5)に、Oracle10g R2 Express Edition for Linux x86を追加インストールして試した記録。
尚、Oracle10g EXへは、同環境へインストール済みOracle Database 11g R1のSQL*Plusから接続した。(MacOSXからssh接続しているため、その方が楽だったので・・・)

G5Server:˜ oracle$ ssh oracle@glasscatfish
oracle@glasscatfish's password:
[oracle@glasscatfish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 火 10月 16 0:04:43 2007

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

> conn sys@xe as sysdba
パスワードを入力してください:
接続されました。
SYS>
SYS> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SYS> select comp_name,version,status from dba_registry;

COMP_NAME VERSION STATUS
-------------------------------------------------- ------------------------------ ----------
Oracle Database Catalog Views 10.2.0.1.0 VALID
Oracle Database Packages and Types 10.2.0.1.0 VALID
Oracle Text 10.2.0.1.0 VALID
Oracle XML Database 10.2.0.1.0 VALID

SYS>
SYS> !
[oracle@glasscatfish ˜]$ ll
合計 8
drwxr-xr-x 2 oracle oinstall 4096 10月 14 15:32 Desktop
[oracle@glasscatfish ˜]$ pwd
/home/oracle
[oracle@glasscatfish ˜]$ mkdir scott_xmldir
[oracle@glasscatfish ˜]$ ll
合計 16
drwxr-xr-x 2 oracle oinstall 4096 10月 14 15:32 Desktop
drwxr-xr-x 2 oracle oinstall 4096 10月 14 15:44 scott_xmldir
[oracle@glasscatfish ˜]$ cd scott_xmldir
[oracle@glasscatfish scott_xmldir]$ cat list1.xml
<?xml version="1.0" encoding="UTF-8" ?>
<顧客名簿>
<顧客 id="128">
<住所>
<郵便番号>123-4567</郵便番号>
<都道府県>千葉県</都道府県>
<市町村名>浦安市</市町村名>
<町名番地>舞浜1-2-3</町名番地>
</住所>
<電話 タイプ="会社">03-1234-5678</電話>
<電話 タイプ="自宅">03-5555-6666</電話>
<電話 タイプ="携帯">090-1112-4444</電話>
<ファックス>03-8888-7777</ファックス>
<Eメール>hoge@macdeoracle.jp</Eメール>
</顧客>
<顧客 id="256">
<住所>
<郵便番号>155-5555</郵便番号>
<都道府県>東京都</都道府県>
<市町村名>世田谷区</市町村名>
<町名番地>用賀1-2-3</町名番地>
</住所>
<電話 タイプ="会社">03-7575-7575</電話>
<電話 タイプ="自宅">03-8585-8585</電話>
<電話 タイプ="携帯">090-9191-9191</電話>
<ファックス>03-4141-4141</ファックス>
<Eメール>hoge@discushamburg.jp</Eメール>
</顧客>
<顧客 id="512">
<住所>
<郵便番号>345-4567</郵便番号>
<都道府県>大阪府</都道府県>
<市町村名>中央区</市町村名>
<町名番地>難波2-2-2</町名番地>
</住所>
<電話 タイプ="会社">06-1234-5678</電話>
<電話 タイプ="自宅">06-5555-6666</電話>
<電話 タイプ="携帯">090-0606-0606</電話>
<ファックス>06-8888-7777</ファックス>
<Eメール>hoge@lampeye.jp</Eメール>
</顧客>
</顧客名簿>
[oracle@glasscatfish scott_xmldir]$ exit
exit

SYS>
SYS> create directory scott_xmldir as '/home/oracle/scott_xmldir';

ディレクトリが作成されました。

SYS> grant read on directory scott_xmldir to scott;

権限付与が成功しました。

SYS> grant write on directory scott_xmldir to scott;

権限付与が成功しました。

SYS>

SYS>
SYS>
SYS> conn scott@xe
パスワードを入力してください:
接続されました。
SCOTT>
SCOTT> declare
2 isSuccess boolean;
3 begin
4 isSuccess := dbms_xdb.createfolder('/public/scott');
5 end;
6 /

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

SCOTT>
SCOTT> l
1 declare
2 r boolean;
3 begin
4 r := dbms_xdb.createresource(
5 '/public/scott/list1.xml',
6 bfilename('SCOTT_XMLDIR','list1.xml'),
7 nls_charset_id('AL32UTF8'));
8* end;
SCOTT> /

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

SCOTT>
SCOTT> xquery
2 let $n := let("/public/scott/list1.xml")
3 return $n
4 /
ERROR:
ORA-19114: XQuery式を解析中にエラーが発生しました:
ORA-06550:行1、列13:
PLS-00201: 識別子SYS.DBMS_XQUERYINTを宣言してください。
ORA-06550:行1、列7:
PL/SQL: Statement ignored


SCOTT>

この日本語のメッセージでググっても、おそらく Oracle10g R2 XE上のXMLDBに関するものはヒットしないだろうということで・・・・

SCOTT> xquery
2 let $n := fn:doc("/public/scott/list1.xml")
3 return $n
4 /
ERROR:
ORA-19114: error during parsing the XQuery expression:
ORA-06550: line 1, column 13:
PLS-00201: identifier 'SYS.DBMS_XQUERYINT' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

英語メッセージに切り替え、英語のメッセージを表示させてからググってみた。
すると、ありましたよ。US OTNに。

http://forums.oracle.com/forums/message.jspa?messageID=1280038#1280038

ということで、Express Editionでは今のところこの機能は動作しないようだ。
次のリリースに期待するしかなさそうですね。



ついに、奥さんがMacBook Pro 15inchを購入、本日届いた! これで、このCentOS5+Oracle11gの環境も初期化して、初代のiMac G5どもども下取だな、そろそろ。
さてさて、LinuxのOracle11g環境を別に作らねば。。

| | | コメント (0) | トラックバック (0)

2007年10月15日 (月)

Oracle de XMLDB #2

前回、Oracle XML repositoryへXMLを格納したが、PL/SQLなどのAPIから操作するほか、Enterprise Managerからrepositoryを管理することができる。通常はこちらから管理したほうが楽でしょうね。

バックナンバー:
Oracle de XMLDB #1


以下、CentOS 5に構築したOracle11g の Enerprise Manager Database ControlをSafariから操作している様子。

Em11g_xml_resource1

Em11g_xml_resource2

Em11g_xml_resource3

| | | コメント (0) | トラックバック (0)

Oracle de XMLDB #1

前回のエントリでXML Master Professional Database認定試験向けのお勉強用環境をOracle10g/11g環境で作ろうかな。と書いたが早速作ってみた。

Oracle10g R2/Oracle11g R1をインストールすればXMLDBは標準でインストールされているので特に問題になることはないと思う。

ところで、Oracle10g R2からSQL*PlusからXQueryを直接実行できるようになっているのだが、ご存知だろうか?
この例では、Oracle XML RepositoryへXML文書を登録し、SQL*PlusからXQueryを直接発行する環境を作ってみる。

参考:
Oracle XML DB開発者ガイド 10gリリース2(10.2)- 20 Oracle XML DBリポジトリのデータへのアクセス
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス 10g リリース2(10.2)- 120 DBMS_XDB

まず、今回利用した環境の情報から。
OSは、CentOS4.4(Final) 32bit そう、今年始めに構築した、Oracle10g R2 の Linux RAC環境を利用した。 (Oracle11g R1 EEの環境もあるのだが手順は同じなので Oracle10g R2で構築した例を載せておく。)

[oracle@discus1 ˜]$ uname -svr
Linux 2.6.9-42.EL #1 Sat Aug 12 09:17:58 CDT 2006
[oracle@discus1 ˜]$ cat /etc/redhat-release
CentOS release 4.4 (Final)
[oracle@discus1 ˜]$ srvctl status database -d orcl
インスタンスorcl1はノードdiscus1で実行中です。
インスタンスorcl2はノードdiscus2で実行中です。
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus1
VIPはノードで実行中です: discus1
GSDはノードで実行中です: discus1
リスナーはノードで実行中です: discus1
ONSデーモンはノードで実行中です: discus1
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus2
VIPはノードで実行中です: discus2
GSDはノードで実行中です: discus2
リスナーはノードで実行中です: discus2
ONSデーモンはノードで実行中です: discus2
[oracle@discus1 ˜]$


SYS> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SYS>
SYS> select comp_name,version,status from dba_registry where comp_name like '%XML%';

COMP_NAME VERSION STATUS
-------------------------------------------------- ------------------------------ ----------
Oracle XML Database 10.2.0.1.0 VALID

SYS>


テストに利用するXMLファイル(list1.xml)を $ORACLE_HOME/scott_xmldir以下に作成

[oracle@discus1 scott_xmldir]$ ll
合計 4
-rw-r--r-- 1 oracle dba 2078 10月 13 21:28 list1.xml
[oracle@discus1 scott_xmldir]$ pwd
/u01/app/oracle/scott_xmldir/
[oracle@discus1 scott_xmldir]$ cat list1.xml
<?xml version="1.0" encoding="UTF-8"?>
<顧客名簿>
<顧客 id="128">
<住所>
<郵便番号>123-4567</郵便番号>
<都道府県>千葉県</都道府県>
<市町村名>浦安市</市町村名>
<町名番地>舞浜1-2-3</町名番地>
</住所>
<電話 タイプ="会社">03-1234-5678</電話>
<電話 タイプ="自宅">03-5555-6666</電話>
<電話 タイプ="携帯">090-1112-4444</電話>
<ファックス>03-8888-7777</ファックス>
<Eメール>hoge@macdeoracle.jp</Eメール>
</顧客>
<顧客 id="256">
<住所>
<郵便番号>155-5555</郵便番号>
<都道府県>東京都</都道府県>
<市町村名>世田谷区</市町村名>
<町名番地>用賀1-2-3</町名番地>
</住所>
<電話 タイプ="会社">03-7575-7575</電話>
<電話 タイプ="自宅">03-8585-8585</電話>
<電話 タイプ="携帯">090-9191-9191</電話>
<ファックス>03-4141-4141</ファックス>
<Eメール>hoge@discushamburg.jp</Eメール>
</顧客>
<顧客 id="512">
<住所>
<郵便番号>345-4567</郵便番号>
<都道府県>大阪府</都道府県>
<市町村名>中央区</市町村名>
<町名番地>難波2-2-2</町名番地>
</住所>
<電話 タイプ="会社">06-1234-5678</電話>
<電話 タイプ="自宅">06-5555-6666</電話>
<電話 タイプ="携帯">090-0606-0606</電話>
<ファックス>06-8888-7777</ファックス>
<Eメール>hoge@lampeye.jp</Eメール>
</顧客>
</顧客名簿>
[oracle@discus1 scott_xmldir]$


$ORACLE_HOME/scott_xmldirをdirectoryオブジェクトとして作成。今の所読み込みだけで十分だが、書き込み権限も付与しておく。

SYS> create directory scott_xmldir as '/u01/app/oracle/scott_xmldir/';

ディレクトリが作成されました。

SYS> grant read on directory scott_xmldir to scott;

権限付与が成功しました。

SYS> grant write on directory scott_xmldir to scott;

権限付与が成功しました。

SYS>

SYS>


この例では、XMLファイルをOracle XML repositoryへ登録する。/publicフォルダ以下に scott/xmlフォルダを追加作成後、/public/scott/xml以下へ対象のXMLファイルを登録する。
尚、データベースキャラクタセットは、AL32UTF8であり、登録するXMLファイルのエンコーディングは、UTF-8とした。

まず、/publicフォルダ以下に、scottフォルダを作成する。
SYS> conn scott@orcltest
パスワードを入力してください:
接続されました。

SCOTT> declare
2 r boolean;
3 begin
4 r := dbms_xdb.createfolder('/public/scott');
5 end;
6 /

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

次に、/public/scottフォルダ以下に、xmlフォルダを作成する。
SCOTT> l
1 declare
2 r boolean;
3 begin
4 r := dbms_xdb.createfolder('/public/scott/xml');
5* end;
SCOTT> /

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

/public/scott/xmlフォルダ直下へSCOTT_XMLDIRディレクトリオブジェクト以下にあるxmlファイル(list1.xml)を登録し、パスを/public/scott/xml/list1.xmlとする。
SCOTT> l
1 declare
2 r boolean;
3 begin
4 r := dbms_xdb.createresource(
5 '/public/scott/xml/list1.xml',
6 bfilename('SCOTT_XMLDIR','list1.xml'),
7 nls_charset_id('AL32UTF8'));
8* end;
SCOTT> /

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

SCOTT>
SCOTT>


最後に、確認の意味を含めて、XML repositoryへ登録したxmlをXQueryを利用して、SQL*Plusから直接問い合わせてみる。

SCOTT> set long 4000
SCOTT> l
1 xquery
2 let $d := fn:doc("/public/scott/xml/list1.xml")
3* return $d
SCOTT> /

Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><顧客名簿><顧客 id="128"><住所><郵便番号>123-4567</郵便番号><都道府県>千葉県</都道府県><市町村
名>浦安市</市町村名><町名番地>舞浜1-2-3</町名番地></住所><電話 タイプ="会社">03-1234-5678</電話><電話 タイプ="自宅">03-5555-6666</電
話><電話 タイプ="携帯">090-1112-4444</電話><ファックス>03-8888-7777</ファックス><Eメール>hoge@macdeoracle.jp</Eメール></顧客><顧客 i
d="256"><住所><郵便番号>155-5555</郵便番号><都道府県>東京都</都道府県><市町村名>世田谷区</市町村名><町名番地>用賀1-2-3</町名番地></
住所><電話 タイプ="会社">03-7575-7575</電話><電話 タイプ="自宅">03-8585-8585</電話><電話 タイプ="携帯">090-9191-9191</電話><ファック
ス>03-4141-4141</ファックス><Eメール>hoge@discushamburg.jp</Eメール></顧客><顧客 id="512"><住所><郵便番号>345-4567</郵便番号><都道府
県>大阪府</都道府県><市町村名>中央区</市町村名><町名番地>難波2-2-2</町名番地></住所><電話 タイプ="会社">06-1234-5678</電話><電話 タ
イプ="自宅">06-5555-6666</電話><電話 タイプ="携帯">090-0606-0606</電話><ファックス>06-8888-7777</ファックス><Eメール>hoge@lampeye.jp
</Eメール></顧客></顧客名簿>



SCOTT>

ここまでできれば、XQuery1.0の実行は、SQL*Plusからダイレクトに行えるようになる。 簡単!。

あとは、いろいろなXQueryを試すのみ! Enjoy!

| | | コメント (0) | トラックバック (1)

2007年10月13日 (土)

DBMS_COMPARISONパッケージ で表データの比較 #6

「DBMS_COMPARISONパッケージで表データの比較」のつづき。

マニュアルは、DBMS_COMPARISONを利用するための前提が記載されているいるので、前提を満たしていないとどんなエラーになるか試してみた。

バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1
DBMS_COMPARISONパッケージ で表データの比較 #2
DBMS_COMPARISONパッケージ で表データの比較 #3
DBMS_COMPARISONパッケージ で表データの比較 #4
DBMS_COMPARISONパッケージ で表データの比較 #5



● もしも、2つの表に前提を満たす主キー制約が無かったら。。。。。

SCOTT> alter table emp2 drop constraint emp2_pk;

表が変更されました。

SCOTT> create table emp3 as select * from emp2;

表が作成されました。

SCOTT> begin
2 dbms_comparison.create_comparison(
3 comparison_name => '索引の無い表の比較',
4 schema_name => 'SCOTT',
5 object_name => 'EMP2',
6 dblink_name => null,
7 remote_schema_name => 'SCOTT',
8 remote_object_name => 'EMP3'
9 );
10 end;
11 /
begin
*
行1でエラーが発生しました。:
ORA-23626: 適格な索引が表SCOTT.EMP2にありません
ORA-06512: "SYS.DBMS_COMPARISON", 行4197
ORA-06512: "SYS.DBMS_COMPARISON", 行420
ORA-06512: 行2

ちなみに、ローカル表には主キー制約があり、リモート表(実際にリモートデータベーベースにある表、マテリアライズドビューである必要はない)に主キー制約が存在しない場合は、DBMS_COMPARISONパッケージは可能だった。
ただしその場合、データを比較する際リモート表が全表走査されることになるだろう(実際にトレース取ったわけではないが・・)から、主キー制約、または一意制約はあったほうがよいだろう。(この点には注意が必要だが、主キーベースのレプリケーション環境では影響はないかと。。)



そういえば、XML Master Professional Databaseが今年の12月から開始予定とのことなので、そろそろ、XML絡みのネタを増やしていこうか・・・、Oracle9i/10g さらに11gとXML DBとしての機能も強化してきたOracleなのでOracleを使ってXML Master Professional Databaseの受験対策環境作っておくのもいいなぁ・・・準備しておくか・・・

| | | コメント (0) | トラックバック (0)

DBMS_COMPARISONパッケージ で表データの比較 #5

「DBMS_COMPARISONパッケージで表データの比較」の続きです。

表の内容を比較すると比較結果がどんどん記録されていく。不要になった比較結果は削除しときましょ。

バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1
DBMS_COMPARISONパッケージ で表データの比較 #2
DBMS_COMPARISONパッケージ で表データの比較 #3
DBMS_COMPARISONパッケージ で表データの比較 #4



purge_comparison()drop_comparison()、関数名だけだと何を削除するのか分かりにくいな〜。ということでこれらの関数の確認も。。

● 比較結果をpurge_comparison()関数でパージする。

DBMS_COMPARISON.COMPARE()関数を実行すると、比較結果の詳細やサマリーなどが記録される。
不要になった結果はpurge_comparison()関数で、後始末。

SCOTT> select scan_id,comparison_name from user_comparison_scan order by scan_id;

SCAN_ID COMPARISON_NAME
---------- ------------------------------
1 EMP表の比較
2 EMP表の比較
3 EMP表の比較
4 EMP表の比較
5 EMP表の比較
6 EMP表の比較
7 EMP表の比較

7行が選択されました。

SCOTT> select scan_id,comparison_name from user_comparison_scan_summary order by scan_id;

SCAN_ID COMPARISON_NAME
---------- ------------------------------
1 EMP表の比較
2 EMP表の比較
3 EMP表の比較
4 EMP表の比較
5 EMP表の比較
6 EMP表の比較
7 EMP表の比較

7行が選択されました。

SCOTT> select scan_id,comparison_name from user_comparison_scan_values order by scan_id;

SCAN_ID COMPARISON_NAME
---------- ------------------------------
1 EMP表の比較
2 EMP表の比較
3 EMP表の比較
4 EMP表の比較
5 EMP表の比較
6 EMP表の比較
7 EMP表の比較

7行が選択されました。


SCOTT> select scan_id,comparison_name from user_comparison_row_dif order by scan_id;

SCAN_ID COMPARISON_NAME
---------- ------------------------------
3 EMP表の比較
4 EMP表の比較
4 EMP表の比較
6 EMP表の比較

SCOTT>

以下、指定したcomparisonに関連する比較結果全てをパージする例。
SCOTT> exec dbms_comparison.purge_comparison('EMP表の比較');

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

SCOTT> select scan_id,comparison_name from user_comparison_scan order by scan_id;

レコードが選択されませんでした。

SCOTT> select scan_id,comparison_name from user_comparison_scan_summary order by scan_id;

レコードが選択されませんでした。

SCOTT> select scan_id,comparison_name from user_comparison_scan_values order by scan_id;

レコードが選択されませんでした。

SCOTT> select scan_id,comparison_name from user_comparison_row_dif order by scan_id;

レコードが選択されませんでした。

SCOTT>


● comparisonをdrop_comparison()関数で削除する。

作成したcomparisonが不要になったら、drop_comparison()関数で削除。
SCOTT> select comparison_name from user_comparison;

COMPARISON_NAME
------------------------------
EMP表の比較

SCOTT> select comparison_name,column_position from user_comparison_columns;

COMPARISON_NAME COLUMN_POSITION
------------------------------ ---------------
EMP表の比較 1
EMP表の比較 2
EMP表の比較 3
EMP表の比較 4
EMP表の比較 5
EMP表の比較 6
EMP表の比較 7
EMP表の比較 8

8行が選択されました。

SCOTT> exec dbms_comparison.drop_comparison('EMP表の比較');

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

SCOTT> select comparison_name from user_comparison;

レコードが選択されませんでした。

SCOTT> select comparison_name,column_position from user_comparison_columns;

レコードが選択されませんでした。

SCOTT>

| | | コメント (0) | トラックバック (0)

2007年10月12日 (金)

Unbreakable Linux

昨日は、Oracle Unbreakable Linux発表記念- オラクルのLinux戦略の全貌が明らかに!と題したセミナーに参加してきた。(とは言っても、時間の関係で、DBマガジンでもおなじみの一志達也氏のセッションだけでしたけど。)

オラクルが本気でLinuxのサポート始めたんですね。

資料のサポートメニューを見ると一番安価なパッチの提供とUnbreakable Linux Networkを提供する
Enterprise Linux Network Supportで、2CPUまでで、年間12,400円、CPU無制限でも12,400円。
さらに、その上のサポートであるBasic Supportでは、24時間365日の問い合せができ、2CPUまで49,900円、CPU無制限でも124,900円だとか。

ところで、一志さんのセッションって、Windowsユーザー向けのセッションではないと思っていたのですが、Windowsユーザのこともかなり意識しているのでしょうね。プレゼン中に、 "Windows"って何度も言っていた
(追記2007/10/13-まあ、Linux陣営内で顧客の取り合いということでは無いよ。っていうこともあるのかな、盛んにWindows、Windowsと言っていたのは。。)

"WIndows"って言った回数をカウントしておけば良かった。。 (^^;;;;


頂いたノベルティは、ブログ de ノベルティへ

| | | コメント (0) | トラックバック (0)

DBMS_COMPARISONパッケージ で表データの比較 #4

「DBMS_COMPARISONパッケージで表データの比較」の続きです。

バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1
DBMS_COMPARISONパッケージ で表データの比較 #2
DBMS_COMPARISONパッケージ で表データの比較 #3




奥さんが、新しいMacBook Proを購入したので、今奥さんが使っているiMac G5とOracle Database 11g R1 + CentOS 5で遊んでいるIBM ThinkPad R52が下取り処分に。。。

あ〜〜〜、もう少しだけ遊ばせて〜〜〜! と慌てたり。。。まあ、DBMS_COMPARISONパッケージを試す程度はできそうですが。。。さて、Oracle11gで遊ぶ環境が無くなる〜。

どうしよう。。。既存の環境をつぶさなければインストールできそうにない、TurboLinux(United Linux 1.0)+Oracle9i R2/Oracle10g R1環境を潰すか。。

なんて、前置きはこれくらいにして。

● CONVERGE()関数でデータを一致させる。

EMP表の内容にEMP2表の内容を合わせるように指定して実行!。異なるデータだけが処理対象となっていることにお気づきだろうか。。
SCOTT> set serveroutput on
SCOTT> l
1 DECLARE
2 scanInfo DBMS_COMPARISON.COMPARISON_TYPE;
3 BEGIN
4 DBMS_COMPARISON.CONVERGE(
5 comparison_name => 'EMP表の比較',
6 scan_id => 2,
7 scan_info => scanInfo,
8 converge_options => DBMS_COMPARISON.CMP_CONVERGE_LOCAL_WINS

9 );
10 DBMS_OUTPUT.PUT_LINE('ScanID:'||to_char(scanInfo.scan_id));
11 DBMS_OUTPUT.PUT_LINE('Local rows merged:'||to_char(scanInfo.loc_rows_merged));
12 DBMS_OUTPUT.PUT_LINE('Remote rows merged:'||to_char(scanInfo.rmt_rows_merged));
13 DBMS_OUTPUT.PUT_LINE('Local rows deleted:'||to_char(scanInfo.loc_rows_deleted));
14 DBMS_OUTPUT.PUT_LINE('Remote rows deleted:'||to_char(scanInfo.rmt_rows_deleted));
15* END;
SCOTT> /
ScanID:2
Local rows merged:0
Remote rows merged:2
Local rows deleted:0
Remote rows deleted:1

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

SCOTT>
SCOTT> select * from emp order by empno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7000 PLECO MANAGER 7839 07-10-06 2500 30
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7788 SCOTT ANALYST 7566 87-04-19 3000 20
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7876 ADAMS CLERK 7788 87-05-23 1100 20
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
9999 DISCUS ANALYST 7839 07-10-06 3000 20

16行が選択されました。

SCOTT> select * from emp2 order by empno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7000 PLECO MANAGER 7839 07-10-06 2500 30
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7788 SCOTT ANALYST 7566 87-04-19 3000 20
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7876 ADAMS CLERK 7788 87-05-23 1100 20
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
9999 DISCUS ANALYST 7839 07-10-06 3000 20

16行が選択されました。

SCOTT>

となっており、2表の内容は一致したようだ。(黙視しただけなので、RECHECK()関数でも確認してみることに。。。)


● RECHECK()関数で再度比較する。

前回の比較時に返されたscan_idとcomparison名を指定して再チェックするだけ。
SCOTT> l
1 BEGIN
2 DBMS_OUTPUT.PUT_LINE('======== 再比較結果 ========');
3 IF DBMS_COMPARISON.RECHECK('EMP表の比較', 2, true) THEN
4 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容は同じです。');
5 ELSE
6 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容に違いがあります。');
7 END IF;
8* END;
SCOTT> /
======== 再比較結果 ========
EMP表とEMP2表の内容は同じです。

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

SCOTT>

2つの表の内容は一致しました!。めでたしめでたし!


ちょ〜〜〜〜〜っと待った〜〜〜〜〜っ!

マニュアルでは、RECHECK()関数は、2つの表の内容に違いが無かった場合FALSEを返すと記載されています。COMPARE()関数とは逆と記載されています。

しか〜〜〜し。Oracle Database 11g 11.1.0.6.0では、RECHECK()を実行し、2つの表の内容が同一の場合、COMPARE()関数と同様に、TRUEを返してきます。

そうなんです、マニュアルバグのようです!。
いずれ修正されると思うので現時点のマニュアルバグの証拠写真をカシャっ!

Dbms_comparison_manual_bug

以下はマニュアルからの引用


Return Values

This function returns TRUE when differences are found in the database objects being compared. This function returns FALSE when no differences are found in the database objects being compared.

となっており、違いがあれば、TRUEを、同じであれば、FALSEを返すと書かれています。皆さんご注意を。


また、RECHECK()関数は、同一か否かを判定するだけで、どのデータが違うといった情報までは取得していない。データが一致しているか一致していないかだけしか確認できない。どのデータが一致していないのかを確認するには、再度COMPARE()関数を実行する必要がある。とのこと。間違いやすいので要注意ですな〜〜。


Note:
This function does not identify new differences in the database objects that have appeared since the specified scan was run. To identify new differences, run the COMPARE function in this package.

| | | コメント (0) | トラックバック (0)

2007年10月11日 (木)

DBMS_COMPARISONパッケージ で表データの比較 #3

DBMS_COMPARISONパッケージで表データの比較の続きです。

バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1
DBMS_COMPARISONパッケージ で表データの比較 #2



前回は、2つの表を比較し内容が同一であることを確認した。というところまでだった。今回は、emp/emp2の内容が異なっている場合の例を。

● まず、emp表、emp2表で内容の一致しないデータを準備しておく。

SCOTT> 
SCOTT> insert into emp values(9999,'DISCUS','ANALYST',7839,sysdate,3000,null,20);

1行が作成されました。

SCOTT> insert into emp2 values(8888,'NEON','CLERK',7839,sysdate,1300,null,20);

1行が作成されました。

SCOTT> insert into emp values(7000,'PLECO','MANAGER',7839,sysdate,2500,null,30);

1行が作成されました。

SCOTT> insert into emp2 values(7000,'PLEGO','MANAGER',7839,sysdate,2500,null,30);

1行が作成されました。

SCOTT> commit;

コミットが完了しました。

SCOTT>

● COMPARE関数で比較してみる。

SCOTT> l
1 DECLARE
2 isSame BOOLEAN;
3 scanInfo DBMS_COMPARISON.COMPARISON_TYPE;
4 BEGIN
5 isSame := DBMS_COMPARISON.COMPARE(
6 comparison_name => 'EMP表の比較'
7 ,scan_info => scanInfo
8 ,perform_row_dif => true
9 );
10 DBMS_OUTPUT.PUT_LINE('========= 結果 =======');
11 DBMS_OUTPUT.PUT_LINE('scan_id='||TO_CHAR(scanInfo.scan_id));
12 IF isSame THEN
13 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容は同じです。');
14 ELSE
15 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容に違いがあります。');
16 END IF;
17* END;
SCOTT> /
========= 結果 =======
scan_id=2
EMP表とEMP2表の内容に違いがあります。

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

SCOTT>

● user_comparison_scan_summaryビューや、user_comparison_row_difビューなどで比較結果を確認。

尚、2票間に同一キーを持つデータは存在するがキー以外の列値が異なっている場合、どの列値が異なっているか? というところまで確認することはできない。
SCOTT> l
1 select
2 c.comparison_name,
3 s.scan_id,
4 s.current_dif_count
5 from
6 user_comparison c join user_comparison_scan_summary s
7 on c.comparison_name = s.comparison_name
8 where
9* s.scan_id = 2
SCOTT> /

COMPARISON_NAM SCAN_ID CURRENT_DIF_COUNT
-------------- ---------- -----------------
EMP表の比較 2 3

SCOTT>
SCOTT> l
1 select
2 s.root_scan_id as scan_id,
3 s.comparison_name,
4 d.index_value,
5 s.status,
6 case
7 when local_rowid is not null
8 and remote_rowid is not null then
9 'ローカル表、リモート表に同一キーを持つ行が存在しますが、キー以外で列値に違いがあります。'
10 when local_rowid is null
11 and remote_rowid is not null then
12 'ローカル表に存在しない行がリモート表に存在します。'
13 when local_rowid is not null
14 and remote_rowid is null then
15 'ローカル表に存在する行がリモート表に存在しません。'
16 end as description
17 from
18 user_comparison_scan_summary s join user_comparison_row_dif d
19 on s.scan_id = d.scan_id
20 where
21 s.root_scan_id = 2
22 and s.parent_scan_id is not null
23 order by
24* d.index_value
SCOTT> /

SCAN_ID COMPARISON_NAME INDEX_VAL STATUS DESCRIPTION
---------- -------------------- --------- ---------------- ---------------------------------------------------------------------------
2 EMP表の比較 7000 ROW DIF ローカル表、リモート表に同一キーを持つ行が存在しますが、キー以外で列値に違いがあります。
2 EMP表の比較 8888 ROW DIF ローカル表に存在しない行がリモート表に存在します。
2 EMP表の比較 9999 ROW DIF ローカル表に存在する行がリモート表に存在しません。

SCOTT>

今日はここまで。
次回は、2つの表の内容を一致させてから再度比較してみる。

| | | コメント (0) | トラックバック (0)

2007年10月10日 (水)

DBMS_COMPARISONパッケージ で表データの比較 #2

DBMS_COMPARISONパッケージで表データの比較の続きです。

バックナンバー:
DBMS_COMPARISONパッケージ で表データの比較 #1



DBMS_COMPARISONパッケージを利用し2つの表を比較!。(今回は、同一データベース、同一スキーマ内でテーブルの内容を比較してみることにする。)


● 表データを比較する手順

COMPARISONを作成する。

(比較仕様を作成する。 とでも書いたほうがわかりやすいか?。。。)

・作成したCOMPARISONを元に比較する

(比較仕様を元に比較を実行する。 とでも書いたほうがわかりやすいか?。。。)




では、比較実験開始!

emp表を複製してemp2表を作成する。(まずは、表、索引まで完全に複製して比較。)

SCOTT> create table emp2 as select * from emp;

表が作成されました。

SCOTT>
SCOTT> alter table emp2 add constraint emp2_pk primary key (empno);

表が変更されました。

SCOTT>
SCOTT> select * from emp order by empno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 NULL 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 NULL 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 NULL 30
7782 CLARK MANAGER 7839 81-06-09 2450 NULL 10
7788 SCOTT ANALYST 7566 87-04-19 3000 NULL 20
7839 KING PRESIDENT NULL 81-11-17 5000 NULL 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7876 ADAMS CLERK 7788 87-05-23 1100 NULL 20
7900 JAMES CLERK 7698 81-12-03 950 NULL 30
7902 FORD ANALYST 7566 81-12-03 3000 NULL 20
7934 MILLER CLERK 7782 82-01-23 1300 NULL 10

14行が選択されました。

SCOTT> select * from emp2 order by empno;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 NULL 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 NULL 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 NULL 30
7782 CLARK MANAGER 7839 81-06-09 2450 NULL 10
7788 SCOTT ANALYST 7566 87-04-19 3000 NULL 20
7839 KING PRESIDENT NULL 81-11-17 5000 NULL 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7876 ADAMS CLERK 7788 87-05-23 1100 NULL 20
7900 JAMES CLERK 7698 81-12-03 950 NULL 30
7902 FORD ANALYST 7566 81-12-03 3000 NULL 20
7934 MILLER CLERK 7782 82-01-23 1300 NULL 10

14行が選択されました。

SCOTT>


create_comparison関数でcomparisonを作成する。
2つの表(empとemp2)は、どちらも同一データベースのSCOTTスキーマに存在するため、dblink_name引数にはnullを指定する。

SCOTT> l
1 begin
2 dbms_comparison.create_comparison(
3 comparison_name => 'EMP表の比較'
4 ,schema_name => 'SCOTT'
5 ,object_name => 'EMP'
6 ,dblink_name => null
7 ,remote_schema_name => 'SCOTT'
8 ,remote_object_name => 'EMP2'
9 );
10* end;
SCOTT> /

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

SCOTT>

作成されたcomparisonを確認するには、user_comparisonビュー/user_comparison_columnsビュー問い合わせる

SCOTT> l
1 select
2 comparison_name
3 ,scan_mode
4 ,schema_name||'.'||object_name||'(type='||object_type||')' as local
5 ,remote_schema_name||'.'||remote_object_name||'(type='||remote_object_type||')' as remote
6 ,dblink_name
7 ,last_update_time
8 from
9 user_comparison
10 where
11* comparison_name = 'EMP表の比較'
SCOTT> /

COMPARISON_NAME SCAN_MODE LOCAL REMOTE DBLINK_NAME LAST_UPDATE_TIME
--------------- --------- -------------------------- -------------------------- ----------- ------------------------------
EMP表の比較 FULL SCOTT.EMP(type=TABLE) SCOTT.EMP2(type=TABLE) NULL 07-10-06 15:58:36.665370

SCOTT>
SCOTT> select * from user_comparison_columns order by column_position;

COMPARISON_NAME COLUMN_POSITION COLUMN_NAME I
------------------------------ --------------- ------------------------------ -
EMP表の比較 1 EMPNO Y
EMP表の比較 2 ENAME N
EMP表の比較 3 JOB N
EMP表の比較 4 MGR N
EMP表の比較 5 HIREDATE N
EMP表の比較 6 SAL N
EMP表の比較 7 COMM N
EMP表の比較 8 DEPTNO N

8行が選択されました。

SCOTT>

compare関数を利用して比較する。

事前に作成されたcomparisonを元に、compare関数を利用して比較を行う。この時、比較処理事に採版されるscan_idを記録しておくとよいだろう。
scan_idは、内容に相違がある場合、その詳細をディクショナリビューから問い合わせたり、再比較する際に利用する。

SCOTT> set serveroutput on format wrapped
SCOTT> l
1 DECLARE
2 isSame BOOLEAN;
3 scanInfo DBMS_COMPARISON.COMPARISON_TYPE;
4 BEGIN
5 isSame := DBMS_COMPARISON.COMPARE(
6 comparison_name => 'EMP表の比較'
7 ,scan_info => scanInfo
8 ,perform_row_dif => true
9 );
10 DBMS_OUTPUT.PUT_LINE('========= 結果 =======');
11 DBMS_OUTPUT.PUT_LINE('scan_id='||TO_CHAR(scanInfo.scan_id));
12 IF isSame THEN
13 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容は同じです。');
14 ELSE
15 DBMS_OUTPUT.PUT_LINE('EMP表とEMP2表の内容に違いがあります。');
16 END IF;
17* END;
SCOTT> /
========= 結果 =======
scan_id=1
EMP表とEMP2表の内容は同じです。

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

SCOTT>

ということで、次回は表の内容が異なっている場合はどうなるかという例を。

| | | コメント (0) | トラックバック (0)

2007年10月 9日 (火)

MacOSXのX11 から Oracle Database 11g - 番外編 - 自動起動・停止

インストール、構成関連は前回で終わりとしていたが、自動起動、停止に関するエントリをアップし忘れていたので追記しておく。


まあ、自動起動、停止は、Oracleから提供されている dbstart/dbshutスクリプトを起動スクリプトから実行すれば良いだけなのと、マニュアルにも記載されているし、ググれば山ほどヒットするので細かい解説はしないのであしからず。

● Oracle Database 11g になっても、わすれちゃならねぇ、oratab編集!

[oracle@glasscatfish ˜]$ cat /etc/oratab
#



# This file is used by ORACLE utilities. It is created by root.sh
# and updated by the Database Configuration Assistant when creating
# a database.

# A colon, ':', is used as the field terminator. A new line terminates
# the entry. Lines beginning with a pound sign, '#', are comments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y>:
#
# The first and second fields are the system identifier and home
# directory of the database respectively. The third filed indicates
# to the dbstart utility that the database should , "Y", or should not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
#
lampsys:/u01/app/oracle/product/11.1.0/lampeye:Y
[oracle@glasscatfish ˜]$


● Oracleの起動スクリプトする、CentOS5では以下のようにした。(ORACLE_OWNER/ORACLE_HOMEはご自分で設定したユーザ名とパスを指定してくださいね。)

[root@glasscatfish init.d]# vi oracle
[root@glasscatfish init.d]# cat oracle
#!/bin/bash
# chkconfig: 35 80 30
# description: oracle database startup/shutdown script
#

. /etc/rc.d/init.d/functions

ORACLE_OWNER="oracle"
ORACLE_HOME="/u01/app/oracle/product/11.1.0/lampeye"


case "$1" in
start)
echo -n $"Starting Oracle Database 11g:"
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
echo "OK"
;;
stop)
echo -n $"Stopping Oracle Database 11g:"
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut ORACLE_HOME"
echo "OK"
;;
*)
echo $"Usage: $0 {start|stop}"
esac
[root@glasscatfish init.d]#
[root@glasscatfish init.d]# chmod 750 oracle
[root@glasscatfish init.d]# chkconfig --add oracle
[root@glasscatfish init.d]# chkconfig --list | grep oracle
oracle 0:off 1:off 2:off 3:on 4:off 5:on 6:off
[root@glasscatfish init.d]#

あとは、CentOSを起動/停止し、 $ORACLE_HOME/startup.logや $ORACLE_HOME/shutdown.log/startup.logの内容及なども含め、正しく起動、停止しているか確認すればOK。

| | | コメント (0) | トラックバック (0)

2007年10月 8日 (月)

DBMS_COMPARISONパッケージ で表データの比較 #1

Oracle Database 11gで新たに追加されたDBMS_COMPARISONパッケージ
このパッケージは2つのTable/Single-table view/Materialized view(シノニムも可)を比較したり、データを一致させたりするための機能を提供するパッケージだ。
レプリケーション関連のマニュアルへのリンクもあるのでレプリケーション環境を意識した機能ではあるようだが、単に2つの表の内容を比較したり一致させることにも利用できるのでレプリケーション環境以外でも利用できる。

ただし、マニュアルに記載されているように利用できるデータ型や索引などの制限があるので、利用に際して事前調査は必要でしょうね。


参考:
Oracle Database PL/SQL Packages and Types Reference 11g Release 1 (11.1.) 31 DBMS_COMPARISON

ということで、早速試してみる。


環境は、先日作成したIBM Thinkpad R52 のCentOS 5上に構築したOracle Database 11g R1 11.1.0.6.0 for Linux (x86)を利用した。)

例によって、MacOSXのTerminalからssh経由で利用した。
(CentOS5/Oracle11gともエンコーディングにUTF-8を利用しているため、TerminalのエンコーティングもUTF-8に設定した。


Dbms_comparison001

まずは、Oracle Database 11gから新規追加されたDBMS_COMPARISONパッケージ関連のディクショナリービューの確認。(尚、DBA_*ビューも追加されている。)

[oracle@glasscatfish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 月 10月 8 08:50:38 2007

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

> conn scott/tiger
接続されました。
SCOTT>
SCOTT>
SCOTT> desc user_comparison_scan
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COMPARISON_NAME NOT NULL VARCHAR2(30)
SCAN_ID NOT NULL NUMBER
PARENT_SCAN_ID NUMBER
STATUS VARCHAR2(16)
COUNT_ROWS NUMBER
SCAN_NULLS VARCHAR2(1)
LAST_UPDATE_TIME TIMESTAMP(6)


SCOTT> desc user_comparison_scan_summary
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COMPARISON_NAME NOT NULL VARCHAR2(30)
SCAN_ID NOT NULL NUMBER
PARENT_SCAN_ID NUMBER
ROOT_SCAN_ID NUMBER
STATUS VARCHAR2(16)
CURRENT_DIF_COUNT NUMBER
INITIAL_DIF_COUNT NUMBER
COUNT_ROWS NUMBER
SCAN_NULLS VARCHAR2(1)
LAST_UPDATE_TIME TIMESTAMP(6)

SCOTT> desc user_comparison_scan_values
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COMPARISON_NAME NOT NULL VARCHAR2(30)
SCAN_ID NOT NULL NUMBER
COLUMN_POSITION NOT NULL NUMBER
MIN_VALUE VARCHAR2(4000)
MAX_VALUE VARCHAR2(4000)
LAST_UPDATE_TIME TIMESTAMP(6)

SCOTT> desc user_comparison_row_dif
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COMPARISON_NAME NOT NULL VARCHAR2(30)
SCAN_ID NOT NULL NUMBER
LOCAL_ROWID ROWID
REMOTE_ROWID ROWID
INDEX_VALUE VARCHAR2(4000)
STATUS VARCHAR2(3)
LAST_UPDATE_TIME TIMESTAMP(6)

SCOTT>
SCOTT> desc user_comparison
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COMPARISON_NAME NOT NULL VARCHAR2(30)
COMPARISON_MODE VARCHAR2(5)
SCHEMA_NAME VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
OBJECT_TYPE VARCHAR2(17)
REMOTE_SCHEMA_NAME VARCHAR2(30)
REMOTE_OBJECT_NAME VARCHAR2(30)
REMOTE_OBJECT_TYPE VARCHAR2(17)
DBLINK_NAME VARCHAR2(128)
SCAN_MODE VARCHAR2(9)
SCAN_PERCENT NUMBER
CYCLIC_INDEX_VALUE VARCHAR2(4000)
NULL_VALUE VARCHAR2(4000)
LOCAL_CONVERGE_TAG RAW(2000)
REMOTE_CONVERGE_TAG RAW(2000)
MAX_NUM_BUCKETS NUMBER
MIN_ROWS_IN_BUCKET NUMBER
LAST_UPDATE_TIME TIMESTAMP(6)

SCOTT>
SCOTT> desc user_comparison_columns
名前 NULL? 型
----------------------------------------- -------- ----------------------------
COMPARISON_NAME NOT NULL VARCHAR2(30)
COLUMN_POSITION NOT NULL NUMBER
COLUMN_NAME NOT NULL VARCHAR2(30)
INDEX_COLUMN VARCHAR2(1)


DBMS_COMPARISIONパッケージを利用するには、EXECUTEオブジェクト権限、及び、EXECUTE_CATALOG_ROLEロール(データディクショナリ内のオブジェクトに対するEXECUTE/SELECT権限)を実行するユーザへ付与する必要がある

SCOTT> conn / as sysdba
接続されました。
SYS> grant execute on dbms_comparison to scott;

権限付与が成功しました。

SYS> grant execute_catalog_role to scott;

権限付与が成功しました。

SYS> conn scott/tiger
接続されました。
SCOTT> desc dbms_comparison
FUNCTION COMPARE RETURNS BOOLEAN
引数名 タイプ In/Out Default?
------------------------------ ----------------------- ------ --------
COMPARISON_NAME VARCHAR2 IN
SCAN_INFO RECORD OUT
SCAN_ID NUMBER OUT
LOC_ROWS_MERGED NUMBER OUT
RMT_ROWS_MERGED NUMBER OUT
LOC_ROWS_DELETED NUMBER OUT
RMT_ROWS_DELETED NUMBER OUT
MIN_VALUE VARCHAR2 IN DEFAULT
MAX_VALUE VARCHAR2 IN DEFAULT
PERFORM_ROW_DIF BOOLEAN IN DEFAULT

・・・・・・・中略・・・・・・・

FUNCTION RECHECK RETURNS BOOLEAN
引数名 タイプ In/Out Default?
------------------------------ ----------------------- ------ --------
COMPARISON_NAME VARCHAR2 IN
SCAN_ID NUMBER IN
PERFORM_ROW_DIF BOOLEAN IN DEFAULT

SCOTT>

これでDBMS_COMPARISONパッケージを利用する準備は整った。というところで本日は終わり。

次回へ続く。

| | | コメント (0) | トラックバック (0)

2007年10月 6日 (土)

OSC (Open Source Conference) 2007 Tokyo/Fall #2

OSC 2007 Tokyo/Fall の2日目です。

実は、megawattさんとdrmarさんからビール蔵元ツア−へも誘われていたのだが、身重のウチの奥さんが少々安静にしているようにとのドクターからのお達し。ということで、あまり離れるわけにもいかず、当初の予定通り。ということで、今日は、2007-10-06 (土) Ruby Hot Topics 2007のだけ。

私は、Rubyも、Ruby on Railsも全くコーディング経験はないのだが、とにかく気になるんですよね。
奥さんが、C++より先に、Rubyやってたというのも多少なりとも影響はしているのだが。。

Rubyを知らないので、コードとか新機能とかの話はよくわからないので書かないが、とにかく遊んでみたいという気持ちが強くなってきているんですよね〜。(いろんなのに興味持ち過ぎ!・・・・・か・・・・)
で、今日のセミナーの感想を一言で表すと!


       わくわく感!

以上

Cimg7134

| | | コメント (0) | トラックバック (0)

2007年10月 5日 (金)

OSC (Open Source Conference) 2007 Tokyo/Fall #1

今日は、OSC (Open Source Conference) 2007 Tokyo/Fallに来ています。

OSCに来ると思うんですが、Mac使っている方が多いです〜。

入り口付近には、ずらりとならぶ、各ユーザグループやNPO法人などのブースがあり、その奥には、あの100ドルPCも。
Cimg7111

Cimg7116

2007-10-05 (金) 地域の自立・再生と地球環境を守るためのOSS活用提案
や、
2007-10-05 (金) 山形県立寒河江工業高校におけるLinux、オープンソースの取り組み
生まれは東京だが小学から高校までは山形(新庄)だったこともあり、田舎の経済や産業の現状を見ると、上記セミナーのタイトルにはひかれたのだが。。。参加したセミナーは

2007-10-05 (金) 地域の自立・再生と地球環境を守るためのOSS活用提案
OpenPNEの話題も出ていたが、そういえば、日本DEC同窓会のSNSもOpenPNEだな。

新庄市は財政状態が厳しいというのはニュースなどで見聞きしているが、この際いろいろなシステムにOSSを利用してしていくのもよいかもしれない。新しい市長さんへも言っとくか〜。。住民が減少傾向にあるのに道路ばかり作ってないで、新たな産業などへも目を向けて、それらを上手く活用するとか。
Cimg7112

2007-10-05 (金) オープンソースCMSの発展系、最新Plone3.0によるサイト構築
個人的には、「オープンソースCMSの発展系、最新Plone3.0によるサイト構築」が面白かったな〜。以前、仕事ではXOOPSをかなり使っていたが、Ploneもいいかも。
そういえば、Spring 8もPloneだとか。
以前からブログだけは拝見していたが本田氏のプレゼンでした。
Cimg7114

2007-10-05 (金) Heartbeatで簡単・手軽にクラスタリング!
Cimg7117
ということに。。。
ついでに、初めてカーネル読書会に参加しようと思っていたが、前日の無理がたたり、「Heartbeatで簡単・手軽にクラスタリング!」のあたりで強烈な睡魔が・・・。ということで早々に撤収。

受付で、アンケートと引き換えに抽選を。。。あ!   Asianuxのポロシャツが!!!。

明日も、興味のあるセミナーがあるのでちょっとだけ行く予定。

| | | コメント (0) | トラックバック (0)

MacOSXのX11 から Oracle Database 11g #7

MacOSXのX11 から Oracle Database 11g その7回目。
Enterprise Manager 11g Database Controlを起動してみる。

バックナンバー
MacOSXのX11 から Oracle Database 11g #1
MacOSXのX11 から Oracle Database 11g #2
MacOSXのX11 から Oracle Database 11g #3
MacOSXのX11 から Oracle Database 11g #4
MacOSXのX11 から Oracle Database 11g #5
MacOSXのX11 から Oracle Database 11g #6

Oracle10gのEnterprise Managerは、Safariなんかに最適化してませんなどと表示されていたが、Enterprise Manager 11gでは今のところem10gに類似する現象にはお目にかかっていない。。問題なさそう・・・かな・・。

Ora11g_em1

Ora11g_em2

Ora11g_em3

Ora11g_em4

Ora11g_em5

Ora11g_em6

Ora11g_em7

ということで、
Oracle11gのお遊び環境として利用しているThink Padが下取りに出されるまでに、Oracle11gの新機能で遊んでおきたいので、Oracle Database 11gのインストール絡みのエントリはこれでおしまい。

| | | コメント (0) | トラックバック (0)

2007年10月 4日 (木)

MacOSXのX11 から Oracle Database 11g #6

MacOSXのX11 から Oracle Database 11g その6回目。
インストール後の作業。

バックナンバー
MacOSXのX11 から Oracle Database 11g #1
MacOSXのX11 から Oracle Database 11g #2
MacOSXのX11 から Oracle Database 11g #3
MacOSXのX11 から Oracle Database 11g #4
MacOSXのX11 から Oracle Database 11g #5

オラクル所有者の環境変数の<詳細はマニュアルを参照のこと。

今回設定した環境変数は以下を。

[oracle@glasscatfish ˜]$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

# User specific aliases and functions

export TMP=/tmp
export TMP_DIR=/tmp

# for oracle11g
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.1.0/lampeye
export ORACLE_SID=lampsys
export ORA_NLS10=$ORACLE_HOME/nls/data
export NLS_LANG=japanese_japan.AL32UTF8
export CLASSPATH=$ORACLE_HOME/JRE/lib:$ORACLE_HOME/jlib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export PATH=$PATH:$ORACLE_HOME/bin:.
[oracle@glasscatfish ˜]$

一旦、停止後、Net Serviceも含めて手動での起動確認。

G5Server:˜ oracle$ 
G5Server:˜ oracle$
G5Server:˜ oracle$ ssh oracle@glasscatfish

oracle@glasscatfish's password:
Last login: Sun Sep 30 14:44:03 2007 from 192.168.1.19
[oracle@glasscatfish ˜]$ onsctl start
onsctl: ons started
[oracle@glasscatfish ˜]$ lsnrctl start

LSNRCTL for Linux: Version 11.1.0.6.0 - Production on 30-9月 -2007 14:47:05

Copyright (c) 1991, 2007, Oracle. All rights reserved.

/u01/app/oracle/product/11.1.0/lampeye/bin/tnslsnrを起動しています。お待ちください...

TNSLSNR for Linux: Version 11.1.0.6.0 - Production
システム・パラメータ・ファイルは/u01/app/oracle/product/11.1.0/lampeye/network/admin/listener.oraです。
ログ・メッセージを/u01/app/oracle/diag/tnslsnr/glasscatfish/listener/alert/log.xmlに書き込みました。
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=glasscatfish.macdeoracle.jp)(PORT=1521)))
リスニングしています: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=glasscatfish.macdeoracle.jp)(PORT=1521)))に接続中
リスナーのステータス
------------------------
別名 LISTENER
バージョン TNSLSNR for Linux: Version 11.1.0.6.0 - Production
開始日 30-9月 -2007 14:47:05
稼働時間 0 日 0 時間 0 分 0 秒
トレース・レベル off
セキュリティ ON: Local OS Authentication
SNMP OFF
パラメータ・ファイル /u01/app/oracle/product/11.1.0/lampeye/network/admin/listener.ora
ログ・ファイル /u01/app/oracle/diag/tnslsnr/glasscatfish/listener/alert/log.xml
リスニング・エンドポイントのサマリー...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=glasscatfish.macdeoracle.jp)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
リスナーはサービスをサポートしていません。
コマンドは正常に終了しました。
[oracle@glasscatfish ˜]$ sqlplus /nolog

SQL*Plus: Release 11.1.0.6.0 - Production on 日 9月 30 14:47:09 2007

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

SQL> conn / as sysdba
アイドル・インスタンスに接続しました。
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area 514748416 bytes
Fixed Size 1300940 bytes
Variable Size 234882612 bytes
Database Buffers 272629760 bytes
Redo Buffers 5935104 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>


以下のようなエラーが発生する場合には、SELinuxを無効又は、Permissiveにすることを忘れている場合、KNOWN ISSUEじゃ! ちなみに、今回は、SELinuxを無効にしたが、マニュアルには、Permissiveに変更するよう記載されているので、本番環境では、Permissiveにしておくべきでしょうね。
http://www.oracle-base.com/articles/11g/OracleDB11gR1InstallationOnEnterpriseLinux4and5.php


[oracle@glasscatfish ˜]$ sqlplus /nolog
sqlplus: error while loading shared libraries: /u01/app/oracle/product/11.1.0/lampeye/lib/libnnz11.so: cannot restore segment prot after reloc: Permission denied


さて、次回は、EMを軽く操作してみましょうか。。

| | | コメント (0) | トラックバック (0)

2007年10月 3日 (水)

MacOSXのX11 から Oracle Database 11g #5

MacOSXのX11 から Oracle Database 11g その5回目、いよいよMacOSXのxtermからssh経由でOracle Database 11gのインストールのつづきをQuickTimeムービーでどうぞ。

バックナンバー
MacOSXのX11 から Oracle Database 11g #1
MacOSXのX11 から Oracle Database 11g #2
MacOSXのX11 から Oracle Database 11g #3
MacOSXのX11 から Oracle Database 11g #4

Oracle11gになっても、rootユーザでのshellスクリプト実行は必須ですな〜! (^^;;;

また、事前チェックでスワップ領域の警告がでたのだが、今回のインストールでは問題ないのでそのまま進めた。

(再生にはQuickTimeが必要です。)

約13MBでサウンドトラックなし。
oracle11gx11macosx


とCentOS5 へのOracle Database 11gのインストールは、予想通り順調ですね〜、次回へつづく。

| | | コメント (0) | トラックバック (0)

MacOSXのX11 から Oracle Database 11g #4

MacOSXのX11 から Oracle Database 11g その4回目、いよいよMacOSXのxtermからssh経由でOracle Database 11gのインストール。

バックナンバー
MacOSXのX11 から Oracle Database 11g #1
MacOSXのX11 から Oracle Database 11g #2
MacOSXのX11 から Oracle Database 11g #3

以下、MacOSXのX11、xtermからssh接続にて、CentOS 5上のOUI(Oracle Universal Installer)を起動してインストールしたスクリーンショットをどうぞ!
(カスタムインストールでOracle Database 11g R1 EEをインストールした様子です。)

まず、X11のxtermを起動し、SSH接続してOUIを起動。
(尚、LANG=ja_JP.UTF-8、NLS_LANG=japanese_japan.AL32UTF8のままでもOUIは文字化けしません。ただ、MacOSXの付属のX11のxtermでは文字化けしちゃいますけどね。TerminalはUTF-8に対応しているんだが。まあ、気になる方は、LANG=en_US.UTF-8、NLS_LANG=american_america.AL32UTF8などにして文字化け回避すればいいんじゃないだろうか。今回は、OUIで文字化けしなければ問題ないのでそのまま実行しちゃいます。)

Oui0001

xtermでは文字化けしてますが、OUIでは問題なし!
Oui0002


ということで、つづきはムービーで公開予定。
(ダウントードサイズが大きめのQuickTimeにするかYouTubeにするか検討中。いまのところ別エントリで公開予定)

| | | コメント (0) | トラックバック (0)

2007年10月 2日 (火)

MacOSXのX11 から Oracle Database 11g #3

MacOSXのX11 から Oracle Database 11g その3回目です。

バックナンバー
MacOSXのX11 から Oracle Database 11g #1
MacOSXのX11 から Oracle Database 11g #2

インストレーションガイドは一度は読んでおきましょうね。

では、お役即のインストーレーション前の準備作業から。
インストレーションガイドに示された順に行ったので、ガイドを読み進みながらやればいいと思いますよ。)

特に細かい解説はしないが、各作業に関連するマニュアルのリンクを載せているのでそちらも参照のこと。

● Disk Space Requirements -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Disk Space Requirements

[root@glasscatfish ˜]# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
35G 8.3G 25G 26% /
/dev/sda1 99M 11M 83M 12% /boot
tmpfs 1010M 0 1010M 0% /dev/shm


● Memory Requirements -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Memory Requirements

[root@glasscatfish ˜]# cat /proc/meminfo
MemTotal: 2066544 kB
・・・中略・・・
SwapTotal: 2031608 kB
・・・中略・・・
[root@glasscatfish ˜]# cat /proc/cpuinfo
・・・中略・・・
model name : Intel(R) Pentium(R) M processor 1.73GHz
・・・中略・・・

[root@glasscatfish ˜]#


● Operating System Requirements -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Operating System Requirements

● Kernel Reauirements -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Kernel Reauirements


今回は、前述のマニュアルには以下のような NOTEがある。まあ、お遊び環境なので Red Hat Enterprise Linux 5.0と互換の高いCentOS 5なら問題ないだろう。(ちなみに、Oracle10g R2をCentOS4.4へインストールした際もRea Hat Enterprise Linux 4.0へのインストール手順と変るところは無かった。)

Note:
Only the distributions and versions listed in the earlier itemized list are supported. Do not install the software on other versions of Linux.

[root@glasscatfish ˜]# cat /proc/version
Linux version 2.6.18-8.el5 (mockbuild@builder4.centos.org) (gcc version 4.1.1 20070105 (Red Hat 4.1.1-52)) #1 SMP Thu Mar 15 19:57:35 EDT 2007
[root@glasscatfish ˜]#
[root@glasscatfish ˜]# uname -a
Linux glasscatfish 2.6.18-8.el5 #1 SMP Thu Mar 15 19:57:35 EDT 2007 i686 i686 i386 GNU/Linux
[root@glasscatfish ˜]#


● Package Requirements -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Package Requirements

● Compiler Requirements -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Compiler Requirements


注)libaio-devel-0.3.106-3.2、sysstat-7.0.0-3.el5、unixODBC-2.2.11-7.1、unixODBC-devel-2.2.11-7.1は、別途追加インストールした。
[root@glasscatfish ˜]# rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel glibc glibc-common glibc-devel gcc gcc-c++ libaio-devel libaio libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel
binutils-2.17.50.0.6-2.el5
compat-libstdc++-33-3.2.3-61
elfutils-libelf-0.125-3.el5
elfutils-libelf-devel-0.125-3.el5
glibc-2.5-12
glibc-common-2.5-12
glibc-devel-2.5-12
gcc-4.1.1-52.el5
gcc-c++-4.1.1-52.el5
libaio-devel-0.3.106-3.2
libaio-0.3.106-3.2
libgcc-4.1.1-52.el5
libstdc++-4.1.1-52.el5
libstdc++-devel-4.1.1-52.el5
make-3.81-1.1
sysstat-7.0.0-3.el5
unixODBC-2.2.11-7.1
unixODBC-devel-2.2.11-7.1
[root@glasscatfish ˜]#


● Configuring Name Resolution -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Configuring Name Resolution

[root@glasscatfish ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

192.168.1.7 glasscatfish.macdeoracle.jp glasscatfish
[root@glasscatfish ˜]#
[root@glasscatfish ˜]# hostname
glasscatfish.macdeoracle.jp
[root@glasscatfish ˜]#


● Creating Required Operationg System Groups and Users -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Creating Required Operationg System Groups and Users


グループは、oinstallとdbaを作成し、oracle所有者は、oracleとし、プライマリグループは、oinstall セカンダリグループは dba というお約束の構成にした。(今回は、ASMを利用しないので asmadminグループは作成しない。)
[root@glasscatfish ˜]# cat /etc/group | grep -E '(oinstall|dba)'
oinstall:x:501:oracle
dba:x:502:oracle
[root@glasscatfish ˜]#
[root@glasscatfish ˜]# cat /etc/passwd | grep oracle
oracle:x:501:501:oracle owner:/home/oracle:/bin/bash
[root@glasscatfish ˜]#

● Verifying that the User nobody Exists -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Verifying that the User nobody Exists

[root@glasscatfish ˜]# id nobody
uid=99(nobody) gid=99(nobody) groups=99(nobody)
[root@glasscatfish ˜]#


● Configuring Kernel Parameters -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Configuring Kernel Parameters

[root@glasscatfish ˜]# /sbin/sysctl -a | grep -E '(sem|shmall|shmmax|shmmni|file-max|ip_local_port_range|mem_default|mem_max|vmem_default|vmen_max)'
net.ipv4.ip_local_port_range = 32768 61000
net.core.optmem_max = 10240
net.core.rmem_default = 109568
net.core.wmem_default = 109568
net.core.rmem_max = 131071
net.core.wmem_max = 131071
kernel.sem = 250 32000 32 128
kernel.shmmni = 4096
kernel.shmall = 268435456
kernel.shmmax = 4294967295
fs.file-max = 205074
[root@glasscatfish ˜]#
[root@glasscatfish ˜]# /sbin/sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
kernel.sem = 250 32000 100 128
fs.file-max = 65536
[root@glasscatfish ˜]#


● Setting Shell Limits for the oracle User -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Setting Shell Limits for the oracle User

[root@glasscatfish ˜]# tail -6 /etc/security/limits.conf

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
# End of file
[root@glasscatfish ˜]#
[root@glasscatfish ˜]# vi /etc/pam.d/login
[root@glasscatfish ˜]# tail -3 /etc/pam.d/login
#for oracle11g
session required /lib/security/pam_limits.so
session required /pam_limits.so
[root@glasscatfish ˜]#
[root@glasscatfish ˜]# vi /etc/profile
[root@glasscatfish ˜]# tail -14 /etc/profile
fi
done

unset i
unset pathmunge

if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384
fi
fi
[root@glasscatfish ˜]#


● Creating an Oracle Base Directory -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Creating an Oracle Base Directory


Oracle Base directoryもいつもの、 /u01/app とした。尚、お遊び環境なので他のディレクトリの作成はOUIにお任せすることにした。


最後に、
● Configuring the oracle Users's Environment -
  Oracle® Database Installation Guide 11g Release 1 (11.1) for Linux - Configuring the oracle Users's Environment


Oracle所有者の環境変数などもいつもの同じなので特に解説するまでもないと思うので、マニュアルを参照してくださいね。

尚、今回作成するデータベースの SIDは、lampeye にするつもりだったのだが、打ち間違えて、lampsys になってしまった。(^^;;;
お遊び環境なので作り直しはせず、lampsys のままに・・・・・・。(本番環境作るときはタイプミスに注意しましょうね。。)

尚、今回は、MacOSXからxtermを利用するので、MacOSXからCentOS 5へXサーバーへのアクセスを許可しておく必要がある。お忘れなく!

例)IPアドレスが192.168.1.19へXサーバーへのアクセスを許可する場合。

[root@glasscatfish ˜]# xhost +192.168.1.19
192.168.1.19 being added to access control list
[root@glasscatfish ˜]#

ということで、 Oracle Database インストール前の準備はこんなところ、Oracle10g R2のインストール前作業と大きく変わるところはない。

次回はいよいよ、インストール。11gのインストーラーはどんな感じなのかなぁ・・・・・。

| | | コメント (0) | トラックバック (0)

2007年10月 1日 (月)

MacOSXのX11 から Oracle Database 11g #2

さて、前回からのつづきです。

CentOS 5をダウンロードし、CD6枚を作成し、あっという間にインストール終了。
MacOSXでCDを作成する方法は、「Mac De Oracle - 10万円 de RAC #9」などを参考に。

(CentOSのインストール方法は、さて前回紹介した書籍やネットをググって見てくださいね。)

CentOSのインストールについて解説するつもりはないが、インストール後にCentOS 5での準備については少々書いておく。

Oracle Universal Installer (以下、OUI)は、MacOSXのxtermからssh接続して実行するのでまずはssh接続の確認。

G5Server:˜ oracle$ ssh -Y oracle@glasscatfish
The authenticity of host 'glasscatfish (192.168.1.7)' can't be established.
RSA key fingerprint is 13:86:62:9a:95:2c:d7:98:11:aa:3b:f1:e2:35:05:b3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'glasscatfish,192.168.1.7' (RSA) to the list of known hosts.
oracle@glasscatfish's password:
Last login: Sat Sep 29 10:48:25 2007 from 192.168.1.13
[oracle@glasscatfish ˜]$

ついでに、VNCでの接続も確認しておく。(MacOSXからCentOSのGnome Desktopでいろいろとやる事もあだろうし。)
CentOS側では、メニューの「システム」->「設定」->「リモートデスクトップ」でVNCによるリモートデスクトップが利用できるようになっている。


Remote6 Remote7

MacOSXからはChiken of the VNCを利用し接続している。

Remote1 Remote2

Remote3

VNC接続に必要なポートを空けて必要があるのでFirewallの設定もお忘れなく。

Remote5

それと、Oracle Database 11gのインストール後に関するエントリにも書くつもりだが、SELinuxはPermissive又は無効にしておく必要がある。今回は無効にした。
(Oracle10gの時もそうだったな。)
尚、マニュアルには、Permissiveへ変更するよう記載されているので本番環境ではPermissiveにするべきでしょうね。

http://www.oracle-base.com/articles/11g/OracleDB11gR1InstallationOnEnterpriseLinux4and5.php
どのようなエラーになるのかは、Oracle Database 11gのインストール後に関するエントリで書く予定。


Remote4


しかし、Linuxのインストールや設定はバージョンアップ毎に楽になっているのがわかるよな〜。ほんと。

| | | コメント (0) | トラックバック (0)

2007年9月30日 (日)

MacOSXのX11 から Oracle Database 11g #1

いや〜、Oracle10gのころは各プラットフォームのOracle Databaseが次々にOTN USからダウンロードできたのになんか、Linux X86版リリース後、なかなか次のがないな〜。軸足がLinuxに置かれたのはなんとなく理解できるが・・・・。

しかたないので、Oracle Database 11g for Linux x86を CentOS 5.0へインストールして遊ぶことにした。

え、MacOSXとは無関係じゃん?!   

はい。それはそうなんですが、無理矢理絡めるのが Mac De Oracle流!


そう、 Oracle Database 11gのインストール作業はすべて、MacOSX X11のxtermからSSH接続して行うことにする。

CentOS 5は、Red Had Enterprise Linux 5と互換があるので、インストールには問題はないだろう。(Oracle10gをCentOS 4.4へインストールした際も全く問題なかったしね。)

では、まずは、利用する環境から。

● H/W - IBM (レノボ) ThinkPad R52 / CPU Pentium M 1.73Ghz / メモリ:2GB / DISK:40GB

今回利用しているノートPCは、妻が仕事で利用していたものなのだが、仕事も無事おわりMacがメインのウチでは邪魔なので、いずれ下取りに出すことが確定している。ただ、下取りに出すまで間、Oracle Database 11gのサーバーにして遊んでおこうか! というのが事の発端なのですがね。。・・・

● OS - CentOS 5 - i386

● Oracle Database 11g R1 EE for Linux X86

● そして、忘れちゃならねぇ、Mac - Apple PowerMac G5 Dual 2.7Ghz - MacOSX 10.4.10 Server
うちは未だに、IntelMacが無いのだが、LeopardがリリースされてMacBookなんか登場したら考えよ。・・・・・・・

参考
Oracle Database 11g マニュアル(英語)

CentOSが始めての方は、これなんかいいんじゃないかな。

あとは、これとか

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年9月28日 (金)

"日本語"のデータベースオブジェクト名 #2

ということで、前回のつづきというか、予告通り、"日本語"(マルチバイト文字)をデータベースオブジェクト名として定義しているデータベースで起こりうる問題点について。

"日本語"(マルチバイト文字)で 表名、列名、いないと思うけど(笑)ストアドプロシージャ名などを定義している方々は注意しておいたほうがよいだろう。

Oracleで許可されているデータベースオブジェクト名のサイズは、マニュアルにも記載されているように、データベース名とデータベースリンクを除き、30バイトまでと規定されていることを思い出してほしい。

日本語:Oracle Database SQLリファレンス 10g リリース2(10.2) - スキーマ・オブジェクトのネーミング規則

英語:Oracle® Database SQL Reference 10g Release 2 (10.2) - Schema Object Names and Qualifiers

例えば、データベースキャラクタセットが、JA16SJISである場合、テーブル名や列名を日本語(マルチバイト文字)で定義すると利用できる文字数は最大15文字までである。(半角英数字であれば、30文字)

以下、データベースキャラクタセット:JA16SJIS環境下でマルチバイト/シングルバイトでテーブル名を定義した場合の例

SCOTT> select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET JA16SJISTILDE

SCOTT>
SCOTT>
SCOTT> create table z12345678901234567890123456789 (a number);

表が作成されました。

●マルチバイト文字で15文字(30バイト)なのでOK!

SCOTT> create table "Z12345678901234" (a number);

表が作成されました。

SCOTT> create table z12345678901234567890123456789x (a number);
create table z12345678901234567890123456789x (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。

●マルチバイト文字で16文字(32バイト)なのでNG!

SCOTT> create table "Z123456789012345" (a number);
create table "Z123456789012345" (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。


SCOTT>
SCOTT> select table_name,lengthb(table_name) from user_tables;

TABLE_NAME LENGTHB(TABLE_NAME)
------------------------------ -------------------
Z12345678901234567890123456789 30
Z12345678901234 30

SCOTT>


前述のようなJA16SJISをデータベースキャラクタセットとするデータベースを、Unicodeのキャラクタセットである AL32UTF8 をデータベースキャラクタセットとするデータベースへ移行しようとした場合、どうなるか想像できますか?

想像できますよね? 

そう、単純には移行できないのですよ。JA16SJISでは2バイトだった文字がAL32UTF8では3バイトになる訳ですから。

マルチバイト1文字のバイト数の増加によりデータ量も増加するので、DISK容量の見直しも必要になるのですが、一番問題になるのが、日本語でデータベースオブジェクト名を定義しているという点でしょう。

もし、表名や列名を日本語(マルチバイト文字)11文字以上で定義しているとしたら、データベースキャラクタセットが AL32UTF8 であるデータベース上では、DDL全てがエラーになるはずです。
それらを修正するとなると、SQL/DDL文。その他プログラムに至まで、その影響は広範囲に渡るのではないでしょうか?


将来的なことも考慮してUnicode環境へ移行したいということであれば、コストを掛けて移行する価値はあると思います。その際にはシングルバイト文字で各名称を定義したほうがよいでしょうね。日本語の表名や列名の方が、直感的にわかりやすいからと日本語でテーブル名や列名を定義し、たった10文字でわかりやすい名称を定義することはかなり難しいと思いますから。

A:「--------」
B:「え、10文字でも定義できますよって!? 」
B:「もしや、"T123456789"とかいうテーブル名にでもしようと考えていますか?」
B:「それとも、名称を省略しまくって10文字以内の略名にしようと考えているのでしょうか?」
B:「それが、直感的に見てわかりやすい名称でしょうか?」
B:「見て、直感的に理解しやすいから日本語名称でテーブル名を定義したいのではないですか?」
な〜〜〜〜んて、やりとりが聞こえてきそう。。。

私が関わったところではそんな面倒なところは無かったので幸せだったりするが・・・・・

以下、データベースキャラクタセット:AL32UTF8環境でマルチバイト/シングルバイト、それぞれでテーブル名を定義した場合の例

SCOTT> select * from v$nls_parameters where parameter = 'NLS_CHARACTERSET';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET AL32UTF8

SCOTT>
SCOTT> create table z12345678901234567890123456789 (a number);

表が作成されました。

●マルチバイト文字で15文字(45バイト)!、当然サイズ超過!


SCOTT> create table "Z1234567891234" (a number);
create table "Z1234567891234" (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。

●マルチバイト文字で10文字。(30バイト)

SCOTT> create table "Z123456789" (a number);

表が作成されました。

●シングルバイト文字で31文字(31バイト)なので当然エラー!

SCOTT> create table z12345678901234567890123456789x (a number);
create table z12345678901234567890123456789 (a number)
*
行1でエラーが発生しました。:
ORA-00972: 識別子が長すぎます。


SCOTT>


SCOTT> select table_name,lengthb(table_name) from user_tables;

TABLE_NAME LENGTHB(TABLE_NAME)
------------------------------------------------------------ -------------------
Z123456789 30
Z12345678901234567890123456789 30

SCOTT>

| | | コメント (0) | トラックバック (0)

2007年9月27日 (木)

"日本語"のデータベースオブジェクト名 #1

Oracle10gのグローバリゼーションガイドには、新たに構築するデータベースでは、データベースキャラクタセットとして AL32UTF8 を推奨している。
Oracle Database グローバリゼーション・サポート・ガイド
10g リリース2(10.2)- データベース・キャラクタ・セットに関する指示書

ちなみに、Oracle製品間であっても、こんな注意点もある。
Oracle Content Management SDK(Oracle CM SDK)

とにかく、データベースキャラクタセットを選択する際には、関連するプロダクトの制限などもよ〜〜く調査して、方針を決めないといけないだろうね。あとで苦労しないためにも。

次回は、データベースキャラクタセット絡みで注意しないとならない点を書こうかな。
特に、日本語(マルチバイト文字)で表名、列名、その他のデータベースオブジェクト名を定義しているようなところでは注意しておいたほうがよい点について書いてみようかと。

そういえば、"日本語" de ストアドなんてお遊びもやってましたねぇ。(^^;;

| | | コメント (0) | トラックバック (0)

2007年9月23日 (日)

SQL*Loader で BLOBロード

少々前に、大量のBLOBデータをデータベースへロードするためのプログラムをコーディングしている方がいたのだが、そのプログラムの仕様を聞いてみたら、SQL*Loaderでも対応可能な内容だった。SQL*LoaderでBLOBデータをローディングできることは知らなかったのだ。知っていたらもっと楽だったろうに。


今回の例ではOracle10g R1を利用しているのだが、Oracle10g R2でも使い方は同じ。

● 参考:
・Oracle Database ユーティリティ 10g リリース1(10.1)
・Oracle Database ユーティリティ 10g リリース2(10.2)LOBFILEからのLOBデータロード
・Oracle Database ユーティリティ 10g リリース2(10.2)EXPRESSIONパラメータ

ということで、前述の話に比べると少々単純なのだがロードの例を一つ。

● まずは準備。

BLOBを格納する表のキーはユニークな数値なので、シーケンスを利用する。え!? SQL*Loaderでシーケンスが利用できるのか?
できるんです。EXPRESSIONパラメータを利用すれば!(EXPRESSIONパラメータの利用例は随分前にOTN-JのCode Tipsへも投稿してあったっけ。OTN-JのCode Tipsを参照するにはOTN-Jへのユーザ登録(無料)必要です。)

> conn scott/tiger
接続されました。
SCOTT>
SCOTT>
SCOTT> create sequence sq_blob_key
2 start with 1
3 increment by 1
4 maxvalue 999999
5 nocycle
6 nocache;

順序が作成されました。

BLOBデータを登録する表の定義は以下。
(blob用表領域は他のデーブルデータとは別表領域にしている)

SCOTT> l
1 create table blobtab
2 (
3 blob_id number primary key,
4 blob_type varchar(4),
5 content blob
6 )
7 lob(content) store as
8 (
9 tablespace blobspace
10 nocache logging
11* )
SCOTT> /

表が作成されました。

SCOTT>


● SQL*Loaderの制御ファイルとBLOBとして登録するファイルは同一ディレクトリ上へ配置。

ちなみに、Linux/Unix系OSでは、hostコマンドまたは、! を利用すればSQL*Plusからshellコマンドなとを直接実行できる。
SCOTT>  
SCOTT> !ls | grep -E '¥.(ctl|jpg|zip|png|gif)$'
blobload.ctl
discus.gif
generic_connectivity.zip
image001.png
neontetra.jpg

SCOTT>


● SQL*Loaderの制御ファイルの内容

ポイントは、シーケンスを利用するために、expressionパラメータで sq_blob_key.nextval と設定している点と、ex_fname FILLER以降の定義(赤字部分)。
SCOTT> !cat blobload.ctl
LOAD DATA
INFILE 'blobload.dat'
INTO TABLE blobtab
FIELDS TERMINATED BY ','
(
blob_id expression "sq_blob_key.nextval",
blob_type,
ext_fname FILLER CHAR(80),
content LOBFILE(ext_fname) TERMINATED BY EOF
)


● SQL*Loaderの制御ファイルのINFILEパラメータで指定するデータファイルの内容

この例では同一ディレクトリに配置した gif/zip/png/jpgを登録対象とした。
拡張子、ファイル名の順にカンマ区切りでデータファイルを作成。(awkを使えば簡単ですしね)

SCOTT> !ls | grep -E '¥.(zip|jpg|png|gif)$' | awk '{print substr($1,index($1,".")+1)","$1","}' > blobload.dat
SCOTT> !cat blobload.dat
gif,discus.gif,
zip,generic_connectivity.zip,
png,image001.png,
jpg,neontetra.jpg,

SCOTT>
SCOTT>


● 準備完了!

準備が整った。今回はSQL*Loaderの制御ファイル、データファイル、BLOBとして登録するファイルを同一ディレクトリに配置した。
SCOTT> !ls | grep -E '¥.(ctl|dat|jpg|zip|png|gif)$'
blobload.ctl
blobload.dat
discus.gif
generic_connectivity.zip
image001.png
neontetra.jpg

SCOTT>


● SQL*Loaderの実行

SCOTT> !sqlldr userid=scott/tiger@xtiger control=blobload.ctl log=blobload.log

SQL*Loader: Release 10.1.0.3.0 - Production on 土 9月 22 17:12:16 2007

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

コミット・ポイントに達しました。 - 論理レコード件数4

SCOTT>


● SQL*Loaderのログを確認!

SCOTT> !cat blobload.log

SQL*Loader: Release 10.1.0.3.0 - Production on 土 9月 22 17:12:16 2007

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

制御ファイル: blobload.ctl
データ・ファイルblobload.dat
不良ファイル: blobload.bad
廃棄ファイル: 指定なし

(すべて廃棄できます)

ロード数: ALL
スキップ数: 0
許容エラー数: 50
バインド配列: 64行、最大256000バイト
継続文字: 指定なし
使用パス: 従来型

表BLOBTAB、 ロード済 すべての論理レコードから
この表に対する有効な挿入オプション: INSERT

Column Name Position Len Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
BLOB_ID EXPRESSION
列のSQL文字列 : "sq_blob_key.nextval"
BLOB_TYPE FIRST * , CHARACTER
EXT_FNAME NEXT 80 , CHARACTER
(FILLERフィールド)
CONTENT DERIVED * EOF CHARACTER
動的LOBFILE - ファイル名EXT_FNAME


表BLOBTAB:
4行のロードに成功しました。
0行はデータ・エラーのためロードされませんでした。
0行はWHEN句のエラーのためロードされませんでした。
0行はすべてのフィールドがNULLのためロードされませんでした。

バインド配列に割り当てられた領域: 21760バイト(64行)
読取りバッファのバイト数: 1048576

スキップされた論理レコードの合計: 0
読み込まれた論理レコードの合計: 4
拒否された論理レコードの合計: 0
廃棄された論理レコードの合計: 0

実行開始土 9月 22 17:12:16 2007
実行終了土 9月 22 17:12:17 2007

実行時間: 00: 00: 00.80
CPUタイム : 00: 00: 00.06

SCOTT>


● 内容確認。(登録ファイルのサイズとBLOBサイズが同じであることを確認)

SCOTT> select
2 blob_id,
3 blob_type,
4 lengthb(content)
5 from
6 blobtab
7 order by
8 blob_id;

BLOB_ID BLOB LENGTHB(CONTENT)
---------- ---- ----------------
1 gif 9675
2 zip 20070
3 png 2327573
4 jpg 6492

SCOTT>
SCOTT> !ls -l | grep -E '¥.(jpg|zip|png|gif)$'
-rw-r--r-- 1 oracle oinstall 9675 Dec 31 1997 discus.gif
-rw-r--r-- 1 oracle oinstall 20070 Nov 17 2005 generic_connectivity.zip
-rw-r--r-- 1 oracle oinstall 2327573 Jul 21 16:21 image001.png
-rw-r--r-- 1 oracle oinstall 6492 May 4 1999 neontetra.jpg

SCOTT>

| | | コメント (0) | トラックバック (0)

2007年9月16日 (日)

MERGE文 #2 - 同一表でマージ?!

merge文を利用したついでに、merge文のTipsも1つ紹介しておきましょう。(Oracle9iでmerge文が追加された際、OTN-Jでも同じ話題があったので投稿したネタですが使えるTipsなのでね。。今そのスレッドの日付を見たら、なんと、2002年。。。時の経つのは早いもので。。。)

ということで、今回はMERGE文のTipsを一つ。

この内容は、2002年にOracle9iでmerge文がサポートされた頃にOTN-Jのフォーラムに投稿した内容ですが、「同一表を使ってMERGE文を実行する」というTipsです。

MERGE文ばOracle9iから登場するということで、リリース直後からMERGE文についてはいろいろと実験をしていて、通常2つの表を使うMERGE文を1つの表だけで行えないのか? とあれやこれや試し、dual表を上手に利用すれば実現可能であることがわかっていた。ほぼその頃にOTN-Jのフォーラムに投稿された内容に。。

単一の表だけでMERGE文を実行できるか?  というスレッド

があったのでレスを付けたのが2002年。

投稿したのはWindowsで実験したログだったが、MERGE文を試していた環境は日本ではリリースされなかった? Oracle9i R2 Developer Preview for MacOSX Server (Jaguar)上だったんですよ〜。マニアック過ぎるけど。。。。

例では、1つの表に対して、データが存在していなければデータ登録、存在していれば更新するという処理をMERGE文だけで行っています。
通常2つの表を利用するMERGE文ですが、dual表をダミーとして利用すれば、1つの表に対してMERGE文を実行できるというわけです。
(MERGE文の用途は結構広いので、知っていて損はないと思いますよ〜。)
ただし、内部では複雑なことをやっているようなので、事前にBUG情報などをチェックしておくこともよいかもしれません。(不具合により意図した動作をしない場合を想定して、代替案を考えなくてはなりませんからね。)

ということで、2002年に投稿した内容より。

Oracle9i 9.0.1.3.0 EE for windowsで試したログ

SQL> set linesize 132
SQL> set pagesize 500
SQL> column create_timestamp format a30
SQL> column update_timestamp format a30
SQL> column id format a4
SQL> column data format a4

SQL> create table sample_table
2 (
3 id varchar2(10) primary key,
4 data varchar2(40),
5 create_timestamp timestamp,
6 update_timestamp timestamp
7 );

表が作成されました。

SQL> create table sample_table_temp
2 (
3 id varchar2(10) primary key,
4 data varchar2(40),
5 create_timestamp timestamp,
6 update_timestamp timestamp
7 );

表が作成されました。

SQL> insert into sample_table values('A001','HOGE',systimestamp,null);

1行が作成されました。

SQL> insert into sample_table values('A002','SOLE',systimestamp,null);

1行が作成されました。

SQL> insert into sample_table values('A003','DOLE',systimestamp,null);

1行が作成されました。

SQL> insert into sample_table values('A004','KOLE',systimestamp,null);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> insert into sample_table_temp values('A003','どれ',systimestamp,null);

1行が作成されました。

SQL> insert into sample_table_temp values('A002','それ',systimestamp,null);

1行が作成されました。

SQL> insert into sample_table_temp values('B001','なに',systimestamp,null);

1行が作成されました。

SQL> insert into sample_table_temp values('B002','ほれ',systimestamp,null);

1行が作成されました。

SQL> commit;

コミットが完了しました。



※まずは、2つの表の単純なマージでMERGE文の感覚を掴む!

SQL> merge into sample_table
2 using sample_table_temp
3 on (sample_table.id = sample_table_temp.id)
4 when matched then
5 update set
6 sample_table.data = sample_table_temp.data,
7 sample_table.update_timestamp = systimestamp
8 when not matched then
9 insert values
10 (
11 sample_table_temp.id,
12 sample_table_temp.data,
13 systimestamp,
14 null
15 );

4行がマージされました。

SQL> select * from sample_table;

ID DATA CREATE_TIMESTAMP UPDATE_TIMESTAMP
---- ---- ------------------------------ ------------------------------
A001 HOGE 02-05-23 13:24:59.000001
A002 それ 02-05-23 13:25:59.000001 02-05-23 13:40:59.000000
A003 どれ 02-05-23 13:26:20.000001 02-05-23 13:40:59.000000
A004 KOLE 02-05-23 13:26:57.000000
B002 ほれ 02-05-23 13:40:59.000000
B001 なに 02-05-23 13:40:59.000000

6行が選択されました。

SQL> commit;


SQL> select * from sample_table;

ID DATA CREATE_TIMESTAMP UPDATE_TIMESTAMP
---- ---- ------------------------------ ------------------------------
A001 HOGE 02-05-23 13:24:59.000001
A002 SOLE 02-05-23 13:25:59.000001
A003 DOLE 02-05-23 13:26:20.000001
A004 KOLE 02-05-23 13:26:57.000000


SQL> select * from sample_table_temp;

ID DATA CREATE_TIMESTAMP UPDATE_TIMESTAMP
---- ---- ------------------------------ ------------------------------
A003 どれ 02-05-23 13:27:40.000001
A002 それ 02-05-23 13:28:04.000001
B001 なに 02-05-23 13:28:28.000001
B002 ほれ 02-05-23 13:28:56.000001



※本題、dual表をダミーとして同一表でMERGE文を利用する。以下の例では、同一キーがないため、挿入されます。
SQL> merge into sample_table src
2 using ( select 'C001' id from dual ) dummy
3 on ( src.id = dummy.id )
4 when matched then
5 update set
6 data = 'だ!',
7 update_timestamp = systimestamp
8 when not matched then
9 insert values
10 (
11 'C001',
12 'だ〜',
13 systimestamp,
14 null
15 );


1行がマージされました。

SQL> select * from sample_table;

ID DATA CREATE_TIMESTAMP UPDATE_TIMESTAMP
---- ---- ------------------------------ ------------------------------
A001 HOGE 02-05-23 13:24:59.000001
A002 それ 02-05-23 13:25:59.000001 02-05-23 13:40:59.000000
A003 どれ 02-05-23 13:26:20.000001 02-05-23 13:40:59.000000
A004 KOLE 02-05-23 13:26:57.000000
B002 ほれ 02-05-23 13:40:59.000000
B001 あ! 02-05-23 13:40:59.000000 02-05-23 14:06:28.000000
C001 だ〜 02-05-23 14:37:08.000001

7行が選択されました。


※さらに同一文を実行すると、同一キーがあるため更新されます。
SQL> merge into sample_table src
2 using ( select 'C001' id from dual ) dummy
3 on ( src.id = dummy.id )
4 when matched then
5 update set
6 data = 'だ!',
7 update_timestamp = systimestamp
8 when not matched then
9 insert values
10 (
11 'C001',
12 'だ〜',
13 systimestamp,
14 null
15 );

1行がマージされました。

SQL> select * from sample_table;

ID DATA CREATE_TIMESTAMP UPDATE_TIMESTAMP
---- ---- ------------------------------ ------------------------------
A001 HOGE 02-05-23 13:24:59.000001
A002 それ 02-05-23 13:25:59.000001 02-05-23 13:40:59.000000
A003 どれ 02-05-23 13:26:20.000001 02-05-23 13:40:59.000000
A004 KOLE 02-05-23 13:26:57.000000
B002 ほれ 02-05-23 13:40:59.000000
B001 あ! 02-05-23 13:40:59.000000 02-05-23 14:06:28.000000
C001 だ! 02-05-23 14:37:08.000001 02-05-23 14:37:30.000000

7行が選択されました。

| | | コメント (0) | トラックバック (0)

2007年9月15日 (土)

MERGE文 #1 - 重複行の削除

ははは、久々のOracleネタです。

最近、OTN-Jのフォーラムを閲覧したり返信したりする回数を控えている。Feedの概要だけ眺めている事が多くなってきていることも影響しているが、興味をそそる内容のものが少ないことや、本家US OTNのフォーラムOracle Aceの方々のブログのほうが面白いのもその理由の一つ)

で、しばらく振りで、面白そうなネタだったのでレスを付けた。
ちょいと前のネタになるが、

定義の同じ2つの表のデータを纏めて表示したい。ただし、重複データを除く。また、重複していた件数も取得したい。。。。

というスレッド。

ただ質問内容を読むと、最近よくある実行環境(Oracleのバージョンなど)を記述せず、●●したいというタイプの質問。
(単に書き忘れかもしれないが、問題が発生している環境やOracleのバージョンを書かずに意図した答えを待ってるなんて時間がもったいないじゃん。そこんとこをちゃんと公開していれば、もっと早く意図した解答得られたと思うが。。)
そして、最後まで、実行環境に関する情報は未提示のままスレッドは終わるのであった〜〜(笑)

ということで質問内容など詳細は下記URLで
http://otn.oracle.co.jp/forum/message.jspa?messageID=35016369&tstart=15

私がレスした内容は以下のようなもの。


(質問内容のカラム名が ”日本語”だったので例題も引用識別子で囲んだ日本語の表/列名にしてあります。私は実際の開発では使いませんけどね、日本語オブジェクト名なんて。。


主キー制約や一意制約、その他の制約などが提示されていないので勝手に作ってありますが、merge文を使えば出来ますよ。
尚、Oracle10gを利用していものと仮定していますので、Oracle9i以前である場合、merge文でdeleteを実施することはできません。

また、暗黙カーソルを利用していますので、sql%rowcount属性で重複行数(マージした行数)を取得しています。
(明示カーソルにした場合は、カーソル名%rowcount)

他の方法もあると思いますので、あとは処理速度等比較し、よい方を採用すれば良いと思います。

詳細は、SQLや、PL/SQLリファレンスマニュアルの merge文及び、カーソル属性あたりを確認してみてください。

SCOTT> create table "テーブルA"
2 ("商品コード" char(5) not null,
3 "送品年月日" date not null,
4 "個数" number(4) not null
5 );

表が作成されました。

SCOTT> create table "テーブルB" as select * from "テーブルA";

表が作成されました。

SCOTT>

データの登録・・・・中略・・・・

SCOTT> alter session set nls_date_format = 'yyyy/mm/dd';

セッションが変更されました。

SCOTT> select * from "テーブルA";

商品コード 送品年月日 個数
-------- ---------- ----------
00001 2007/07/18 5
00002 2007/07/18 6
00003 2007/07/19 7
00004 2007/07/18 5
00005 2007/07/20 4
00001 2007/07/19 8
00002 2007/07/19 2
00003 2007/07/20 0

8行が選択されました。

SCOTT> select * from "テーブルB";

商品コード 送品年月日 個数
-------- ---------- ----------
00001 2007/08/18 5
00002 2007/08/18 6
00003 2007/07/19 9
00004 2007/08/18 5
00005 2007/08/20 4
00001 2007/07/19 10
00002 2007/08/19 2
00003 2007/08/20 0

8行が選択されました。


SCOTT> set serveroutput on
SCOTT> l
1 begin
2 merge
2 into "テーブルA" dest
3 using "テーブルB" src
4 on (
5 dest."商品コード"=src."商品コード"
6 and dest."送品年月日"=src."送品年月日"
7 )
8 when matched then update set dest."個数"=-1
9 delete where dest."個数"=-1;
10 dbms_output.put_line(sql%rowcount);
11* end;
SCOTT> /

2

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

SCOTT>
SCOTT> select * from "テーブルA";

商品コード 送品年月日 個数
-------- ---------- ----------
00001 2007/07/18 5
00002 2007/07/18 6
00004 2007/07/18 5
00005 2007/07/20 4
00002 2007/07/19 2
00003 2007/07/20 0

6行が選択されました。

SCOTT>

マニュアルにもしっかり記述されているが、merge文のdelete句を利用する場合のポイントは、マージ条件に一致し、update句で更新対象となったデータがdelete句の処理対象となるという点だ。delete句がupdate句とは個別に実行されるわけではない。
前述の例では、update句でマージ条件に一致したデータ(この場合は重複しているデータ)の”個数”を-1に変更し、delete句で "個数” = -1となったデータ(重複したデータ)を削除している。
このことを理解していないと意図した結果を得られないので要注意。(一度理解してしまえば間違ることもなくなると思うが。。。)

merge文を利用したついでに、merge文のTipsも1つ紹介しておきましょう。(Oracle9iでmerge文が追加された際、OTN-Jでも同じ話題があったので投稿したネタですが使えるTipsなのでね。。
今そのスレッドの日付を見たら、なんと、2002年。。。時の経つのは早いもので。。。)

では、次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年9月13日 (木)

MySQL Users Conference Japan 2007 #2

MySQL Users Conference Japan 2007の最終日です。

コンファレンスの内容などは、他方々のブログ等のエントリで十分なので特に書く事もないのだが、例によって参加したセッションの一こまを。

● パネルディスカッション: MySQL の独自性と優位点

Kaj Arno, VP Community, MySQL AB
Patrick Bolduan, MTV Japan (Customer)
Kai Seidler, XAMPP (Community Member)
Marten Mickos, CEO, MySQL AB
Michael "Monty" Widenius, MySQL Fellow and Co-founder, MySQL AB
Brian Aker, Director of Architecture, MySQL AB

Cimg6581

● MySQL の Plugin API 詳細解説(ストレージエンジン自作入門)

Brian Aker  - Director of Architecture, MySQL AB
Cimg6582

● MySQL Cluster 入門

Stewart Smith - Cluster Developer, MySQL AB
Cimg6585

● MySQL Cluster の詳細解説

Stewart Smith - Cluster Developer, MySQL AB
Cimg6586

● MySQL 5.1の詳細解説

Brian Aker - Stewart Smith
Cimg6587

● MySQL テクニカルケーススタディ(海外事例解説)

Jimmy Guerrero - Product Manager for MySQL Cluster, MySQL AB
Cimg6588

● レセプション

今日はこの後、しっかりと夕食を食べることになっているので、軽く摘んでおきました。(^^
ワインやビールもありましたが何せ車なのでウーロンだけ〜。
レセプションの最後に抽選があったんですけど、当たっちゃいました。くじ運悪い私が!。
頂いたものは後日、ブログ de ノベルティへ。

Cimg6594

20070912001 20070912002 20070912003

スーツよりジーンズな方が多いのは、それだけで楽しかったりして。

あ、忘れるところだったが、Q&Aで、MySQLの storage engineとしてDB2を利用できるようにするという話題に関しても少々触れていたましたねぇ。今後どうなるんでしょうねぇ。



2007/9/13追記
セッションで使用したプレゼン内容は、あとで公開されるようなことを言っていましたね。そういえば。
ということで、セッションの資料が公開されたらリンクを追加する予定。

以下のエントリは詳細なメモが記載されてますね (^^;。
http://d.hatena.ne.jp/akiyan/20070911

従業員用食堂か〜〜、気付かなかったよ〜。 1200円も払ってまずい煮込みハンバーグ+マッシュポテトだったよ。(><)
http://nonn-et-twk.net/twk/node/93

| | | コメント (0) | トラックバック (0)

2007年9月11日 (火)

MySQL Users Conference Japan 2007 #1

え〜〜っ。またまた、オラクル以外のネタ。 MySQL Users Conference Japan 2007に来ています。
(Generic ConnectivitiyネタでもMySQLはやってますが、なにせ、4.x及び、4.1なのでね。。。いずれ、5.x系のMySQLと10g R1 又は、11g R1でGeneric Connectivityネタもやりたいし。。。MacOSX版のOracle11gがリリースされればの話ですが。。)

Mysqlucjapan2007

Cimg6560

ということで、本日参加したセッションは、

● MySQL高可用性ソリューションの概要

Overview of MySQL HA solutions
- Jimmy Guerrero (Product Manager for MySQL Cluster, MySQL AB)

● 社内外の開発者が参加するMySQLの開発モデル

MySQL architecture of Participation
- Kaj Arno (VP Community Relations, MySQL AB)

Cimg6564 Cimg6565

● MySQLパフォーマンスチューニング&ベンチマーク

Performance Tuning and Benchmarks
- Colin Charles (Community Relations Manager, APAC at MySQL AB)

Cimg6566

● Web 2.0に向けたMySQLアーキテクチャ

Web 2.0 and emerging web technologies
- Brian Aker (Director of architecture. MySQL AB)

Cimg6568

ちなみに、Brian Akerさんは、Mac使ってプレゼンしてましたね〜。

それに、ランチビュッフェも頂きました。。
Cimg6563 Cimg6562


MySQL 5.1.xのパーティショニングのタイプもOracleと同じようなタイプをサポートしているようなのでコンポジットパーティションで組み合わせる事ができるパーティショニングタイプなんかも調べておこうか。 そういえば、Oracle11gでは、コンポジットパーティションで利用できるパーティションタイプの組み合わせがかなり増えていたなぁ。

明日も楽しみじゃ。

| | | コメント (0) | トラックバック (0)

2007年8月30日 (木)

Oracle de Fizzbuzz #2

前回はOracle上にFizzbuzz用基本的な環境を作成したところまでだった。
今回は、幾つかの前提を設け、なるべくこちらの意図した解答を引き出す工夫も含めて..

事前にnullを設定した10行を登録した表を用意しておき、SQL文だけでFizzbuzzを解かせるなんてのもおもしろそう。

SYS> create table fizzbuzz.x (x number(1));

表が作成されました。

SYS> l
1 begin
2 for i in 1..10 loop
3 insert into fizzbuzz.x values(null);
4 end loop;
5* end;
SYS> /

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

SYS> commit;

コミットが完了しました。

SYS> set null NULLだ!
SYS> select * from fizzbuzz.x;

X
----------
NULLだ!
NULLだ!
NULLだ!
NULLだ!
NULLだ!
NULLだ!
NULLだ!
NULLだ!
NULLだ!
NULLだ!

10行が選択されました。

上記のような前提なら、以下のような答えを期待しちゃう。ポイントは直積するか、という点と、rownum疑似列を使っうかどうか、ってところ。。

FIZZBUZZ> l
1 select
2 case 0
3 when mod(rownum,15) then 'fizzbuzz'
4 when mod(rownum,3) then 'fizz'
5 when mod(rownum,5) then 'buzz'
6 else to_char(rownum)
7 end as results
8 from
9* x a cross join x b
FIZZBUZZ>

事前にデータを準備せず、100行の生成もSQLで行うことを期待するのであれば、オラクルだと Oracle9i以降であれば、cube又はrollup、Oracle10g以降であれば階層問合せのいずれかというところか。
case式の変わりに、decodeを利用したり、with句を利用しないで単純に副問い合せにしたりといういくつかのバリエーションはあるとおもうが・・・・・。
(いまさら、Oracle8iを利用することもないだろうから。。。まだ、利用している方、すみません。。。)

部分的cubeがいくつの小計を計算するかさえ知っていれば。。。以下のようなクエリで実現できる。以下の方法であれば、cubeがサポートされたOracle9i以降で実行できるクエリ版、fizzbuzzが作れる。

日本語のマニュアルはこちら
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19217-02/aggreg.htm#sthref1627

英語版のマニュアルはこちら
http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/aggreg.htm#sthref1627

FIZZBUZZ> edit
file afiedt.bufが書き込まれました。

1 with
2 t as (
3 select 1 from dual group by cube(1,1,1,1)
4 )
5 select
6 case 0
7 when mod(rownum,15) then 'fizzbuzz'
8 when mod(rownum,3) then 'fizz'
9 when mod(rownum,5) then 'buzz'
10 else to_char(rownum)
11 end as results
12 from
13 t a cross join t b
14 where
15* rownum <= 100
尚、cubeがサポートされてないリリースだと、、ちと面倒だが、、、Oracle9i以降であれば使える方法ですよん。

階層問い合せで行う方法もあるが、個人的にはcubeを使ったクエリのほうが好き。以下の例で利用している階層問合せは、Oracle9iでは1行しか返してこないので将来的にもそのような挙動をするのか多少不安だし。。

FIZZBUZZ> l
1 with
2 t as
3 (
4 select level
5 from dual
6 connect by level <= 10
7 )
8 select
9 case 0
10 when mod(rownum,15) then 'fizzbuzz'
11 when mod(rownum,3) then 'fizz'
12 when mod(rownum,5) then 'buzz'
13 else to_char(rownum)
14 end as results
15 from
16* t a cross join t b
FIZZBUZZ>


といったところだろうか。

| | | コメント (0) | トラックバック (0)

2007年8月29日 (水)

Oracle de Fizzbuzz #1 - いまごろ・・・ですが・・

え〜〜っと、前回のエントリで予告していたとおり、あの話題。
今頃。。。という感じのネタですが、少々視点を変えて、fizzbuzzをOracle上で解かせるための簡単な環境作りを中心に。


では、早速、環境作りから。

Oracleではプロファイルによるリソース制限を設定することができる。この機能はOracle7のころから提供されている。(使っている方はどれだけいるか定かでないが。。。)
この機能を利用すれば、セッション単位で、CPU利用時間や、接続時間、アイドル時間などを制限することが可能だ。

ここまで書けば、なにを言いたいか想像できると思う。 

そう、プロファイルを利用すれば、fizzbuzz問題の解答時間制限を設定できるんです!

以下のように、プロファイルで connect_time(接続時間)制限を2分と設定しておけば、接続から2分強経過した時点でオラクルとのセッションが強制的にdisconnectされる。

fizzbuzzユーザに接続して、2分程度でfizzbuzzを解いてみて!? という環境が簡単に作れるわけです。

この制限は、SQL*Plusから接続しても、
iSQL*Plusから接続しても、Oracle SQL Developer、JDeveloperから接続しても同じなので、

例えば、

Linux/MacOSX/Windowのクライアントを用意しておき、
好きなクライアントからSQL*Plusを利用して、SQL又は、PL/SQLでfizzbuzzを解いて! とか

Linux/MacOSXのクライアントからSQL*plusを利用して、SQL又は、PL/SQLでfizzbuzz解いて! 
ただし、editコマンドで起動するのはvi  とか

前提条件を絞って、SQLだけで、fizzbuzz解いて! とか、 

データベースサーバーとして、Oracle9iを用意しておいて、SQLだけで、fizzbuzz解いて! とか

nullカラムで且つ、10行登録されている表を使って、fizzbuzz解いて!

ということを制限時間内に行わせてみる環境が作れるわけです。

(こんなこと考えていると、PL/SQL で Python Challengeをやっていたことを思いだす。。。。。)

注)
コネクションプーリングしているユーザにconnect_timeとか、idle_timeなんて制限付けたりしないでくださいね!。
そんなことする方は居ないと思うけど。。念のため。

以下、fizzbuzzというプロファイルを作成(接続時間制限2分)、fizzbuzzユーザを作成し、fizzbuzzプロファイルを設定。
最後に、初期化パラメータ、 resource_limitをtrueにしてあげれば、準備完了。 という例です。


尚、作成するユーザには、必要最小限のシステム権限やオブジェクト権限だけを付与おくといいですね。例えば、表やシーケンスを作成できないようにしておくとか。

SYS> show parameter resource_limit 

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
resource_limit boolean FALSE
SYS>
SYS> create profile fizzbuzz limit connect_time 2;

プロファイルが作成されました。

SYS> select * from dba_profiles where profile='FIZZBUZZ';

PROFILE RESOURCE_NAME RESOURCE LIMIT
---------- -------------------------------- -------- ----------
FIZZBUZZ COMPOSITE_LIMIT KERNEL DEFAULT
FIZZBUZZ SESSIONS_PER_USER KERNEL DEFAULT
FIZZBUZZ CPU_PER_SESSION KERNEL DEFAULT
FIZZBUZZ CPU_PER_CALL KERNEL DEFAULT
FIZZBUZZ LOGICAL_READS_PER_SESSION KERNEL DEFAULT
FIZZBUZZ LOGICAL_READS_PER_CALL KERNEL DEFAULT
FIZZBUZZ IDLE_TIME KERNEL DEFAULT
FIZZBUZZ CONNECT_TIME KERNEL 2
FIZZBUZZ PRIVATE_SGA KERNEL DEFAULT
FIZZBUZZ FAILED_LOGIN_ATTEMPTS PASSWORD DEFAULT
FIZZBUZZ PASSWORD_LIFE_TIME PASSWORD DEFAULT
FIZZBUZZ PASSWORD_REUSE_TIME PASSWORD DEFAULT
FIZZBUZZ PASSWORD_REUSE_MAX PASSWORD DEFAULT
FIZZBUZZ PASSWORD_VERIFY_FUNCTION PASSWORD DEFAULT
FIZZBUZZ PASSWORD_LOCK_TIME PASSWORD DEFAULT
FIZZBUZZ PASSWORD_GRACE_TIME PASSWORD DEFAULT

16行が選択されました。

SYS>
SYS> create user fizzbuzz identified by jazz
2 default tablespace users
3 temporary tablespace temp
4 quota unlimited on users
5 profile fizzbuzz;

ユーザーが作成されました。

SYS> grant create session,create procedure to fizzbuzz;

権限付与が成功しました。

SYS>
SYS> alter system set resource_limit = true scope=both;

システムが変更されました。

SYS>


fizzbuzzユーザにconnectして、モタモタしていると・・・・・・。Oracleさんからdisconnectされちゃいます!

FIZZBUZZ> select 'Zzzzzz......' from dual:
select 'Zzzzzz......' from dual
*
行1でエラーが発生しました。:
ORA-02399: 最大接続時間を超えました。ログオフ中です。


FIZZBUZZ>

もし、他の前提条件なしで、Oracle9i以降の環境を利用してfizzbuzz解いて! といきなり言われたとしたら、私なら、linuxのクライアントから以下のような無名PL/SQLブロックだけで解くだろうな〜。
(無難な方法だし、1分もかからないでできるだろう。。ただ、SQLだけで、Oracle9iという前提だと、1分強かもしれないな〜。まず、どうんな方法で100行準備するかを決めなきゃならないからね)

FIZZBUZZ> set serveroutput on 
FIZZBUZZ> l
1 begin
2 for i in 1..100 loop
3 dbms_output.put_line(
4 case when mod(i,15)=0 then 'fizzbuzz'
5 when mod(i,3)=0 then 'fizz'
6 when mod(i,5)=0 then 'buzz'
7 else to_char(i)
8 end
9 );
10 end loop;
11* end;
FIZZBUZZ> /
1
2
fizz
4
・・・・中略・・・・
98
fizz
buzz

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

FIZZBUZZ>
経過: 00:00:00.05

次回は、幾つかの前提条件を設けて、Oracle de fizzbuzz する予定(そんなにfizzbuzzネタで引っ張るつもりはないですよ。w)

| | | コメント (0) | トラックバック (0)

2007年8月19日 (日)

PL/SQL de Conditional Compile #5

さて、PL/SQL条件付きコンパイルもネタが無くなってきたので、最後に、DBMS_DB_VERSIONパッケージを利用して、各リリース毎にコードを切り替えてみよう!
ということで、Oracle database 10g以前のリリースとOracle databse 11g以降のリリースでコードを切り替える例。

● 条件付きコンパイルが無い場合、Oracle11gより前のリリースで以下ようなコードを書いてしまったら....

当然コンパイルエラー!
FUNCTION CONDITIONAL_COMP_SAMPLE3 RETURN NUMBER
IS
vSeq# NUMBER;
BEGIN
vSeq# := mySeq.NEXTVAL;
RETURN vSeq#;
END CONDITIONAL_COMP_SAMPLE3;
/

警告: ファンクションが変更されましたが、コンパイル・エラーがあります。

SCOTT> show errors
FUNCTION CONDITIONAL_COMP_SAMPLE3のエラーです。

LINE/COL ERROR
-------- -----------------------------------------------------------------
9/5 PL/SQL: Statement ignored
9/20 PLS-00357:
表またはビュー、シーケンス参照MYSEQ.NEXTVALは、このコンテキストで
は使用できません。

SCOTT>

● しかし、DBMS_DB_VERSIONパッケージでリリース毎にコードを選択し切り替えたら・・・・便利ですよね。

CREATE OR REPLACE FUNCTION CONDITIONAL_COMP_SAMPLE3 RETURN NUMBER 
IS
vSeq# NUMBER;
BEGIN

$IF DBMS_DB_VERSION.Ver_LE_10 $THEN
SELECT mySeq.NEXTVAL INTO vSeq# FROM DUAL;
$ELSE
vSeq# := mySeq.NEXTVAL;
$END

RETURN vSeq#;

END CONDITIONAL_COMP_SAMPLE3;

DBMS_DB_VERSIONパッケージをリリース番号でどのようにソースコードが変化するか確認。
● Oracle database 10g以前のバージョンでコンパイルした場合

SCOTT> 
SCOTT> set serveroutput on
SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMP_SAMPLE3');
FUNCTION CONDITIONAL_COMP_SAMPLE3 RETURN NUMBER
IS
vSeq# NUMBER;
BEGIN
SELECT mySeq.NEXTVAL INTO vSeq# FROM DUAL;
RETURN vSeq#;
END CONDITIONAL_COMP_SAMPLE3;

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


● Oracle database 11g以降でコンパイルした場合

SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMP_SAMPLE3');
FUNCTION CONDITIONAL_COMP_SAMPLE3 RETURN NUMBER
IS
vSeq# NUMBER;
BEGIN
vSeq# := mySeq.NEXTVAL;
RETURN vSeq#;
END CONDITIONAL_COMP_SAMPLE3;

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

SCOTT>


● 各リリース毎のDBMS_DB_VERSIONパッケージの違い
参考 http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_dbver.htm

● 10.2:
package DBMS_DB_Version is 
Version constant pls_integer := 10;
Release constant pls_integer := 2;
Ver_LE_9_1 constant boolean := false;
Ver_LE_9_2 constant boolean := false;
Ver_LE_9 constant boolean := false;
Ver_LE_10_1 constant boolean := false;
Ver_LE_10_2 constant boolean := true;
Ver_LE_10 constant boolean := true;
end DBMS_DB_Version;
● 10.1:
package DBMS_DB_Version is 
Version constant pls_integer := 10;
Release constant pls_integer := 1;
Ver_LE_9_1 constant boolean := false;
Ver_LE_9_2 constant boolean := false;
Ver_LE_9 constant boolean := false;
Ver_LE_10_1 constant boolean := true;
Ver_LE_10 constant boolean := true;
end DBMS_DB_Version;
● 9.2:
package DBMS_DB_Version is 
version constant pls_integer := 9;
release constant pls_integer := 2;
Ver_LE_9_1 constant boolean := false;
Ver_LE_9_2 constant boolean := true;
Ver_LE_9 constant boolean := true;
end DBMS_DB_Version;




PL/SQL de Conditional Compile #1
PL/SQL de Conditional Compile #2
PL/SQL de Conditional Compile #3
PL/SQL de Conditional Compile #4

| | | コメント (0) | トラックバック (0)

2007年8月18日 (土)

PL/SQL de Conditional Compile #4

PL/SQLの条件付きコンパイルのつづきです。

今回は、エラーディレクティブ($ERROR)を利用して、ちょっとした物忘れ対策を!

どのような物忘れ対策かというと、コード中に書かなければならないロジックがあるが、今は書かずに後で追加しようとコメントでメモを残しておいた。
だが〜〜、うっかりミスで、コーディングしないまま、結合テストに〜〜〜〜〜!。あ〜〜〜、大変だ〜!!!! 

なんてことを、防止できるかも・・・・・・・・。しれないという使い方!。

たとえば、以下のように、後でコードを追加しようとストアドファンクションをロジックなして仮に作成しておいたとする。
後でロジックを追加するというこを、すっかり忘れてしまっていると、テスト段階になって、あれ? 結果が帰ってこない!!! ソースを見ると。
あ〜〜〜〜、忘れてた〜〜〜 (^^;;;;;;;

なんてことに・・・・ コンパイルが通ってしまうので、実行してみないと気付かない。。なんてことになっちゃいます。

SCOTT> l
1 create or replace
2 FUNCTION CONDITIONAL_COMP_SAMPLE2
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7 -- TODO - 結合テストまでに、ここにロジック書かなきゃ!
8 RETURN vNow;
9* END CONDITIONAL_COMP_SAMPLE2;
10 /

ファンクションが作成されました。

SCOTT> set null 'NULL!'
SCOTT> select conditional_comp_sample2 from dual;

CONDITIONAL_COMP_SAMPLE2
---------------------------------------------------------------------------
NULL!

SCOTT>

しかし、$ERRORディレクティブを利用して、コンパイルエラーになるようにしておけば。。。。
さらに、エラーメッセージには、やることを思い出させてくれるようなコメントを設定しておけば、これまた、物忘れの激しい方でもなんとかなるかもしれません。

SCOTT> l
1 CREATE OR REPLACE
2 FUNCTION CONDITIONAL_COMP_SAMPLE2
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7
8 -- TODO - 結合テストまでに、ここにロジック書かなきゃ!
9 $ERROR
10 '結合テストまでに、ここにロジック書かなきゃ!'
11 $END
12
13
14 RETURN vNow;
15
16* END CONDITIONAL_COMP_SAMPLE2;
SCOTT> /

警告: ファンクションが変更されましたが、コンパイル・エラーがあります。

SCOTT> show errors
FUNCTION CONDITIONAL_COMP_SAMPLE2のエラーです。

LINE/COL ERROR
-------- -----------------------------------------------------------------
7/3 PLS-00179: $ERROR: 結合テストまでに、ここにロジック書かなきゃ!
SCOTT>

応用編としては、上記のように、単純に、コンパイルエラーにはせず、前々回のエントリで利用したPLSQL_DEBUG初期化パラメータ等と組み合わせ、デバッグ時はコンパイル正常に行わせるという使い方も考えられます。


参考
http://www.oracle.com/technology/oramag/oracle/06-jul/o46plsql.html
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/fundamentals.htm#BEIJFDHG

| | | コメント (0) | トラックバック (0)

2007年8月17日 (金)

PL/SQL de Conditional Compile #3

PL/SQL条件付きコンパイルの続きです。

前回までのおさらい。

初期化パラメータをセッション単位で変更してコンパイルしていたが、Oracle10g R1 10.1.0.4.0以降及び、Oracle9i R2 9.2.0.6.0以降へバックポートされた条件付きコンパイル機能では一部利用できない初期化パラメータがあり、全リリースで共通のソースコードを利用するには、各リリースで利用できる初期化パラメータ PLSQL_DEBUG を利用するようにした。というところまでだった。

今回はいままでとは異なる方法で条件付きコンパイルを行ってみることにする。

その方法とは、初期化パラメータを利用せずパッケージの仕様部で宣言した定数を利用する方法だ。
この方法であれば、リリース毎にいくつかの制限のある初期化パラメータを利用せずに条件コンパイルが可能だ。

但し、その都度、パッケージ定数を変更するという手間はかかる。
実際に利用する際には、定数を変更する為のスクリプトを事前に用意しておき、そのスクリプトを実行するだけで行えるようにすると良いだろう。
また、パッケージをどのスキーマに定義するか、という点なども、よ〜〜〜く検討した上で利用した方が良いだろう。
ルール無しで利用した場合、後々混乱の原因になる可能性があるということは容易に想像できると思う。

● 条件コンパイルのフラグだけを定義したパッケージを作成する

以下の例では、C_DEBUG_ON定数だけを定義し、値はfalseとした。
CREATE OR REPLACE PACKAGE MyPROPERTIES AS

C_DEBUG_ON CONSTANT BOOLEAN := false;

END MyPROPERTIES;

● 以下、条件コンパイルのサンプルコード

以前作成したコードとの違いは、初期化パラメータではなく、前述したパッケージのC_DEBUG_ON定数を参照している点である。
CREATE OR REPLACE FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
$IF myproperties.c_debug_on $THEN
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LINE('======= start =====');
$END

SELECT SYSTIMESTAMP INTO vNow FROM dual;

$IF myproperties.c_debug_on $THEN
DBMS_OUTPUT.PUT_LINE('======= end =======');
$END

RETURN vNow;

END CONDITIONAL_COMPILATION_SAMPLE;

● MYPROPERTIES.C_DEBUG_ON=falseで上記サンプルコードをコンパイルし実行した例

Conditional_compilation137 Conditional_compilation138 Conditional_compilation139Conditional_compilation1310


● MYPROPERTIES.C_DEBG_ON=trueで、上記サンプルコードをコンパイルし実行した例

Conditional_compilation131 Conditional_compilation132Conditional_compilation133
Conditional_compilation134 Conditional_compilation135 Conditional_compilation136

| | | コメント (0) | トラックバック (0)

2007年8月16日 (木)

PL/SQL de Conditional Compile #2



とにかく、熱過ぎる! 沖縄の方が気温が低いってどうよ!? 避暑のために、石垣島なんていいかも。
午前10時の気温。東京:摂氏34.6度、沖縄:摂氏29.9度
沖縄のほうが気温が低い!(爆笑)

http://www.weather-eye.com/amedas_graph/index.html

yanokami (矢野顕子 × レイ・ハラカミ) - yanokami - EP - You Showed Me yanokami (矢野顕子 × レイ・ハラカミ) - yanokami - EP - You Showed Me



さて、PL/SQL条件付きコンパイルの続きです。

前回は、本機能が正式にサポートされているOracle10g R2 10.2.0.2.0で行ったが、今回は、バックポートされた Oracle10g R1 10.1.0.4.0で行う。
PL/SQL条件付きコンパイル機能は、前回も書いたように、Oracle10g R1 10.1.0.4.0以降、Oracle9i R2 9.2.0.6.0以降へバックポートされている。

但し、Oracle10g R1 10.1.0.4.0以降及び、Oracle9i R2 9.2.0.6.0以降へバックポートされたPL/SQL条件付きコンパイルでは幾つかの制限があり、Oracle10g R2 からサポートされている同機能と比べて利用できない機能などが存在するので注意が必要だ。
ちなみに、前回のエントリで紹介したPLSQL_CCFLAG初期化パラメータは、パックポートされたOracle10g R1 10.1.0.4.0及び、Oracle9i R2 9.2.0.6.0以降では利用できないと記載されている。

参考:plsql_conditional_compilation.pdfのFunctionality restrictions in 10.1 and 9.2 (P.61)


では、前述の制限を踏まえつつ、以下、Oracle10g 10.1.0.4.0でのテストを!

環境:Oracle10g R1 10.1.0.4.0 for Linux x86
 (TurboLinux Enterprise Server 8 SP3- powered by United Linux 1.0)

前回の例では、ユーザ定義フラグとして、独自に DEBUGONブラグをPLSQL_CCFLAGS初期化パラメータで設定していたが、前述の制限の通り、ハックポートされた機能では利用できない。

そのため、バックポートされた条件付きコンパイルでも利用できるよう、PLSQL_DEBUG初期化パラメータを利用することにした。
このパラメータを利用すれば、Oracle10g R2/R1(10.1.0.4.0以降)/Oracle9i R2(9.2.0.6.0以降)それにOracle11gでも利用できるコードにすることができる。

注)初期化パラメータをしなくても各リリースでソースコードを共有できる方法がある。
但し、初期化パラメータを利用する方法に比べ、いちいちコードに手を加えなければならないなど、イマイチな感じはある。(別途掲載予定)

Conditional_compilation_sql_develop

● まずは、PLSQL関連の初期化パラメータの確認から。

PL/SQL関連の隠しパラメータが幾つかあるが、ここで大切なのは、_plsql_conditional_compilationという初期化パラメータでこれがTRUEであれば、PL/SQLの条件コンパイルが機能する。
また、Oracle10g R2には存在していた、PLSQL_CCFLAGS初期化パラメータが存在していないことも確認できる。前述した通り、今回は、PLSQL_DEBUG初期化パラメータを利用して条件コンパイルを行うことにする。

SYS> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.4.0 - Prod
PL/SQL Release 10.1.0.4.0 - Production
CORE 10.1.0.4.0 Production
TNS for Linux: Version 10.1.0.4.0 - Production
NLSRTL Version 10.1.0.4.0 - Production

SYS> l
1 select
2 a.ksppinm,
3 b.ksppstvl,
4 b.ksppstdf
5 from
6 x$ksppi a join x$ksppcv b
7 on a.indx = b.indx
8 and a.ksppinm like '%plsql%'
9 order by
10* a.ksppinm
SYS> /

KSPPINM KSPPSTVL KSPPSTDF
---------------------------------- ------------------------------ ------------------------------
_plsql_anon_block_code_type INTERPRETED TRUE
_plsql_conditional_compilation TRUE FALSE
_plsql_dump_buffer_events TRUE
plsql_code_type INTERPRETED TRUE
plsql_compiler_flags INTERPRETED, NON_DEBUG TRUE
plsql_debug FALSE TRUE
plsql_native_library_dir TRUE
plsql_native_library_subdir_count 0 TRUE
plsql_optimize_level 2 TRUE
plsql_v2_compatibility FALSE TRUE
plsql_warnings DISABLE:ALL TRUE

11行が選択されました。

SYS>

● 前回のコードから変更したコードは赤字部分

SCOTT> l
1 create or replace
2 FUNCTION CONDITIONAL_COMPILATION_SAMPLE
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7 $IF $$PLSQL_DEBUG $THEN
8 DBMS_OUTPUT.ENABLE(20000);
9 DBMS_OUTPUT.PUT_LINE('======= start =====');
10 $END
11 SELECT SYSTIMESTAMP INTO vNow FROM dual;
12 $IF $$PLSQL_DEBUG $THEN
13 DBMS_OUTPUT.PUT_LINE('======= end =======');
14 $END
15 RETURN vNow;
16* END CONDITIONAL_COMPILATION_SAMPLE;
17 /

ファンクションが作成されました。

● では、PLSQL_DEBUG=falseとして確認!

SCOTT> set serveroutput on
SCOTT> alter session set plsql_debug=false;

セッションが変更されました。

SCOTT> alter function conditional_compilation_sample compile;

ファンクションが変更されました。

SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMPILATION_SAMPLE');
FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
SELECT SYSTIMESTAMP INTO vNow FROM dual;
RETURN vNow;
END CONDITIONAL_COMPILATION_SAMPLE;

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


SCOTT> select conditional_compilation_sample from dual;

CONDITIONAL_COMPILATION_SAMPLE
---------------------------------------------------------------------------
07-08-13 22:53:14.161995000


● 次に、PLSQL_DEBUG=trueとして確認!

SCOTT> alter session set plsql_debug=true;

セッションが変更されました。

SCOTT> alter function conditional_compilation_sample compile;

ファンクションが変更されました。

SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMPILATION_SAMPLE');
FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LINE('======= start =====');
SELECT SYSTIMESTAMP INTO vNow FROM dual;
DBMS_OUTPUT.PUT_LINE('======= end =======');
RETURN vNow;
END CONDITIONAL_COMPILATION_SAMPLE;

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

SCOTT> select conditional_compilation_sample from dual;

CONDITIONAL_COMPILATION_SAMPLE
---------------------------------------------------------------------------
07-08-13 22:54:01.071903000

======= start =====
======= end =======
SCOTT>
SCOTT>


次回は、初期化パラメータを利用しない場合コードの例を載せる予定。

| | | コメント (0) | トラックバック (0)

2007年8月15日 (水)

PL/SQL de Conditional Compile #1

PL/SQLで条件付きコンパイル? 耳慣れないのも方も多いかもしれない。 C/C++では、おなじみの#ifdefなどのディレクティブ!

そう、それです! プリプロセッサといえば分かり易いでしょうか。 
Oracle10g R2以降で、正式に、PL/SQLのプリプロセッサが実装されています。(正式にと書いたのには理由があります、実は、この条件付きコンパイルは、Oracle10g R1 10.1.0.4以降、Oracle9i R2 9.2.0.6.0以降にバックポートされています。) 

マニュアルでは、 conditional compilation (条件付きコンパイル)として解説されています。

PL/SQLの条件付きコンパイル、マニュアルには記載はされているものの、この機能を解説している日本語のサイトはほとんど見た事がありませんし、実際の所、私もまだ本格的に利用したことはありません。しかし、うまく使えばそれなりの効果は期待できそうですね。

では、早速、条件付きコンパイルの例を。

● 正式に機能追加されたリリースである、Oracle10g R2で試す。

SYS> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for 32-bit Windows: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

初期化パラメータにいくつかのPL/SQLコンパイル用パラメータが追加されている。 (Oracle10g R1や、Oracle9i R2と比較するわかりやすいかも。。) 以下は、初期化パラメータの幾つかをリストしたもの。詳細はマニュアル参照のこと。
SYS> show parameter plsql

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
plsql_ccflags string
plsql_code_type string INTERPRETED
plsql_compiler_flags string INTERPRETED, NON_DEBUG
plsql_debug boolean FALSE
plsql_native_library_dir string
plsql_native_library_subdir_count integer 0
plsql_optimize_level integer 2
plsql_v2_compatibility boolean FALSE
plsql_warnings string DISABLE:ALL


● 条件付きコンパイル、PLSQL_CCFLAG初期化パラメータで独自フラグを利用する例

以下は、PLSQL_CCFLAG初期化パラメータで、DEBUGONという独自のフラグを設定し、条件付きコンパイルを行う例で、選択ディレクティブである$IF - $THENを利用してデバッグ用ログの表示コードを制御しています。

PLSQL_CCFLAGで、debugonフラグをtrueに設定すれば、DBMS_OUTPUT.PUT_LINE()でデバッグ用ログを表示するコードがコンパイルされ、false又はフラグが設定されていなければ、表示しないコードでコンパイルされます。

SCOTT> l
1 create or replace
2 FUNCTION CONDITIONAL_COMPILATION_SAMPLE
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7 $IF $$DEBUGON $THEN
8 DBMS_OUTPUT.ENABLE(20000);
9 DBMS_OUTPUT.PUT_LINE('======= start =====');
10 $END
11 SELECT SYSTIMESTAMP INTO vNow FROM dual;
12 $IF $$DEBUGON $THEN
13 DBMS_OUTPUT.PUT_LINE('======= end =======');
14 $END
15 RETURN vNow;
16* END CONDITIONAL_COMPILATION_SAMPLE;
17 /

ファンクションが作成されました。


● dbms_preprocessorパッケージによる条件付きコンパイル後のソースの確認

dbms_preprocessorパッケージのprint_post_processed_source()プロシージャを利用すると、条件付きコンパイル後のソースを確認することができる。(all_sourceビューには、条件付きコンパイル前のソースが格納されているため、条件付きコンパイル後のソースとは異なってしまう。)
DBMS_PREPROCESSORパッケージに関する詳細は、マニュアルを参照のこと。

SCOTT> set serveroutput on
SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMPILATION_SAMPLE');
FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
SELECT SYSTIMESTAMP INTO vNow FROM dual;
RETURN vNow;
END CONDITIONAL_COMPILATION_SAMPLE;

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

上記のコードは、PLSQL_CCFLAG初期化パラメータにdebugonフラグが未定義又は、falseで定義された場合のコードである。


● 実行してみると、デバッグ用ログは表示されていない。(当然!)

SCOTT> set serveroutput on
SCOTT> select conditional_compilation_sample from dual;

CONDITIONAL_COMPILATION_SAMPLE
---------------------------------------------------------------------------
07-08-13 18:20:39.234000000

SCOTT> set serveroutput off

● PLSQL_CCFLAG初期化パラメータに debugonフラグをtrueで設定してみると・・・。

SCOTT> 
SCOTT> alter session set plsql_ccflags='debugon:true';

セッションが変更されました。

SCOTT> l
1 create or replace
2 FUNCTION CONDITIONAL_COMPILATION_SAMPLE
3 RETURN TIMESTAMP
4 IS
5 vNow TIMESTAMP;
6 BEGIN
7 $IF $$DEBUGON $THEN
8 DBMS_OUTPUT.ENABLE(20000);
9 DBMS_OUTPUT.PUT_LINE('======= start =====');
10 $END
11 SELECT SYSTIMESTAMP INTO vNow FROM dual;
12 $IF $$DEBUGON $THEN
13 DBMS_OUTPUT.PUT_LINE('======= end =======');
14 $END
15 RETURN vNow;
16* END CONDITIONAL_COMPILATION_SAMPLE;
17 /

ファンクションが作成されました。


SCOTT> exec dbms_preprocessor.print_post_processed_source('FUNCTION','SCOTT','CONDITIONAL_COMPILATION_SAMPLE');
FUNCTION CONDITIONAL_COMPILATION_SAMPLE
RETURN TIMESTAMP
IS
vNow TIMESTAMP;
BEGIN
DBMS_OUTPUT.ENABLE(20000);
DBMS_OUTPUT.PUT_LINE('======= start =====');
SELECT SYSTIMESTAMP INTO vNow FROM dual;
DBMS_OUTPUT.PUT_LINE('======= end =======');
RETURN vNow;
END CONDITIONAL_COMPILATION_SAMPLE;

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

SCOTT>
SCOTT> set serveroutput on
SCOTT> select conditional_compilation_sample from dual;

CONDITIONAL_COMPILATION_SAMPLE
---------------------------------------------------------------------------
07-08-13 18:26:13.906000000

======= start =====
======= end =======
SCOTT>
ということで、デバッグ用ログが表示されるコードでコンパイルされています!。

次回は、Oracle10g R1 10.1.0.4.0で試す予定。
Conditional_compilation_sql_develop

| | | コメント (0) | トラックバック (0)

2007年8月10日 (金)

Download : Oracle Database 11g R1 for Linux x86

http://www.oracle.com/technology/software/products/database/index.html?rssid=rss_otn_soft

お〜〜〜〜、Oracle Database 11g R1 for Linux x86がダウンロードできるようになってますね。
早速、ダウンロードして遊んでみますかね.

| | | コメント (0) | トラックバック (0)

2007年7月11日 (水)

Virtual Index

個人的にはOracle9iのころも含めて実践では利用した事は無い機能なのだが、Oracle ACEの一人である、Chris Foot氏が、dbazineでVirtual Indexについて書いていたので試してみることにした。


注)仮想索引は、今のところマニュアルに記載されていない隠し機能の一つなので、利用する際は、your own risk! ですよ。
  

まずは、準備から。dbazine.comの記事でも利用されている、HRスキーマ(サンプルスキーマ)を利用し試してみた。

SYS> 
SYS> select count(*) from hr.departments;

COUNT(*)
----------
27

SYS> select count(*) from hr.employees;

COUNT(*)
----------
107

SYS> create table scott.departments as select * from hr.departments;

表が作成されました。

SYS> create table scott.employees as select * from hr.employees;

表が作成されました。

SYS> conn scott/tiger
接続されました。


SCOTT> insert into employees select * from employees;

107行が作成されました。


....中略....


SCOTT> r
1* insert into employees select * from employees

109568行が作成されました。

SCOTT> commit;

コミットが完了しました。

SCOTT>

SCOTT> alter table departments add constraint pk_departments primary key (department_id);

表が変更されました。

SCOTT> exec dbms_stats.gather_schema_stats(ownname=>'SCOTT',cascade=>true);

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


SCOTT> alter session set optimizer_mode = 'FIRST_ROWS';

セッションが変更されました。

SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2011 Card=1481 Bytes=35544)
1 0 NESTED LOOPS (Cost=2011 Card=1481 Bytes=35544)
2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=514 Card=1494 Bytes=11952)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTMENTS' (TABLE) (Cost=1 Card=1 Bytes=16)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPARTMENTS' (INDEX (UNIQUE)) (Cost=0 Card=1)


SCOTT>

empoyees表のemployee_id列に索引がないので、FULLスキャンになっているようですね。

ということで、準備完了!

● 早速、仮想索引 (virtual index)を作成してみる! create index文に、 nosegment句を付けるだけ。


  ついでに統計情報も取得する。

SCOTT> create index empid_v_idx on employees(employee_id) nosegment;

索引が作成されました。

SCOTT> exec dbms_stats.gather_index_stats(ownname=>'SCOTT',indname=>'EMPID_V_IDX');

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

● 実行計画を確認してみる。


おやおや、変化しないですねぇ。って当然です。Virtual Indexは今のところ隠し機能なので、
_use_nosegment_indexes という隠しパラメータを true にセットしないと機能しません。

SCOTT> set autot trace exp
SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=2902 Card=2365 Bytes=56760)
1 0 NESTED LOOPS (Cost=2902 Card=2365 Bytes=56760)
2 1 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=513 Card=2384 Bytes=19072)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTMENTS' (TABLE) (Cost=1 Card=1 Bytes=16)
4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPARTMENTS' (INDEX (UNIQUE)) (Cost=0 Card=1)


SCOTT>


● _use_nosegment_indexesパラメータをtrueに設定して再チャレンジ。


おお〜〜〜。employee_id列に非ユニーク索引を作成すれば、このクエリは早くなりそうですね。

SCOTT> alter session set "_use_nosegment_indexes" = true;

セッションが変更されました。

SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=273 Card=2365 Bytes=56760)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=10 Card=88 Bytes=704)
2 1 NESTED LOOPS (Cost=273 Card=2365 Bytes=56760)
3 2 TABLE ACCESS (FULL) OF 'DEPARTMENTS' (TABLE) (Cost=3 Card=27 Bytes=432)
4 2 INDEX (RANGE SCAN) OF 'EMPID_V_IDX' (INDEX) (Cost=1 Card=2384)

SCOTT>


● では、本当の索引を作成したらどうなのでしょうね。


おお〜〜〜。Cost=3042もある〜〜〜。 Virtual Indexの時は、Cost=273なのに〜〜。
だから、隠し機能なんですかね????。 
単純な問合せでは、Virtual Indexとの差はあまりなかったのですが。。。

SCOTT> drop index empid_v_idx;

索引が削除されました。

SCOTT> alter session set "_use_nosegment_indexes" = false;

セッションが変更されました。

SCOTT> create index empid_idx on employees(employee_id);

索引が作成されました。

SCOTT> exec dbms_stats.gather_index_stats(ownname=>'SCOTT',indname=>'EMPID_IDX');

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

SCOTT> l
1 select
2 employee_id,
3 e.department_id,
4 d.department_name
5 from
6 employees e join departments d
7 on e.department_id = d.department_id
8 where
9* employee_id = 203
SCOTT> /

実行計画
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=3042 Card=1657 Bytes=39768)
1 0 NESTED LOOPS (Cost=3042 Card=1657 Bytes=39768)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=1365 Card=1673 Bytes=13384)
3 2 INDEX (RANGE SCAN) OF 'EMPID_IDX' (INDEX) (Cost=4 Card=1673)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPARTMENTS' (TABLE) (Cost=1 Card=1 Bytes=16)
5 4 INDEX (UNIQUE SCAN) OF 'PK_DEPARTMENTS' (INDEX (UNIQUE)) (Cost=0 Card=1)

SCOTT>


● なぜ? 実行計画に差がでてしまうのだろうか???? (だから隠し機能のままなのか???) 疑問。。。


推測なので、間違っているかもしれないという前提ですが、以下のログを見てもらいたい。
user_objectsには索引として存在しているが、 user_indexesには存在しない。
user_indexesに存在しないということは、dbms_statsパッケージでアナライズしたVirtual Indexの統計情報はどこに格納されるのか???
それがポイントになりそうな気がします。

統計情報の格納場所が無い = 統計情報が無い = 統計情報の欠落 = コストベース・オプティマイザは、統計情報のデフォルト値を利用して実行計画を立てる!
 
ということになるのではないか? と思った次第。従って、実体のある索引とはかけ離れたCostが算出されてしまう。 
これは私個人の推測に過ぎません。なにせ、隠し機能なので、マニュアルにも解説は無いので・・・。

このようなことを踏まえた上で、開発環境で、試してみる程度なら楽しいかもしれませんね。。(趣味の世界の話になっちゃいますけどね。。笑)

今回は、Oracle10g R1を利用した結果なので、Oracle10g R2でも試してみましょうかね。気が向いた時にでも。

SCOTT> l
1 select
2 object_name
3 ,object_type
4 from
5 user_objects
6 where
7* object_type = 'INDEX' and object_name = 'EMPID_V_IDX'
SCOTT> /

OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
EMPID_V_IDX INDEX

SCOTT> l
1 select
2 index_name
3 ,table_name
4 ,index_type
5 ,uniqueness
6 ,initial_extent
7 ,last_analyzed
8 ,status
9 from
10 user_indexes
11 where
12* index_name = 'EMPID_V_IDX'
SCOTT> /

レコードが選択されませんでした。

SCOTT>

| | | コメント (1) | トラックバック (0)

2007年7月 8日 (日)

Stored Procedure で host command #3

前回からの続きです。
さて、前回は、javaクラスをOracle Databaseへデプロイしたところまでだった。

ということで、デプロイしたクラスとメソッドを確認しておきましょう! (以下の例は、 user_java_methodsビューを問い合わせたもの)

このマニュアルも参考になるのでリンクしておきます。

SQL> conn scott/tiger
SQL> select name,method_name,accessibility,is_static,return_class from user_java_methods;

NAME METHOD_NAM ACCESSIBILITY IS_STA RETURN_CLA
---------------------------------------- ---------- ------------------ ------ ----------
jp/macdeoracle/CommandOutputReader $init$ NO -
jp/macdeoracle/CommandOutputReader <init> PUBLIC NO -
jp/macdeoracle/CommandOutputReader run PUBLIC NO -
jp/macdeoracle/HostCommandExecuter <clinit> YES -
jp/macdeoracle/HostCommandExecuter exec PRIVATE YES -
jp/macdeoracle/HostCommandExecuter ls PUBLIC YES -
jp/macdeoracle/HostCommandExecuter main PUBLIC YES -
jp/macdeoracle/HostCommandExecuter <init> PUBLIC NO -

8行が選択されました。

SQL>

● 次にjavaストアドプロシージャのコール仕様を作成する

language java以降がポイントですよ。実行するstatic methodを指定します。
SQL> create or replace procedure ls(directory IN VARCHAR2)
2 as language java
3 name 'jp.macdeoracle.HostCommandExecuter.ls(java.lang.String)';
4 /

プロシージャが作成されました。

では、実行してみると・・・・・。
あれれ、権限が足りないとでますね。。。。。

SQL>
SQL> exec ls('c:¥temp');
BEGIN ls; END;

*
行1でエラーが発生しました。:
ORA-29532: 不明なJava例外でJavaコールが終了しました: java.security.AccessControlException: the Permission (java.io.FilePermission <<ALL
FILES>> execute) has not been granted to SCOTT. The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' )
ORA-06512: "SCOTT.LS", 行1
ORA-06512: 行1


● エラーメッセージの指示通りに、 dbms_java.grant_permissionを実行してみることに。。
  user_java_policyを確認してみると権限は付与されたようですね。。。

SQL> conn / as sysdba
SQL> execute dbms_java.grant_permission('SCOTT','SYS:java.io.FilePermission','<<ALL FILES>>','execute');

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

SQL>
SQL> conn scott/tiger
SQL> select action,type_name,name,enabled from user_java_policy;


ACTION TYPE_NAME NAME ENABLED
---------- ---------------------------------------- ---------------------------------------- ----------------
read java.io.FilePermission <<ALL FILES>> ENABLED
java.lang.RuntimePermission accessClassInPackage.* ENABLED
java.lang.RuntimePermission defineClassInPackage.* ENABLED
java.lang.RuntimePermission getProtectionDomain ENABLED
java.lang.RuntimePermission stopThread ENABLED
connect, java.net.SocketPermission * ENABLED
resolve
java.lang.RuntimePermission createSecurityManager ENABLED
java.lang.RuntimePermission exitVM ENABLED
java.lang.RuntimePermission loadLibrary.* ENABLED
java.lang.RuntimePermission modifyThread ENABLED
java.lang.RuntimePermission modifyThreadGroup ENABLED
java.lang.RuntimePermission preferences ENABLED
read java.util.PropertyPermission * ENABLED
write java.util.PropertyPermission user.language ENABLED
oracle.aurora.rdbms.security.PolicyTable 0:java.lang.RuntimePermission#loadLibrar ENABLED
Permission y.*
oracle.aurora.security.JServerPermission DUMMY DISABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.java.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.oracle.aurora.* ENABLED
oracle.aurora.security.JServerPermission LoadClassInPackage.oracle.jdbc.* ENABLED
execute java.io.FilePermission <<ALL FILES>> ENABLED

21行が選択されました。

SQL>


再度、実行してます!

SQL> exec ls('c:¥temp');
BEGIN ls; END;

*
行1でエラーが発生しました。:
ORA-29532: 不明なJava例外でJavaコールが終了しました: java.security.AccessControlException: the Permission (java.io.FilePermission <<ALL
FILES>> execute) has not been granted to SCOTT. The PL/SQL to grant this is dbms_java.grant_permission( 'SCOTT',
'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute' )
ORA-06512: "SCOTT.LS", 行1
ORA-06512: 行1


なんなんでしょうね。よくわからないエラーメッセージですね。権限はあるのに。
わかりにくいメッセージ。やはりこうでなくちゃ、オラクルは。。なんてね。
イライラしてきたので、javasysprivロールを付与しちゃいました。(セキュリティ面からみれば好ましくないのですけど。)
各クラス毎に実行権限を細かく付与すればうまくいきそうですが、エラーメッセージからは、何のどんな権限が不足しているのか単純には判断できない(予想はつきますけど・・・)ので、この件に関しては別途調べることにして先へ進むことにします。要調査->TODO

SQL> conn / as sysdba
接続されました。
SQL> grant javasyspriv to scott;

権限付与が成功しました。


:-) やっと動いた〜。

SQL> conn scott/tiger
接続されました。

SQL>
SQL> set serveroutput on
SQL> exec dbms_java.set_output(2000);

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

SQL> exec ls('c:¥temp');
apex_3.0
apex_3.0.zip
jdevstudio10131.zip
version.log

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

SQL>

なんとか実行できました。。。ね。 (^^;;;;

Jdeveloper_filelist3

| | | コメント (0) | トラックバック (0)

2007年7月 4日 (水)

Stored Procedure で host command #2

さて、前回のつづきです。
javaストアドプロシージャのソースは以下の通り。

OSコマンドを実行するjavaの例は、ググればやまほどヒットするので特に解説はなし。
Oracleでjavaストアドプロシージャを作成する方法は、マニュアル「Oracle Database Java開発者ガイド - 3 Oracle DatabaseでのJavaメソッドのコール」を参照のこと。
基本は前述のマニュアルで足りると思います。(今回は、JDBCも利用していませんし。)
それに加えて、OTN-JのOracleJVM and Java Stored Procedures なども参考になるでしょうね。

以下、Oracle JDeveloper 10.1.3.1 for MacOSXを利用。

Jdev10gmacosx_hostcommand

package jp.macdeoracle;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;


public class CommandOutputReader extends Thread {
private InputStream is;
private String lines = "";

public CommandOutputReader(InputStream is) {
this.is = is;
}

public void run()
{
String outputLine;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(this.is));
while ((outputLine = br.readLine()) != null) {
System.out.println(outputLine);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package jp.macdeoracle;

import java.lang.Runtime;
import java.lang.SecurityException;
import java.io.IOException;

public class HostCommandExecuter
{
public static final String OS_WINDOWS_ = "Windows";
public static final String OS_MACOSX_ = "Mac OS X";
public static final String OS_LINUX_ = "Linux";

private static void exec(String[] command)
throws IOException,
SecurityException,
InterruptedException
{
Process myproc = Runtime.getRuntime().exec(command);
new CommandOutputReader(myproc.getInputStream()).start();
new CommandOutputReader(myproc.getErrorStream()).start();
myproc.waitFor();
}

public static void ls(String directory)
throws IOException,
SecurityException,
InterruptedException
{
String osname = System.getProperty("os.name");
if (osname.indexOf(OS_WINDOWS_) >= 0) {
String[] cmd = {"CMD.EXE", "/C", "DIR", "/B", directory};
exec(cmd);
} else if (
osname.indexOf(OS_MACOSX_) >= 0
|| osname.indexOf(OS_LINUX_) >= 0
) {
String[] cmd = {"/bin/ls", directory};
exec(cmd);
} else {
throw new IOException(osname + ":このOSには対応していません。");
}
}

public static void main(String[] args)
throws IOException,
InterruptedException,
SecurityException
{
ls(".");
}
}

上記ソースをコンパイルしてOracle Databaseへデプロイ! (以下、Oracle10g R2の例)
うまくいけば以下のようなログが表示される。

loadjavaを接続'Oracle10gR2_Scott'で呼出し中。引数:
-order -resolve -definer -force -thin -schema scott -verbose
creating : class SCOTT.jp/macdeoracle/CommandOutputReader
loading : class SCOTT.jp/macdeoracle/CommandOutputReader
creating : class SCOTT.jp/macdeoracle/HostCommandExecuter
loading : class SCOTT.jp/macdeoracle/HostCommandExecuter
resolving: class SCOTT.jp/macdeoracle/CommandOutputReader
resolving: class SCOTT.jp/macdeoracle/HostCommandExecuter
Loadjavaが終了しました。
公開が終了しました。
---- ストアド・プロシージャのデプロイが終了しました ----


次のようなエラーがでたら、J2SE 1.4.xでコンパイルし直してデプロイすべし! 
オラクルにしては、わかり易いメッセージじゃ。 (^^) 

loadjavaを接続'Oracle9iR2_Scott'で呼出し中。引数:
-order -resolve -definer -force -thin -schema scott -verbose
creating : class SCOTT.jp/macdeoracle/CommandOutputReader
loading : class SCOTT.jp/macdeoracle/CommandOutputReader
created : "SCOTT".CREATE$JAVA$LOB$TABLE
Error while creating class jp/macdeoracle/CommandOutputReader
ソケットから読み込むデータはこれ以上ありません。
Error while testing for existence of dbms_java.handleMd5
Exception java.sql.SQLException: OALL8 is in an inconsistent state.
created : "SCOTT".JAVA$CLASS$MD5$TABLE
creating : class SCOTT.jp/macdeoracle/HostCommandExecuter
loading : class SCOTT.jp/macdeoracle/HostCommandExecuter
Error while creating class jp/macdeoracle/HostCommandExecuter
ソケットから読み込むデータはこれ以上ありません。
The following operations failed
class SCOTT.jp/macdeoracle/CommandOutputReader: creation (createFailed)
class SCOTT.jp/macdeoracle/HostCommandExecuter: creation (createFailed)
oracle.aurora.server.tools.loadjava.ToolsException: Failures occurred during processing
at oracle.aurora.server.tools.loadjava.LoadJava.process(LoadJava.java:863)
at oracle.jdeveloper.deploy.tools.OracleLoadjava.deploy(OracleLoadjava.java:116)
at oracle.jdeveloper.deploy.tools.OracleLoadjava.deploy(OracleLoadjava.java:46)
at oracle.jdevimpl.deploy.OracleDeployer.deploy(OracleDeployer.java:97)
at oracle.jdevimpl.deploy.StoredProcHandler.doDeploy(StoredProcHandler.java:473)
at oracle.jdevimpl.deploy.StoredProcHandler.doDeploy(StoredProcHandler.java:360)
at oracle.jdevimpl.deploy.StoredProcHandler.doDeploy(StoredProcHandler.java:284)
at oracle.jdevimpl.deploy.StoredProcProfileDt$Action$1.run(StoredProcProfileDt.java:383)
#### デプロイが不完全です ####
*** Note ***
デプロイ・エラーの可能性の1つとして、ターゲット・データベースがJDKバージョン1.5をサポートしていないことが考えられます。
お使いのプロジェクト・プロパティ・コンパイラのソースとターゲットを古いバージョンに変更することで、この問題を修復できます。
************


プロジェクトプロパティを開いて、j2se 1.4.2を設定している様子。
Change_jdk1 Change_jdk2Change_jdk3Change_jdk4

今日はここまで。次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年6月30日 (土)

Stored Procedure で host command

随分前のネタ(Oracle9i R2は、TurboLinux8 Enterprise Server - Powered by United Linux 1.0と Oracle10g R1 は、MacOSX Pantherの頃なので2005年くらいに公開するタイミングを逃していたネタ)なんですが、検索キーワードやOTN-Jなどでもたまに見かけるので、昔のネタに、Oracle10g R2 for Windowsの例も付け加えて公開することにした。

どんなネタかって? まずは実行結果から。

見ての通り、ストアドプロシージャからDOSコマンドのdirや、shellコマンドのlsを実行してます。
Oracleのストアドプロシージャは、PL/SQL以外に、javaやCでを書くこともできます。
以下の例は、javaストアドプロシージャで DOSコマンドのdirや、shellコマンドのlsを実行しています。

セキュリティ上、なんでもかんでも実行できるようにしたりするのはお勧めしませんが、以前、負荷テストで使ったことがあります。
負荷テスト開始のタイミングで、sarを実行し、テスト終了時に停止させるshellスクリプトを実行してましたね。 いつ終わるかはっきりしないような負荷テストを自動起動し、システム側の状態も同時に記録するといったことを行っていました。
ただ、最近は、DBMS_SCHEDULERパッケージがあるので自前で作らなくてできるとは思いますが。。まぁ、こんなことも出来るんだよね。 っていうことを知ってても損はないんじゃないかと思います。


● Linux (United Linux 1.0 なつかしい〜。)

SCOTT> conn scott@zion
パスワードを入力してください:
接続されました。
SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for Linux: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

SCOTT>
SCOTT>
SCOTT> set serveroutput on
SCOTT> exec dbms_java.set_output(20000);

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

SCOTT> exec ls('/tmp');
UnitedLinux-1.0-SP-3
i830-20030120-i386-linux.tar.gz
turbonetcfg-routing.log
turbonetcfg.log

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

SCOTT>

● MacOSX 10.3 Panther

SCOTT> conn scott@panther
パスワードを入力してください:
接続されました。
SCOTT> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
PL/SQL Release 10.1.0.3.0 - Production
CORE 10.1.0.3.0 Production
TNS for MacOS X Server: Version 10.1.0.3.0 - Production
NLSRTL Version 10.1.0.3.0 - Production

SCOTT> set serveroutput on
SCOTT> exec dbms_java.set_output(20000);

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

SCOTT> exec ls('/Users/oracle');
Desktop
Documents
Library
Movies
Music
Pictures
Public
Sites
jdevhome

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

SCOTT>


● Windows XP Professional

SCOTT> conn scott@catfish
パスワードを入力してください:
接続されました。
SCOTT>
SCOTT>
SCOTT>
SCOTT> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
PL/SQL Release 10.2.0.2.0 - Production
CORE 10.2.0.2.0 Production
TNS for 32-bit Windows: Version 10.2.0.2.0 - Production
NLSRTL Version 10.2.0.2.0 - Production

SCOTT>

SCOTT> set serveroutput on
SCOTT> exec dbms_java.set_output(20000);

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

SCOTT> exec ls('c:¥temp');
apex_3.0
apex_3.0.zip
jdevstudio10131.zip
version.log

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

SCOTT>

ってとこですね。ほんとにお遊びでした。(笑)

ということで、次回はどうやってOracleのPL/SQL、java、ホストコマンドで遊んでいるかお見せします。

| | | コメント (0) | トラックバック (0)

2007年6月24日 (日)

OSC 2007 .DB

今日は、Open Source Conference 2007 .DBに行ってきました。 結構な人数が来てましたね。

朝は寝坊したこともあり、10時からのセッションには間に合わず。。。 orz、
ということで、DBマガジンでもおなじみの増永良文氏のセッションなど午後からのものを中心に。。

 


Cimg4826 Cimg4834

頂いたノベルティは、こちら。

| | | コメント (0) | トラックバック (0)

2007年5月17日 (木)

Mac De Oracle : Oracleのバージョン確認(FAQ) #9

OCFS2 のバージョン確認方法は?

10万円 de RAC #22の最後にも記載してありますが、ググれば沢山ヒットすると思いますよ。   


Googleで検索する例も載せておきましょう!

how to determine ocfs2 version で検索すれば英語のページは沢山ヒットする。
ocfs2のバージョン確認 と入力して検索すれば、私のBlogも含んだ検索結果が返ってきますよ。

以下のスクリーンショットは、MacOSXのTerminalからCentOSへssh接続したもの
Mac_linux_ssh


[root@discus1 ˜]# cat /proc/fs/ocfs2/version
OCFS2 1.2.3 Thu Aug 10 18:16:03 PDT 2006 (build 6b798aaadf626d3b137c3952809b2f38)
[root@discus1 ˜]#

| | | コメント (0) | トラックバック (0)

2007年5月11日 (金)

Mac De Oracle - 10万円 de RAC 番外編 - 消えたiscsi-targeのその後。

随分前の事なので忘れかけていた方も多いかもしれないが、「Mac De Oracle - 10万円 de RAC 番外編 - 消えたiscsi-target」というエントリのその後。

Mac De Oracle - 10万円 de RAC 番外編 - 消えたiscsi-target」は、conaryの自動アップデートにより、カーネルその他のモジュールがアップデートされたのは良いのだが、iscsi-targetが消えてしまった。conaryの自動更新を止められるかも?!、という方法を探し出したので、その設定で様子を見る。 という内容であった。
というところで放置してしまうのも何なので、その後の状況を書いておこうと思う。


結果としては、”うまくいった!!!!” 

ということ。

但し、その後は、詳しく調べていないので、これが本当に正しい方法なのか?! とは言切れないので注記しておく。

ちなみに、例の対処を行った後でも不安だったこともあり、rootにログイン時、conaryのログのタイムスタンプを確認できるよう .bash_profileを変更してある。
あれから随分経過したが、タイムスタンプは "Feb 19 16:28"のままであるから例の対処後は一度も動いていないということになる。。

ただ、今でも疑問なのことは、conaryがいつどのタイミングで動いているのか。。。ということ。
もしかしたら、起動時か?!。。。。。。消去法でいくと、そのタイミングか?! と、たった今、閃いたのだが。。。どうだか。。。ねぇ。。。

Openfilerや conaryに関しては別途調べておこう。==> TODO。  (^^;;;;;;

pb17:˜ oracle$ ssh root@arowana
root@arowana's password:
Last login: Thu Apr 26 23:08:40 2007 from 192.168.1.19
Linux arowana.jp 2.6.17.11-1.1.x86.i686.cmov #1 Tue Sep 5 23:54:38 EDT 2006 i686 i686 i386 GNU/Linux
-rw-r--r-- 1 root root 73425 Feb 19 16:28 conary
[root@arowana ˜]# shutdown -h now

Broadcast message from root (pts/0) (Fri May 11 18:00:59 2007):

The system is going down for system halt NOW!
[root@arowana ˜]#

| | | コメント (0) | トラックバック (0)

2007年2月26日 (月)

Mac De Oracle - 10万円 de RAC #43

10万円 de RACの最終回。PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認。JDeveloper10g R3 10.1.3編。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので) 
    SQL*Plus編/SQL Developer編/JDeveloper10g編
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今日は、PowerBook G4 (MacOSX10.4.8)の Oracle JDeveloper10g R3 10.1.3 for MacOSX Studio Editionからの接続確認を行う。

現時点(2007/2/25現在)での最新版である。

● 起動
スプラッシュ画面

Rac_de_oracle_jdev1

● connecttionの設定
jdbc thin driverにて接続。

Rac_de_oracle_jdev2

● emp表を問い合わせてみる。。

Rac_de_oracle_jdev3

と駆け足で接続確認まで行い。10万円 de RACも一旦終了。



いや〜〜、まいったなぁ。熱っぽい。30秒で体温を計れる体温計で体温を計ると、なんと37度?? なんかの間違いか? もう一度計り直す、36.6度。間を取って、36.8度くらいにしとこう。妻には早めに寝ろと言われるし。。まあ。言う事聞いて寝てやるか〜〜。風邪だったらまずいし。。。

| | | コメント (0) | トラックバック (0)

2007年2月25日 (日)

Mac De Oracle - 10万円 de RAC #42

10万円 de RACのつづき。PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認。Oracle SQL Developer 1.1編。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので) 
    SQL*Plus編/SQL Developer編
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今日は、PowerBook G4 (MacOSX10.4.8)の Oracle SQL Developer 1.1 Patch 1 (1.1.1.25.14) for MacOSXからの接続確認を行う。

現時点(2007/2/25現在)では最新版のOracle SQL Developerである。

● 起動
スプラッシュ画面

Rac_de_oracle_sqldev1

● connecttionの設定
jdbc thin driverにて接続。

Rac_de_oracle_sqldev_connection

● emp表を問い合わせてみる。。

Rac_de_oracle_sqldev2


ということで、PowerBook G4の Oracle SQL Developer 1.1 for MacOSXからの接続は確認できた。次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月24日 (土)

Mac De Oracle - 10万円 de RAC #41

10万円 de RACのつづき。PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認。SQL*Plus編。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. >簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので) SQL*Plus編
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



10万円 de RACも残すところ後少し、今日は、PowerBook G4 (MacOSX10.4.8)の SQL*Plusからの接続確認を行う。

● tnsnames.oraの設定

TAFの設定もしてあるが接続確認だけを行う。
Last login: Sat Feb 24 22:30:49 on ttyp4
Welcome to Darwin!
pb17:˜ oracle$ cat $ORACLE_HOME/network/admin/tnsnames.ora
ORCLTEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcltest.discus.info)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)

pb17:˜ oracle$

● /etc/hostsの設定

今回はDNSは利用していないのでhostsに設定した。
pb17:˜ oracle$ cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
192.168.1.3 discus1
192.168.1.4 discus2
192.168.1.5 arowana

#public virtual ip(vip) for Oracle RAC
192.168.1.100 discus1-vip
192.168.1.101 discus2-vip

pb17:˜ oracle$

● 環境変数NLS_LANGの設定

データベースのキャラクタセットに合わせて、AL32UTF8に設定し、SQL*Plusで接続確認を行った。
また、TerminalのキャラクタエンコーディングはUTF-8である。
pb17:˜ oracle$ echo $NLS_LANG
Japanese_Japan.JA16SJISTILDE
pb17:˜ oracle$ export NLS_LANG=japanese_japan.AL32UTF8
pb17:˜ oracle$ sqlplus /nolog

SQL*Plus: Release 10.1.0.3.0 - Production on 土 2月 24 22:39:36 2007

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

> conn system@orcltest
パスワードを入力してください:
接続されました。
SYSTEM> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl2

SYSTEM> show parameter service

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string orcl.discus.info, orcltest
SYSTEM>
SYSTEM> select * from v$active_instances;

INST_NUMBER INST_NAME
----------- ------------------------------
1 discus1.macdeoracle.jp:orcl1
2 discus2.macdeoracle.jp:orcl2

SYSTEM> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining optionsとの接続が切断されました。

Macosx_client_sqlplus


ということで、PowerBook G4の Oracle10g R1 ClientのSQL*Plusからの接続は確認できた。次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月23日 (金)

10万円 de RAC 番外編 - EM10g DB Control

iSCSI-targetが消失してしまった件は流石に参ったが、復活した 10万円 de RAC環境で、
Oracle Enterprise Manager 10g Database Controlを起動する。

搭載メモリが512MBと少ないこともありモッサリとした動きだが、使えないこともないという感じです。


http://hostname:1158/em/ をSafariでアクセスすると Safariになんか最適化していません。と警告がでます。(ちょいと嫌みな言い回しに置き換えてみました。m(_ _)m
[an error occurred while processing this directive]
1

「OK」ボタンをクリック。
ログイン画面が表示されます。
[an error occurred while processing this directive]
2


SYSDBAでログインしてみます。
再度、Safariになんか最適化していません。と警告がでます。(ちょいと、しつこいです。)
[an error occurred while processing this directive]
3


「OK」ボタンをクリック。ライセンス情報画面が表示されます。
[an error occurred while processing this directive]
4


「同意します」ボタンをクリック。再度、ライセンス情報画面が表示されました。
(念には念ということでしょうか)
[an error occurred while processing this directive]
5
「OK」ボタンをクリック。クリック、クリック。全然先に進みません。。。


しかたないので、再度、http://hostname:1158/em/ にアクセスすると。。
やっと表示されましたね。。。いくつかの機能を操作して動作確認しています。。

[an error occurred while processing this directive]
6 7_1 8 9


一通り確認したので、ログアウト
[an error occurred while processing this directive]
A

ということで、Safariでも使えますね。

| | | コメント (0)

2007年2月21日 (水)

Mac De Oracle - 10万円 de RAC 番外編 - 消えたiscsi-target

さて、スタバで Coffee break中。。。ついでなので、記事もアップ。

消えたiscsi-targetの謎。。。の続きです。

原因は分かったのだが、その原因に気付く前にOpenfilerも含めて再構築してしまったため、備忘録の意味も含むめて載せておく。
(再構築でも結構楽しめましたけどね)

Mac De Oracle - 10万円 de RAC #40


今日、Oracle RACを起動して、MacOSXのOracle Clientから接続した例や、更新系トランザクションのFAILOVERの例を作ろうと思っていたら、なんと、共有DISK(iSCSI)が起動しない。
Openfilerの管理画面やコマンドで確認してみても、iscsi-target サービスの起動が失敗している。。。

と書いたが、その原因は、どうも、Openfilerがkernelを自動更新しており、その際、iscsi-trgtモジュールが含まれていなかったのが原因であることに気がつく。。
”自動更新"かよ〜〜〜っ。 しかも、iscsi-trgtモジュールが無いなんて。。。。
そういえば、grubのカーネル選択画面に、当初インストールした 2.6.17....ではなく2.6.19...が現れていたことを今更ながら、思い出す。。。

なぜ、それに気付いたのか???
当初、原因が分からず(iscsi_trgtモジュールが本当に消えていたことは確認していたが。。)元々少々調子が怪しいDISKを使っていた影響か?? 
などと思い込んでいたこともあり Openfiler2.1を再インストールし、RACを最初から再構築した。その後、grubの選択画面にリストされるkernelのバージョンの違いなどに気付いたという次第。。。トホホ。。
もっと早く気付けば、あまり手間をかけずに回復できたかも。。。。しれない。。

いろいろと調べていると、iscsi-targetの起動エラーメッセージは以下のようなものであった。


Starting ISCSI target service: FATAL: module iscsi_trgt not found.
netlink fd :connection refused

上記メッセージを元に検索すると、少々異なる部分もあるが、過去にも類似した問題があったことを知る。
原文は、こちらを参照のこと。

以下内容を抜粋

I just updated OpenFiler? 2.0 beta 1 to the latest packages using 'yum update', but after a restart of the system iscsi didn't work anymore. One of the updates was a kernel update, 2.6.9-34.EL.

Looking at /var/log/messages I saw that iscsi daemon was unable to start because of netlink:

Mar 11 20:32:09 openfiler ietd: nl_open -1 Mar 11 20:32:09 openfiler ietd: netlink fd Mar 11 20:32:09 openfiler ietd: : Connection refused Mar 11 20:32:09 openfiler iscsi-target: ietd startup failed

orz




現在、Openfilerは2.1の状態でiscsi-targetも正常に起動動作している。


だが、Openfilerは自動アップデート設定がデフォルトだとすると一体なにが、動いているのか? というところが気にった。
それを止めないと、また同じことが起こる可能性もあるため、手動更新に変更したいと思っていたのだが、これまた、資料がなかなら見つからない。。
Openfiler2.1には、up2dateやyumはOpenfiler2.1にはインストールされていない。。。なにが動いてんの??? 

と、しばし考え込む。。。。。。

Openfilerは、rPath Linuxをベースにしていることを思い出した。なじみの無いDistributionなのでrPath Linuxのサイトで調べると、、、書いてましたよ。
conaryというパッケージ管理が利用されているとのこと。

自動実行されているようなのだが、cronでもchkconfigでも、それらしい設定は見つからない。。。。どんどんMacOSXと離れてく〜〜。
さらに調べて行くと、conaryのwikiに、

Configuring Conary to Automatically Search a Given Label
To configure Conary to automatically search a given label you must use a text editor to add the label to Conary's main configuration file, /etc/conaryrc.

という記述があり、/etc/conaryrcが、Openfiler2.1に存在していた。このファイルを削除するか、パラメータをコメントアウトしてしまえばなんとかなるかも。。。。。

ということで、これでkernelの自動更新を止められたのか全く自信なし!。と自信を持って書いておくが(爆)、
ひとまず、conaryrcに定義されている全パラメータをコメントアウトし、模様を見つつ、conaryopenfilerについては別途、情報収集しようということに。。。しておく。。


[root@arowana ˜]# cat /etc/conaryrc
#installLabelPath openfiler.rpath.org@rpl:devel conary.rpath.com@rpl:1
#pinTroves kernel.*
#includeConfigFile /etc/conary/config.d/*
#autoResolve True
[root@arowana ˜]#


#ちなみに、conaryでupdateした場合、rollbackもできるようで、もし、意図せず更新されてしまった場合には過去のバージョンへ戻せるようだ。もっと早く気付けばよかった。。。


#お遊び用途で構築したOracle RACですが、。。。結構いろいろと楽しませてくれますね。openfiler! (^^)

| | | コメント (0) | トラックバック (1)

2007年2月20日 (火)

10万円 de RAC 番外編 - Cluster Databaseの削除

さて、Oracle RACを構築中、ちょっとした確認漏れから、データベースだけを再作成したことは以前書いていたが、その際、データベースをDBCA (Database Configuration Assistant)を利用し削除した模様を番外編として載せておくことにする。

お約束であるユーザーの等価化操作はお忘れなく。
尚、環境変数LANGは、事前に un_US.UTF-8に変更済みである。

[oracle@discus1 ˜]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 ˜]$ /usr/bin/ssh-add
Enter passphrase for /u01/app/oracle/.ssh/id_rsa:
Identity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)
Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)
[oracle@discus1 ˜]$ ssh discus1 "date;hostname"
Sun Jan 14 13:43:34 JST 2007
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ssh discus2 "date;hostname"
Sun Jan 14 13:43:56 JST 2007
discus2.macdeoracle.jp
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ $ORACLE_HOME/bin/dbca &

オペレーション自体は簡単なので解説はしないが、その模様はQuickTimeムービーでご覧ください。

(再生にはQuickTimeが必要です。)
dbca

| | | コメント (0) | トラックバック (0)

2007年2月19日 (月)

Mac De Oracle - 10万円 de RAC #40

10万円 de RACのつづき。簡単なTransparent Application Failover (TAF)の確認。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Transparent Application Failover (TAF)を確認する。

とは言っても、大掛かりな方法で確認する訳ではなく、SQL*PlusとSQLを利用したお手軽な方法で行う。



オリジナルと異なるところは、環境変数NLS_LANGが、日本語のキャラクタセットだというところだけなので、特に追記することもなく、一気に確認を。

CentOSがUTF-8ベースであることもあり、環境変数LANG=ja_JP.UTF-8、環境変数NLS_LANG=japanese_japan.AL32UTF8 としてある。データベースキャラクタセットもAL32UTF8としてある。
MacOSXのTerminalは、これらに併せて、UTF-8に設定してある。(以下に示す確認では、日本語を表示することもないのだが、環境としてはそのようになっている。)

尚、手順など、OTN USの元ネタ「29. Transparent Application Failover (TAF)」とほぼ同様なのでそちらも参照されたい。

● tnsnames.oraには、以下のような設定があるはずである。

FAILOVER_MODEパラメータを見てもらうと分かるが、FAILOVERのタイプは、SELECTで、方法は、BASICとなっている。
これは、ノードAに接続しselect文を実行していたセッションは、ノードAに障害が発生しFAILOVERした場合でもノードBに引き継がれ、何事も無かったかのように処理が継続されることを意味する。
また、ノードAに接続し、insert文、update文、delete文のいずれかを実行していたセッションは、FAILOVERが発生した場合、ノードBにセッションは引き継がれ、所定の回復措置を行ったあとで処理(アプリケーション側でのハンドリングを必要とする)を継続できることを意味する。(所定の回復措置とは、FAILOVERが発生したことを示すエラーをキャッチし、現行トランザクションをロールバックし、トランザクションを再開始することを意味する)

ORCLTEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = discus1-vip.macdeoracle.jp)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = discus2-vip.macdeoracle.jp)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.discus.info)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)

以下、SQL*Plusで接続し、問い合せを実行後、接続しているインスタンス(下記例では、orcl2)をshutdown abortで強制停止し、意図的にFAILOVERを発生させた。その後、同じ問い合せを実行すると接続しているインスタンスは、Cluster内で起動している残りのインスタンス(下記例では、orcl1)に切り替わっていることが確認できる。その際、FAILOVERによるエラー等は一切発生しない。更新トランザクションのFAILOVERについては別エントリで。

SQL> col instance_name for a13
SQL> col failover_method for a15
SQL> col failed_over for a11
SQL> col failover_type for a10
SQL> col host_name for a26
SQL> l
1 select
2 instance_name,
3 host_name,
4 null as failover_type,
5 null as failover_method,
6 null as failed_over
7 from
8 v$instance
9 union
10 select
11 null,
12 null,
13 failover_type,
14 failover_method,
15 failed_over
16 from
17 v$session
18 where
19* username = 'SYSTEM'
SQL> /

INSTANCE_NAME HOST_NAME FAILOVER_T FAILOVER_METHOD FAILED_OVER
------------- -------------------------- ---------- --------------- -----------
orcl2 discus2.macdeoracle.jp
SELECT BASIC NO

SQL>
SQL> !
[oracle@discus1 ˜]$ srvctl status database -d orcl
Instance orcl1 is running on node discus1
Instance orcl2 is running on node discus2
[oracle@discus1 ˜]$ srvctl stop instance -d orcl -i orcl1 -o abort
[oracle@discus1 ˜]$ srvctl status database -d orcl
Instance orcl1 is not running on node discus1
Instance orcl2 is running on node discus2
[oracle@discus1 ˜]$ srvctl start instance -d orcl -i orcl1
[oracle@discus1 ˜]$ srvctl status database -d orcl
Instance orcl1 is running on node discus1
Instance orcl2 is running on node discus2
[oracle@discus1 ˜]$ srvctl stop instance -d orcl -i orcl2 -o abort
[oracle@discus1 ˜]$ srvctl status database -d orcl
Instance orcl1 is running on node discus1
Instance orcl2 is not running on node discus2
[oracle@discus1 ˜]$ exit
exit

SQL> /

INSTANCE_NAME HOST_NAME FAILOVER_T FAILOVER_METHOD FAILED_OVER
------------- -------------------------- ---------- --------------- -----------
orcl1 discus1.macdeoracle.jp
SELECT BASIC YES

SQL>


次回へつづく。



今日、Oracle RACを起動して、MacOSXのOracle Clientから接続した例や、更新系トランザクションのFAILOVERの例を作ろうと思っていたら、なんと、共有DISK(iSCSI)が起動しない。

Openfilerの管理画面やコマンドで確認してみても、iscsi-target サービスの起動が失敗している。。。
ということで、10万円 De RACの次回投稿は、環境の回復後ということになってしまった。(いやはや、最悪は再構築か??? まぁ、そうなった場合でもたいした手間ではないのだが。。。。一度、やり直しているし。openfilerのiscsi-targetサービスが起動すれば全ては解決できることなので、もしかすると意外に簡単なことなのかもしれないが。。。) 

何はともあれ、続きは書くのでご安心を。

| | | コメント (0) | トラックバック (0)

2007年2月18日 (日)

Mac De Oracle - 10万円 de RAC #39

10万円 de RACのつづき。Clusterの開始と停止の確認。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Clusterの開始と停止の確認を行う。

オリジナルと異なるところは、環境変数NLS_LANGが、日本語のキャラクタセットだというところだけなので、特に追記することもなく、一気に確認を。
CentOSがUTF-8ベースであることもあり、環境変数LANG=ja_JP.UTF-8、環境変数NLS_LANG=japanese_japan.AL32UTF8 としてある。データベースキャラクタセットもAL32UTF8としてある。
MacOSXのTerminalは、これらに併せて、UTF-8に設定してある。

尚、手順など、OTN USの元ネタ「28. Starting / Stopping the Cluster」とほぼ同様なのでそちらも参照されたい。


下記例は、discus1で実施したものである。

[oracle@discus1 ˜]$ echo $ORACLE_SID
orcl1
[oracle@discus1 ˜]$ emctl stop dbconsole
TZ set to Japan
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://discus1.macdeoracle.jp:1158/em/console/aboutApplication
Stopping Oracle Enterprise Manager 10g Database Control ...
... Stopped.
[oracle@discus1 ˜]$ srvctl stop instance -d orcl -i orcl1
[oracle@discus1 ˜]$ srvctl stop asm -n discus1
[oracle@discus1 ˜]$ srvctl stop nodeapps -n discus1
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 日 1月 14 22:15:46 2007

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

SQL> conn sys@orcltest as sysdba
パスワードを入力してください:
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2

SQL> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining optionsとの接続が切断されました。
[oracle@discus1 ˜]$ srvctl start nodeapps -n discus1
[oracle@discus1 ˜]$ srvctl start asm -n discus1
[oracle@discus1 ˜]$ srvctl start instance -d orcl -i orcl1
[oracle@discus1 ˜]$ emctl start dbconsole
TZ set to Japan
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0
Copyright (c) 1996, 2005 Oracle Corporation. All rights reserved.
http://discus1.macdeoracle.jp:1158/em/console/aboutApplication
Starting Oracle Enterprise Manager 10g Database Control ................... started.
------------------------------------------------------------------
Logs are generated in directory /u01/app/oracle/product/10.2.0/db_1/discus1_orcl1/sysman/log
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 日 1月 14 22:20:45 2007

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

SQL> conn sys@orcltest as sysdba
パスワードを入力してください:
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2

SQL> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining optionsとの接続が切断されました。
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 日 1月 14 22:21:29 2007

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

SQL> conn / as sysdba
接続されました。
SQL>
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1

SQL>

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月17日 (土)

10万円 de RAC 番外編 - X11

Mac De Oracle - 10万円 de RAC #6で、OUIなどのGUIの操作は、VNC(今回は、Chicken of the VNC)を利用したと書いたが、他の方法として、sshX11 forwarding を利用する方法もあるので、MacOSXのX11を利用した例も載せておくことにする。

尚、MacOSXでは、 X11はオプションであるためデフォルトではインストールされない。もし利用するのであれば、追加インストールする必要がある。

MacOSXのX11がインストール済みであれば、リモートマシンの /etc/ssh/ssh_configで、forwardX11Trustedを"yes"に変更後、 MacOSXのxtermからssh -Y [user@]hostで接続すれば、 MacOSXのxtermからリモートホストのX11ベースアプリケーションが起動できる。


今回は、PowerBook G4(192.168.1.13) の xtermから、Oracle RACを構成するノードの一つ(discus1 : 192.168.1.3)に接続し、OUI (Oracle Universal Installer)を起動した例を載せておく。


X11_forwarding1

尚、環境変数LANGをen_US.UTF-8に設定しているが、Cでも問題ないだろう。

pb17:˜ discus$ echo $DISPLAY
:1.0
pb17:˜ discus$ ssh -Y oracle@discus1
The authenticity of host 'discus1 (192.168.1.3)' can't be established.
RSA key fingerprint is bf:2a:13:07:0a:d0:73:02:7c:af:e2:8c:7e:62:0d:33.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus1,192.168.1.3' (RSA) to the list of known hosts.
oracle@discus1's password:
Last login: Sat Feb 17 00:44:03 2007 from 192.168.1.13
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ export LANG=en_US.UTF-8
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ $ORACLE_HOME/oui/bin/runInstaller &
[1] 1612
[oracle@discus1 ˜]$ Starting Oracle Universal Installer...

No pre-requisite checks found in oraparam.ini, no system pre-requisite checks will be executed.
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2007-02-17_12-52-27AM.
Please wait......
Oracle Universal Installer, Version 10.2.0.1.0 Production
Copyright (C) 1999, 2005, Oracle. All rights reserved.


X11_forwarding2
X11_forwarding3
X11_forwarding4
X11_forwarding5


[1]+  Done                    $ORACLE_HOME/oui/bin/runInstaller
[oracle@discus1 ˜]$

といった感じ。


参考:
X Window System
X11 forwarding
ADC Technical Q&A QA1232
ssh_config




さて、明日は石垣島在住の友人が石垣牛を持って、久々に遊びにくるのだが、石垣牛をどう料理するか。。
シンプルに塩、胡椒だろうか。。やはり。。
石垣牛は、2000年の沖縄サミットの晩餐会のメインディッシュを飾ったということなので、それといっしょに、あのCoCoファームGRAND CUVEE NOVOを開けるのもいいか。。。

| | | コメント (0) | トラックバック (0)

Mac De Oracle - 10万円 de RAC #38

10万円 de RACのつづき。Oralce RAC ClusterとDatabase構成の確認。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oralce RAC ClusterとDatabase構成の確認を行う。

オリジナルと異なるところは、環境変数NLS_LANGが、日本語のキャラクタセットだというところだけなので、特に追記することもなく、一気に確認を。
CentOSがUTF-8ベースであることもあり、環境変数LANG=ja_JP.UTF-8、環境変数NLS_LANG=japanese_japan.AL32UTF8 としてある。データベースキャラクタセットもAL32UTF8としてある。
MacOSXのTerminalは、これらに併せて、UTF-8に設定してある。

尚、手順など、OTN USの元ネタ「27. Verify the RAC Cluster & Database Configuration」とほぼ同様なのでそちらも参照されたい。


以下の確認作業は、Oracle RACの全ノードで実施する。(下記例は、discus1から実施したもの)

[oracle@discus1 ˜]$ srvctl status database -d orcl
Instance orcl1 is running on node discus1
Instance orcl2 is running on node discus2
[oracle@discus1 ˜]$ srvctl status instance -d orcl -i orcl2
Instance orcl2 is running on node discus2
[oracle@discus1 ˜]$ srvctl status service -d orcl -s orcltest
Service orcltest is running on instance(s) orcl2, orcl1
[oracle@discus1 ˜]$ srvctl status nodeapps -n discus1
VIP is running on node: discus1
GSD is running on node: discus1
Listener is running on node: discus1
ONS daemon is running on node: discus1
[oracle@discus1 ˜]$ srvctl status asm -n discus1
ASM instance +ASM1 is running on node discus1.
[oracle@discus1 ˜]$ srvctl config database
orcl
[oracle@discus1 ˜]$ srvctl config database -d orcl
discus1 orcl1 /u01/app/oracle/product/10.2.0/db_1
discus2 orcl2 /u01/app/oracle/product/10.2.0/db_1
[oracle@discus1 ˜]$ srvctl config nodeapps -n discus1 -a -g -s -l
VIP exists.: /discus1-vip.macdeoracle.jp/192.168.1.100/255.255.255.0/eth0:eth1
GSD exists.
ONS daemon exists.
Listener exists.
[oracle@discus1 ˜]$ srvctl config asm -n discus1
+ASM1 /u01/app/oracle/product/10.2.0/db_1
[oracle@discus1 ˜]$

[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 金 1月 12 00:37:21 2007

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

SQL> conn / as sysdba
接続されました。
SQL> l
1 select
2 inst_id,
3 instance_number inst_no,
4 instance_name inst_name,
5 parallel,
6 status,
7 database_status db_status,
8 active_state state,
9 host_name host
10 from
11 gv$instance
12 order by
13* inst_id
SQL> /

INST_ID INST_NO INST_ PARALLEL STAT DB_STATU STATE HOST
---------- ---------- ----- --------- ---- -------- -------- ----------------------
1 1 orcl1 YES OPEN ACTIVE NORMAL discus1.macdeoracle.jp
2 2 orcl2 YES OPEN ACTIVE NORMAL discus2.macdeoracle.jp

SQL>
SQL> l
1 select name from v$datafile
2 union
3 select member from v$logfile
4 union
5 select name from v$controlfile
6 union
7* select name from v$tempfile
SQL> /

NAME
--------------------------------------------------------------------------------
+FLASH_RECOVERY_AREA/orcl/controlfile/current.268.611867601
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.269.611867617
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.270.611867647
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.271.611873595
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.272.611873627
+ORCL_DISK_GRP1/orcl/controlfile/current.277.611867599
+ORCL_DISK_GRP1/orcl/datafile/example.262.611867781
+ORCL_DISK_GRP1/orcl/datafile/indx.270.611876095
+ORCL_DISK_GRP1/orcl/datafile/sysaux.257.611867731
+ORCL_DISK_GRP1/orcl/datafile/system.267.611867671
+ORCL_DISK_GRP1/orcl/datafile/undotbs1.258.611867715
+ORCL_DISK_GRP1/orcl/datafile/undotbs1.269.611876347
+ORCL_DISK_GRP1/orcl/datafile/undotbs2.265.611876455
+ORCL_DISK_GRP1/orcl/datafile/undotbs2.275.611867793
+ORCL_DISK_GRP1/orcl/datafile/users.274.611867809
+ORCL_DISK_GRP1/orcl/onlinelog/group_1.276.611867607
+ORCL_DISK_GRP1/orcl/onlinelog/group_2.268.611867637
+ORCL_DISK_GRP1/orcl/onlinelog/group_3.273.611873585
+ORCL_DISK_GRP1/orcl/onlinelog/group_4.271.611873619
+ORCL_DISK_GRP1/orcl/tempfile/temp.272.611867743

20行が選択されました。

SQL>
SQL> l
1 select path
2 from
3 v$asm_disk
4 where
5 group_number in
6 (
7 select group_number
8 from
9 v$asm_diskgroup
10 where
11 name = 'ORCL_DISK_GRP1'
12* )
SQL> /

PATH
--------------------
ORCL:VOL1
ORCL:VOL2

SQL>

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月16日 (金)

Mac De Oracle - 10万円 de RAC #37

10万円 de RACのつづき。表領域の作成と変更。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、表領域の作成と変更を行う。

尚、手順など、OTN USの元ネタ「26. Create / Alter Tablespaces」とほぼ同様なのでそちらも参照されたい。

クラスタデータベースの作成も無事終わり、お遊び用データベースの環境をそれなりに整えておくことにする。
尚、以降にリストされるファイル名は、OMF(Oracle Managed Files)ファイルであるため、環境が異なれば名称もことなることにご注意を。私の環境では以下のようなファイル名になっているだけなのである。

SQL*Plusを起動し、sysdbaユーザとして接続後、 scottユーザの作成及び、権限付与、USERS表領域の拡張(データファイルサイズの拡張)、SYSTEM、SYSAUX表領域の拡張(データファイルサイズの拡張)、UNDOTBS1とUNDOTBS2表領域の拡張(データファイルの追加)、一時表領域の拡張(データファイルサイズの拡張)などをダ〜〜〜〜〜ッとやっちゃいます。
(クラスタデータベースは作成されているので、どちらのノードから接続しても同じです。以下の例では、discus1で SQL*Plusを起動して接続しています)

[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 木 1月 11 23:00:06 2007

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

SQL> conn / as sysdba
パスワードを入力してください:
接続されました。

SQL> l
1 select
2 tablespace_name,file_name
3 from
4 dba_data_files
5 union
6 select
7 tablespace_name,file_name
8 from
9* dba_temp_files
SQL> /

TABLESPACE_NAME FILE_NAME
-------------------- ------------------------------------------------------------
EXAMPLE +ORCL_DISK_GRP1/orcl/datafile/example.262.611867781
SYSAUX +ORCL_DISK_GRP1/orcl/datafile/sysaux.257.611867731
SYSTEM +ORCL_DISK_GRP1/orcl/datafile/system.267.611867671
TEMP +ORCL_DISK_GRP1/orcl/tempfile/temp.272.611867743
UNDOTBS1 +ORCL_DISK_GRP1/orcl/datafile/undotbs1.258.611867715
UNDOTBS2 +ORCL_DISK_GRP1/orcl/datafile/undotbs2.275.611867793
USERS +ORCL_DISK_GRP1/orcl/datafile/users.274.611867809

7行が選択されました。

SQL>
SQL> create user scott identified by xxxxxx
2 default tablespace users
3 temporary tablespace temp
4* quota unlimited on users
SQL> /

ユーザーが作成されました。

SQL> grant create session,create table,create procedure,alter session to scott;

権限付与が成功しました。

SQL> conn scott/xxxxxx
接続されました。
SQL> conn / as sysdba
接続されました。
SQL>
SQL> alter database datafile '+ORCL_DISK_GRP1/orcl/datafile/users.274.611867809' resize 1024m;

データベースが変更されました。

SQL> create tablespace indx datafile '+ORCL_DISK_GRP1' size 1024m
2 autoextend off
3 extent management local autoallocate
4 segment space management auto;

表領域が作成されました。

SQL> alter database datafile '+ORCL_DISK_GRP1/orcl/datafile/system.267.611867671' resize 800m;

データベースが変更されました。

SQL> alter database datafile '+ORCL_DISK_GRP1/orcl/datafile/sysaux.257.611867731' resize 500m;

データベースが変更されました。

SQL> alter tablespace undotbs1 add datafile '+ORCL_DISK_GRP1' size 1024m
2 autoextend on next 50m maxsize 2048m;

表領域が変更されました。

SQL> alter tablespace undotbs2 add datafile '+ORCL_DISK_GRP1' size 1024m
2 autoextend on next 50m maxsize 2048m;

表領域が変更されました。

SQL> alter database tempfile '+ORCL_DISK_GRP1/orcl/tempfile/temp.272.611867743' resize 1024m;

データベースが変更されました。

SQL>
SQL> l
1 select
2 t.status,
3 t.tablespace_name,
4 t.contents as "TS Type",
5 t.extent_management as "Ext.Mgt.",
6 t.segment_space_management as "Seg.Mgt.",
7 sum(f.bytes) as "TS size"
8 from
9 dba_tablespaces t join dba_data_files f
10 on t.tablespace_name = f.tablespace_name
11 group by
12 t.status,
13 t.tablespace_name,
14 t.contents,
15 t.extent_management,
16 t.segment_space_management
17 order by
18* t.tablespace_name
SQL> /

STATUS TABLESPACE_NAME TS Type Ext.Mgt. Seg.Mgt. TS size
--------- --------------- ------------ -------- -------- ----------
ONLINE EXAMPLE PERMANENT LOCAL AUTO 157286400
ONLINE INDX PERMANENT LOCAL AUTO 1073741824
ONLINE SYSAUX PERMANENT LOCAL AUTO 524288000
ONLINE SYSTEM PERMANENT LOCAL MANUAL 838860800
ONLINE UNDOTBS1 UNDO LOCAL MANUAL 1283457024
ONLINE UNDOTBS2 UNDO LOCAL MANUAL 1283457024
ONLINE USERS PERMANENT LOCAL AUTO 1073741824

7行が選択されました。

SQL>


Terminal

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月15日 (木)

Mac De Oracle - 10万円 de RAC #36

10万円 de RACのつづき。Oracle Net Service構成ファイルの確認。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle Net Serviceの確認。

tnsnames.oraに作成した(された)Cluster Databaseの各サービス名で接続できるか確認する。

尚、手順など、OTN USの元ネタ「25. Verify TNS Networking Files」とほぼ同様なのでそちらも参照されたい。

どちらのノードから行ってもいよいのだが、下記例では、discus1から行っている。

[oracle@discus1 ˜]$ 
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 木 1月 11 22:52:06 2007

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

SQL> conn system@orcl2
パスワードを入力してください:
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2

SQL> conn system@orcl1
パスワードを入力してください:
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1

SQL> conn system@orcltest
パスワードを入力してください:
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl2

SQL> conn system@orcl
パスワードを入力してください:
接続されました。
SQL> select instance_name from v$instance;

INSTANCE_NAME
------------------------------------------------
orcl1

SQL> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining optionsとの接続が切断されました。
[oracle@discus1 ˜]$

とまあ、こんな感じです。


次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月14日 (水)

Mac De Oracle - 10万円 de RAC #35

10万円 de RACのつづき。Oracle Cluster databaseの作成(第二回目)。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1/その2
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle Cluster databaseの作成を行う。(第二回目)。

尚、手順など、OTN USの元ネタ「24. Create the Oracle Cluster Database」とほぼ同様なのでそちらも参照されたい。

以降の操作は、Oracle RACを構成する1つのノード(この例ではdiscus1)から実行する。
前回から継続して作業を行っているのであれば、特に問題はないと思うが、このステップから作業を再開したような場合、かつ、sshを利用して他のノードをアクセスする方法を取っている場合は、ユーザーの等価化又は、その再確認をしておくといいだろう。)


● dbca (Database Configuration Assistanct)を起動してCluster databaseを作成する

dbca (Database Configuration Assistant)を起動する際も文字化け回避策として、環境変数LANGを一時的に、en_USにしておく。
[oracle@discus1 ˜]$ export LANG=en_US.UTF-8
[oracle@discus1 ˜]$ dbca &
[1] 13291
[oracle@discus1 ˜]$



(再生にはQuickTimeが必要です。)
dbca

● データベース作成後の確認

SQL*Plusを利用し、作成したデータベースのサービス名を各ノードで確認しておく。下記は、作成したインスタンス(orcl1とorcl2)にSQL*Plusで接続し確認している。
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 木 1月 11 22:45:04 2007

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

SQL> conn sys@orcl1 as sysdba
パスワードを入力してください:
接続されました。
SQL> show parameter service

NAME TYPE VALUE
----------------- -------------------- ----------------------------
service_names string orcl.discus.info, orcltest
SQL> exit
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining optionsとの接続が切断されました。
[oracle@discus1 ˜]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 木 1月 11 22:48:18 2007

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

SQL> conn sys@orcl2 as sysdba
パスワードを入力してください:
接続されました。
SQL> show parameter service

NAME TYPE VALUE
----------------- -------------------- ----------------------------
service_names string orcl.discus.info, orcltest
SQL>

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月13日 (火)

Mac De Oracle - 10万円 de RAC #34

10万円 de RACのつづき。Oracle Cluster databaseの作成(第一回目)。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成 その1
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle Cluster databaseの作成を行う。その第一回目。

尚、手順など、OTN USの元ネタ「24. Create the Oracle Cluster Database」とほぼ同様なのでそちらも参照されたい。

以降の操作は、Oracle RACを構成する1つのノード(この例ではdiscus1)から実行する。
前回から継続して作業を行っているのであれば、特に問題はないと思うが、このステップから作業を再開したような場合、かつ、sshを利用して他のノードをアクセスする方法を取っている場合は、ユーザーの等価化又は、その再確認をしておくといいだろう。)

● まずは、Cluster Database作成前のチェックから

環境変数LANGは、en_USでも ja_JPどちらでも問題ないが、この例では、ja_JPに戻した。
[oracle@discus1 ˜]$ cd /tmp/ora
[oracle@discus1 ora]$ ll
total 12
dr-xr-xr-x 9 oracle dba 4096 Jan 7 22:18 clusterware
dr-xr-xr-x 6 oracle dba 4096 Jan 7 23:07 companion
dr-xr-xr-x 6 oracle dba 4096 Jan 7 22:39 database
[oracle@discus1 ora]$ echo $LANG
en_US.UTF-8
[oracle@discus1 ora]$ export LANG=ja_JP.UTF-8
[oracle@discus1 ora]$ ./clusterware/cluvfy/runcluvfy.sh stage -pre dbcfg -n discus1,discus2 -d ${ORACLE_HOME} -verbose

データベース構成の事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。

ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しまし結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

管理権限をチェック中...

チェック: ユーザー"oracle"の存在
ノード名 ユーザーが存在します コメント
------------ ------------------------ ------------------------
discus2 はい 合格
discus1 はい 合格
結果: "oracle"のユーザーの存在チェックに合格しました。

チェック: グループ"dba"の存在
ノード名 ステータス グループID
------------ ------------------------ ------------------------
discus2 存在します 510
discus1 存在します 510
結果: "dba"のグループの存在チェックに合格しました。

チェック: グループ"dba"内のユーザー"oracle"[プライマリ]のメンバーシップ
ノード名 ユーザーが存在します グループが存在します グループ内のユーザー プライマリ コメント
---------------- ------------ ------------ ------------ ------------ ------------
discus2 はい はい はい はい 合格
discus1 はい はい はい はい 合格
結果: グループ"dba"内のユーザー"oracle"[プライマリ]のメンバーシップ・チェックに合格しました。

管理権限チェックに合格しました。

ノード接続性をチェック中...

ノード"discus2"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.4 192.168.1.0
eth0 192.168.1.101 192.168.1.0
eth1 192.168.2.4 192.168.2.0

ノード"discus1"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.3 192.168.1.0
eth0 192.168.1.100 192.168.1.0
eth1 192.168.2.3 192.168.2.0

チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus2:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus1:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

サブネット"192.168.1.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth0:192.168.1.4 eth0:192.168.1.101
discus1 eth0:192.168.1.3 eth0:192.168.1.100

サブネット"192.168.2.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。

CRS整合性をチェック中...

デーモン活性をチェック中...

チェック: "CRS daemon"の活性
ノード名 実行中
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: "CRS daemon"の活性チェックに合格しました。

デーモン活性をチェック中...

チェック: "CSS daemon"の活性
ノード名 実行中
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: "CSS daemon"の活性チェックに合格しました。

デーモン活性をチェック中...

チェック: "EVM daemon"の活性
ノード名 実行中
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: "EVM daemon"の活性チェックに合格しました。

すべてのデーモンの活性
ノード名 CRS daemon CSS daemon EVM daemon
------------ ------------------------ ------------------------ ----------
discus2 はい はい はい
discus1 はい はい はい

CRS状態をチェック中...

チェック: CRSの状態
ノード名 CRS OK?
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: CRS状態チェックに合格しました。

CRS整合性チェックに合格しました。

データベース構成の事前チェックはすべてのノードで失敗しました。
[oracle@discus1 ora]$


以前も何度か出てきた以下のエラーメッセージだが、VIPの設定が正しいことは既に確認済みなので無視して問題はない。

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


ログが長いので、今日はここまで。 次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月12日 (月)

Mac De Oracle - 10万円 de RAC #33

10万円 de RACのつづき。TNS Listenerの構成。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle Net Service(TNS Listenerの構成を含む)の構成を行う。面倒な作業ではないがしっかり行っておきたいところですね。結構ここら辺りでつまらないミスをする方が多いし。

尚、手順など、OTN USの元ネタ「23. Create TNS Listener Process」とほぼ同様なのでそちらも参照されたい。


この作業は、Oracle RACを構成する1つのノード(この例では、discus1)から行えばよい。前回の作業に続けて行っているのであれば、特に問題はないと思うが、このステップから作業を再開したような場合、かつ、sshを利用して他のノードをアクセスする方法を取っている場合は、ユーザーの等価化又は、その再確認をしておくといいだろう。)

● Oracle Netサービスの構成は、netcaを利用して行う。

ouiの場合と同様に、文字化け回避策として、環境変数LANGをja_JPではなく、en_USにしておく。以下、netca起動時のログ
[oracle@discus1 &title;]$ echo $LANG
en_US.UTF-8
[oracle@discus1 &title;]$
[oracle@discus1 &title;]$
[oracle@discus1 &title;]$
[oracle@discus1 &title;]$ netca &
[1] 18800
[oracle@discus1 &title;]$
Oracle Net Services Configuration:
Configuring Listener:LISTENER
Default local naming configuration complete.
discus1...
discus2...
Listener configuration complete.
Profile configuration complete.
Profile configuration complete.
Oracle Net Services configuration successful. The exit code is 0

[1]+ Done netca
[oracle@discus1 &title;]$


以下、netcaを操作してOracle Netサービスの構成を行っている様子をQuickTimeムービーにしたもの。TNS Listenerの構成に続き、Naming methodsの構成(tnsnames.oraやsqlnet.ora)を行っている。


(再生にはQuickTimeが必要です。)
netca



● 確認!

netcaによるOracle Netサービスの構成が済んだら、念のためリスナープロセスが起動されているか確認しておく。
尚、確認は、Oracle RACを構成する全ノードで行う。
[oracle@discus1 &title;]$ hostname
discus1.macdeoracle.jp
[oracle@discus1 &title;]$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_DISCUS1
[oracle@discus1 &title;]$ ssh discus2 hostname
discus2.macdeoracle.jp
[oracle@discus1 &title;]$ ssh discus2 ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_DISCUS2
[oracle@discus1 &title;]$

次回へつつく。

| | | コメント (0) | トラックバック (0)

2007年2月11日 (日)

Mac De Oracle - 10万円 de RAC #32

10万円 de RACのつづき。Oracle10g R2 Companion CD softwareのインストール。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2 Companion CD softwareのインストール

尚、手順など、OTN USの元ネタ「22. Install Oracle 10g Companion CD Software」とほぼ同様なのでそちらも参照されたい。


また、今回は、Compaion CDに含まれるソフトウェアのうち、Oracle Database 10g Products 10.2.0.1.0だけをインストールした(サンプルスキーマなど)。このCompanion CDに含まれるソフトウェアのインストールはオプションであり、必要に応じてインストールすればよい。例えば、Oracle HTMLDBが必要であれば追加インストールすればよい。

● companion CDに含まれる OUIを起動し、追加プロダクトのインストールを開始する。

Oracle10g R2 Clusterware、Softwareのインストールと同様に、Oracle RACを構成する1ノード(この例ではdiscus1)にてインストールを実行すればよい。

※以下はOUI (Oracle Universal Installer)を起動するまでのログ、及び、OUIの実行画面のQuickTimeムービーである。

[oracle@discus1 ora]$ ll
total 12
dr-xr-xr-x 9 oracle dba 4096 Jan 7 22:18 clusterware
dr-xr-xr-x 6 oracle dba 4096 Jan 7 23:07 companion
dr-xr-xr-x 6 oracle dba 4096 Jan 7 22:39 database
[oracle@discus1 ora]$ ./companion/runInstaller -ignoreSysPrereqs
Starting Oracle Universal Installer...

Checking installer requirements...

Checking operating system version: must be redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
Passed


All installer requirements met.

Preparing to launch Oracle Universal Installer from /tmp/OraInstall2007-01-14_01-54-39PM. Please wait ...
[oracle@discus1 ora]$ Oracle Universal Installer, Version 10.2.0.1.0 Production
Copyright (C) 1999, 2005, Oracle. All rights reserved.



(再生にはQuickTimeが必要です。)
companion_cd

次回へつつく。

| | | コメント (0) | トラックバック (0)

2007年2月10日 (土)

Mac De Oracle - 10万円 de RAC #31

10万円 de RACのつづき。Oracle10g R2 Database softwareのインストール その2。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1/その2
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2 Database softwareのインストール(第二回目)

尚、手順などは、OTN USの元ネタ「21. Install Oracle Database 10g Software」と同じなので、そちらも参照のこと。


環境変数LANGがja_JPだと、OUIが文字化けしてしいましたが、表示だけの問題(フォントの問題)なので特に対処せず、一番簡単な方法である、en_USに変更することで対処。

以下、文字化けしたOUI

[oracle@discus1 ora]$ echo $LANG
ja_JP.UTF-8
[oracle@discus1 ora]$
[oracle@discus1 ora]$ ./database/runInstaller -ignoreSysPrereqs
Oracle Universal Installerを起動中です...v
インストーラ要件の確認中...

オペレーティング・システムのバージョンを確認中: 必須redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
問題なし


すべてのインストーラ要件を満たしています。

Oracle Universal Installerの起動を準備中 /tmp/OraInstall2007-01-11_06-13-04PM. お待ちください...
[oracle@discus1 ora]$ Oracle Universal Installer, バージョン 10.2.0.1.0 製品版
Copyright (C) 1999, 2005, Oracle. All rights reserved.

Warning: Cannot convert string "-watanabe-mincho-medium-r-normal--*-140-*-*-c-*-jisx0208.1983-0" to type FontStruct


041


以下、文字化けを回避した状態でインストールを行う。

[oracle@discus1 ora]$ export LANG=en_US.UTF-8
[oracle@discus1 ora]$
[oracle@discus1 ora]$ ./database/runInstaller -ignoreSysPrereqs

Starting Oracle Universal Installer...

Checking installer requirements...

Checking operating system version: must be redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
Passed

All installer requirements met.

Preparing to launch Oracle Universal Installer from /tmp/OraInstall2007-01-11_06-19-23PM. Please wait ...
[oracle@discus1 ora]$ Oracle Universal Installer, Version 10.2.0.1.0 Production
Copyright (C) 1999, 2005, Oracle. All rights reserved.

[an error occurred while processing this directive]
042


(再生にはQuickTimeが必要です。)
rac_de_oracle31-1


● Oracle10g R2になっても無くならない、Oracleインストールのお約束、root.shの実行
root.shは、Oracle RACを構成する全ノードで実行する。

[an error occurred while processing this directive]
052

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# /u01/app/oracle/product/10.2.0/db_1/root.sh
Running Oracle10 root.sh script...

The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/product/10.2.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.

[root@discus1 ˜]#
[root@discus1 ˜]# ssh root@discus2 /u01/app/oracle/product/10.2.0/db_1/root.sh
root@discus2's password:
Running Oracle10 root.sh script...

The following environment variables are set as:
ORACLE_OWNER= oracle
ORACLE_HOME= /u01/app/oracle/product/10.2.0/db_1

Enter the full pathname of the local bin directory: [/usr/local/bin]:
Copying dbhome to /usr/local/bin ...
Copying oraenv to /usr/local/bin ...
Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.

[root@discus1 ˜]#
[an error occurred while processing this directive]

(再生にはQuickTimeが必要です。)
rac_de_oracle31-2


次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月 9日 (金)

Mac De Oracle - 10万円 de RAC #30

10万円 de RACのつづき。Oracle10g R2 Database softwareのインストール その1。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール その1
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2 Database softwareのインストール(第一回目)

尚、手順などは、OTN USの元ネタ「21. Install Oracle Database 10g Software」と同じなので、そちらも参照のこと。

では早速取りかかる、まず、データベースインストール事前チェックを行う。


OUIを起動するノードは、discus1なのでdiscus1から実行している。
※ログの内容は、省略せず全ての内容を載せている為少々長いがご容赦を。
 (どのようなチェックが行われているか知るにはちょうどよいログなので)

[oracle@discus1 ora]$ pwd
/tmp/ora
[oracle@discus1 ora]$ echo $LANG
ja_JP.UTF-8
[oracle@discus1 ora]$
[oracle@discus1 ora]$ ll
dr-xr-xr-x 9 oracle dba 4096 1月 7 22:18 clusterware
dr-xr-xr-x 6 oracle dba 4096 1月 7 23:07 companion
dr-xr-xr-x 6 oracle dba 4096 1月 7 22:39 database
[oracle@discus1 ora]$
[oracle@discus1 ora]$ ./clusterware/cluvfy/runcluvfy.sh stage -pre dbinst -n discus1,discus2 -r 10gR2 -verbose

データベース・インストールの事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

管理権限をチェック中...

チェック: ユーザー"oracle"の存在
ノード名 ユーザーが存在します コメント
------------ ------------------------ ------------------------
discus2 はい 合格
discus1 はい 合格
結果: "oracle"のユーザーの存在チェックに合格しました。

チェック: グループ"dba"の存在
ノード名 ステータス グループID
------------ ------------------------ ------------------------
discus2 存在します 115
discus1 存在します 115
結果: "dba"のグループの存在チェックに合格しました。

チェック: グループ"dba"内のユーザー"oracle"[プライマリ]のメンバーシップ
ノード名 ユーザーが存在します グループが存在します グループ内のユーザー プライマリ コメント
---------------- ------------ ------------ ------------ ------------ ------------
discus2 はい はい はい はい 合格
discus1 はい はい はい はい 合格
結果: グループ"dba"内のユーザー"oracle"[プライマリ]のメンバーシップ・チェックに合格しました。

管理権限チェックに合格しました。

ノード接続性をチェック中...


ノード"discus2"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.4 192.168.1.0
eth0 192.168.1.101 192.168.1.0
eth1 192.168.2.4 192.168.2.0


ノード"discus1"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.3 192.168.1.0
eth0 192.168.1.100 192.168.1.0
eth1 192.168.2.3 192.168.2.0


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus2:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus2:eth0 discus1:eth0 はい
discus1:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

サブネット"192.168.1.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth0:192.168.1.4 eth0:192.168.1.101
discus1 eth0:192.168.1.3 eth0:192.168.1.100

サブネット"192.168.2.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


システム要件をチェック中: 'database'...

チェック: メモリー合計
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 502.37MB (514428KB) 512MB (524288KB) 失敗
discus1 502.37MB (514428KB) 512MB (524288KB) 失敗
結果: メモリー合計チェックが失敗しました。

チェック: "/tmp"ディレクトリのディスク空き領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 8.33GB (8737036KB) 400MB (409600KB) 合格
discus1 6.81GB (7145740KB) 400MB (409600KB) 合格
結果: ディスク空き領域チェックに合格しました。

チェック: スワップ領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2GB (2097144KB) 1GB (1048576KB) 合格
discus1 2GB (2097144KB) 1GB (1048576KB) 合格
結果: スワップ領域チェックに合格しました。

チェック: システム・アーキテクチャ
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 i686 i686 合格
discus1 i686 i686 合格
結果: システム・アーキテクチャチェックに合格しました。

チェック: カーネル・バージョン
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2.6.9-42.EL 2.4.21-15EL 合格
discus1 2.6.9-42.EL 2.4.21-15EL 合格
結果: カーネル・バージョンチェックに合格しました。

チェック: "make-3.79"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 make-3.80-6.EL4 合格
discus1 make-3.80-6.EL4 合格
結果: "make-3.79"のパッケージの存在チェックに合格しました。

チェック: "binutils-2.14"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 binutils-2.15.92.0.2-21 合格
discus1 binutils-2.15.92.0.2-21 合格
結果: "binutils-2.14"のパッケージの存在チェックに合格しました。

チェック: "gcc-3.2"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 gcc-3.4.6-3 合格
discus1 gcc-3.4.6-3 合格
結果: "gcc-3.2"のパッケージの存在チェックに合格しました。

チェック: "compat-db-4.0.14-5"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 compat-db-4.1.25-9 合格
discus1 compat-db-4.1.25-9 合格
結果: "compat-db-4.0.14-5"のパッケージの存在チェックに合格しました。

チェック: "compat-gcc-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-gcc-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-libstdc++-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-libstdc++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "glibc-2.3.2-95.27"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 glibc-2.3.4-2.25 合格
discus1 glibc-2.3.4-2.25 合格
結果: "glibc-2.3.2-95.27"のパッケージの存在チェックに合格しました。

チェック: "openmotif-2.2.3"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 openmotif-2.2.3-10.RHEL4.5 合格
discus1 openmotif-2.2.3-10.RHEL4.5 合格
結果: "openmotif-2.2.3"のパッケージの存在チェックに合格しました。

チェック: "setarch-1.3-1"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 setarch-1.6-1 合格
discus1 setarch-1.6-1 合格
結果: "setarch-1.3-1"のパッケージの存在チェックに合格しました。

チェック: "semmsl"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 250 250 合格
discus1 250 250 合格
結果: "semmsl"のカーネル・パラメータチェックに合格しました。

チェック: "semmns"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 32000 32000 合格
discus1 32000 32000 合格
結果: "semmns"のカーネル・パラメータチェックに合格しました。

チェック: "semopm"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 100 100 合格
discus1 100 100 合格
結果: "semopm"のカーネル・パラメータチェックに合格しました。

チェック: "semmni"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 128 128 合格
discus1 128 128 合格
結果: "semmni"のカーネル・パラメータチェックに合格しました。

チェック: "shmall"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2097152 2097152 合格
discus1 2097152 2097152 合格
結果: "shmall"のカーネル・パラメータチェックに合格しました。

チェック: "shmmni"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 4096 4096 合格
discus1 4096 4096 合格
結果: "shmmni"のカーネル・パラメータチェックに合格しました。

チェック: "file-max"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 65536 65536 合格
discus1 65536 65536 合格
結果: "file-max"のカーネル・パラメータチェックに合格しました。

チェック: "rmem_default"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 262144 262144 合格
discus1 262144 262144 合格
結果: "rmem_default"のカーネル・パラメータチェックに合格しました。

チェック: "rmem_max"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 1048576 262144 合格
discus1 1048576 262144 合格
結果: "rmem_max"のカーネル・パラメータチェックに合格しました。

チェック: "wmem_default"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 262144 262144 合格
discus1 262144 262144 合格
結果: "wmem_default"のカーネル・パラメータチェックに合格しました。

チェック: "wmem_max"のカーネル・パラメータ
ノード名 構成済 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 1048576 262144 合格
discus1 1048576 262144 合格
結果: "wmem_max"のカーネル・パラメータチェックに合格しました。

チェック: "dba"のグループの存在
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus2 存在します 合格
discus1 存在します 合格
結果: "dba"のグループの存在チェックに合格しました。

チェック: "nobody"の既存ユーザー
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus2 存在します 合格
discus1 存在します 合格
結果: "nobody"の既存ユーザーチェックに合格しました。

システム要件が失敗しました 'database'

CRS整合性をチェック中...

デーモン活性をチェック中...

チェック: "CRS daemon"の活性
ノード名 実行中
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: "CRS daemon"の活性チェックに合格しました。

デーモン活性をチェック中...

チェック: "CSS daemon"の活性
ノード名 実行中
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: "CSS daemon"の活性チェックに合格しました。

デーモン活性をチェック中...

チェック: "EVM daemon"の活性
ノード名 実行中
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: "EVM daemon"の活性チェックに合格しました。

すべてのデーモンの活性
ノード名 CRS daemon CSS daemon EVM daemon
------------ ------------------------ ------------------------ ----------
discus2 はい はい はい
discus1 はい はい はい

CRS状態をチェック中...

チェック: CRSの状態
ノード名 CRS OK?
------------------------------------ ------------------------
discus2 はい
discus1 はい
結果: CRS状態チェックに合格しました。

CRS整合性チェックに合格しました。

ノード・アプリケーションの存在をチェック中...


VIPノード・アプリケーションの存在をチェック中です
ノード名 必須 ステータス コメント
------------ ------------------------ ------------------------ ----------
discus2 はい 存在します 合格
discus1 はい 存在します 合格
結果: チェックに合格しました。

ONSノード・アプリケーションの存在をチェック中です
ノード名 必須 ステータス コメント
------------ ------------------------ ------------------------ ----------
discus2 いいえ 存在します 合格
discus1 いいえ 存在します 合格
結果: チェックに合格しました。

GSDノード・アプリケーションの存在をチェック中です
ノード名 必須 ステータス コメント
------------ ------------------------ ------------------------ ----------
discus2 いいえ 存在します 合格
discus1 いいえ 存在します 合格
結果: チェックに合格しました。


データベース・インストールの事前チェックはすべてのノードで失敗しました。
[oracle@discus1 ora]$


以下のエラーがレポートされるが、メモリーは512MB載せており最低要件は満たしているので無視して構わない。その他のエラーは、以前書いた通り、無視しても構わない。

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


チェック: メモリー合計
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 502.37MB (514428KB) 512MB (524288KB) 失敗
discus1 502.37MB (514428KB) 512MB (524288KB) 失敗
結果: メモリー合計チェックが失敗しました。


チェック: "compat-gcc-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-gcc-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-libstdc++-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-libstdc++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在チェックが失敗しました。


次回Oracle10g R2 Database softwareのインストール(第二回目)へつづく

| | | コメント (0) | トラックバック (0)

2007年2月 8日 (木)

Mac De Oracle - 10万円 de RAC #29

10万円 de RACのつづき。Oracle10g Clusterwareのインストール。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g Clusterwareのインストール

尚、手順などは、OTN USの元ネタ「20. Install Oracle 10g Clusterware Software」と同じなので、そちらも参照のこと。

OUIは、Oracle RACを構成する1ノードで起動すればよい。下記例は、discus1で実行したもの。

前のステップで作成したOracle Cluster File Systemに Oracle Clusterwareが利用する2つの共有ファイル(ファイルグループ)を作成する。

1つは、Oracle Cluster Registry (OCR)というCRS及び、Oracle Databaseが利用するレジストリファイル、
もう一つは、CRS Voting Diskというスプリット・ブレイン発生時に生き残るサブクラスタを決めるために利用されるファイルである。

Oracle Clusterwareなどの詳細は、マニュアル「Oracle Database Oracle ClusterwareおよびOracle Real Application Clusters管理およびデプロイメント・ガイド 10g リリース2(10.2)」を参照されたい。


OUIを起動してOracle Clusterwareのインストール。
画面数がそれなりに多いので画面のスナップショットではなく、QucikTimeムービーで!。

(再生にはQuickTimeが必要です。)

rac_de_oracle


orainstRoot.shとroot.shをOracle RACを構成する全ノードで実施しろというダイアログが表示されるので、それに従い各ノードで実行する。

[root@discus1 ˜]# /u01/app/oracle/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oracle/oraInventory to 770.
Changing groupname of /u01/app/oracle/oraInventory to dba.
The execution of the script is complete
[root@discus1 ˜]# ssh discus2
root@discus2's password:
Last login: Mon Jan 8 14:33:54 2007 from discus1.macdeoracle.jp
[root@discus2 ˜]# /u01/app/oracle/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oracle/oraInventory to 770.
Changing groupname of /u01/app/oracle/oraInventory to dba.
The execution of the script is complete
[root@discus2 ˜]# exit
logout

Connection to discus2 closed.
[root@discus1 ˜]#
[root@discus1 ˜]# /u01/app/oracle/product/crs/root.sh
WARNING: directory '/u01/app/oracle/product' is not owned by root
WARNING: directory '/u01/app/oracle' is not owned by root
WARNING: directory '/u01/app' is not owned by root
WARNING: directory '/u01' is not owned by root
Checking to see if Oracle CRS stack is already configured
/etc/oracle does not exist. Creating it now.

Setting the permissions on OCR backup directory
Setting up NS directories
Oracle Cluster Registry configuration upgraded successfully
WARNING: directory '/u01/app/oracle/product' is not owned by root
WARNING: directory '/u01/app/oracle' is not owned by root
WARNING: directory '/u01/app' is not owned by root
WARNING: directory '/u01' is not owned by root
assigning default hostname discus1 for node 1.
assigning default hostname discus2 for node 2.
Successfully accumulated necessary OCR keys.
Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.
node <nodenumber>: <nodename> <private interconnect name> <hostname>
node 1: discus1 discus1-priv discus1
node 2: discus2 discus2-priv discus2
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Now formatting voting device: /u02/oradata/orcl/CSSFile
Now formatting voting device: /u02/oradata/orcl/CSSFile_mirror1
Now formatting voting device: /u02/oradata/orcl/CSSFile_mirror2
Format of 3 voting devices complete.
Startup will be queued to init within 90 seconds.
Adding daemons to inittab
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
discus1
CSS is inactive on these nodes.
discus2
Local node checking complete.
Run root.sh on remaining nodes to start CRS daemons.
[root@discus1 ˜]#
[root@discus1 ˜]# ssh discus2
root@discus2's password:
Last login: Mon Jan 8 14:33:54 2007 from discus1.macdeoracle.jp
[root@discus2 ˜]# /u01/app/oracle/product/crs/root.sh
WARNING: directory '/u01/app/oracle/product' is not owned by root
WARNING: directory '/u01/app/oracle' is not owned by root
WARNING: directory '/u01/app' is not owned by root
WARNING: directory '/u01' is not owned by root
Checking to see if Oracle CRS stack is already configured
/etc/oracle does not exist. Creating it now.

Setting the permissions on OCR backup directory
Setting up NS directories
Oracle Cluster Registry configuration upgraded successfully
WARNING: directory '/u01/app/oracle/product' is not owned by root
WARNING: directory '/u01/app/oracle' is not owned by root
WARNING: directory '/u01/app' is not owned by root
WARNING: directory '/u01' is not owned by root
clscfg: EXISTING configuration version 3 detected.
clscfg: version 3 is 10G Release 2.
assigning default hostname discus1 for node 1.
assigning default hostname discus2 for node 2.
Successfully accumulated necessary OCR keys.
Using ports: CSS=49895 CRS=49896 EVMC=49898 and EVMR=49897.
node <nodenumber>: <nodename> <private interconnect name> <hostname>
node 1: discus1 discus1-priv discus1
node 2: discus2 discus2-priv discus2
clscfg: Arguments check out successfully.

NO KEYS WERE WRITTEN. Supply -force parameter to override.
-force is destructive and will destroy any previous cluster
configuration.
Oracle Cluster Registry for cluster has already been initialized
Startup will be queued to init within 90 seconds.
Adding daemons to inittab
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
discus1
discus2
CSS is active on all nodes.
Waiting for the Oracle CRSD and EVMD to start
Oracle CRS stack installed and running under init(1M)
Running vipca(silent) for configuring nodeapps
指定のインタフェース"eth0"はパブリックではありません。パブリック・インタフェース
を使用して仮想IPを構成する必要があります。

[root@discus2 ˜]#

以下のエラーメッセージが表示されるが、最後のノード(この例では discus2)でVIP Configuration Assistant を起動し手動で構成すれば解決できる。

指定のインタフェース"eth0"はパブリックではありません。パブリック・インタフェース
を使用して仮想IPを構成する必要があります。

とういうことで、vipcaをdiscus2で実行したQuickTimeムービーをどうぞ。
尚、vipcaの実行は、rootユーザで実行すること。

rac_de_oracle_vipca

vipca終了後、Oracle Clusterwareインストールの確認!
Oracle RACを構成する全ノードで確認する。下記例はdiscus1で実施したもの

[oracle@discus1 ˜]$ $ORA_CRS_HOME/bin/olsnodes -n
discus1 1
discus2 2
[oracle@discus1 ˜]$ ls -l /etc/init.d/init.*
-r-xr-xr-x 1 root root 1951 Jan 8 17:44 /etc/init.d/init.crs
-r-xr-xr-x 1 root root 4714 Jan 8 17:44 /etc/init.d/init.crsd
-r-xr-xr-x 1 root root 35394 Jan 8 17:44 /etc/init.d/init.cssd
-r-xr-xr-x 1 root root 3190 Jan 8 17:44 /etc/init.d/init.evmd
[oracle@discus1 ˜]$ ps ax | grep [c]rs
5135 ? Ss 0:00 /bin/su -l oracle -c sh -c 'ulimit -c unlimited; cd /u01/app/oracle/product/crs/log/discus1/evmd; exec /u01/app/oracle/product/crs/bin/evmd '
5144 ? Ssl 0:00 /u01/app/oracle/product/crs/bin/crsd.bin reboot
5845 ? Ssl 0:00 /u01/app/oracle/product/crs/bin/evmd.bin
5961 ? S 0:00 /bin/su -l oracle -c /bin/sh -c 'ulimit -c unlimited; cd /u01/app/oracle/product/crs/log/discus1/cssd; /u01/app/oracle/product/crs/bin/ocssd || exit $?'
5962 ? S 0:00 /bin/sh -c ulimit -c unlimited; cd /u01/app/oracle/product/crs/log/discus1/cssd; /u01/app/oracle/product/crs/bin/ocssd || exit $?
5988 ? Ssl 0:00 /u01/app/oracle/product/crs/bin/ocssd.bin
6255 ? S 0:00 /u01/app/oracle/product/crs/bin/evmlogger.bin -o /u01/app/oracle/product/crs/evm/log/evmlogger.info -l /u01/app/oracle/product/crs/evm/log/evmlogger.log
6585 ? Ss 0:00 /u01/app/oracle/product/crs/opmn/bin/ons -d
6586 ? Sl 0:00 /u01/app/oracle/product/crs/opmn/bin/ons -d
[oracle@discus1 ˜]$


● 最後に、discus1のOUIを終了させれば、Oracle Clusterwareのインストールは完了!


039 040

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年2月 7日 (水)

Mac De Oracle - 10万円 de RAC #28

10万円 de RACのつづき。今回は、Oracle10g R2インストール事前作業のその4。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3/その4
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2インストール前の事前作業のつづき(第四回目というか、おまけ)。


尚、手順などは、OTN USの元ネタ「19. Pre-Installation Tasks for Oracle10g Release 2」と同じなので、そちらも参照のこと。

前回でOracle10g R2インストール前の事前作業は終わっているのだが、前回のエントリで発生した共有ディスクのチェックが失敗する原因について補足されていたので、ついでに試してみることにする。


理由の1つは、cvu自体が、SCSIデバイス以外では正常に動作しないというもの。SCSIデバイス以外のデバイスには、Openfilerのボリュームグループも含まれるとこのと。(Metalink上で公開されているらしいgが、未確認)


また、もう一つ理由として、Linuxのcvuは、内部で smartctlを呼び出しており、それが、iSCSIデバイスのシリアル番号を返さないことが影響しているというもの。

試してみると、確かに、 Serial numberが取れていない!

[oracle@discus1 cluvfy]$ /usr/sbin/cvuqdisk /dev/sdd
smartctl version 5.33 [i686-redhat-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

Device: Openfile Virtual disk Version: 0
Serial number:
Device type: disk
Local Time is: Sun Jan 7 14:45:15 2007 JST
Device supports SMART and is Disabled
Temperature Warning Disabled or Not Supported



[root@discus1 cluvfy]# /usr/sbin/smartctl -i /dev/sdd
smartctl version 5.33 [i686-redhat-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

Device: Openfile Virtual disk Version: 0
Serial number:
Device type: disk
Local Time is: Sun Jan 7 14:48:50 2007 JST
Device supports SMART and is Disabled
Temperature Warning Disabled or Not Supported
[root@discus1 cluvfy]#

ということで、次回、Oracle10g Clusterwareのインストールへつづく。

| | | コメント (0) | トラックバック (0)

2007年2月 6日 (火)

Mac De Oracle - 10万円 de RAC #27

10万円 de RACのつづき。今回は、Oracle10g R2インストール事前作業のその3。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2/その3
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2インストール前の事前作業のつづき(第三回目)。


尚、手順などは、OTN USの元ネタ「19. Pre-Installation Tasks for Oracle10g Release 2」と同じなので、そちらも参照のこと。


● cvuでハードウェアとOSの設定チェックを行う。
この操作は、OUIを起動するノード(この例ではdiscus1)で実施する。

[oracle@discus1 cluvfy]$ ./runcluvfy.sh stage -post hwos -n discus1,discus2 -verbose

ハードウェアとオペレーティング・システム設定の事後チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

ノード接続性をチェック中...


ノード"discus2"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.4 192.168.1.0
eth1 192.168.2.4 192.168.2.0


ノード"discus1"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.3 192.168.1.0
eth1 192.168.2.3 192.168.2.0


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

サブネット"192.168.1.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth0:192.168.1.4
discus1 eth0:192.168.1.3

サブネット"192.168.2.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


共有記憶域アクセス可能性をチェック中...

WARNING:
パッケージcvuqdiskがインストールされていません。
discus2,discus1


ノード"discus2,discus1"で共有記憶域チェックが失敗しました。

ハードウェアとオペレーティング・システム設定の事後チェックはすべてのノードで失敗しました。
[oracle@discus1 cluvfy]$


レポートされたエラーやワーニングを再確認する。
まず、VIPに関するエラーだが、これは、クラスタサービスインストール事前チェックと同様、/etc/hostsに正しく設定してあるので無視する。

ERROR: 
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


次のcvuqdiskパッケージがインストールされていないというワーニングは解決しておく。

共有記憶域アクセス可能性をチェック中...

WARNING:
パッケージcvuqdiskがインストールされていません。
discus2,discus1


ノード"discus2,discus1"で共有記憶域チェックが失敗しました。


以下のようにcvuqdisk-1.0.1-1を追加。これはOracle RACを構成する全ノード(この例ではdiscus1とdiscus2)で行う。

[root@discus1 ora]# cd /tmp/oraclusterware/rpm
[root@discus1 rpm]# ll
合計 8
-rwxr-xr-x 1 oracle dba 5339 1月 7 22:12 cvuqdisk-1.0.1-1.rpm

[root@discus1 rpm]# export CVUQDISK_GRP=dba
[root@discus1 rpm]# rpm -iv cvuqdisk-1.0.1-1.rpm
Preparing packages for installation...
cvuqdisk-1.0.1-1
[root@discus1 rpm]# ls -l /usr/sbin/cvuqdisk
-rwsr-x--- 1 root dba 4168 6月 3 2005 /usr/sbin/cvuqdisk
[root@discus1 rpm]#
[root@discus1 rpm]# scp ./cvuqdisk-1.0.1-1.rpm discus2:/tmp
root@discus2's password:
cvuqdisk-1.0.1-1.rpm 100% 5339 5.2KB/s 00:00
以下、discus2でdiscus1と同様の作業を行う。

cvuqdiskのインストールが済んだら、cvuで再度チェックする。

[oracle@discus1 cluvfy]$ ./runcluvfy.sh stage -post hwos -n discus1,discus2 -verbose

ハードウェアとオペレーティング・システム設定の事後チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

ノード接続性をチェック中...


ノード"discus2"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.4 192.168.1.0
eth1 192.168.2.4 192.168.2.0


ノード"discus1"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.3 192.168.1.0
eth1 192.168.2.3 192.168.2.0


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

サブネット"192.168.1.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth0:192.168.1.4
discus1 eth0:192.168.1.3

サブネット"192.168.2.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


共有記憶域アクセス可能性をチェック中...


ノード"discus2,discus1"で共有記憶域チェックが失敗しました。

ハードウェアとオペレーティング・システム設定の事後チェックはすべてのノードで失敗しました。

これで無視可能なエラー以外のチェックはパスできた。


長いので、次回へづつく。

| | | コメント (0) | トラックバック (0)

2007年2月 5日 (月)

Mac De Oracle - 10万円 de RAC #26

10万円 de RACのつづき。今回は、Oracle10g R2インストール事前作業のその2。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1/その2
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2インストール事前作業のつづき(第二回目)。
前回は、cvuの事前確認で、ユーザー等価化までを確認した。
尚、手順などは、OTN USの元ネタ「19. Pre-Installation Tasks for Oracle10g Release 2」と同じなので、そちらも参照されたい。

● クラスタ・サービス設定の事前チェックの実行
尚、cvuは、Oracle RACを構成する1つのノードで実行すればよい。下記、discus1で実行した例である。

cvuを起動し、Oracle RACを構成するノード、discus1とdiscus2にクラスタ・サービスインストール事前チェックを行う。
[oracle@discus1 cluvfy]$ ./runcluvfy.sh stage -pre crsinst -n discus1,discus2 -verbose

クラスタ・サービス設定の事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 合格
discus1 合格
結果: ユーザー"oracle"のユーザー等価チェックに合格しました。

管理権限をチェック中...

チェック: ユーザー"oracle"の存在
ノード名 ユーザーが存在します コメント
------------ ------------------------ ------------------------
discus2 はい 合格
discus1 はい 合格
結果: "oracle"のユーザーの存在チェックに合格しました。

チェック: グループ"oinstall"の存在
ノード名 ステータス グループID
------------ ------------------------ ------------------------
discus2 存在します 511
discus1 存在します 511
結果: "oinstall"のグループの存在チェックに合格しました。

チェック: グループ"oinstall"内のユーザー"oracle"[プライマリ]のメンバーシップ
ノード名 ユーザーが存在します グループが存在します グループ内のユーザー プライマリ コメント
---------------- ------------ ------------ ------------ ------------ ------------
discus2 はい はい いいえ 該当なし 失敗
discus1 はい はい いいえ 該当なし 失敗
結果: グループ"oinstall"内のユーザー"oracle"[プライマリ]のメンバーシップ・チェックが失敗しました。

管理権限チェックが失敗しました。

ノード接続性をチェック中...


ノード"discus2"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.4 192.168.1.0
eth1 192.168.2.4 192.168.2.0


ノード"discus1"のインタフェース情報
インタフェース名 IPアドレス サブネット
------------------------------ ------------------------------ ----------------
eth0 192.168.1.3 192.168.1.0
eth1 192.168.2.3 192.168.2.0


チェック: サブネット"192.168.1.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth0 discus1:eth0 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.1.0"のノード接続性チェックに合格しました。

チェック: サブネット"192.168.2.0"のノード接続性
ソース 宛先 接続しましたか
------------------------------ ------------------------------ ----------------
discus2:eth1 discus1:eth1 はい
結果: ノードdiscus2,discus1を持つサブネット"192.168.2.0"のノード接続性チェックに合格しました。

サブネット"192.168.1.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth0:192.168.1.4
discus1 eth0:192.168.1.3

サブネット"192.168.2.0"のプライベート・インターコネクトに適したインタフェース:
discus2 eth1:192.168.2.4
discus1 eth1:192.168.2.3

ERROR:
VIPに適したインタフェースのセットが見つかりませんでした。

結果: ノード接続性チェックが失敗しました。


システム要件をチェック中: 'crs'...

チェック: メモリー合計
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 502.37MB (514428KB) 512MB (524288KB) 失敗
discus1 502.37MB (514428KB) 512MB (524288KB) 失敗
結果: メモリー合計チェックが失敗しました。

チェック: "/tmp"ディレクトリのディスク空き領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 8.98GB (9414872KB) 400MB (409600KB) 合格
discus1 7.28GB (7628652KB) 400MB (409600KB) 合格
結果: ディスク空き領域チェックに合格しました。

チェック: スワップ領域
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2GB (2097144KB) 1GB (1048576KB) 合格
discus1 2GB (2097144KB) 1GB (1048576KB) 合格
結果: スワップ領域チェックに合格しました。

チェック: システム・アーキテクチャ
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 i686 i686 合格
discus1 i686 i686 合格
結果: システム・アーキテクチャチェックに合格しました。

チェック: カーネル・バージョン
ノード名 使用可能 必須 コメント
------------ ------------------------ ------------------------ ----------
discus2 2.6.9-42.EL 2.4.21-15EL 合格
discus1 2.6.9-42.EL 2.4.21-15EL 合格
結果: カーネル・バージョンチェックに合格しました。

チェック: "make-3.79"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 make-3.80-6.EL4 合格
discus1 make-3.80-6.EL4 合格
結果: "make-3.79"のパッケージの存在チェックに合格しました。

チェック: "binutils-2.14"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 binutils-2.15.92.0.2-21 合格
discus1 binutils-2.15.92.0.2-21 合格
結果: "binutils-2.14"のパッケージの存在チェックに合格しました。

チェック: "gcc-3.2"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 gcc-3.4.6-3 合格
discus1 gcc-3.4.6-3 合格
結果: "gcc-3.2"のパッケージの存在チェックに合格しました。

チェック: "glibc-2.3.2-95.27"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 glibc-2.3.4-2.25 合格
discus1 glibc-2.3.4-2.25 合格
結果: "glibc-2.3.2-95.27"のパッケージの存在チェックに合格しました。

チェック: "compat-db-4.0.14-5"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 compat-db-4.1.25-9 合格
discus1 compat-db-4.1.25-9 合格
結果: "compat-db-4.0.14-5"のパッケージの存在チェックに合格しました。

チェック: "compat-gcc-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-gcc-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-libstdc++-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-libstdc++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 欠落 失敗
discus1 欠落 失敗
結果: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

チェック: "openmotif-2.2.3"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 openmotif-2.2.3-10.RHEL4.5 合格
discus1 openmotif-2.2.3-10.RHEL4.5 合格
結果: "openmotif-2.2.3"のパッケージの存在チェックに合格しました。

チェック: "setarch-1.3-1"のパッケージの存在
ノード名 ステータス コメント
------------------------------ ------------------------------ ----------------
discus2 setarch-1.6-1 合格
discus1 setarch-1.6-1 合格
結果: "setarch-1.3-1"のパッケージの存在チェックに合格しました。

チェック: "dba"のグループの存在
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus2 存在します 合格
discus1 存在します 合格
結果: "dba"のグループの存在チェックに合格しました。

チェック: "oinstall"のグループの存在
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus2 存在します 合格
discus1 存在します 合格
結果: "oinstall"のグループの存在チェックに合格しました。

チェック: "nobody"の既存ユーザー
ノード名 ステータス コメント
------------ ------------------------ ------------------------
discus2 存在します 合格
discus1 存在します 合格
結果: "nobody"の既存ユーザーチェックに合格しました。

システム要件が失敗しました 'crs'

クラスタ・サービス設定の事前チェックはすべてのノードで失敗しました。
[oracle@discus1 cluvfy]$

と、幾つかのチェックに不合格となったので、不合格になった問題を再確認する。


  1. まず、最初は、oracle所有者のプライマリグループが "oinstall"ではないというエラーだ。

    チェック: グループ"oinstall"内のユーザー"oracle"[プライマリ]のメンバーシップ
    ノード名 ユーザーが存在します グループが存在します グループ内のユーザー プライマリ コメント
    ---------------- ------------ ------------ ------------ ------------ ------------
    discus2 はい はい いいえ 該当なし 失敗
    discus1 はい はい いいえ 該当なし 失敗
    結果: グループ"oinstall"内のユーザー"oracle"[プライマリ]のメンバーシップ・チェックが失敗しました。


    このエラーは、OTN USの元ネタの通り、oracle所有者のプライマリグループが "oinstall"ではない為に発生するようなのだが、無視できるエラーなので特に対処はしない。どうしても気になるのであれば、インストールガイド通りに、oracle所有者のプライマリグループを "oinstall"した上で、"dba"グループにも所属させればいいだろう。今回は、特に対処せず、このエラーは無視する。

  2. 次は、VIPに関するエラーがある。

    ERROR: 
    VIPに適したインタフェースのセットが見つかりませんでした。

    結果: ノード接続性チェックが失敗しました。



    インターコネクト用のVIPは、間違いなく /etc/hostsに定義済みであるが、このエラーが出力される。これはバグということなので、これまた無視する。

  3. その次に、メモリサイズが最小要件を満たしていないというエラーが表示された。

    チェック: メモリー合計 
    ノード名 使用可能 必須 コメント
    ------------ ------------------------ ------------------------ ----------
    discus2 502.37MB (514428KB) 512MB (524288KB) 失敗
    discus1 502.37MB (514428KB) 512MB (524288KB) 失敗
    結果: メモリー合計チェックが失敗しました。



    メモリの最小要件は、512MBのはずで、実際に搭載していメモリも512MBなのだが、メモリ合計サイズのチェックは失敗する。
    OUIの実行時にもワーニングが出そうだが、最小要件は満たしているため、このエラーも無視する。

  4. 最後は、RPMパッケージに関するエラーがある。
    チェック: "compat-gcc-7.3-2.96.128"のパッケージの存在 
    ノード名 ステータス コメント
    ------------------------------ ------------------------------ ----------------
    discus2 欠落 失敗
    discus1 欠落 失敗
    結果: "compat-gcc-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

    チェック: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在
    ノード名 ステータス コメント
    ------------------------------ ------------------------------ ----------------
    discus2 欠落 失敗
    discus1 欠落 失敗
    結果: "compat-gcc-c++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

    チェック: "compat-libstdc++-7.3-2.96.128"のパッケージの存在
    ノード名 ステータス コメント
    ------------------------------ ------------------------------ ----------------
    discus2 欠落 失敗
    discus1 欠落 失敗
    結果: "compat-libstdc++-7.3-2.96.128"のパッケージの存在チェックが失敗しました。

    チェック: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在
    ノード名 ステータス コメント
    ------------------------------ ------------------------------ ----------------
    discus2 欠落 失敗
    discus1 欠落 失敗
    結果: "compat-libstdc++-devel-7.3-2.96.128"のパッケージの存在チェックが失敗しました。



    上記、4パッケージが存在しないというエラーが表示されるが、実際には、下記の、3パッケージがインストールされていれば問題ないので、このエラーも無視する。

    [oracle@discus1 cluvfy]$ rpm -qv compat-gcc-32-3.2.3-47.3 compat-gcc-32-c++-3.2.3-47.3 compat-libstdc++-33-3.2.3-47.3
    compat-gcc-32-3.2.3-47.3
    compat-gcc-32-c++-3.2.3-47.3
    compat-libstdc++-33-3.2.3-47.3
    [oracle@discus1 cluvfy]$ ssh discus2 rpm -q compat-gcc-32-3.2.3-47.3 compat-gcc-32-c++-3.2.3-47.3 compat-libstdc++-33-3.2.3-47.3
    compat-gcc-32-3.2.3-47.3
    compat-gcc-32-c++-3.2.3-47.3
    compat-libstdc++-33-3.2.3-47.3
    [oracle@discus1 cluvfy]$

今回はここまで、この続きは次回。

| | | コメント (0) | トラックバック (0)

2007年2月 4日 (日)

Mac De Oracle - 10万円 de RAC #25

10万円 de RACのつづき。今回は、Oracle10g R2インストール事前作業のその1。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業 その1
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、Oracle10g R2インストール前の事前作業。
尚、手順などは、OTN USの元ネタ「19. Pre-Installation Tasks for Oracle10g Release 2」と同じなので、そちらも参照してもらうとして、早速取りかかることにする。


● javaのバージョン確認

事前にjavaのバージョンが、1.4.2であることを確認。
[root@discus1 ˜]# java -version
java version "1.4.2"
gcj (GCC) 3.4.6 20060404 (Red Hat 3.4.6-3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


● 必須パッケージの確認

以下のパッケージがインストールされていることを確認しておく。

[root@discus1 ˜]# rpm -q binutils compat-db compat-gcc-32 compat-gcc-32-c++ compat-libstdc++-33 compat-libgcc-296 control-center cpp gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers glibc-kernheaders gnome-libs libaio libstdc++ libstdc++-devel make openmotif openmotif21 pdksh setarch sysstat xscreensaver
binutils-2.15.92.0.2-21
compat-db-4.1.25-9
compat-gcc-32-3.2.3-47.3
compat-gcc-32-c++-3.2.3-47.3
compat-libstdc++-33-3.2.3-47.3
compat-libgcc-296-2.96-132.7.2
control-center-2.8.0-12.rhel4.5
cpp-3.4.6-3
gcc-3.4.6-3
gcc-c++-3.4.6-3
glibc-2.3.4-2.25
glibc-common-2.3.4-2.25
glibc-devel-2.3.4-2.25
glibc-headers-2.3.4-2.25
glibc-kernheaders-2.4-9.1.98.EL
gnome-libs-1.4.1.2.90-44.1
libaio-0.3.105-2
libstdc++-3.4.6-3
libstdc++-devel-3.4.6-3
make-3.80-6.EL4
openmotif-2.2.3-10.RHEL4.5
openmotif21-2.1.30-11.RHEL4.6
pdksh-5.2.14-30.3
setarch-1.6-1
sysstat-5.0.5-11.rhel4
xscreensaver-4.18-5.rhel4.11
[root@discus1 ˜]#


● CVUによるCRSインストール要件の事前チェック

oracle所有者で cvu (Cluster Verification Utility)を実行して要件の事前チェックを行う。

尚、環境変数LANGは、ja_JP.UTF-8で行った。

[root@discus1 cluvfy]# su - oracle
[oracle@discus1 cluvfy]$ echo $LANG
ja_JP.UTF-8
[oracle@discus1 cluvfy]$
[oracle@discus1 cluvfy]$
[oracle@discus1 clusterware]$ cd /tmp/ora/clusterware/cluvfy
[oracle@discus1 cluvfy]$ ll
合計 29188
-rwxr-xr-x 1 root root 8477663 1月 7 22:11 cvupack.zip
-rwxr-xr-x 1 root root 21356849 1月 7 22:12 jrepack.zip
-rwxr-xr-x 1 root root 3107 1月 7 22:12 runcluvfy.sh


注意点:ユーザーの等価化は事前に確認しておきたい。もし、ユーザーの等価化を怠ると以下のようなエラーが表示される。

[oracle@discus1 cluvfy]$ ./runcluvfy.sh stage -pre crsinst -n discus1,discus2 -verbose

クラスタ・サービス設定の事前チェックを実行しています

ノード到達可能性をチェック中...

チェック: ノード"discus1"からのノード到達可能性
宛先ノード 到達可能ですか
------------------------------------ ------------------------
discus1 はい
discus2 はい
結果: ノード"discus1"からのノード到達可能性チェックに合格しました。


ユーザー等価をチェック中...

チェック: ユーザー"oracle"のユーザー等価
ノード名 コメント
------------------------------------ ------------------------
discus2 失敗
discus1 失敗
結果: ユーザー"oracle"のユーザー等価チェックが失敗しました。

ERROR:
ユーザー等価はすべてのノードでは使用できません。
検証を続行できません。


クラスタ・サービス設定の事前チェックはすべてのノードで失敗しました。
[oracle@discus1 cluvfy]$


上記エラーが表示された場合は、ユーザー等価化を行った後、cvuを再実行すればよい。

[oracle@discus1 cluvfy]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 cluvfy]$ /usr/bin/ssh-add
Enter passphrase for /u01/app/oracle/.ssh/id_rsa:
Identity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)
Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)
[oracle@discus1 cluvfy]$

長くなるので、次回へづづく。

| | | コメント (0) | トラックバック (0)

2007年2月 3日 (土)

Mac De Oracle - 10万円 de RAC #24

10万円 de RACのつづき。今回は、Oracle 10gソフトウェアのダウンロード。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



さて、今回は、Oracle10g及び、RAC関連ソフトウェアのダウンロード。

OTN USの元ネタ「18. Download Oracle RAC 10g Software」も参考程度に見てもらうとして、ソフトウェアをダウンロードしてもよかったのだが、Linux版のOracle10gのお遊び用環境がないこともあり、今回は、OTN ProfessionalのSoftware kitを利用することにした。

ただ、提供されているメディアは、DVDのみで今回利用しているDELL Optiplex GX260にはDVDドライブが無い。(CDとCDRWのタイプ)

ということで、PoewrBook G4にDVDをマウントし、OUI(Oracle Universal Install)を起動するdiscus1からPowerBook G4からscpコマンドでdiscus1の/tmp/ora以下にコピーすることにした。(PowerBook G4の IPアドレスは、192.168.1.13)。


以前にも載せたが、下記配置図を見ていただくと、どのような構成になっているかイメージしやすいと思う。

Rac_de_oracle_3

尚、MacOSXで、sshを許可するには、「システム環境設定」を起動->「共有」をクリック->「リモートログイン」チェックボックスをクリック->「開始」ボタンをクリックする。

Enable_ssh_1


● Apple PowerBook G4にDVDをセット。

Set_dvd_rom_to_powerbook_1


● clusterware、database、companionの各フォルダをscpでコピーする。

[root@discus1 ˜]# cd /tmp
[root@discus1 tmp]# mkdir ora
[root@discus1 tmp]# cd ora
[root@discus1 ora]# scp -r oracle@192.168.1.13:/Volumes/oracle_database_/clusterware .
The authenticity of host '192.168.1.13 (192.168.1.13)' can't be established.
RSA key fingerprint is f3:4b:5d:86:77:4d:3f:87:65:b7:51:e3:bd:39:04:2d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.13' (RSA) to the list of known hosts.
Password:
cvupack.zip    100% 8279KB 1.2MB/s 00:07
jrepack.zip     100% 20MB 563.7KB/s 00:37
・・・中略・・・
[root@discus1 ora]# scp -r oracle@192.168.1.13:/Volumes/oracle_database_/database .
Password:
blafdoc.css 100% 7061 6.9KB/s 00:00
darbbook.css˜ 100% 5145 5.0KB/s 00:00
darbbook.css 100% 141 0.1KB/s 00:00
・・・中略・・・
[root@discus1 ora]# scp -r oracle@192.168.1.13:/Volumes/oracle_database_/companion .
Password:
blafdoc.css 100% 7061 6.9KB/s 00:00
darbbook.css˜ 100% 5145 5.0KB/s 00:00
darbbook.css 100% 141 0.1KB/s 00:00
・・・中略・・・

と、まぁ、こんな具合。

| | | コメント (0) | トラックバック (0)

Mac De Oracle - 10万円 de RAC #23

10万円 de RACのつづき。今回は、Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



今回は、ASMLib2.0のインストールと構成を行う。
尚、手順はOTN USの「17. Install & Configure Automatic Storage Management (ASMLib 2.0)」と同じなのでそちらも参照のこと。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更したり戻したりする場合があるが、その都度記述してある。

● Oracle Automatic Storage Management (ASM) libのダウンロードとインストール
この操作は、Oracle RACを構成する全ノードで行う。
(尚、scpの部分は省略しているが、ダウンロードは1ノードで行い、ダウンロードしたライブラリはscpを利用し残りのノードへコピーした。)

下記例は、discus1で実行したものである。

ASMライブライ、ツール及び、ドライバのダウンロードは、ここから。

今回ダウンロードしたものは以下
● oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm - (for single processor)
● oracleasmlib-2.0.2-1.i386.rpm - (Userspace library)
● oracleasm-support-2.0.3-1.i386.rpm - (Driver support files)

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# uname -a
Linux discus1.macdeoracle.jp 2.6.9-42.EL #1 Sat Aug 12 09:17:58 CDT 2006 i686 i686 i386 GNU/Linux
[root@discus1 ˜]#
[root@discus1 ˜]# cd /tmp
[root@discus1 tmp]# wget -v http://oss.oracle.com/projects/oracleasm/dist/files/RPMS/rhel4/x86/2.0.3/2.6.9-42.EL/oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm
--22:39:10-- http://oss.oracle.com/projects/oracleasm/dist/files/RPMS/rhel4/x86/2.0.3/2.6.9-42.EL/oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm
=> `oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm'
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 127,412 (124K) [application/x-rpm]

100%[==================================================================>] 127,412 130.07K/s

22:39:22 (129.77 KB/s) - `oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm' を保存しました [127412/127412]

[root@discus1 tmp]# wget -v http://oss.oracle.com/projects/oracleasm-support/dist/files/RPMS/rhel4/x86/2.0.3/oracleasm-support-2.0.3-1.i386.rpm
--22:39:34-- http://oss.oracle.com/projects/oracleasm-support/dist/files/RPMS/rhel4/x86/2.0.3/oracleasm-support-2.0.3-1.i386.rpm

=> `oracleasm-support-2.0.3-1.i386.rpm'
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 22,662 (22K) [application/x-rpm]

100%[==================================================================>] 22,662 68.25K/s

22:39:44 (68.06 KB/s) - `oracleasm-support-2.0.3-1.i386.rpm' を保存しました [22662/22662]

[root@discus1 tmp]# wget -v http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel4/x86/2.0.2/oracleasmlib-2.0.2-1.i386.rpm
--22:39:51-- http://otn.oracle.com/software/tech/linux/asmlib/files/RPMS/rhel4/x86/2.0.2/oracleasmlib-2.0.2-1.i386.rpm
=> `oracleasmlib-2.0.2-1.i386.rpm'
otn.oracle.com をDNSに問いあわせています... 141.146.8.66
otn.oracle.com|141.146.8.66|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 301 Moved Permanently
場所: http://www.oracle.com/technology/software/tech/linux/asmlib/files/RPMS/rhel4/x86/2.0.2/oracleasmlib-2.0.2-1.i386.rpm [続く]
--22:40:02-- http://www.oracle.com/technology/software/tech/linux/asmlib/files/RPMS/rhel4/x86/2.0.2/oracleasmlib-2.0.2-1.i386.rpm
=> `oracleasmlib-2.0.2-1.i386.rpm'
www.oracle.com をDNSに問いあわせています... 141.146.8.66
otn.oracle.com:80 への接続を再利用します。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 12,948 (13K) [application/x-redhat-package-manager]

100%[==================================================================>] 12,948 39.47K/s

22:40:13 (39.27 KB/s) - `oracleasmlib-2.0.2-1.i386.rpm' を保存しました [12948/12948]

[root@discus1 tmp]# ll
合計 180
-rw-r--r-- 1 root root 127412 8月 19 08:24 oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm
-rw-r--r-- 1 root root 22662 8月 11 08:11 oracleasm-support-2.0.3-1.i386.rpm
-rw-r--r-- 1 root root 12948 8月 19 09:13 oracleasmlib-2.0.2-1.i386.rpm
[root@discus1 tmp]#
[root@discus1 tmp]# rpm -Uvh oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm oracleasm-support-2.0.3-1.i386.rpm oracleasmlib-2.0.2-1.i386.rpm
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.9-42.EL ########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
[root@discus1 tmp]#


● ASMlibの構成とロード
この操作は、Oracle RACを構成する全ノードで実施する。

[root@discus1 tmp]# cd
[root@discus1 ˜]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting without typing an
answer will keep that current value. Ctrl-C will abort.

Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: [ OK ]
Creating /dev/oracleasm mount point: [ OK ]
Loading module "oracleasm": [ OK ]
Mounting ASMlib driver filesystem: [ OK ]
Scanning system for ASM disks: [ OK ]
[root@discus1 ˜]#

上記操作を行っている画面のスナップショット
Asm_config


[root@discus1 ˜]# iscsi-ls
*******************************************************************************
SFNet iSCSI Driver Version ...4:0.1.11-3(02-May-2006)
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm4
TARGET ALIAS :
HOST ID : 0
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT Sun Jan 7 17:01:14 JST 2007
SESSION ID : ISID 00023d000001 TSIH 200
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm3
TARGET ALIAS :
HOST ID : 1
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT Sun Jan 7 17:01:14 JST 2007
SESSION ID : ISID 00023d000001 TSIH 100
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm2
TARGET ALIAS :
HOST ID : 2
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT Sun Jan 7 17:01:14 JST 2007
SESSION ID : ISID 00023d000001 TSIH 300
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm1
TARGET ALIAS :
HOST ID : 3
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT Sun Jan 7 17:01:15 JST 2007
SESSION ID : ISID 00023d000001 TSIH 400
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.crs
TARGET ALIAS :
HOST ID : 4
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT Sun Jan 7 17:01:15 JST 2007
SESSION ID : ISID 00023d000001 TSIH 500
*******************************************************************************
[root@discus1 ˜]#
[root@discus1 ˜]# dmesg | sort | grep '^Attached scsi disk'
Attached scsi disk sda at scsi1, channel 0, id 0, lun 0
Attached scsi disk sdb at scsi0, channel 0, id 0, lun 0
Attached scsi disk sdc at scsi3, channel 0, id 0, lun 0
Attached scsi disk sdd at scsi2, channel 0, id 0, lun 0
Attached scsi disk sde at scsi4, channel 0, id 0, lun 0
[root@discus1 ˜]#

上記の結果から、iSCSターゲット名に対応するデバイスは以下のようになっている。

iSCSIターゲット名とSCSIデバイス名、ASMディスク名の対応
iSCSIターゲット名 Host / SCSI ID デバイス名 ASMディスク名
iqn.2006-01.com.openfiler:rac1.asm4
scsi0
/dev/sdb VOL4
iqn.2006-01.com.openfiler:rac1.asm3
scsi1
/dev/sda VOL3
iqn.2006-01.com.openfiler:rac1.asm2
scsi2
/dev/sdd VOL2
iqn.2006-01.com.openfiler:rac1.asm1
scsi3
/dev/sdc VOL1

● ASMディスクの作成

この操作は、Oracle RACを構成する1つのノードで実施する。
下記例は、discus1から実行したもの

[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdc1
Marking disk "/dev/sdc1" as an ASM disk: [ OK ]
[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdd1
Marking disk "/dev/sdd1" as an ASM disk: [ OK ]
[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL3 /dev/sda1
Marking disk "/dev/sda1" as an ASM disk: [ OK ]
[root@discus1 ˜]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdb1
Marking disk "/dev/sdb1" as an ASM disk: [ OK ]


● 新規ボリュームを作成後は必ず、他のノードへ新規ボリュームを認識させるため、scandiskコマンドを実行する。
この操作は、Oracle RACを構成する全ノードで実施する。

[root@discus1 ˜]# /etc/init.d/oracleasm scandisks
Scanning system for ASM disks: [ OK ]
[root@discus1 ˜]# ssh discus2 /etc/init.d/oracleasm scandisks
Scanning system for ASM disks: [ OK ]
[root@discus1 ˜]#


● 作成したボリュームの確認
この操作は、Oracle RACを構成する全ノードで実施する。

[root@discus1 ˜]# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
[root@discus1 ˜]# ssh discus2 /etc/init.d/oracleasm listdisks
root@discus2's password:
VOL1
VOL2
VOL3
VOL4
[root@discus1 ˜]#

これでASMボリュームの作成は終了である。

| | | コメント (0) | トラックバック (0)

2007年2月 2日 (金)

Mac De Oracle - 10万円 de RAC #22

10万円 de RACのつづき。今回は、Oracle Cluster File System (OCFS2)のインストール及び構成。その3。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2/その3
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Oracle Cluster File System (OCFS2)のインストール及び構成。その3。

尚、手順はOTN USの「16. Install & Configure Oracle Cluster File System (OCFS2)」と同じなのでそちらも参照のこと。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更したり戻したりする場合があるが、その都度記述してある。


● デバイスの確認。
(この操作は、OCFS2ファイルシステムのフォーマットを実行するノードで行う。以下は、discus1から実行した例)


次のステップでOCFS2ファイルシステムのフォーマットを行うiSCSIターゲット名は、crs(CRS用に作成した論理ディスク)である。
iscsi-ls -lコマンドを実行すると、iqn.2006-01.com.openfiler:rac1.crsは、/dev/sde にマップされていることが確認できる。(起動毎にマップされるデバイスが変わってしまうことをお忘れなく!)
[root@discus1 ˜]# iscsi-ls -l
*******************************************************************************
SFNet iSCSI Driver Version ...4:0.1.11-3(02-May-2006)
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm4
TARGET ALIAS :
HOST ID : 0
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 29日 金曜日 22:09:40 JST
SESSION ID : ISID 00023d000001 TSIH 1600

DEVICE DETAILS:
---------------
LUN ID : 0
Vendor: Openfile Model: Virtual Model: disk Rev: 0
Type: Direct-Access ANSI SCSI revision: 04
page83 type1: 4f70656e66696c0000000000050000000b0800000e000000
page80: 0a
Device: /dev/sda
*******************************************************************************
・・・中略・・・
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.crs
TARGET ALIAS :
HOST ID : 4
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 29日 金曜日 22:09:40 JST
SESSION ID : ISID 00023d000001 TSIH 1900

DEVICE DETAILS:
---------------
LUN ID : 0
Vendor: Openfile Model: Virtual Model: disk Rev: 0
Type: Direct-Access ANSI SCSI revision: 04
page83 type1: 4f70656e66696c000000000001000000d20700000e000000
page80: 0a
Device: /dev/sde
*******************************************************************************

次に、fdisk を実行する。/dev/sde1をOCFS2ファイルシステムでフォーマットする。

[root@discus1 ˜]# fdisk -l

Disk /dev/hda: 20.0 GB, 20000000000 bytes
255 heads, 63 sectors/track, 2431 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 2431 19422585 8e Linux LVM

・・・中略・・・

Disk /dev/sdd: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdd1 1 22016 22544368 83 Linux

Disk /dev/sde: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = シリンダ数 of 4154 * 512 = 2126848 bytes

デバイス Boot Start End Blocks Id System
/dev/sde1 1 1009 2095662 83 Linux
[root@discus1 ˜]#


● OCFS2ファイルシステムのフォーマット
(この操作は、Oracle RACを構成する1ノードで実施する。以下は、discus1から実行した例)

/dev/sde1をOCFS2ファイルシステムでフォーマットする。(他のパラメータは、OTN USの元記事であるOTN USの「16. Install & Configure Oracle Cluster File System (OCFS2)」と同じである。
[root@discus1 ˜]# mkfs.ocfs2 -b 4K -C 32K -N 4 -L oracrsfiles /dev/sde1
mkfs.ocfs2 1.2.1
Filesystem label=oracrsfiles
Block size=4096 (bits=12)
Cluster size=32768 (bits=15)
Volume size=2145943552 (65489 clusters) (523912 blocks)
3 cluster groups (tail covers 977 clusters, rest cover 32256 clusters)
Journal size=67108864
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Formatting Journals: done
Writing lost+found: done
mkfs.ocfs2 successful


● OCFS2ファイルシステムのマウント
(この操作は、Oracle RACを構成する全ノードで実施、下記例は、discus1で実施した例)

[root@discus1 ˜]# 
[root@discus1 ˜]# mount -t ocfs2 -o datavolume,nointr -L "oracrsfiles" /u02/oradata/orcl
[root@discus1 ˜]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
configfs on /config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sde1 on /u02/oradata/orcl type ocfs2 (rw,_netdev,datavolume,nointr,heartbeat=local)
[root@discus1 ˜]#


● OCFS2自動マウントの構成
(この操作は、Oracle RACを構成する全ノードで実施。下記例は、discus1で実施した例)

ja_JPだとviでの編集でカーソルがずれてしまうという現象に遭遇してまうので、環境変数LANGは、en_US.UTF-8に変更した。
[root@discus1 ˜]# export LANG=en_US.UTF-8
[root@discus1 ˜]# vi /etc/fstab
[root@discus1 ˜]# cat /etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
LABEL=oracrsfiles /u02/oradata/orcl ocfs2 _netdev,datavolume,nointr 0 0
/dev/hdc /media/cdrom auto pamconsole,exec,noauto,managed 0 0
/dev/fd0 /media/floppy auto pamconsole,exec,noauto,managed 0 0
[root@discus1 ˜]#

特にja_JPに戻す必要性もないのだが、ja_JP.UTF-8に戻した。元ネタと違う日本語環境でやるところに意味がある!! なんてね。(笑)
[root@discus1 ˜]# export LANG=ja_JP.UTF-8
[root@discus1 ˜]# chkconfig --list o2cb
o2cb 0:off 1:off 2:on 3:on 4:on 5:on 6:off


● OCFS2ファイルシステムのパーミッション確認
(この操作は、Oracle RACを構成する全ノードで実施。下記例は、discus1で実施した例)

[root@discus1 ˜]# chown oracle:dba /u02/oradata/orcl
[root@discus1 ˜]# chmod 775 /u02/oradata/orcl
[root@discus1 ˜]# ls -ld /u02/oradata/orcl
drwxrwxr-x 3 oracle dba 4096 12月 29 22:59 /u02/oradata/orcl
[root@discus1 ˜]#


● O2CB Heartbeatのしきい値の調整
(この操作は、Oracle RACを構成する全ノードで実施。)

元ネタよりマシンスペック等が劣るため160秒になるように、O2CB_HEARTBEAT_THRESHOLDを81と設定した。[fence time in seconds] = (O2CB_HEARTBEAT_THRESHOLD - 1) * 2
[root@discus1 ˜]# cat /etc/sysconfig/o2cb
#
# This is a configuration file for automatic startup of the O2CB
# driver. It is generated by running /etc/init.d/o2cb configure.
# Please use that method to modify this file
#

# O2CB_ENABELED: 'true' means to load the driver on boot.
O2CB_ENABLED=true

# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
O2CB_BOOTCLUSTER=ocfs2

# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
O2CB_HEARTBEAT_THRESHOLD=81

[root@discus1 ˜]#

変更したパラメータ値を反映させる。

[root@discus1 ˜]# umount /u02/oradata/orcl
[root@discus1 ˜]# /etc/init.d/o2cb unload
Cleaning heartbeat on ocfs2: OK
Stopping cluster ocfs2: OK
Unloading module "ocfs2": OK
Unmounting ocfs2_dlmfs filesystem: OK
Unloading module "ocfs2_dlmfs": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK
[root@discus1 ˜]# /etc/init.d/o2cb configure
Configuring the O2CB driver.

This will configure the on-boot properties of the O2CB driver.
The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets ('[]'). Hitting
without typing an answer will keep that current value. Ctrl-C
will abort.

Load O2CB driver on boot (y/n) [y]: y
Cluster to start on boot (Enter "none" to clear) [ocfs2]: ocfs2
Writing O2CB configuration: OK
Loading module "configfs": OK
Mounting configfs filesystem at /config: OK
Loading module "ocfs2_nodemanager": OK
Loading module "ocfs2_dlm": OK
Loading module "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Starting cluster ocfs2: OK

パラメータの値が反映されているか確認する

[root@discus1 ˜]# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold
81
[root@discus1 ˜]#


最後に、boot時に自動マウントするかも確認しておく。
Oracle RACを構成する全ノードをリブートし/u02/oradata/orclがマウントされているか確認する。

[root@discus1 ˜]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
configfs on /config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sdd1 on /u02/oradata/orcl type ocfs2 (rw,_netdev,datavolume,nointr,heartbeat=local)
[root@discus1 ˜]# df -ah
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
17G 6.4G 9.1G 42% /
none 0 0 0 - /proc
none 0 0 0 - /sys
none 0 0 0 - /dev/pts
usbfs 0 0 0 - /proc/bus/usb
/dev/hda1 99M 9.1M 85M 10% /boot
none 252M 0 252M 0% /dev/shm
none 0 0 0 - /proc/sys/fs/binfmt_misc
sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs
configfs 0 0 0 - /config
ocfs2_dlmfs 0 0 0 - /dlm
/dev/sde1 2.0G 263M 1.8G 13% /u02/oradata/orcl
[root@discus1 ˜]#
[root@discus1 ˜]# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold
81

リブートしても問題なくマウントされているようだ!(ほっ!)

おまけ。
OCFS2のバージョンを確認するには以下のようにする。

[root@discus1 ˜]# cat /proc/fs/ocfs2/version
OCFS2 1.2.3 Thu Aug 10 18:16:03 PDT 2006 (build 6b798aaadf626d3b137c3952809b2f38)
[root@discus1 ˜]#

| | | コメント (0) | トラックバック (0)

2007年2月 1日 (木)

Mac De Oracle - 10万円 de RAC #21

10万円 de RACのつづき。今回は、Oracle Cluster File System (OCFS2)のインストール及び構成。その2。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/その2
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Oracle Cluster File System (OCFS2)のインストール及び構成。その2。

尚、手順はOTN USの「16. Install & Configure Oracle Cluster File System (OCFS2)」と同じなのでそちらも参照のこと。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更したり戻したりする場合があるが、その都度記述してある。


● SELinuxの無効化
(この操作は、Oracle RACを構成する全ノードで実施)

Oracle RACを構成する各ノードに接続し、rootユーザで、/usr/bin/system-config-securitylevelを実行しSELinuxを無効化する。
[oracle@discus1 ˜]$ su -
Password:
[root@discus1 ˜]# /usr/bin/system-config-securitylevel &
[root@discus1 ˜]#

「SELinux」タブをクリック->「Enabled (Modification Requests)」チェックボックスをクリック->「OK」ボタンをクリック。warning dialogが表示されるが「Yes」をクリックする。

Sec


● Oracle RACを構成する各ノードの再起動
(この操作は、Oracle RACを構成する全ノードで実施)

SELinuxの無効化が済んだらリブートする。(お忘れなく!)


● OCFS2の構成
(この操作は、Oracle RACを構成する全ノードで実施)

ocfs2consoleを起動する。「Cluster」メニューをクリック->「Configure Nodes...」を選択->「Information]ダイアログ->「Close」ボタン->「Node Configuration」ダイアログが表示される。
[root@discus1 ˜]#
[root@discus1 ˜]# ocfs2console &
[root@discus1 ˜]#

「Add」ボタンをクリック->Nodeを追加->「Apply」ボタンをクリック。この例では、Oracle RACを構成する2ノードを追加して、最後に「Close」ボタンをクリックして終了。
指定するhostnameとIPアドレスは、パブリックネットワーク用に設定したhostnameとIPアドレスを設定する。

Ocfs2console1 Ocfs2console2

Oracle RACを構成する全ノードの/etc/ocfs/cluster.confは以下のようになる。

[root@discus1 ˜]# cat /etc/ocfs2/cluster.conf
node:
ip_port = 7777
ip_address = 192.168.1.3
number = 0
name = discus1.macdeoracle.jp
cluster = ocfs2

node:
ip_port = 7777
ip_address = 192.168.1.4
number = 1
name = discus2.macdeoracle.jp
cluster = ocfs2

cluster:
node_count = 2
name = ocfs2

[root@discus1 ˜]#


● O2CBクラスタサービスの自動起動構成
(この操作は、Oracle RACを構成する全ノードで実施)

OCFS2用にバンドルされている、O2CBクラスタサービスがboot時に自動起動するよう構成する。

O2CBクラスタサービスに含まれるサービスは、


  • HM:cluster.confにある全ノードを追跡するノードマネージャ

  • HB:ノードがクラスタに結合または、クラスタから切り離される時の up/down通知を発行するハートビートサービス

  • TCP:ノード間通信を取り扱う

  • DML:全ロックの所有者と状態を追跡する分散ロックマネージャ

  • CONFIGFS:/configとしてマウントされるユーザ空間駆動の構成ファイルシステム

  • DLMFS:カーネル空間分散ロックマネージャへのユーザ空間インタフェース


[root@discus1 ˜]# /etc/init.d/o2cb offline ocfs2
[root@discus1 ˜]# /etc/init.d/o2cb unload
[root@discus1 ˜]# /etc/init.d/o2cb configure
Configuring the O2CB driver.
This will configure the on-boot properties of the O2CB driver.

The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets ('[]'). Hitting
<ENTER> without typing an answer will keep that current value. Ctrl-C
will abort.
Load O2CB driver on boot (y/n) [n]: y
Cluster to start on boot (Enter "none" to clear) [ocfs2]: ocfs2
Writing O2CB configuration: OK
Loading module "configfs": OK
Mounting configfs filesystem at /config: OK
Loading module "ocfs2_nodemanager": OK
Loading module "ocfs2_dlm": OK
Loading module "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Starting cluster ocfs2: OK


長いので、次回につづく。

| | | コメント (0) | トラックバック (0)

2007年1月31日 (水)

Mac De Oracle - 10万円 de RAC #20

10万円 de RACのつづき。今回は、Oracle Cluster File System (OCFS2)のインストール及び構成。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成 その1/
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Oracle Cluster File System (OCFS2)のインストール及び構成を行う。

尚、手順は、VNCを利用する部分以外、OTN USの「16. Install & Configure Oracle Cluster File System (OCFS2)」と同じなのでそちらも参照のこと。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更したり戻したりする場合があるが、その都度記述してある。

● Oracle Cluster File System (OCFS2)と関連ツールのダウンロード
(この操作は、Oracle RACを構成する1つのノードでダウンロード後、scpコマンドで残りのノードへコピー)

DELL Optiplex GX260は、シングルCPUなのでocfs2-2.6.9-42.EL-1.2.3-1.i686.rpmocfs2-tools-1.2.1-1.i386.rpm及び、ocfs2console-1.2.1-1.i386.rpmの3モジュールをダウンロードする。(マルチCPU等である場合は該当モジュールをhttp://oss.oracle.com/projects/ocfs2/files/RedHat/RHEL4/から入手する。)
下記例では、wgetコマンドでダウンロードしている例。


尚、環境変数LANGは、ja_JP.UTF-8のままである。
[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]$ uname -a
Linux discus1.macdeoracle.jp 2.6.9-42.EL #1 Sat Aug 12 09:17:58 CDT 2006 i686 i686 i386 GNU/Linux
[root@discus1 ˜]$
[root@discus1 ˜]$ cd /tmp
[root@discus1 tmp]# wget -v http://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL4/i386/1.2.3-1/2.6.9-42.EL/ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm
--22:42:09-- http://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL4/i386/1.2.3-1/2.6.9-42.EL/ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm
=> `ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm'
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2,897,080 (2.8M) [application/x-rpm]

100%[=======================================================================>] 2,897,080 305.47K/s ETA 00:00

22:42:31 (264.94 KB/s) - `ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm' を保存しました [2897080/2897080]

[root@discus1 tmp]#
[root@discus1 tmp]# wget -v http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL4/i386/old/1.2.1-1/ocfs2-tools-1.2.1-1.i386.rpm
--22:45:27-- http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL4/i386/old/1.2.1-1/ocfs2-tools-1.2.1-1.i386.rpm
=> `ocfs2-tools-1.2.1-1.i386.rpm'
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1,027,503 (1003K) [application/x-rpm]

100%[=======================================================================>] 1,027,503 132.18K/s ETA 00:00

22:45:46 (124.78 KB/s) - `ocfs2-tools-1.2.1-1.i386.rpm' を保存しました [1027503/1027503]

[root@discus1 tmp]# wget -v http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL4/i386/old/1.2.1-1/ocfs2console-1.2.1-1.i386.rpm
--22:46:07-- http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL4/i386/old/1.2.1-1/ocfs2console-1.2.1-1.i386.rpm
=> `ocfs2console-1.2.1-1.i386.rpm'
oss.oracle.com をDNSに問いあわせています... 141.146.12.120
oss.oracle.com|141.146.12.120|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 177,224 (173K) [application/x-rpm]

100%[=======================================================================>] 177,224 136.94K/s

22:46:19 (136.47 KB/s) - `ocfs2console-1.2.1-1.i386.rpm' を保存しました [177224/177224]

[root@discus1 tmp]#


● OCSF2及び、関連モジュールのインストール(この操作は、Oracle RACを構成する全ノードで実施

[root@discus1 tmp]# ls -l *.rpm
-rw-r--r-- 1 root root 2897080 8月 12 03:03 ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm
-rw-r--r-- 1 root root 1027503 10月 21 05:02 ocfs2-tools-1.2.1-1.i386.rpm
-rw-r--r-- 1 root root 177224 10月 21 05:02 ocfs2console-1.2.1-1.i386.rpm
[root@discus1 tmp]#
[root@discus1 tmp]# rpm -Uvh ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm ocfs2console-1.2.1-1.i386.rpm ocfs2-tools-1.2.1-1.i386.rpm
Preparing... ########################################### [100%]
1:ocfs2-tools ########################################### [ 33%]
2:ocfs2-2.6.9-42.EL ########################################### [ 67%]
3:ocfs2console ########################################### [100%]
[root@discus1 tmp]#


● VNCサーバーの構成及び起動(この操作は、Oracle RACを構成する全ノードで実施)

GUIツールを利用するためVNCサーバーの構成を行う。(今回は、3台のPCにマウスとキーボードが2セット、モニター1台という構成であるためVNCを利用している。半分は趣味ですが。)
CentOS4.4のインストール時にVNCサーバーはインストール済みなので、構成は簡単。(もしインストールされていなければインストールする。)

oracleユーザにログインし、vncserverを起動する。(はじめて)起動するとパスワードが要求される。このパスワードは、vnc clientから接続する時に利用する。
この時点でホームディレクトリ直下に、.vnc/xstartup が作成される。

[root@discus1]# su - oracle
[oracle@discus1 ˜]$ echo $LANG
ja_JP.UTF-8
[oracle@discus1 ˜]$ vncserver

You will require a password to access your desktops.

Password:
Verify:
xauth: creating new authority file /u01/app/oracle/.Xauthority

New 'discus1.macdeoracle.jp:1 (discus1)' desktop is discus1.macdeoracle.jp:1

Creating default startup script /u01/app/oracle/.vnc/xstartup
Starting applications specified in /u01/app/oracle/.vnc/xstartup
Log file is /u01/app/oracle/.vnc/discus1.macdeoracle.jp:1.log


● vncserverの停止(この操作は、Oracle RACを構成する全ノードで実施)

[oracle@discus1 ˜]$ vncserver -kill :1
Killing Xvnc process ID 28159


● xstartupファイルの編集(この操作は、Oracle RACを構成する全ノードで実施)

xstartupファイルを編集し、起動するウィンドウマネージャを twnから gnomeに変更する。
[oracle@discus1 ˜]$ export LANG=en_US.UTF-8
[oracle@discus1 ˜]$ vi ./.vnc/xstartup
[oracle@discus1 ˜]$ cat ./.vnc/xstartup
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
exec gnome-session


● vncserverを起動する(この操作は、Oracle RACを構成する全ノードで実施)

xstartupファイルの変更後、vncserverを起動する。これでvnc clientで接続するとgnomeのdesktopが現れるようになる。
[oracle@discus1 ˜]$ export LANG=ja_JP.UTF-8
[oracle@discus1 ˜]$ vncserver

New 'discus1.macdeoracle.jp:1 (discus1)' desktop is discus1.macdeoracle.jp:1

Starting applications specified in /u01/app/oracle/.vnc/xstartup
Log file is /u01/app/oracle/.vnc/discus1.macdeoracle.jp:1.log

[oracle@discus1 ˜]$


● VNCクライアントのダウンロード(この操作は、Apple PowerBook G4でのみ実施)

今回は、Chicken of the VNCというフリーのVNCクライアントを利用した。
ダウンロードは以下。
http://www.apple.com/downloads/macosx/networking_security/chickenofthevnc.html

長いので、次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年1月30日 (火)

Mac De Oracle - 10万円 de RAC #19

10万円 de RACのつづき。今回は、Oracle RACノード構成ファイルの確認。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



/etc/modprobe.conf、/etc/sysctl.conf、/etc/hosts、/etc/rc.localの最終確認。しっかり確認してことが大切!。

下記、確認は、Oracle RACを構成する全ノードで行う。

[root@discus1 ˜]# cat /etc/modprobe.conf | grep hangcheck
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
[root@discus1 ˜]#
[root@discus1 ˜]# cat /etc/sysctl.conf | grep -E 'net¥.core|kernel¥.s[h|e]|fs¥.|range'
net.core.rmem_default=262144
net.core.wmem_default=262144
net.core.rmem_max=262144
net.core.wmem_max=262144
kernel.shmmax = 2147483648
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
[root@discus1 ˜]#
[root@discus1 ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost localhost.localdomain loopback

# Public Networks - (eth0)
192.168.1.3 discus1.macdeoracle.jp discus1
192.168.1.4 discus2.macdeoracle.jp discus2
192.168.1.5 arowana.macdeoracle.jp arowana

# Private Network - (eth1)
192.168.2.3 discus1-priv.macdeoracle.jp discus1-priv
192.168.2.4 discus2-priv.macdeoracle.jp discus2-priv
192.168.2.5 arowana-priv.macdeoracle.jp arowana-priv

# Public Virtual IP(VIP) address for - (eth0)
192.168.1.100 discus1-vip.macdeoracle.jp discus1-vip
192.168.1.101 discus2-vip.macdeoracle.jp discus2-vip
[root@discus1 ˜]#
[root@discus1 ˜]# cat /etc/rc.local | grep hangcheck
/sbin/modprobe hangcheck-timer
[root@discus1 ˜]#

次回につづく。

| | | コメント (0) | トラックバック (0)

2007年1月29日 (月)

Mac De Oracle - 10万円 de RAC #18

10万円 de RACのつづき。今回は、Oracle RACノード間リモートアクセスの構成。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



さて、今回は、Oracle RACノード間リモートアクセスの構成を行う。

Cluster Databaseをインストールする際、OUI (Oracle Universal Installer)は、OUIを起動したノードをローカルノードし、他のノードをリモートアクセスする。ここで行う構成はその準備ということになる。
リモートノードをアクセスするには、rshを利用する方法と、sshを利用する方法があるが、本例では、sshを利用する方法を選択した。

詳細は、OTN USの元記事、「14. Configure RAC Nodes for Remote Access」や、マニュアルOracle Database Oracle ClusterwareおよびOracle Real Application Clustersインストレーション・ガイド 10g リリース2(10.2) for Linux「すべてのクラスタ・ノードでのSSHの構成」を参照のこと。(実は、この準備が整っていなかったり、忘れていたりするこが原因で、Oracle RACのインストールに失敗することが多々あるので、準備と確認はしっかり行っておきたい。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更してある。ただ、このセクションでの操作では、en_USに変更する必要はない。ただ、前セクションから続いておりそのままen_USになっているだけのことなので、あまり気にしないでください。( 文字化けなどを回避した場合は操作前のコメントに別途記述します。)

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# export LANG=en_US.UTF-8


[root@discus2 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus2 ˜]# export LANG=en_US.UTF-8


● RSAキーとDSAキーの作成

以下の操作は、Oracle RACを構成する全ノードで実施する。

[root@discus1 ˜]# pgrep sshd
4285
[root@discus1 ˜]# su - oracle
[oracle@discus1 ˜]$ mkdir -p ˜/.ssh
[oracle@discus1 ˜]$ chmod 700 ˜/.ssh
[oracle@discus1 ˜]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/u01/app/oracle/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /u01/app/oracle/.ssh/id_rsa.
Your public key has been saved in /u01/app/oracle/.ssh/id_rsa.pub.
...中略...
[oracle@discus1 ˜]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/u01/app/oracle/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /u01/app/oracle/.ssh/id_dsa.
Your public key has been saved in /u01/app/oracle/.ssh/id_dsa.pub.
...以下略...
以下の操作は、Oracle RACを構成する1つのノードで実施する。下記は、discus1から実行した例。
もし authorized_keysファイルが存在しなければ、 touchコマンドで作成する。
[oracle@discus1 ˜]$ cd ~/.ssh
[oracle@discus1 .ssh]$ ls -l *.pub
-rw-r--r-- 1 oracle dba 617 Dec 28 21:52 id_dsa.pub
-rw-r--r-- 1 oracle dba 237 Dec 28 21:51 id_rsa.pub
[oracle@discus1 .ssh]$ ls -l authorized_keys
-rw------- 1 oracle dba 3416 Dec 28 21:58 authorized_keys
[oracle@discus1 .ssh]$
以下の操作は、Oracle RACを構成する1つのノードで実施する。下記は、discus1から実行した例。
[oracle@discus1 ˜]$ ssh discus1 cat ˜/.ssh/id_rsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus1 (192.168.1.3)' can't be established.
RSA key fingerprint is 61:8a:f9:9e:28:a2:b7:d3:70:8d:dc:76:ca:d9:23:43.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus1,192.168.1.3' (RSA) to the list of known hosts.
oracle@discus1's password:
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus1 cat ˜/.ssh/id_dsa.pub >> ˜/.ssh/authorized_keys
Enter passphrase for key '/u01/app/oracle/.ssh/id_rsa':
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus2 cat ˜/.ssh/id_rsa.pub >> ˜/.ssh/authorized_keys
The authenticity of host 'discus2 (192.168.1.4)' can't be established.
RSA key fingerprint is 84:2b:bd:eb:31:2c:23:36:55:c2:ee:54:d2:23:6a:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'discus2,192.168.1.4' (RSA) to the list of known hosts.
oracle@discus2's password:
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus2 cat ˜/.ssh/id_dsa.pub >> ˜/.ssh/authorized_keys
oracle@discus2's password:
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ scp ˜/.ssh/authorized_keys discus2:.ssh/authorized_keys
oracle@discus2's password:
authorized_keys 100% 1652 1.6KB/s 00:00
以下、操作は、Oracle RACを構成する全ノードで実施する。
[oracle@discus1 ˜]$ chmod 600 ˜/.ssh/authorized_keys


以下、操作は、Oracle RACを構成する1つのノードで実施する。下記は、discus1から実行した例。
[oracle@discus1 ˜]$ ssh discus1 hostname
Enter passphrase for key '/u01/app/oracle/.ssh/id_rsa':
discus1.macdeoracle.jp
[oracle@discus1 ˜]$ ssh discus2 hostname
Enter passphrase for key '/u01/app/oracle/.ssh/id_rsa':
discus2.macdeoracle.jp


● sshユーザ等価関係の有効化

OUIを実行するノードで、以下の操作を行い、パスワードが要求されずにsshやscpが実行できるようにしておく。OUIの実行時にはお忘れなく!

以下、操作は、Oracle RACを構成する1つのノードで実施する。下記は、ローカルノード(discus1)からリモートノード(discus2)をリモートアクセスできるようにした例。

[oracle@discus1 ˜]$ exec /usr/bin/ssh-agent $SHELL
[oracle@discus1 ˜]$ /usr/bin/ssh-add
Enter passphrase for /u01/app/oracle/.ssh/id_rsa:
Identity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)
Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus1 "date;hostname"
Fri Dec 29 22:13:27 JST 2006
discus1.macdeoracle.jp
[oracle@discus1 ˜]$
[oracle@discus1 ˜]$ ssh discus2 "date;hostname"
Fri Dec 29 22:13:46 JST 2006
discus2.macdeoracle.jp
[oracle@discus1 ˜]$

次回へつづく。

| | | コメント (0) | トラックバック (0)

Mac De Oracle - 10万円 de RAC #17

10万円 de RACのつづき。今回は、hangcheck-timerカーネル・モジュールの構成。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



さて、今回は、hangcheck-timerカーネル・モジュールの構成を行う。

手順も含め、ほぼOTN USの元エントリ、「13. Configure the hangcheck-timer Kernel Module」と同じであり、あまり書くこともないのでメモ程度の内容とした、詳細はOTN USの元ネタを参照されたい。

Hangcheck-timerの詳細については、ネットを検索したりすれば山のようにヒットすると思うが、マニュアルでは、Oracle Database Oracle ClusterwareおよびOracle Real Application Clustersインストレーション・ガイド
10g リリース2(10.2) for Linux 「hangcheck-timerモジュールの構成確認」あたり
を参照するとよいだろう。以前のリリースでは、watchdogだったが、現時点では非推奨となっているのでご注意を。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更してある。ただ、このセクションでの操作では、en_USに変更する必要はない。ただ、前セクションから続いておりそのままen_USになっているだけのこと。。。

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# export LANG=en_US.UTF-8


[root@discus2 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus2 ˜]# export LANG=en_US.UTF-8


以下、すべての操作は、Oracle RACを構成する全ノードで実施する。

● hangcheck-timerモジュールの確認

[root@discus1 ˜]# find /lib/modules -name "hangcheck-timer.ko"
/lib/modules/2.6.9-42.EL/kernel/drivers/char/hangcheck-timer.ko
[root@discus1 ˜]#


● hangcheck-timerのパラメータの調整

hangcheck_tickパラメータと、hangcheck_marginパラメータをオラクルの推奨値に設定した。PCが非力だったり、ネットが遅い環境では、これでは短いという状況が発生する可能性もあるが、もしそのような状況が発生した場合には、再度調整すればいいことなので。

[root@discus1 ˜]# echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modprobe.conf
[root@discus1 ˜]# cat /etc/modprobe.conf
alias eth0 e1000
alias eth1 r8169
alias snd-card-0 snd-intel8x0
options snd-card-0 index=0
install snd-intel8x0 /sbin/modprobe --ignore-install snd-intel8x0 && /usr/sbin/alsactl restore >/dev/null 2>&1 || :
remove snd-intel8x0 { /usr/sbin/alsactl store >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-intel8x0
alias usb-controller ehci-hcd
alias usb-controller1 uhci-hcd
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
[root@discus1 ˜]#


● 自動起動の設定

[root@discus1 ˜]# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local
[root@discus1 ˜]# cat /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/sbin/modprobe hangcheck-timer
[root@discus1 ˜]#


● 確認!

[root@discus1 ˜]# grep Hangcheck /var/log/messages | tail -2
Dec 29 22:12:32 discus1 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds).
Dec 29 22:12:32 discus1 kernel: Hangcheck: Using monotonic_clock().
[root@discus1 ˜]#

次回へつづく。



昨日、Blue Note Tokyoで Peabo Brysonのライブに行ってきたと書いたが、Peabo Brysonのライブ、昨年と同じく、まずは、会場の皆さんと熱い!握手から!。(お約束みたいです)

客層はというと、やはり、女性客が多い。ただ、ライプということもあるのだろうか、バラード系の曲よりは、ハンドクラップを要求するような曲が多かった。(私としては、少々、期待はずれ。まぁ、楽しかったので、よかったんですけどね)

Sadeの曲はなんだったか失念したが、 Change The World、Brigdge over troubled water なども歌ってましたね。

  


Blue note tokyoがSadeを呼んでくれたら行くんだけどねぇ。だた。Sadeって今も音楽活動しているのかよくわからん!? サイトはあるからやっているんだろうけど。 http://www.sade.com

| | | コメント (0) | トラックバック (0)

2007年1月28日 (日)

Mac De Oracle - 10万円 de RAC #16

10万円 de RACのつづき。今回は、Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



さて、今回は、Linuxサーバーにクラスタ構成でOracleをインストールする為に必要な事前準備を行う。
手順も含め、ほぼOTN USの元エントリ、「12. Configure the Linux Servers for Oracle」と同じであり、あまり書くこともないのでメモ程度の内容とした、詳細はOTN USの元ネタを参照されたい。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更してある。

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# export LANG=en_US.UTF-8


[root@discus2 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus2 ˜]# export LANG=en_US.UTF-8


● Swapサイズ

Oracle RACを構成する全ノードで確認しておく

Oracle10g R2の最小メモリサイズは、512MB。DELL Optiplex GX260に1GBのメモリを積みたかったのだが、今回入手できたメモリは512MB。メモリサイズはギリギリだが、お遊び用環境なので、この程度でも特に困ることはないと思う。

実メモリが512MBなのだが、念のため、当初の予定どおり、swapは、2GBを割り当てた。(CentOS4.4のインストール時に割当済み。)


● カーネル・パラメータ構成及び、oracleユーザに対するshell limitの設定

※尚、パラメータの詳細は、Oracle Database インストレーション・ガイド 10gリリース2(10.2)for Linux x86 カーネル・パラメータの構成、oracleユーザに対するシェル制限の設定を参照のこと。
Oracle RACを構成する全ノードで実施する

[root@discus1 ˜]# 
[root@discus1 ˜]# sysctl -w kernel.shmmax=2147483648 >> /etc/sysctl.conf
[root@discus1 ˜]# sysctl -w kernel.sem="250 32000 100 128" >> /etc/sysctl.conf
[root@discus1 ˜]# sysctl -w fs.file-max=65536 >> /etc/sysctl.conf
[root@discus1 ˜]# sysctl -w net.ipv4.ip_local_port_range="1024 65000" >> /etc/sysctl.conf
[root@discus1 ˜]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_max = 262144
kernel.shmmax = 2147483648
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
[root@discus1 ˜]#
[root@discus1 ˜]# cat >> /etc/security/limits.conf <<EOF
> oracle soft nproc 2047
> oracle hard nproc 16384
> oracle soft nofile 1024
> oracle hard nofile 65536
> EOF
[root@discus1 ˜]# tail -4 /etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
[root@discus1 ˜]# cat >> /etc/pam.d/login <<EOF
> session required /lib/security/pam_limits.so
> EOF
[root@discus1 ˜]# tail -1 /etc/pam.d/login
session required /lib/security/pam_limits.so
[root@discus1 ˜]#
[root@discus1 ˜]# cat >> /etc/profile <<EOF
> if [ ¥$USER = "oracle" ]; then
> if [ ¥$SHELL = "/bin/ksh" ]; then
> ulimit -p 16384
> ulimit -n 65536
> else
> ulimit -u 16384 -n 65536
> fi
> umask 022
> fi
> EOF


● 日付と時間の設定について

クラスタ構成のインストールにでは、OUI(Oracle Universal Install)は、最初にOUIが起動されたノードにソフトウェアをインストールし、次に、残りのリモートノードへ該当ソフトウェアをコピーする。その際、"tar"コマンドを各リモートノードで実行するのだが、リモートノードのシステム日時が、ローカルノードのシステム日時より遅れていると、リモートノードへのインストールが失敗するので注意が必要である。

NTP serverを利用して各ノードの時間の同期するように設定しておけば、まず発生することはないだろうが、もし、NTP serverをせずOracle RAC構成をインストールする際には注意しておきたい。

ただ、今回はあえて、NTP serverは利用せず、手動設定とした。
元ネタにもあるように、インストーラーを起動するノード(discus1)のシステム日時より、約20秒ほど、リモートノード(discus2)のシステム日時を進めておいた。

[oracle@discus1 ˜]$ date
Fri Jan 26 21:47:10 JST 2007

[oracle@discus2 ˜]$ date
Fri Jan 26 21:47:32 JST 2007
[oracle@discus2 ˜]$

次回につづく。



ラッキー! Blue Note Tokyoの
Peabo Bryson - Collection - Tonight, I Celebrate My Love
Peabo Brysonのライブ Jam Session会員は特別割引だったとは、また、安くなった分でカクテル頼みました!

http://www.bluenote.co.jp/art/20070126.html

| | | コメント (0) | トラックバック (0)

2007年1月27日 (土)

Mac De Oracle - 10万円 de RAC #15

10万円 de RACのつづき。今回は、Oracle所有者と関連ディレクトリの作成及び環境変数の設定。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Oracle所有者の作成や環境変数の設定などを行う。
手順や設定内容など、ほぼ、OTN USの元エントリ(11. Create "oracle" User and Directories)と同じなので、元ネタも参照のこと。


また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更してある。

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# export LANG=en_US.UTF-8


[root@discus2 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus2 ˜]# export LANG=en_US.UTF-8


● Oracle用ユーザとグループの作成。

この作業は、Oracle RACを構成する全ノードで同じ操作を行う。下記例は、discus1で行ったもの。
[root@discus1 ˜]# mkdir -p /u01/app
[root@discus1 ˜]# groupadd -g 510 dba
[root@discus1 ˜]# groupadd -g 511 oinstall
[root@discus1 ˜]# useradd -u 600 -g 510 -d /u01/app/oracle -s /bin/bash -c "Oracle Owner" -p oracle oracle
[root@discus1 ˜]# chown -R oracle:dba /u01
[root@discus1 ˜]# passwd oracle
Changing password for user oracle.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@discus1 ˜]#

● Oracleユーザのログインスクリプトの作成。

この作業は、Oracle RACを構成する全ノードで同じ操作を行う。下記例は、discus1で行ったもの。
.bash_profileを編集又は、作成し、環境変数を設定する。Oracleに必要な環境変数の詳細などは、Oracle Datbase管理者リファレンス 10gリリース2 (10.2) for UNIX Systemsなどを参照すればよいだろう。
尚、ORACLE_SIDは、ノード毎にユニークなSIDを指定すること。


[root@discus1 ˜]# su - oracle
[oracle@discus1 ˜]# export LANG=en_US.UTF-8
[oracle@discus1 ˜]# vi .bash_profile
[oracle@discus1 ˜]# . .bash_profile
[oracle@discus1 ˜]#
[oracle@discus1 ˜]# cat .bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ˜/.bashrc ]; then
. ˜/.bashrc
fi

# User specific environment and startup programs
alias ls="ls -FA"

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORA_CRS_HOME=$ORACLE_BASE/product/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin

# Each RAC node must have a unique ORACLE_SID.
export ORACLE_SID=orcl1

export NLS_LANG=japanese_japan.AL32UTF8

export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS10=$ORACLE_HOME/nls/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp

PATH=$PATH:$HOME/bin

export PATH
unset USERNAME
[oracle@discus1 ˜]#


iSCSIの共有ストレージの構成は下記表の通り。(サイズとASMディスクグループ名の一部が異なるが、それ以外はOTN USの元ネタとほぼ同じ

共有ストレージの構成
ファイルシステム iSCSIターゲット名 サイズ(GB) マウントポイント ASMディスクグループ名 ファイルタイプ
OCFS2
crs
2
/u02/oradata/orcl
-
Oracle Cluster Registry - (100 MB)
Voting Disk - (20MB)
ASM
asm1
22
ORCL:VOL1 +ORCL_DISK_GRP1 Oracleデータベースファイル
ASM
asm2
22
ORCL:VOL2 +ORCL_DISK_GRP1 Oracleデータベースファイル
ASM
asm3
22
ORCL:VOL3 +FLASH_RECOVERY_AREA Flash recovery area
ASM
asm4
22
ORCL:VOL4 +FLASH_RECOVERY_AREA Flash recovery area
合計
-
90
-
-
-


● OCSF2向けマウントポイントの作成。

Oracle Database Oracle ClusterwareおよびOracle Real Application Clustersインストレーション・ガイド10g リリース2(10.2) for Linuxなども参照のこと。
この作業もOracle RACを構成する全ノードで同じ操作を行う。下記例は、discus1で行ったもの。

このマウントポイントには、Oracle Clusterware が利用する共有ファイルを配置する。(以下の操作は、rootユーザで実行する)

[oracle@discus1 ˜]# exit
[root@discus1 ˜]#
[root@discus1 ˜]# mkdir -p /u02/oradata/orcl
[root@discus1 ˜]# chown -R oracle:dba /u02

次回につづく。



話は変わるが、megawattさんから、映画「不都合な真実」が500円で観られる と聞き、予約受付開始と同時に申し込んだ。500円だとレンタルビデオ並の値段。
開催日は、1月28日を含めて、3日。 見たい方はぜひ。
http://www.tetrapak.co.jp/NEWS/RELEASE/061221.html
予約はhttp://www.tohotheater.jp/index.htmlから

ちなみに、映画「不都合な真実」に出演している、アル・ゴア 元副大統領は、現在、Apple Inc.の役員でもある。

| | | コメント (0) | トラックバック (0)

2007年1月26日 (金)

Mac De Oracle - 10万円 de RAC #14

Oracle RACノードでのiSCSIボリュームの構成のつづき。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成 その1。 その2
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



前回に引き続き、Oracle RACを構成するノードでのiSCSIボリュームの構成作業の後半部分。
作業内容は、OTN USのエントリー 10. Configure iSCSI Volumes on Oracle RAC Nodesに同じ。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。特別、日本語に戻す必要はないのだが、折角なので環境変数LANGは ja_JP.UTF-8に戻して行った。

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]#




● fdiskでSCSIデバイスにパーティションを作成する。
パーティションの作成は、Oracle RACを構成する1つのノードで実行するだけでよい。下記例では、discus1から実行している。

※1デバイス毎に1パーティションを作成し、全シリンダを割り当てた。

[root@discus1 ˜]# fdisk /dev/sda
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

このディスクのシリンダ数は 22016 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
(例. DOS FDISK, OS/2 FDISK)
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

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

Disk /dev/sda: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-22016, default 1): 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-22016, default 22016): 22016

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

Disk /dev/sda: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sda1 1 22016 22544368 83 Linux

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
[root@discus1 ˜]#


.../dev/sdb、/dev/sdc、/dev/sddも同様、中略...


[root@discus1 ˜]# fdisk /dev/sde
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1009, default 1): 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1009, default 1009): 1009

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

Disk /dev/sde: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = シリンダ数 of 4154 * 512 = 2126848 bytes

デバイス Boot Start End Blocks Id System
/dev/sde1 1 1009 2095662 83 Linux

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
[root@discus1 ˜]#

● 無事パーティションはできたようなので確認する。Oracle RACの全ノードで実行し、内容を確認する。
下記例は、discus1で実行したもの。

[root@discus1 ˜]# 
[root@discus1 ˜]# partprobe
[root@discus1 ˜]#
[root@discus1 ˜]# fdisk -l

Disk /dev/hda: 20.0 GB, 20000000000 bytes
255 heads, 63 sectors/track, 2431 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 2431 19422585 8e Linux LVM

Disk /dev/sda: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sda1 1 22016 22544368 83 Linux

Disk /dev/sdb: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdb1 1 22016 22544368 83 Linux

Disk /dev/sdc: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdc1 1 22016 22544368 83 Linux

Disk /dev/sdd: 23.0 GB, 23085449216 bytes
64 heads, 32 sectors/track, 22016 cylinders
Units = シリンダ数 of 2048 * 512 = 1048576 bytes

デバイス Boot Start End Blocks Id System
/dev/sdd1 1 22016 22544368 83 Linux

Disk /dev/sde: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = シリンダ数 of 4154 * 512 = 2126848 bytes

デバイス Boot Start End Blocks Id System
/dev/sde1 1 1009 2095662 83 Linux
[root@discus1 ˜]#

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年1月25日 (木)

Mac De Oracle - 10万円 de RAC #13

前回からのつづき。
今回は、Oracle RACノードでのiSCSIボリュームの構成を行う。
尚、ログが長いため、エントリを2回に分ける。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Openfiler側の構成も無事終わり、Oracle RACを構成するノードでのiSCSIボリュームの構成作業に移る。作業内容は、OTN USのエントリー 10. Configure iSCSI Volumes on Oracle RAC Nodesに同じ。

また、各操作は、Apple PowerBook G4のTerminalから sshを利用し、Oracle RACを構成する各ノードに接続して行っている。

尚、Terminalの文字セットエンコーディングは、UTF-8にしておく。環境変数LANGは、一時的に、en_US.UTF-8に変更してある。

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# export LANG=en_US.UTF-8


[root@discus2 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus2 ˜]# export LANG=en_US.UTF-8

●iscsi-initiator-utilsがインストールされていることを確認する。
  Oracle RACを構成する全ノードで確認する。

もし、インストールされていなければインストールするべし!。。。

[root@discus1 ˜]# rpm -q iscsi-initiator-utils
iscsi-initiator-utils-4.0.3.0-4
[root@discus1 ˜]#

● /etc/iscsi.confを編集し、DiscoveryAddressパラメータを追加する。
  Oracle RACを構成する全ノードで行う。

DiscoveryAddressには、Openfilerサーバーのプライベート IP アドレス又は、ホスト名を指定する。この例では、arowana-priv (192.168.2.5)を指定した。

[root@discus1 ˜]# cat /etc/iscsi.conf | grep DiscoveryAddress
# SCSI Routing Instance (i.e., DiscoveryAddress)
# "DiscoveryAddress" setting. The format for the "DiscoveryAddress" setting is
#DiscoveryAddress=10.4.100.0
#DiscoveryAddress=10.4.100.1:3260
#DiscoveryAddress=scisrouter1
DiscoveryAddress=arowana-priv
[root@discus1 ˜]#


● iSCSIサービスを再起動する。
  Oracle RACを構成する全ノードで行う。

[root@discus1 ˜]# service iscsi restart
Searching for iscsi-based multipath maps
Found 0 maps
Stopping iscsid: iscsid not running

Checking iscsi config: [ OK ]
Loading iscsi driver: [ OK ]
Starting iscsid: [ OK ]
[root@discus1 ˜]#

● iSCSIサービス自動起動の設定する。
  Oracle RACを構成する全ノードで行う。

[root@discus1 ˜]# chkconfig --level 345 iscsi on
[root@discus1 ˜]#

ログより
iscsidが起動し、192.168.2.5 (Openfilerサーバー)に接続していることが確認できる。

[root@discus1 ˜]# tail -40 /var/log/messages
Dec 28 19:52:53 discus1 fstab-sync[4360]: added mount point /media/floppy for /dev/fd0
Dec 28 20:48:49 discus1 sshd(pam_unix)[4427]: session opened for user root by root(uid=0)
Dec 28 22:20:27 discus1 iscsi: iscsi config check succeeded
Dec 28 22:20:27 discus1 kernel: SCSI subsystem initialized
Dec 28 22:20:27 discus1 kernel: iscsi-sfnet: Loading iscsi_sfnet version 4:0.1.11-3
Dec 28 22:20:27 discus1 kernel: iscsi-sfnet: Control device major number 254
Dec 28 22:20:27 discus1 iscsi: Loading iscsi driver: succeeded
Dec 28 22:20:33 discus1 iscsid[4635]: version 4:0.1.11-3 variant (02-May-2006)
Dec 28 22:20:33 discus1 iscsi: iscsid 起動 succeeded
Dec 28 22:20:33 discus1 iscsid[4639]: Connected to Discovery Address 192.168.2.5
...以下略...


次に、SCSIデバイスとiSCSIターゲットのマッピングを確認する。
尚、iscsidが起動される毎、毎回、SCSIデバイスとiSCSIターゲットのマッピングが変わるので注意が必要だ。
SCSIデバイスに対する作業を行う前にiscsidを再起動したり、サーバーを再起動した場合には、以下の手順でSCSIデバイスとiSCSIターゲットのマッピングを確認する必要がある。

※以降の確認作業は、SCSIデバイスがアタッチされたか確認する意味も兼ね、Oracle RACを構成する全ノードで確認するとよいだろう。

1)SCSIデバイスとSCSI IDを確認する。

下記例では、 SCSIデバイス:sda が、 SCSI ID:scsi1 に対応付けられていることを確認でき、sdbからsdeまで5つのデバイスが確認できる。

[root@discus1 ˜]# dmesg | sort | grep '^Attached scsi disk'
Attached scsi disk sda at scsi1, channel 0, id 0, lun 0
Attached scsi disk sdb at scsi0, channel 0, id 0, lun 0
Attached scsi disk sdc at scsi3, channel 0, id 0, lun 0
Attached scsi disk sdd at scsi2, channel 0, id 0, lun 0
Attached scsi disk sde at scsi4, channel 0, id 0, lun 0
[root@discus1 ˜]#

2)iSCSIターゲット名と、SCSI IDの対応を確認する。

iscsi-lsコマンドを実行すると、iSCSIターゲット名とSCSI IDとのマッピングを確認できる。下記例では、iSCSIターゲット名:iqn.2006-01.com.openfiler:rac1.asm4 が、HOST ID(SCSI ID) : 1 に対応していることが確認できる。以下、残りのiSCSIターゲット名も同様にマッピングされたSCSI IDを確認できる。

[root@discus1 ˜]# iscsi-ls
*******************************************************************************
SFNet iSCSI Driver Version ...4:0.1.11-3(02-May-2006)
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm4
TARGET ALIAS :
HOST ID : 1
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 28日 日曜日 22:33:06 JST
SESSION ID : ISID 00023d000001 TSIH b00
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm3
TARGET ALIAS :
HOST ID : 0
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 28日 日曜日 22:33:06 JST
SESSION ID : ISID 00023d000001 TSIH c00
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm2
TARGET ALIAS :
HOST ID : 3
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 28日 日曜日 22:33:06 JST
SESSION ID : ISID 00023d000001 TSIH d00
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.asm1
TARGET ALIAS :
HOST ID : 2
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 28日 日曜日 22:33:06 JST
SESSION ID : ISID 00023d000001 TSIH e00
*******************************************************************************
TARGET NAME : iqn.2006-01.com.openfiler:rac1.crs
TARGET ALIAS :
HOST ID : 4
BUS ID : 0
TARGET ID : 0
TARGET ADDRESS : 192.168.2.5:3260,1
SESSION STATUS : ESTABLISHED AT 2006年 12月 28日 日曜日 22:33:06 JST
SESSION ID : ISID 00023d000001 TSIH f00
*******************************************************************************
[root@discus1 ˜]#

上記 1)と 2)からiSCSIターゲットとSCSIデバイスのマッピングを確認できる。

iSCSI Target Name と SCSIデバイス対応表
iSCSI Target Name Host / SCSI ID SCSI デバイス名
iqn.2006-01.com.openfiler:rac1.asm4 scsi0 /dev/sdb
iqn.2006-01.com.openfiler:rac1.asm3 scsi1 /dev/sda
iqn.2006-01.com.openfiler:rac1.asm2 scsi2 /dev/sdd
iqn.2006-01.com.openfiler:rac1.asm1 scsi3 /dev/sdc
iqn.2006-01.com.openfiler:rac1.crs scsi4 /dev/sde


長くなるので、次回につづく。
次回は、iSCSIターゲット(Openfilerで作成した論理ボリューム)に対応付けられたSCSIデバイスにパーティションを作成する。

| | | コメント (0) | トラックバック (0)

2007年1月23日 (火)

Mac De Oracle - 10万円 de RAC #12

前回からのつづき、今回は、OpenfilerによるiSCSIボリュームの構成。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



さて、Openfilerのインストールも無事終わり、iSCSIボリュームの構成を行う。iSCSIボリュームに利用できる空き容量は、前回のエントリ通り、約90GBで、それを5つの論理ボリュームに割り振り、それらのボリュームをOracle RACを構成する全ノードからアクセスできるように構成する。

作成するボリューム名などはOTN USの元記事と同じボリューム名にすることにした。また、ブラウザベースの管理画面の操作は、OTN USの元記事 Configure iSCSI Volumes using Openfiler と同なじなのでそちらも参照のこと。


以下、Apple PowerBook G4から、ブラウザベースの管理画面で、iSCSIの構成を行った画面

Openfilerの パブリックネットワーク用ip addressは、192.168.1.5 と設定としたので、 https://192.168.1.5:446/に Safariからアクセスする。

最初にアクセスすると、次の画面が表示される。 スクロール後、「I have read, and hereby accept, the license terms」ボタンをクリック。
[an error occurred while processing this directive]
O001


● 管理者デフォルトパスワードの変更

ログイン画面で、管理者名(openfiler)とパスワードを入力後、(インストール直後の管理者のパスワードは "password"。)「administer the storage device from here.」リンクをクリックして、管理者のパスワードを変更しておく。

(再生にはQuickTimeが必要です。)
[an error occurred while processing this directive]O002


● iSCSI targetサービスの有効化。

ステータスを "enabled" 変更後、念のためにプロセスの起動を確認しておく。

[root@arowana ˜]# service iscsi-target status
ietd (pid 1988) is running...
[root@arowana ˜]#

[an error occurred while processing this directive]
O009


● ローカルネットワークの構成

2007/2/19 QuickTImeムービー上のホスト名がPublic Network用のホスト名となっているが、正しくは、private network用のホスト名である、 discus1-priv.macdeoracle.jpなどが正しい。後日修正予定
Oracle RACを構成する全ノード(私の環境では、discus1とdiscus2の両ノード)からiSCSIボリュームにアクセスできるようにする。尚、アクセスを許可するIP addressは、プライベートネットワーク用に設定したIPアドレスを指定する。

(再生にはQuickTimeが必要です。)

[an error occurred while processing this directive]O003


● 物理ディスクのパーティショニング

この例では、IDEディスクが2本あり、iSCSIに利用できる容量は、/dev/hda に69GB、/dev/hdb に19GBの空きがある。各パーティションのサイズは、69GB、19GB、Modeは "Primary"、Partition Typeは "Physical volume" で作成する。

(再生にはQuickTimeが必要です。)

[an error occurred while processing this directive]O010


● ボリュームグループの作成

先に作成したパーティションから成るボリュームグループを1つ作成する。

[an error occurred while processing this directive]
O0150160 O0150161


● 論理ボリュームの作成

先に作成したボリュームグループに以下のサイズで論理ボリュームを作成する。

iSCSI 論理ボリューム
ボリューム名
容量(MB)
ファイルシステム・タイプ
備考
crs
2,048
iSCSI
Oracle Clusterware
asm1
22,016
iSCSI
Oracle ASM Volume 1
asm2
22,016
iSCSI
Oracle ASM Volume 2
asm3
22,016
iSCSI
Oracle ASM Volume 3
asm4
22,016
iSCSI
Oracle ASM Volume 4

[an error occurred while processing this directive]
O0170190 O0170191 O0170192


● 論理ボリュームへのアクセス権付与

Oracle RACを構成する全ノードへ、作成した論理ボリュームへのアクセスを許可する。
[Volume]->[List of Existing Volumes]->で表示される管理画面のProperties列にある[Edit]リンクをクリックし、作成した論理ボリューム毎に、Oracle RACを構成する全ノードからのアクセスを許可する。


O0220230 O0220231 O0220232


最後に、サービスをリスタート。

[root@arowana &tilde]# service iscsi-target restart
Stopping iSCSI target service: [ OK ]
Starting iSCSI target service: [ OK ]


次回のエントリで解説する作業を終えると、[Status]で、iSCSIの各論理ボリュームのステータスが確認できる。以下では、各論理ボリューム毎、2つのセッションの存在が確認できる。

[an error occurred while processing this directive]
O024

| | | コメント (0) | トラックバック (0)

2007年1月20日 (土)

Mac De Oracle - 10万円 de RAC #11

前回からのつづき、今回は、Openfiler2.1のインストール

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Openfile2.1をインストールするPCは、以前、妻がFedora Core2やDebianをインストールして遊んでいたPCだが、今では部屋の隅で埃まみれになっていたDell PowerEdge SC600 Pen4 1.8Ghz メモリ:768MB。

プライベートネットワーク(iSCSIやOracle RAC interconnect用)用途で、Logtec LAN-GTJ/PCI というギガビット対応NICを追加した。配置図を見てもらうと分かり易いだろう

注意)
2セットしかないキーボードとマウスを、既にインストールの終了した、DELL Optiplex GX260から取り外し、DELL PowerEdge SC600に繋ぎ換えた。1台しかないモニターも同様。

準備として、をダウンロードし、isoイメージファイルからCDを作成しておく。

作成したCDを使ってDELL PowerEdge SC600を起動すれば、インストールが開始される。インストールは簡単で、時間にして30分程度だった。内容は、OTN USの 8. Install Openfilerと同じなのでそちらを参照してもらうとして、違う点だけを書いておく。


● Keyboard Configuration

Japaneseを選択した。


● Partitioning

ディスクが2本あるのだが、一本のディスクに以下のようにパーティションを割り当てた
/boot : ext3で、100MB
/ : ext3で 4096MB
swap : 実装メモリの2倍、 1536MBを割り当てた。

この状態で、2本のディスクの空きは、90GBほど.



● ネットワークなど

Gateway : 192.168.1.1
Primary DNS : 192.168.1.1

Openfilerサーバー (hostname=arowana.macdeoracle.jp)
device ip address sub-netmask 備考
eth0 192.168.1.5 255.255.255.0 パブリックネットワーク用、100メガビット
eth1 192.168.2.5 255.255.255.0 プライベートネットワーク用、ギガビット


● Time Zone Selection

Tokyoを選択




以下、数少ない問題点。

DELL PowerEdge SC600には、オンボードに100BASE-TのNICがあり、それをプライマリNIC(eth0)にし、追加したギガビット対応NICをセカンダリNIC(eth1)として、Oracle RACのInterconnectなどのプライベートネットワークに利用することにしていた。
Openfilerのインストールを開始すると、2枚のNICは正常に認識され、eth0とeth1のネットワーク構成も正常に行えたのだが、インストール後の確認作業でeth0にギガバイト対応NIC、eth1にオンボードのNICが対応づけられていたため、/etc/modprobe.confと/etc/sysconfig/network-scripts/ifcfg-eth0とifcfg-eth1を手動で変更した。

  1. /etc/modprobe.confの変更内容は以下の通り。
  2. [root@arowana etc]# diff modprobe.conf.org modprobe.conf
    1,2c1,2
    < alias eth0 r8169
    < alias eth1 e1000
    ---
    > alias eth0 e1000
    > alias eth1 r8169
    [root@arowana etc]#
  3. etc/sysconfig/network-scripts/ifcfg-eth0とifcfg-eth1のMacアドレス部分を入れ替えた。
  4. [root@arowana network-scripts]# diff ifcfg-eth0.org ifcfg-eth0
    4c4
    < HWADDR=00:01:8E:B3:76:7E
    ---
    > HWADDR=00:C0:9F:17:FC:A0
    [root@arowana network-scripts]# diff ifcfg-eth1.org ifcfg-eth1
    4c4
    < HWADDR=00:C0:9F:17:FC:A0
    ---
    > HWADDR=00:01:8E:B3:76:7E
    [root@arowana network-scripts]#


以下、変更後の確認!

[root@arowana ˜]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:C0:9F:17:FC:A0
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::2c0:9fff:fe17:fca0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4786 errors:0 dropped:0 overruns:0 frame:0
TX packets:1558 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:1080063 (1.0 Mb) TX bytes:563385 (550.1 Kb)
Base address:0xecc0 Memory:fe100000-fe120000

[root@arowana ˜]# ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:01:8E:B3:76:7E
inet addr:192.168.2.5 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::201:8eff:feb3:767e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:7884 (7.6 Kb)
Interrupt:10 Base address:0xc000

[root@arowana ˜]#
[root@arowana ˜]# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: umbg
Wake-on: g
Current message level: 0x00000007 (7)
Link detected: yes
[root@arowana ˜]# ethtool eth1
Settings for eth1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000033 (51)
Link detected: yes
[root@arowana ˜]#

最後に、Apple PowerBook G4からTerminalを利用し、sshなどを実行中のスナップショット!


Check_arowana

| | | コメント (0) | トラックバック (0)

2007年1月19日 (金)

Mac De Oracle - 10万円 de RAC #10

前回からのつづき、今回は、ネットワークの構成

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。



Apple PowerBook G4からTerminalを起動し、SSHにて各ノードに接続して実行した。

尚、CentOS4.4側では、環境変数LANGをja_JP.UTF-8としてある。この場合、MacOSXのTerminalの文字エンコーディングもUTF-8に設定すれば、ほとんど問題はないのだが、viを使う際には編集時にカーソルの位置が1行ほどずれたりする問題が発生したため、viなど(vi以外にも幾つかあったので都度注釈を入れることにする)を使用する際には、環境変数LANGを一時的に en_US.UTF-8に変更した。

[root@discus1 ˜]# echo $LANG
ja_JP.UTF-8
[root@discus1 ˜]# export LANG=en_US.UTF-8


Characterenc_1 Jpman_3 Enman_1


行っている内容は、US OTNの元ネタと同じなので、そちらも参照していただくとして、
US OTNの元ネタでは、GUIを利用しているが、こちらでは、viを使って、/etc/hostsを編集した。(VNCも使えるようにしてあるのでGUIで行うこともできるのだが、Oracle10gのインストール時以外では、VNCを利用しないで作業を進めることにする。)

以下は、両ノードの/etc/hostsの内容であるが、Oracle RACとなる両ノードで、/etc/hostsを同じ内容に設定する。ちなみに、ipアドレス:192.168.1.5(arowana)は、この時点では存在していないが、Openfilerを構築するサーバーに割り当てるアドレスである。配置図と見比べると分かり易いかもしれない。

Last login: Wed Dec 26 20:38:44 on ttyp2
Welcome to Darwin!
pb17:˜ oracle$ ssh root@192.168.1.3
root@192.168.1.3's password:
Last login: Tue Dec 26 20:48:49 2006 from 192.168.1.13
[root@discus1 ˜]#
[root@discus1 ˜]#
[root@discus1 ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost localhost.localdomain loopback

# Public Networks - (eth0)
192.168.1.3 discus1.macdeoracle.jp discus1
192.168.1.4 discus2.macdeoracle.jp discus2
192.168.1.5 arowana.macdeoracle.jp arowana

# Private Network - (eth1)
192.168.2.3 discus1-priv.macdeoracle.jp discus1-priv
192.168.2.4 discus2-priv.macdeoracle.jp discus2-priv
192.168.2.5 arowana-priv.macdeoracle.jp arowana-priv

# Public Virtual IP(VIP) address for - (eth0)
192.168.1.100 discus1-vip.macdeoracle.jp discus1-vip
192.168.1.101 discus2-vip.macdeoracle.jp discus2-vip
[root@discus1 ˜]# exit
pb17:˜ oracle$ ssh root@192.168.1.4
root@192.168.1.4's password:
Last login: Tue Dec 26 20:52:49 2006 from 192.168.1.13
[root@discus2 ˜]#
[root@discus2 ˜]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost localhost.localdomain loopback

# Public Networks - (eth0)
192.168.1.3 discus1.macdeoracle.jp discus1
192.168.1.4 discus2.macdeoracle.jp discus2
192.168.1.5 arowana.macdeoracle.jp arowana

# Private Network - (eth1)
192.168.2.3 discus1-priv.macdeoracle.jp discus1-priv
192.168.2.4 discus2-priv.macdeoracle.jp discus2-priv
192.168.2.5 arowana-priv.macdeoracle.jp arowana-priv

# Public Virtual IP(VIP) address for - (eth0)
192.168.1.100 discus1-vip.macdeoracle.jp discus1-vip
192.168.1.101 discus2-vip.macdeoracle.jp discus2-vip

● ネットワーク関連パラメータの変更

尚、操作はOracle RACを構成する両ノードで行う。(以下は、discus1で実行した例)

[root@discus1 ˜]# sysctl net.core.rmem_default
net.core.rmem_default = 110592
[root@discus1 ˜]# sysctl net.core.wmem_default
net.core.wmem_default = 110592
[root@discus1 ˜]# sysctl net.core.rmem_max
net.core.rmem_max = 110592
[root@discus1 ˜]# sysctl net.core.wmem_max
net.core.wmem_max = 110592
[root@discus1 ˜]# sysctl -w net.core.rmem_default=262144
net.core.rmem_default = 262144
[root@discus1 ˜]# sysctl -w net.core.wmem_default=262144
net.core.wmem_default = 262144
[root@discus1 ˜]# sysctl -w net.core.rmem_max=262144
net.core.rmem_max = 262144
[root@discus1 ˜]# sysctl -w net.core.wmem_max=262144
net.core.wmem_max = 262144
[root@discus1 ˜]#

● ifconfigやethtoolで確認する。

Oracle RACを構成する両ノードで行う。以下は、discus1で実行した例

[root@discus1 ˜]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:08:74:B1:C4:50
inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::208:74ff:feb1:c450/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2223 errors:0 dropped:0 overruns:0 frame:0
TX packets:1393 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:311464 (304.1 KiB) TX bytes:188753 (184.3 KiB)
Base address:0xe8c0 Memory:ff8c0000-ff8e0000

[root@discus1 ˜]# ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:01:8E:B3:76:A3
inet addr:192.168.2.3 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::201:8eff:feb3:76a3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:834485 errors:0 dropped:0 overruns:0 frame:0
TX packets:630210 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1025393733 (977.8 MiB) TX bytes:272522200 (259.8 MiB)
Interrupt:169 Base address:0x8c00

[root@discus1 ˜]# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 100Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: umbg
Wake-on: g
Current message level: 0x00000007 (7)
Link detected: yes

[root@discus1 ˜]# ethtool eth1
Settings for eth1:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Link detected: yes
[root@discus1 ˜]#

次回につづく。



先月、Blue Note Tokyoにちょこっとだけ来ていた、クリント・イーストウッドの息子、カイル・イーストウッド。聞いてみたくなりました。
と、Blue Note Tokyoのスケジュールを見ると、来月にまた、2、3日ライブやるようで。。

CDのジャケットを見ると、やはり親子、マカロニウェスタンに出ていた若かりし頃のクリント・イーストウッドにそっくり! 

| | | コメント (0) | トラックバック (0)

2007年1月18日 (木)

Mac De Oracle - 10万円 de RAC #9

前回のつづき。 今回は、CentOS4.4のインストール 。

  1. ハードウェアの価格構成
  2. Linux (CentOS 4.4)のインストール
  3. ネットワークの構成
  4. Openfilerのインストール
  5. OpenfilerによるiSCSIボリュームの構成
  6. Oracle RACノードでのiSCSIボリュームの構成
  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定
  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)
  9. hangcheck-timerカーネル・モジュールの構成
  10. Oracle RACノード間リモートアクセスの構成
  11. Oracle RACノード構成ファイルの確認
  12. Oracle Cluster File System (OCFS2)のインストール及び構成
  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成
  14. Oracle 10gソフトウェアのダウンロード)
  15. Oracle10g R2インストール事前作業
  16. Oracle10g Clusterwareのインストール
  17. Oracle10g R2 Database softwareのインストール
  18. Oracle10g R2 Companion CD softwareのインストール
  19. TNS Listenerの構成
  20. Oracle Cluster databaseの作成
  21. Oracle Net Serviceの確認
  22. 表領域の作成と変更
  23. Oralce RAC ClusterとDatabase構成の確認
  24. Clusterの開始と停止の確認
  25. 簡単なTransparent Application Failover (TAF)の確認
  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)
注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。


今回インストールするLinuxは、CentOS4.4である。ネットを検索すればダウンロードサイトはすぐに見つかる。日本であれば、http://ftp.riken.jp/Linux/centos/4.4/isosなどから入手すればよいだろう。DELL Optiplex GX260にインストールするのは、i386版なので以下の4ファイルをダウンロードして、isoイメージでCD-Rに焼く。

CentOS-4.4-i386-bin1of4.iso
CentOS-4.4-i386-bin2of4.iso
CentOS-4.4-i386-bin3of4.iso
CentOS-4.4-i386-bin4of4.iso


私の場合は、(当然だが)Macintoshでダウンロードした。ダウンロードしたisoイメージファイルからCDを作成した。以前別エントリでもisoフォーマットのCDの作成方法は書いているが、今日は画像付きで!

9001 9002 9003 9004 9005 9006 9007


と簡単に作成できる。

作成したCDを使い、DELL Optiplex GX260へCentOS 4.4をインストールする。といっても、このブログは、MacとOracleがメインなのでLinuxのインストールについて細かく書くつもりはないので、あしからず。(ネットを検索すれば、すぐに見つけることも可能だし、操作は、US OTNの6. Install the Linux Operating Systemとほぼ同じであるのでそちらを参照してもらいたい。)


以下、違う点だけを書いておく。

● Language / Keyboard Selection

言語は、Japanese を選択した。また、キーボードも 日本語を選択した。


● Partitioning

パーティションは、/boot に 100MB、 swapには、メモリ512MBと少ないこともあり、2GB、残りはすべて / に割当てた。今回、/homeは作成していない
尚、DELL Optiplex GX260には、20GBのディスクが1本という構成である。


● Network Configuration及び hostname

NICは、DELL Optiplex GX260のオンボードにギガビット対応NICがあるが、プライベートネットワーク向けにLogitec LAN-GTJ/PCIというギガビット対応NICを追加してあり、eth0をパブリックネットワーク、eth1をプライベートネットワーク向けに構成する。どちらもギガビット対応のNICなのだが、パブリックネットワーク側のHUBはコストを抑えるため100メガビットとなっている。

RACを構成する2ノードとも、DHCPは利用せず、固定IP。また、gateway及び、DNSの ipアドレスは、192.168.1.1 とした。

RACを構成するノード1 (hostname=discus1.macdeoracle.jp)
device ip address sub-netmask 備考
eth0 192.168.1.3 255.255.255.0 パブリックネットワーク用、100メガビット
eth1 192.168.2.3 255.255.255.0 プライベートネットワーク用、ギガビット
RACを構成するノード2 (hostname=discus2.macdeoracle.jp)
device ip address sub-netmask 備考
eth0 192.168.1.4 255.255.255.0 パブリックネットワーク用、100メガビット
eth1 192.168.2.4 255.255.255.0 プライベートネットワーク用、ギガビット


尚、CentOS4.4をインストールする際、2セットあるキーボードとマウスは2台のOptiplexに繋ぎ、1台しかないモニターはインストールする都度繋ぎ換えた。

以下、MacOSXの Terminalから、各ノードのsshでログインし、プライベートアドレスで pingでテストをしてみたところ。

Ping_from_mac

ということで特に問題もなく、CentOS4.4のインストールは完了した。

次回へつづく。

| | | コメント (0) | トラックバック (0)

2007年1月17日 (水)

Mac De Oracle - 10万円 de RAC #8

今回から構築記録を書いて行くことにする。
内容は、OTN USで公開されているBuild Your Own Oracle RAC 10g Release 2 Cluster on Linux and iSCSIにほぼ同じで、以下のような内容について書いて行く予定である。

「1.ハードウェアの構成と価格」は「Mac De Oracle - 10万円 de RAC #1」「Mac De Oracle - 10万円 de RAC #5」で解説済みであるため 「2.Linux (CentOS4.4)のインストール」から書く予定である。


  1. ハードウェア構成と価格(Mac De Oracle - 10万円 de RAC #1Mac De Oracle - 10万円 de RAC #5参照のこと)

  2. Linux (CentOS 4.4)のインストール

  3. ネットワークの構成

  4. Openfilerのインストール

  5. OpenfilerによるiSCSIボリュームの構成

  6. Oracle RACノードでのiSCSIボリュームの構成

  7. Oracle所有者と関連ディレクトリの作成及び環境変数の設定

  8. Oracle向けLinuxサーバーの構成(カーネルパラメータの設定)

  9. hangcheck-timerカーネル・モジュールの構成

  10. Oracle RACノード間リモートアクセスの構成

  11. Oracle RACノード構成ファイルの確認

  12. Oracle Cluster File System (OCFS2)のインストール及び構成

  13. Oracle Automatic Storage Management(ASMLib 2.0)のインストール及び構成

  14. Oracle 10gソフトウェアのダウンロード)

  15. Oracle10g R2インストール事前作業

  16. Oracle10g Clusterwareのインストール

  17. Oracle10g R2 Database softwareのインストール

  18. Oracle10g R2 Companion CD softwareのインストール

  19. TNS Listenerの構成

  20. Oracle Cluster databaseの作成

  21. Oracle Net Serviceの確認

  22. 表領域の作成と変更

  23. Oralce RAC ClusterとDatabase構成の確認

  24. Clusterの開始と停止の確認

  25. 簡単なTransparent Application Failover (TAF)の確認

  26. PowerBook G4のJDeveloper10g/SQL Developer/SQL*Plusなどからの接続確認(Mac De Oracleではお約束!なので)


注)
MacOSX 10.4.8(PowerPC)へのOracle10g clientインストールは特に新しいネタでもないので記事として書く予定はないが、MacOSX 10.4.8(PowerPC)のJDeveloper10g、SQL DeveloperやSQL*Plusからの接続確認等の記録は載せる予定である。


尚、今回、Oracle10g R2 for Linuxは、OTN Software kitのものを利用し、kitに含まれていないソフトウェアはダウンロードした。

ダウンロードは以下、
CentOS Enterprise Linux 4.4
Oracle Cluster File System Release 2 - (1.2.3-1)
Oracle Cluster File System Releaase 2 Tools - (1.2.1-1)
Oracle Database 10g Release 2 EE, Clusterware, Companion CD - (10.2.0.1.0)
Openfiler 2.1 x86 (Final)
ASMLib 2.0 Library and Tools - (2.0.3-1) - Tools / Libraries
ASMLib 2.0 Driver - (2.6.9-42.EL / 2.0.3-1) - Single Processor / SMP / Hugemem



ところで、先日のエントリで、メルセデスベンツの配信しているCLS class Video Podcastのジャンアレジ編でジャンアレジがぶどう畑を所有していることを知った。ネットで調べると、(2007/1/19訂正ー 夫妻のワインの醸造元として有名な方が作っているワインが)日本に輸入されていた。しかも、2003年ものは雑誌「ワイン王国No.28」で特選ベストバイワインと最高評価の5つ星を獲得していたことに、また、ビックリ。ということで、つい購入してしまった(御手頃な値段なので)。飲むのが楽しみだ。
Wine

シャトー・ドゥ・セグリエス・リラック 2003
シャトー・ドゥ・セグリエス・コート・デュ・ローヌ 2004

(2007/1/19追記。)
ジャンアレジさんのワインは、クロドゥレルミタージュ です。
検索すると、2003年と2001年のもが見つかった。 ちなみに、2003年のビンテージで6000円〜7000円くらい。

| | | コメント (0) | トラックバック (0)

2007年1月15日 (月)

Mac De Oracle - 10万円 de RAC #7

さて、いくつかのミスはあったが予定通りのRAC環境が構築できた。
次回から構築メモ?的なエントリを順次アップしていく予定でいる。
だが、ココログさんが、再度メンテナンスモードに突入してしまうようで1月16日15時から17日の15時までの24時間の間、記事を投稿できないようだ。(こんどは大丈夫か???。とにかく、頑張ってくださいませー>ココログさん)

ということで、次回の投稿は、1月17日の15時以降になってしまう可能性あり。。


今回構築した環境では、キーボードとマウスは2セット、液晶モニターは1台なのだが、それぞれをどのように接続したのかも各エントリで解説するつもりでいる。(最初のうちは、何度かモニターやキーボードとマウスを別PCに繋ぎ換えるということも行っている。安価にした分だけ少々の手間がかかるのは仕方ない。。。。。環境がある整ってしまえば、SSHでほとんどの操作が
行えるので、モニターを繋ぎ換えるのも最初だけですけどね。。)



ところで、メルセデスの Mixed Tape 15をdownloadしようとして気付いたのだが、昨年の12月からメルセデスのサイトで、Podcasting や、Video Podcastingが行われているんですね
Webページ上では、ドイツ語と英語に切り替えられますが、今のところ配信されているコンテンツ自体はドイツ語です。。

・・・奥さんに訳してもらうかなって、、、横にいる奥さん、Mercedes-Benz CLS-Klasse Video-Podcast Folge 2: ジャンアレジ編(ドイツ語)のVideo Podcastを見ながら笑ったりしてる!〜〜〜〜。

なんて言ってんの〜〜〜、

なにが面白いの〜〜。

訳して、意味教えて〜〜!!!。

(ドイツ語のヒアリングにはちょうどよいらしく、うちの奥さん、早速、iTunesにダウンロード中!!)


Floge2_jean_alesi

| | | コメント (0) | トラックバック (0)

2007年1月12日 (金)

Mac De Oracle - 10万円 de RAC #6

さて、前回からのつづき、途中経過を。
21. Install Oracle Database 10g Softwareから28. Starting / Stopping the Clusterまで問題なく?終了した。時間にして5〜6時間だったと思う。
DELL Optiplex GX260のメモリはメモリ要件ギリギリの512MBであったためDBCA(DataBase Configuration Assistant)には時間がかかり2時間あまりだった。

少々面倒な準備は必要だが、準備さえしっかり行えば、

仮想化技術を利用せず、中古品などを使えば10万円以内でお遊び環境程度とはいえ、RACは構築できるのだ!

ちなみに、妻が仕事の為に、
”しかたなく購入した中古のIBM thinkpad R52は、メモリを2GBにして、11万円”(笑)

 

「問題なく?」というところが気になると思うのだが、その理由は、ASMのDISKグループを2つ作り、その1つはFLASH RECOVERY AREAとして利用し、残りにデータベースファイルを配置する予定だったのだが、確認ミスでデータベースファイルをすべて、FLASH RECOVERY AREA用DISKグループに作ってしまった。(データベースとしては問題なく利用できるのだが・・・)

ということで、データベースだけは作り直そうと考えているしだい。構築記録はデータベースの再作成が終わり次第、順次公開していく予定である。

Cluster Database作成時のOUI(Oracle Universal Installer)の画面のスナップショットを載せておく。
スナップショットからも分かるように、MacOSXからVNC client経由でCentOSのGnome DesktopをリモートアクセスしてOUIを起動している。
Oui_106

どのような経路でアクセスしているか配置図で補足しておく。(アクセス経路は赤太線で示してある)
Racdeoracle_v3r1


尚、今回 MacOSXで利用したVNC Clientは、フリーのVNC ClientであるChicken of the VNCである。以下のURLからダウンロードできる。
Download Chicken of the VNC


Vncicon Vnc1 Vnc2

| | | コメント (0) | トラックバック (0)

2007年1月11日 (木)

Mac De Oracle - 10万円 de RAC #5

Oracle Clusterwareのインストール&構成が終わったので、「10万円 de RAC #3」で、オプションとしていたEM10g R2 Grid Controlについて前提条件などを調べていたのだが、EM10g R2 Grid Controlをインストールする予定のサーバーには、すでにOracle10g R2 EEがインストールしてありメモリなどリソースにも余裕がないこともあり、EM10g R2を使ったお遊びは、H/Wリソースが整ってからのお楽しみということにした。

ということで、「10万円 de RAC」の新しい配置図(EM10g Grid Controlを配置する予定だったサーバー部分を削除した。)

変更前変更後
Racdeoracle_1Racdeoracle_v3_1
2007/1/30訂正ーVIPが192.168.1.2xxとなっているが、192.168.1.1xxの誤り。(画像の訂正は後日。。)
2008/11/28修正:
tableタグが正しく表示されていなかったので修正。合わせて画像サイズも修正

次はOracle10g R2 EEのイントール(Oracle Clusterwareのインストールまでは順調だったのでこのまま行ってくれるといいのだが)

| | | コメント (0) | トラックバック (0)

2007年1月 8日 (月)

Mac De Oracle - 10万円 de RAC #4

構築途中ですが、途中経過を。。。
OTN USの元ネタとは少々異なる設定にしていることや、いくつかの失敗はあったものの、実質8時間/日程度で2日目で元記事のこのステップ(CRSのインストール)まで終了。(つまらないミスなどがなければ12時間程度程度でできるのではないかと思う。)



Peabo Bryson なんて、ゆったり聞くのもいいもんです。

| | | コメント (0) | トラックバック (0)

2007年1月 2日 (火)

Mac De Oracle - 10万円 de RAC #3

あけましておめでとうございます。2007年、最初のエントリーは、10万円 de RACの続きから。

さて、前回設置したH/W構成とこれからインストールするソフトウェア等の配置図をUML2.0対応のUMLモデリングツール Visual Paradigm for UML 6.0 community editionを利用して作成してみた。



配置図(UML2.0の)とし間違いがあれば随時修正する予定なのだが、前述のツールの機能等を確認する意味も兼ねて試しに作成した配置図は以下の通り。元ネタのURL:http://www.oracle.com/technology/pub/articles/hunter_rac10gr2_iscsi.html?rssid=rss_otn_news
妻からの指摘が一番キツかったりして・・・・

Racdeoracle_2
配置図において、背景色が ”赤”及び、”赤い”ライン部分が「10万円 de RAC」の為に購入した機器及びパーツである。
また、配置図中、Windows XP Professionalに配置するOracle EM10g Grid Contorolは、余力があれば試してみようと考えている部分であり実際には作成しない可能性があるオプション構成という位置づけとしておく。




本題から外れるので、Visual Paradigm for UML 6.0に関する記事は別エントリで書くつもりなのだが、このツールなかなかよい。メニューやヘルプはローカライズ国際化対応されていないものの、ダイアグラムには日本語が利用できる。Personal Editionの値段も安目に設定されているので購入を検討中なのである。私より先に妻が購入する可能性が高いのだが。。。。
ちなみに、Community Editionは、非商用利用であれば無料で、かつ、使用期限もなく、全機能が利用できる。印刷時や画像での出力時には、Communiry Editionであり商用利用できない旨のコメントが付加される。また、JDeveloper10gの拡張プラグイン含まれており、さらにうれしい事に、MacOSXにも完全対応しているところがうれしい。私個人としては、PoseidonUMLより気に入っている。

| | | コメント (0) | トラックバック (0)

2006年12月30日 (土)

Mac De Oracle - 10万円 de RAC #2

前回用意したPCやパーツを使いH/Wの設置が完成した。(OTN USのこのエントリの構成をベースにしているが、Openfiler用サーバーには、外付けHDはない。)

詳しい構成は、別エントリにするが、組み上がったサーバー群の画像を以下に載せておく。(2段重ねのDELL Optiplexで、Oracle10g R2 EEの2ノードRACを構築、その隣にあるDELL PowerEdge SC600で、iSCSIとなるOpenfilerサーバーを構築する予定となっている。
Cimg6063

| | | コメント (3) | トラックバック (0)

2006年12月29日 (金)

Mac De Oracle - 10万円 de RAC #1

Oracle10g もリリース2になったこともあり、RAC (Real Application Cluster)でも遊びたいと考えつつ、もう2006年も後僅かとなり、やっと、行動開始!

VMwareなどの仮想化技術を利用せず、お遊びRAC環境を約$2100で作るという記事を読んでいたのだが、中古のPCなら安くできるのではないかと考え、予算を10万円以内でやってみることにした。(既に所持しているものは極力それらを利用する。)
http://www.oracle.com/technology/pub/articles/hunter_rac10gr2_iscsi.html?rssid=rss_otn_news

尚、Oracle10g R2は、MacOSX版がリリースされていないこともあり、前述の記事の通り、Liunx版を利用し、Macintoshは、Oracle Clientや、環境構築時のterminalなどで利用することにした。「Mac De Oracle」というブログなので、Macintoshは、必ず、”どこかで”少しでも絡めるのであった。(笑)

ということで、パーツやPCを買いに、年末で賑わっている御徒町やアメ横を横目に、秋葉に一直線。


買いそろえたものリスト。

(1) PC (中古)
 

DELL Optiplex GX260 CPU:Pen4 2.4Ghz RAM:512MB × 2 = 50,600円
(内蔵DISK:20GB、キーボード、マウス、電源コード含む)

(2) DISPLAY (中古)
DELL 15inch 液晶 ディスプレイ × 1 = 9,800円

(3) HUB (新品)
Corega CG-SW05TXPL(10/100base対応) × 1 = 1,780円
Corega CG-SW05GTPLB(10/100/1000base対応) × 1 = 4,280円

(4) NIC (新品)
Logitec LAN-GTJ/PCI(1000base対応) × 3 = 5,340円

(5) LAN CABLE (新品)
ELECOM LD-GP/BU1 1m カテゴリー6 × 5 = 1,950円
ELECOM LD-GP/BU15 15m カテゴリー6 × 1 = 2,280円


以前から持っていたもの (妻がiMacを使いはじめて、使われなくなったPC。Fedora Core2をインストールしていた)

(1) PC

DELL PowerEdge SC600 CPU : Pen4 1.8Ghz RAM:769MB (推定、中古販売価格=19,800円)
(電源コードとマウスはあるが、キーボードとディスプレイはない。内蔵DISKは2本、20GB+80GB)

(2) LAN CABLE
カテゴリー5 1m × 1 = 100円もしないだろうね。中古なら。

これらで、http://www.oracle.com/technology/pub/articles/hunter_rac10gr2_iscsi.html?rssid=rss_otn_newsの記事のような環境を作ることにした。RAMの容量は1GBにしたがったが、512MBのPC2100の中古が入手できなかったため、512MBのままで試すことにした。
ちなみに、DELL PowerEdge SC600の中古販売推定価格を加えても、95,830円。 実際には、76,030円で Oracle10g R2で RAC環境を構築できる?ということになる。 さて、うまくできますか?! 。。。。次回へつづく。



尚、OptiPlexのGX240ならば、中古で2万円を切っているので、もう少し安く構築できると思うのだが、メモリがPC133であり、512MBにそろえることができなかったので、PC2100を使っているOptiplex GX260にした。
もし、メモリが入手できるようならば、もっと安い中古でも可能かもしれない。。。。

| | | コメント (0) | トラックバック (0)