nkjmkzk.net

powered by Kazuki Nakajima

Archive for the ‘oracle’ tag

日本オラクルに入社しました – シーズン2。

もう2週間以上経ちましたが、8月末でセールスフォース・ドットコムを退職しました。そして今月、日本オラクルにPaaS エバンジェリストとして入社しました。

背景について少しだけ。

  • 中嶋:プラットフォームをデファクトスタンダードにするというミッションに責任をもってやりきりたい。
  • 日本オラクル:VISION 2020を掲げてクラウド No.1に本気で向かっている。

私が自分のキャリアの中で次にやり遂げたいゴールと、日本オラクルがビジョンとして掲げる命題がぴったり一致している。端的に言えばこれが今回の選択の理由です。

会社のプライオリティ#1が自分のやりたいこととピッタリ重なっており、幸せなことにそのど真ん中ストレートの仕事をやらせてもらえる機会がありました。

出たり入ったりドタバタな私ですが、また暖かく迎えていただき、さらに、なんと楽しい仕事を任せていただいた日本オラクルに感謝しています。前職セールスフォース・ドットコムの方々にも今回の選択を理解していただき、快く送り出していただきました。本当にありがとうございます。

今回の立場では、オラクルのPaaSを中心としたクラウドサービスがお客様および技術者にとってどんなインパクトがあるのか、それを伝え、ファンを増やしていくのが私のミッションです。

え?と思うようなデモの作成。

開発者が安心して開発に没頭できる技術情報の整備。

知的好奇心を刺激するエンターテイメントの提供。

同じ関心事をワイワイガヤガヤ会話できるコミュニティのアレンジ。

こういった活動をおこなっていきます。

少しだけ具体的なサービスのお話を。オラクルといえばデータベースが気になるところですが、すでに日本でもデータベースはクラウドサービスとして提供されています。スキーマベース、インスタンスベース、またExadataといったウルトラパフォーマンスの占有環境を利用できる物理ユニットベースのサービス、といった複数のタイプのサービスが提供されています。

これまで企業システムの中で「こっちはクラウドで。こっちはオンプレミスで。」とされていた後者のシステムをもクラウドで実現可能にする。そんなカバレージがオラクルのクラウドサービスの魅力の一つだと思います。

また、データベースサービスはRESTful Webサービスを標準提供しており、オラクルデータベースにREST APIで直接アクセスすることができます。RDBMSは今も昔もこれからも多くのシステムで心臓部を支えるデータベースであることは間違いありません。しかし、SQL互換のRDBMSクラウドサービスは少なからず提供されているものの、REST APIで直接アクセス可能なサービスは実はほとんどありません。

つまりオラクルのデータベースサービスだと、こんな構成でHTML5アプリやモバイルアプリを構築できます。

Screen Shot 2015-09-20 at 11.41.16

 

 

 

 

 

 

 

こういった構成はBaaSなどでは当たり前の構成ですが、これまで使っていたRDMBSをそのまま利用できるという点で極めてユニークです。特にオラクルの場合はクラウド−オンプレミス間の移行が可能であることが特徴です。なのでこれまでオンプレミスで運用していたデータベースをクラウドに移行すれば、すぐにHTML5やモバイルアプリ、または外部サービスとの連携をおこなうための下地が整うことになります。

つまり、既存のデータと投資を最大限活用しながらシステムをモダナイズする近道がここにあります。

これはあくまでもデータベースサービス単体の活用例ですが、実際にはJava, Node.js, NoSQL,  IoT, Mobile, Big Data,  Application Builderなどすごい数のプラットフォームサービスが続々リリースされます。

このあたりの気になるサービスについて、活用例や実際の事例、Tipsなどを今後どんどん発信していこうと思います。

シーズン2がはじまりました。よろしくお願いします!

without comments

Written by 中嶋 一樹

9月 20th, 2015 at 11:56 am

Posted in Uncategorized

Tagged with , ,

超シンプルなOracle Database負荷掛けツール、oraload.py

oraload.pyはマルチスレッドでOracle Databaseに負荷をかけられるpythonスクリプトで、猫でも使えるのが特徴です。

  • 現在どれくらいTPSがでるのか?
  • とりあえずデータベースにできるだけ負荷をかけたい!
  • でも負荷掛けの準備はしたくない!

こういうシーンに役立ちます。元々デモ用に作成したものなので精度よりも結果と使い方の「わかりやすさ」を何より重視したツールです。

oraload.pyのダウンロード:http://github.com/nkjm/oraload

oraload.pyを実行すると下記のように1秒ごとに現在のTPSが表意され、最後に平均のTPSが表示されます。ただそれだけ、というシンプルさ。

TPS:    1133
TPS:    1673
TPS:    1946
TPS:    2014
TPS:    2148
TPS:    2236
TPS:    2115
TPS:    2391
TPS:    2526

TPS Average:    1962

oraload.pyはターゲットとなるデータベースノード上で実行することもできますし、他のノードからネットワーク越しに実行することもできます。

 

実行環境

  • cx_Oracleが利用できること(cx_Oracleのインストール方法はこちら
  • interview.pyがインストールされていること(後述)

機能

  • 任意のユーザであらかじめ定義されたSELECTまたはINSERT文をマルチスレッドで繰り返し発行し、そのときのTPSを表示する
  • テストで使用するユーザは既存のものを選択するか新規に自動作成可能 テーブルは自動的に作成

調整できるパラメータ

  • 使用するユーザ
  • 対象となるデータベース(ホスト名/サービス名)
  • クエリタイプ(SELECTまたはINSERT)
  • クエリ数
  • 負荷の強弱(スレッド数)

使用方法

まず実行環境を整えます。cx_Oracleを先のブログエントリに従ってセットアップし、次にinterview.pyをダウンロードしてインストールします。

interview.pyのダウンロード:http://github.com/nkjm/interview

interview.pyのインストールはダウンロードしたinterview.pyファイルを/usr/lib/python2.4/site-packages/に配置するだけです。

[root@~]# mv interview.py /usr/lib/python2.4/site-packages/

次にoraload.pyをダウンロードします。

oraload.pyのダウンロード:http://github.com/nkjm/oraload

ダウンロードしたoraload.pyをvi等のエディタで開き、SYSDBAで接続するためのアカウント、sys_userとsys_passwordだけ設定します。

[oracle@~]$ vi oraload.py
#!/usr/bin/python
import optparse
import random
import string
import sys
import threading
import time
import cx_Oracle
import interview

### Configuration Area ###
sys_user = 'sys'
sys_password = 'secret'
default_user = ''
default_password = ''
default_ip = ''
default_service = ''

*sys_user、sys_passwordは必ずしも設定する必要はありませんが、設定しない場合にはあらかじめデータベース上にテストで使用するユーザが作成されている必要があります。

以上でセットアップは完了です。oraload.pyを実行してみましょう。プロンプトが表示されテストに必要な情報を訊いてきますので入力していきます。

[oracle@~]$ ./oraload.py

Please enter DB IP Address: 172.22.0.54 <= データベースのIPアドレスまたはホスト名を指定

Please enter DB Service Name: orcl.kawasaki.nkjmkzk.com <= データベースのサービス名を指定

Please select USER NAME from following list. (Enter the number)

        [0] DBSNMP
        [1] SCOTT
        [2] SYSMAN
        [3] MGMT_VIEW
        [4] CLOUD_LARGE
        [5] SYS
        [6] SYSTEM
        [7] CLOUD_SURVEY
        [8] FLOWS_FILES
        [9] MDSYS
        [10] ORDSYS
        [11] EXFSYS
        [12] WMSYS
        [13] ORACLE_OCM
        [14] APPQOSSYS
        [15] XS$NULL
        [16] APEX_030200
        [17] OWBSYS_AUDIT
        [18] MDDATA
        [19] ORDDATA
        [20] CTXSYS
        [21] ANONYMOUS
        [22] OUTLN
        [23] DIP
        [24] APEX_PUBLIC_USER
        [25] XDB
        [26] SPATIAL_CSW_ADMIN_USR
        [27] SPATIAL_WFS_ADMIN_USR
        [28] ORDPLUGINS
        [29] OWBSYS
        [30] SI_INFORMTN_SCHEMA
        [31] OLAPSYS
        [32] +Create New User
Answer: 32 <= 新規にユーザを作成することを選択

Please enter NEW USER NAME: nkjm <= 新しいユーザ名を入力

Please enter PASSWORD: secret <= パスワードを入力

Please select TABLESPACE from following list. (Enter the number)
(just Enter to accept default 'USERS')
        [0] SYSTEM
        [1] SYSAUX
        [2] UNDOTBS1
        [3] USERS
        [4] TEMP
Answer: 3 <= このユーザが使用する表領域を選択

New User has been created.

Table has not been created yet. Create it right now? [y/n]: y <= テストに使用するテーブルを自動作成することを選択

Done.

Sequence has not been created yet. Create it right now [y/n]: y <= テストに使用するシーケンスを自動作成することを選択

Done.

Please select Type of Load from following list. (Enter the number)
        [0] select
        [1] insert
Answer: 1 <= 負荷のタイプを選択(初回はデータが入っていないのでselectを選択するとエラーで終了します)

Please enter Number of Queries: 10000 <= クエリ数を指定

Please enter Number of Threads (just Enter to accept default '1'): 4 <= スレッド数(同時接続数)を指定

#Thread-1 taking off...
#Thread-2 taking off...
#Thread-3 taking off...
#Thread-4 taking off...

TPS:    1536
TPS:    1683
TPS:    1817
TPS:    1721
TPS:    1450
TPS:    394
TPS:    0
TPS:    276
TPS:    39
TPS:    683

TPS Average:    927

[oracle@~]$

先ほど対話的に入力した値をワンライナーで入力するには下記のように実行します。

[oracle@~]$ ./oraload.py -u nkjm -p secret -i 172.22.0.54 -s orcl.kawasaki.nkjmkzk.com -o insert -c 10000 -t 4

* -u => ユーザ名
* -p => パスワード
* -i => DBのIPアドレスまたはホスト名
* -s => DBのサービス名
* -o => 負荷のタイプ(selectまたはinsert)
* -c => 発行するクエリ数
* -t => スレッド数(負荷の強弱を調整)

ここまでのテストでデータが20000件程格納されていますので、それを用いたSELECTも実行できます。

[oracle@~]$ ./oraload.py -u nkjm -p secret -i 172.22.0.54 -s orcl.kawasaki.nkjmkzk.com -o select -c 5000 -t 4

また、デフォルトのユーザ名、パスワード、DBのIP、DBのサービスを事前に設定しておくこともできます。

[oracle@~]$ vi oraload.py
#!/usr/bin/python
import optparse
import random
import string
import sys
import threading
import time
import cx_Oracle
import interview

### Configuration Area ###
sys_user = 'sys'
sys_password = 'mexico'
default_user = 'nkjm'
default_password = 'secret'
default_ip = '172.22.0.54'
default_service = 'orcl.kawasaki.nkjmkzk.com'

デフォルト値を設定しておくとオプションなしでoraload.pyを実行したときに、プロンプトにデフォルト値が入力されているためリターンキーを押すだけで進むことができます。

オプションで–helpを指定することで使い方を確認できます。

[oracle@~]$ ./oraload.py --help
usage: ./oraload.py [OPTIONS]

options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -u USER, --user=USER  User Name
  -p PASSWORD, --password=PASSWORD
                        User Password
  -i IP, --ip=IP        Hostname or IP Address of Oracle Database
  -s SERVICE, --service=SERVICE
                        Service Name of Oracle Database
  -o OPERATION, --operation=OPERATION
                        Type of Load [select|insert]
  -c COUNT, --count=COUNT
                        Number of Queries to be produced
  -t THREAD, --thread=THREAD
                        Number of Threads to be launched

さぁ、レッツトライ。

*ソースを見た人はテストデータのセンスに少し驚くでしょう。

without comments

Written by 中嶋 一樹

5月 31st, 2011 at 11:41 am

Posted in Uncategorized

Tagged with , , ,

pythonからOracleに接続するための拡張モジュール、cx_Oracleの基本的な使い方

cx_Oracleはそこそこ本格的な機能を提供してくれるOracle Database接続用のpythonモジュールです。phpのoci8と比較してもデータベースインスタンスを停止/起動するためのPRELIM AUTHモードをサポートしていたり、マルチスレッドで動かすためのTHREADEDモードをサポートしていたりとかゆいところに手が届きます。

このエントリではごく一般的な操作を解説します。データベース及びInstant Clientのバージョンは11g Release 2 x86_64とします。

インストールについてはこちらのエントリを。pythonからOracleに接続するための拡張モジュール、cx_Oracleのインストール方法

cx_Oracleをpythonスクリプト中で使うにはまずcx_Oracleをインポートします。

#!/usr/bin/python

import cx_Oracle

実行時に下記のエラーが出る場合は$LD_LIBRARY_PATHが通っていない可能性があります。

ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory

Oracle Instant Clientを利用している場合は/usr/lib/oracle/11.2/client64/libにライブラリがありますので下記のように$LD_LIBRARY_PATHを通します。

[oracle@~]$ export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib

まずは接続。個人的にはこれが一番難解なのではと思っています(マジでか)。僕がいつも使っている接続はこの形式です。

conn = cx_Oracle.connect('scott', 'tiger', '172.22.0.54/orcl.kawasaki.nkjmkzk.com')

* scott => ユーザ名
* tiger => パスワード
* 172.22.0.54 => データベースのIPアドレスまたはホスト名 RACの場合にインスタンスを指定する必要がなければSCANを指定
* orcl.kawasaki.nkjmkzk.com => データベースのサービス

ややこしいのが3つ目の172.22.0.54/orcl.kawasaki.nkjmkzk.comの部分。この引数はいろいろなフォーマットがありますが、僕はこのEasy Connectと呼ばれるフォーマットを好んでいます。一般にはtnsnames.oraに定義したエントリ名を使用する方がポピュラーでスクリプト自体は簡素にはなりますが、事前にtnsnames.oraを定義しなければいけないですし、tnsnames.oraがサーチパス上に配置されていなくてはならないのでその部分が汎用的でない気がして僕はあまり使いません。

データベースのIPアドレスまたはホスト名にSCANを使用する場合はデータベースノード上でsrvctlで確認できます。

[oracle@~]$ srvctl config scan
SCAN name: orcl-scan, Network: 1/172.22.0.0/255.255.252.0/eth0
SCAN VIP name: scan1, IP: /orcl-scan.kawasaki.nkjmkzk.com/172.22.0.56

サービスもsrvctlコマンドで確認できます。unique nameとdomainを合わせたものがデフォルトのサービスとなります。

[oracle@~]$srvctl config database -d orcl | grep -e 'Database unique name:' -e 'Domain:'
Database unique name: orcl
Domain: kawasaki.nkjmkzk.com

* orcl.kawasaki.nkjmkzk.comがサービス名となる

明示的に作成したサービスは下記のsrvctlコマンドで確認できます。

[oracle@~]$ srvctl config service

また、上記はノーマルユーザでの接続でしたが、管理作業を行うためにSYSDBAとして接続する場合は次のようにcx_Oracle.SYSDBAフラグを立てます。

conn = cx_Oracle.connect('sys', 'secret', '172.22.0.54/orcl.kawasaki.nkjmkzk.com', cx_Oracle.SYSDBA)

さらに例外処理をきちんと行う場合は下記のようにtry:配下に置き、cx_Oracle.DatabaseErrorの例外を拾うようにします。

try:
    conn = cx_Oracle.connect('scott', 'tiger', '172.22.0.54/orcl.kawasaki.nkjmkzk.com')
except cx_Oracle.DatabaseError,cx_msg:
    print "[ERROR] Failed to connect to Database."
    print "[ERROR cx_Oracle] %s" % cx_msg

* エラーメッセージがcx_msgに代入される

これでデータベースへのセッションが確立されました。次にデータベースに命令を発行しています。
まずはテーブルを作成してみましょう。

先ほど作成したコネクションオブジェクトからカーソルオブジェクトを作成します。これは呪文だと思って実行してください。

cur = conn.cursor()

SQL文を定義してexecute()を発行すればSQL文がデータベースで実行されます。ちなみにSQL文は末尾にセミコロンを入れてはいけません。

sql = "CREATE TABLE TEST_TABLE (COL1 NUMBER)"
cur.execute(sql)

こちらも例外処理を行うには下記のようにtry:配下に置きます。

sql = "CREATE TABLE TEST_TABLE (COL1 NUMBER, COL2 VARCHAR(64))"
try:
    cur.execute(sql)
except cx_Oracle.DatabaseError,cx_msg:
    print "[ERROR] Failed to execute SQL: " + sql
    print "[ERROR cx_Oracle] %s" % cx_msg

データを3件ほどインサートします。デフォルトでは自動でコミットされません。明示的にconn.commit()でコミットする必要があります。

sql = "INSERT INTO TEST_TABLE VALUES (1, 'apple')"
cur.execute(sql)
sql = "INSERT INTO TEST_TABLE VALUES (2, 'orange')"
cur.execute(sql)
sql = "INSERT INTO TEST_TABLE VALUES (2, 'lemon')"
cur.execute(sql)
conn.commit()

データを取得します。データの取得には主にfetchall(), fetchmany(), fetchone()のいずれかを使うことになると思いますが、ここではfetchallを使用しています。fetchallは全検索結果を行を一つのタプルとしてその配列を返します。

sql = "SELECT * FROM TEST TABLE"
cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    print row[0],
    print row[1]

とりあえずここで紹介したメソッドが使えればアプリケーションで求められる基本的な操作はカバーできてしまうかも。

without comments

Written by 中嶋 一樹

5月 29th, 2011 at 1:11 pm

Posted in Uncategorized

Tagged with , ,

pythonからOracleに接続するための拡張モジュール、cx_Oracleのインストール方法

*太古の昔に書いたエントリをリバイスしました。

pythonスクリプトからOracle Databaseに接続するための実装(モジュール)はいくつかあるようですが、いわゆるデファクトっぽいのがcx_Oracleというモジュール。ドキュメント、ダウンロード先等は下記を参照ください。

僕はソースをとってきてインストールすることにしました。OSはOracle Linux 5.6 x86_64。Redhat EnterpriseLinux, CentOS, Scientific Linux等でも確認はしてませんが同じ手順でいけるはずです。コンパイルにはソフトウェア要件としてpython-develとOracle Databaseのクライアントライブラリがインストールされている必要があります。python-develはup2dateやyumコマンドでレポジトリが引っ張ってこれます。

[root@~]# yum install python-devel

レポジトリが登録されていない!という人は下記のコマンドでpublic-yumを登録してください。

[root@~]# cd /etc/yum.repos.d
[root@~]# wget http://public-yum.oracle.com/public-yum-el5.repo
[root@~]# vi public-yum.el5.repo
[ol5_u6_base]
name=Oracle Linux $releasever - U6 - $basearch - base
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL5/6/base/$basearch/
gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-el5
gpgcheck=1
enabled=1
[root@~]# yum install python-devel

Oracle DatabaseのクライアントライブラリはすでにそのOS上にOracle Databaseがインストールされていれば$ORACLE_HOME/libに存在します。クライアント側にOracle Databaseなんてインストールしねぇよ!、という場合はOracle Instant Clientをインストールします。これはフリーで利用可能です。RPMをダウンロードしてインストールしてください。

ダウンロード:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

[roo@~]# rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm

そして上記ライブラリが$ORACLE_HOMEと$LD_LIBRARY_PATHに含まれていることが必要です。Oracle Instant Clientの場合は/usr/lib/oracle/11.2/client64が$ORACLE_HOMEとなり、その下の/usr/lib/oracle/11.2/client64/libを$LD_LIBRARY_PATHに含めます。

[root@~]# export ORACLE_HOME=/usr/lib/oracle/11.2/client64
[root@~]# export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:$LD_LIBRARY_PATH

まずtarボールを/var/opt等に保存して展開。

# tar xvfz cx_Oracle-5.1.tar.gz
# cd cx_Oracle-5.1/

そしてビルド&インストール。

[root@~]# python setup.py build
[root@~]# python setup.py install

これだけでOK。cx_Oracle.soが/usr/lib64/python2.4/site-packages/にインストールされています。

あとはpythonスクリプトの中で、

import cx_Oracle

とすればcx_Oracleのモジュールがロードできるはずです。

$LD_LIBRARY_PATHは忘れないうちにoracleユーザあたりの.bash_profileに登録しておきましょう。

with 3 comments

Written by 中嶋 一樹

5月 29th, 2011 at 1:07 pm

Posted in Uncategorized

Tagged with , ,

新しいRAC VM Templateでノード追加

現在RAC(Real Application Clusters)のVM Templateは下記3つがリリースされています。

  • 11.2.0.2 x86_64
  • 11.2.0.1 x86_64
  • 11.1.0.1 x86_64

この内、新しい11.2.0.xのVM Templateではいくつか機能が追加されてきています。新機能の1つとして、「ノード追加」がサポートされています。

詳しい手順はこちらのREADMEのAppendix Bにまとめられています。

ですがREADMEは英語ということもあり、こちらにも手順を記載しておきます。

まずは2ノードのRACが構築されていることが前提です。つまりbuildcluster.shを流し終わった後でこの手順を開始してください。

3ノード目のVMをVM Templateから作成します。

VMが作成されたら既存のRACに割り当てているのと同じ構成で共有ディスクを割り当てます。(Enterprise Manager 11g VM Management Packの場合はVM作成途中に共有ディスクの割り当てまで行えます)

VMを起動します。そしてVNCコンソールで接続し、次のようなプロンプトが表示されたら「OUT」と入力します。

Is this the first node in the cluster (YES/NO): [OUT]

OSが完全に起動しますのでrootユーザでログインします。デフォルトパスワードはovsrootです。

次に仮でネットワークアドレスを割り振ります。これは一時的なもので構いません。設定ファイルを既存RACから転送するためです。

[root@node3]# ifconfig [IP ADDRESS] netmask [NETMASK]

既存のRACノードからnode3にnetconfig.iniファイルを転送します。

[root@node3]# scp node1:/u01/racovm/netconfig.ini /u01/racovm

netconfig.iniファイルを編集してnode3のエントリを追記します。IPアドレスやノード名は環境に応じて変更してください。

NODE1=node1
NODE1IP=10.185.147.58
NODE1PRIV=node1-priv
NODE1PRIVIP=192.168.12.58
NODE1VIP=node1-vip
NODE1VIPIP=10.185.147.59
NODE2=node2
NODE2IP=10.185.147.60
NODE2PRIV=node2-priv
NODE2PRIVIP=192.168.12.60
NODE2VIP=node2-vip
NODE2VIPIP=10.185.147.61
NODE3=node3
NODE3IP=10.185.147.62
NODE3PRIV=node3-priv
NODE3PRIVIP=192.168.12.62
NODE3VIP=node3-vip
NODE3VIPIP=10.185.147.63

# Common data
PUBADAP=eth0
PUBMASK=255.255.248.0
PUBGW=10.185.144.1
PRIVADAP=eth1
PRIVMASK=255.255.255.0
RACCLUSTERNAME=db-cluster
DOMAINNAME=jp.oracle.com
DNSIP=10.185.147.20

# Device used to transfer network information to second node
# in interview mode
NETCONFIG_DEV=/dev/xvdc
# 11gR2 specific data
SCANNAME=db-cluster
SCANIP=

node3でrootユーザでnetconfig.shスクリプトを実行してネットワーク設定をnetconfig.iniに基づいて再設定します。このスクリプトをネットワーク設定を変更するので必ずコンソール接続で実施してください。SSH等ではセッションが途中で切れてしまいます。

[root@node3]# /u01/racovm/netconfig.sh -n 3

次にnode3のnetconfig.shを既存のRACノードにコピーします。

[root@node3]# scp /u01/racovm/netconfig.ini node1:/u01/racovm/
[root@node3]# scp /u01/racovm/netconfig.ini node2:/u01/racovm/

そして最後に既存のRACノード上でracovm.shスクリプトを実行してノード追加を行います。node3の部分は追加されるノード名です。環境に合わせて変更してください。

[root@node1]# cd /u01/racovm
[root@node1]# ./racovm.sh -S addnodes -N node3 2>&1 | tee addnode3.log

手元の環境では約10分程でノード追加が完了しました。自動的に3ノード目でもASM, DBのインスタンスが起動し、3ノードのRACが動き出します。

with one comment

Written by 中嶋 一樹

11月 4th, 2010 at 11:08 am

Posted in Uncategorized

Tagged with ,

Oracle Database 11.2.0.2公開 ACFSの新機能を少し紹介

ひっそりとOracle Database 11.2.0.2が公開されました。ひっそりと公開している割には新機能が結構あります。Databaseに連動してASM/ACFSが含まれるGrid Infrastructureもアップデートされています。特にACFSの新機能について独断と偏見で選んだ目玉を3つ紹介します。

  • 暗号化

ACFSに格納するデータをリアルタイムに暗号化します。

  • レプリケーション

リモートのACFSにデータを非同期レプリケートします。Data GuardのようにTransaction LogならぬReplication Logを転送することでレプリケーションを実現しています。レプリケートは手動で止めたり、再開したりできます。ただ、暗号化とは併用できないのでご注意を。

  • Solaris対応

ついにSolarisにもACFSがキマシタ。ZFSが超イケてるファイルシステムなのは言うまでもないですがACFSが使えるようになったことで、複数のSolarisノード間でクラスターファイルシステムが構成できるようになり、分散ストレージ環境(Storage GRID)でのデータの共有が簡単に実現できます。

*理論的にはローカルHDD/SSDをZFSからiSCSIでエクスポートして、相互にiSCSIログインしてそれをASMのDISKGROUPとすればストレージ無しで冗長性のあるクラスターファイルシステムを構成するというワケのわからない構成も可能かも。でも相互依存が強過ぎてリブートとかできなくなるのでやめときましょう。

*そういうことをするときはVMでストレージノードとサーバノードを分けるのがオススメです。サポート云々は抜きにして。

新機能の完全なリストと使い方はこちら。

What’s new in Oracle Automatic Storage Management ?

without comments

Written by 中嶋 一樹

9月 14th, 2010 at 10:41 pm

Posted in Uncategorized

Tagged with , ,

phpからASMを管理するためのパッチ

phpからOracleを操作するときは一般的にoci8というAPI群を使います。Oracleに管理者としてログインする際、sqlplusだとconnect /as sysdbaするのはご存知の通りですが、このoci8からOracleに管理者権限接続する際には下記のようにOCI_SYSDBAというフラグを立てて接続することが必要です。
$conn = oci_connect('user', 'password', 'node/service', '', OCI_SYSDBA);
同様にASMに管理者としてログインする際、sqlplusだとconnect /as sysasmすることが必要ですが、このoci8からASMに管理者権限で接続するためのOCI_SYSASMというフラグがないということに気付きました。つまり、phpからASMを管理できないじゃないか、ということになります。
こりゃ困った、ということでいろいろ悩んだ結果、phpにOCI_SYSASM接続モードを勝手に実装することにしました。結果幸運にもphpのソースをちょこっといじるだけでOCI_SYSASM接続モードのサポートをphpに組み込むことができましたのでそれをパッチとして公開しておきます。
php-sysasm.patch
phpのバージョンは5.3.2に対応していますが、多分oci8ってそれほど更新されていないと思うので他のバージョンでもそれほど古くなければ適用可能じゃないかと思います。パッチ適用及びphpのビルド、インストールは下記の手順をご参考に(configureオプションは最小限ですので適宜追加してください)。
[root@~]# tar xvfj php-5.3.2.tar.bz2
[root@~]# cd php-5.3.2/ext/oci8/
[root@~]# patch < /PATH/TO/php-sysasm.patch
[root@~]# cd ../../
[root@~]# ./configure --with-oci8
[root@~]# make
[root@~]# make install

ASMインスタンスへの接続は下記のようにOCI_SYSASMフラグを指定して接続します。

$conn = oci_connect('user', 'password', 'node/service', '', OCI_SYSASM);

without comments

Written by 中嶋 一樹

6月 24th, 2010 at 7:34 am

Posted in Uncategorized

Tagged with , ,

11g RAC on VM Certified !!!!

RAC on VM構成でサポートされるDatabaseに11g R1が加わりました!!

これで現時点でRAC on VMでサポートされるDatabase, OS, Oracle VMは以下の通りとなりました。
Oracle Database
  • 10.2.0.4 32bit
  • 10.2.0.4 64bit
  • 11.1.0.7 32bit (New !!!!)
  • 11.1.0.7 64bit (New !!!!)
OS:
  • OELまたはRHELの準仮想化マシン 5.1以上
Oracle VM
  • 2.1.2以上

ますます盛り上がってきています、RAC onVM。

*昨日のOracle Directセミナーもたくさんの方々にご参加いただきました。有難うございます!

without comments

Written by 中嶋 一樹

7月 29th, 2009 at 1:06 pm

Posted in Uncategorized

Tagged with ,

いよいよOracle Open World Tokyo

いよいよOracle Open World Tokyoが来週開催されます。

http://www.oracle.co.jp/openworld/2009/index.html

お申し込みがまだの方は是非!招待コード「3769」で事前登録すれば無料で入場できます。

僕は最終日の24日 15:30 -のセッション、「SS03-151 低コストと高可用性にとことんこだわったOracle VM環境構築」に登壇します。まだ少しだけ席があるようなので是非ご来場ください!

without comments

Written by 中嶋 一樹

4月 18th, 2009 at 3:07 pm

Posted in Uncategorized

Tagged with

Oracle DatabaseとphpでOPAL環境を構築する

昨日はOracle Database XEの紹介とインストール手順を解説しました。

今日はそのXEを使ってOPAL環境を構築したいと思います。OPALとはかなりマイナーな略式名称ですが、Oracle Database, PHP, Apache, Linuxで構成するWeb+DBのスタックのことです。いわゆるアレです、LAMP(Linux, Apache, MySQL, PHP)みたいなもんです。というか平たく言えばパクリでしょう。*ちなみに「P」はPHP,Python,Perlのどれか。

昨日まででLinuxとOracle Databaseのインストールは済んでいるという前提で、その同じマシンにApacheとPHPをインストール/セットアップしていきましょう。それぞれ今日現在で最新のhttpd-2.2.10とphp-5.2.8を使用します。

まずはApacheですがこれは簡単、というかとくにOPALだからといって特別な手順やオプションはありません。普通にコンパイルしてインストールします。

# tar xvfj httpd-2.2.10.tar.bz2
# cd httpd-2.2.10/
# ./configure ¥
--prefix=/srv/httpd ¥ #適当に置き換えてください
--enable-so #多分デフォルト有効なのでいらないと思われますが一応
# make
# make install

終了ーー。では次にphpのインストールへ。

# tar xvfj php-5.2.8.tar.bz2
# cd php-5.2.8/

次のコンフィグが結構ミソです。phpからOracleに接続するにはOCI (Oracle Call Interface) を使うのが一般的かつ、性能面、機能面で最適な方法と言われています。ただしこれにも2種類あって、PDO_OCIと普通のOCI8というのがあります。実際、よりup-to-dateなドライバはOCI8になります。PDO_OCIの方はMySQLやPostgreSQLに接続する際でも統一されたインターフェースを提供してくれるいわゆる抽象化ドライバです。なので一見こいつをつかっといた方が後でDBを切り替えることがあった際に便利なのですが、残念ながら最近このPDO_OCIはメンテナンスされておらず、OCI8で実装されているBugFixや機能拡張などが反映されていません。なのでOracle一筋な方は迷わずOCI8を選択してください。そしてこのOCI8を使用するにはコンフィグ時に--with-oci8オプションを指定しておく必要があります。ちなみにPDO_OCIの方は--with-pdo-ociとします。一応こいつも入れておいてやろう。

# ./configure ¥
--prefix=/srv/php ¥ #適当に置き換えてください
--with-apxs2=/srv/httpd/bin/apxs ¥ #Apacheをインストールした場所によって置き換えてください
--with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ¥ # $ORACLE_HOMEを指定します。
--with-pdo-oci=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server ¥ # 同じく$ORACLE_HOMEを指定します。
--with-gd ¥
--with-gettext ¥
--disable-short-tags ¥
--enable-pdo ¥
--enable-mbstring ¥
--enable-exif ¥
--enable-sigchild

これでOK。ビルドしていきます。

# make
# make install

これでバイナリがインストールされました。次に設定ファイルを作成します。テンプレートがあるのでそれをコピーして少しだけ編集(追記)します。

# cp php.ini-recommended /srv/php/lib/php.ini
# vi /srv/php/lib/php.ini
extension_dir=/srv/php/lib/php/extensions/no-debug-non-zts-20060613
extension=oci8.so

あと、httpd.confにも少し手を入れます。以下を最後の方にでも追記してください。

# vi /srv/httpd/conf/httpd.conf
AddType application/x-httpd-php .php 
AddType application/x-httpd-php .phtml 
AddType application/x-httpd-php-source .phps 

これでOKです。なお、今更ですがSE Linuxとかが有効になっているとphpのモジュールをロードする際にエラーになっていまうので/etc/selinux/configでSELINUX=disabledにしておいてください。もうこれで使える状態にあるのですが、実はこのphpのソースにバンドルされているOCI8は結構古かったりします。気持ち悪いので最新版にアップデートしておきたいところです。というわけでPECLから最新のソースをとってきます。

# wget http://pecl.php.net/get/oci8-1.3.4.tgz
# tar xvfz oci8-1.3.4.tgz
# cd  oci8-1.3.4/
# /srv/php/bin/phpize
# ./configure --with-oci8=shared,/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
# make
# make install

これでばっちりです。最新のモジュールが/srv/php/lib/php/extensions/no-debug-non-zts-2006061にインストールされました。あとはapachectl startするだけです。ちなみに一応ちゃんとOCI8がインストールされているか確認するためにphpinfo()を活用しましょう。Apacheのドキュメントルートに以下の様にファイルを作成します。

# vi /srv/httpd/htdocs/phpinfo.php
<?php
phpinfo();
?>

そしてこのサーバにアクセスしましょう。


http://あなたのIPアドレス/phpinfo.php

するとこんな画面が出てくるはずです。

下の方にスクロールしていき・・・

ありましたね。よかったよかった。ひとまずこれでセットアップは完了です。

ちなみに今回のようなOPAL環境の構築について、佐藤さんがいち早く良いドキュメントを紹介されています。

http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf

英語にはなってしまうのですがこれははっきり言ってかなりの良書です。Oracle好きだけどJavaはちょっと、という僕のような人にはたまらない感じです。

with one comment

Written by 中嶋 一樹

12月 14th, 2008 at 7:49 pm

Posted in Uncategorized

Tagged with , ,