Casimir Saternos
2005年11月公開
OracleデータベースをLinuxにインストール、実行および管理するための基本的なbashシェル・スクリプトをいくつか学習します。
約7年前、OracleはLinuxで最初の商用データベースをリリースしました。それ以来、Oracle、Red HatおよびNovell/SUSEは、データベースやアプリケーションのパフォーマンスに関連するLinuxカーネルの変更について、着実にコラボレーションしてきました。そのため、Oracle Database 10g for Linuxには、オペレーティング・システムに密接に関連した拡張機能が含まれています。DBAは、これまで以上に、このプラットフォームに関する知識と経験を持ち、自分の監視下にあるシステムを最適に管理する必要があるのです。
システム管理者とDBAの間には、伝統的な責任の分担があります。ただし実際には、その分担が常に明確であるとは限りません。多くのIT企業は、データベースやオペレーティング・システムのレベルで問題に対処する人材を採用しています。もちろん、Oracle Database自体はオペレーティング・システム・リソースを使用し、環境と緊密に連携するように設計されています。
さらに、多くのシステム管理者やDBAは、自分の業務に関連するタスクの自動化の必要性や利便性を感じています。ソフトウェアのインストール、システム・リソースの監視、システムの管理など、反復が多くミスが起こりやすい作業は、手作業よりも自動化されたプロセスでの対応がより適しています。
このようなタスクを自動化するために使用される方法の1つは、シェルスクリプトです。シェルスクリプトは、インストール時から Linuxシステムで重要な役割を果たします。システムの起動および停止時に、さまざまなスクリプトが呼び出されます。Oracleおよびその他のサード・パーティ・ベンダーによるユーティリティは、シェル・スクリプトを介して起動されます。これらは短時間で開発できるため、従来の方法でアプリケーションのプロトタイピングに使用されています。システム管理者は、シェル・スクリプトの機能を利用して、監視下にあるシステムの特定の要件と特異性に合わせたソリューションを提供してきました。
この記事では、LinuxプラットフォームでのOracleデータベースのインストール、実行および保守に関連する"bash"シェル・スクリプトを介して利用可能な機能を紹介します。この記事は、Linuxスクリプトの初心者やLinuxに比較的慣れていないDBAを対象としているため、経験豊富なLinuxシステム管理者にとっては、この記事はあまり参考にならないかもしれません。
シェルスクリプトとは
シェルスクリプトは、一連のコマンドを含むテキストファイルです。file- or script- を実行すると、ファイルに含まれるコマンドが実行されます。シェルという用語は、Linuxカーネルとの通信に使用する特定のコマンド行ユーザーインタフェースを指します。Cシェル(csh)、Kornシェル(ksh)、Bourneシェル(sh)、Bourne- Againシェル(bash)など、いくつかの異なるシェルを使用できます。シェル自体は、ファイルまたはターミナルから行を読み取り、それを解釈し、一般的に他のコマンドを実行するコマンドです。Bourne-Againシェルは、前述の他のシェルの機能を取り入れたもので、この記事で紹介するスクリプトに使用されたものです。
スクリプトファイルの最初の行は、どのシェルを使ってスクリプトを実行するかを指示するために使用することができます。これは、すべてのスクリプトの例で見られる最初の行の意味です。
#!/bin/bash
シェルスクリプトを使用する理由
あなたの経験によっては、DBAの業務に関連するシェルスクリプトにすぐに価値を見いだせないかもしれません。UNIXやUNIXのようなシステムの経験がない場合、無数の暗号化されたコマンドに不安を感じるかもしれません。さらに、Oracle 10g はリレーショナルデータベースであることに加え、データベース内のデータを処理するための堅牢なプラットフォームと、データベース外のOSと対話するいくつかのメソッドを提供します。
しかし、シェルスクリプトの世界に足を踏み入れたのには、次のような理由があるからでしょう。
シェルスクリプトを使用しない場合
Oracle Databaseには、RDBMSの従来の定義を超える機能が含まれています。他のソフトウェアと同様に、オペレーティング・システムによって提供されるリソースを使用しますが、その環境は他のソフトウェアよりもはるかに高いレベルで「表示」および「変更」できます。SQLやOracleの固定ビューは、データベース内部からシステムを把握するのに対し、シェルスクリプトはデータベースの外側からシステムを把握するものです。シェル・スクリプトは、すべての問題を解決するものではありません。
オペレーティングシステムの多くの側面は、データベース内から監視・変更できることを認識することが重要です。オラクルの固定ビュー(接頭辞が v$ のビュー)を使用すると、マシンのホスト名(v$instance)またはデータベースが動作しているプラットフォーム名(v$database)を特定することができます。データベースに関連するファイルの場所やその他の属性も、この方法で特定することができます。データファイルの場所およびその他の属性(v$datafile、dba_data_files)、一時ファイル(v$tempfile、dba_temp_files)、REDOログ(v$logfile)、アーカイブ・ログ(v$archived_log)および制御ファイル(v$controlfile)は、データベースから直接問い合せることができます。このビューからフラッシュ・リカバリ領域($recovery_file_dest)に関する情報を確認したり、init.oraパラメータ(db_recovery_file_dest、db_recovery_file_dest_size)を確認したりできます。プロセス(v$process)やメモリ(v$sga, v$sgastat)などの状態も問い合わせることができます。様々な組込みのPL/SQLパッケージと、基礎となるOSへの追加アクセスを可能にするJavaおよびCデータベース・オブジェクトを作成する機能があります。
多数のデータベース・アクセスが必要なタスクのスクリプト化を検討している場合は、スクリプトが最適なオプションではない可能性があります。この記事の後半で、SQL*Plusを使ってデータベースにアクセスする方法の説明がありますが、多くの場合は、他の言語を使って課題にアプローチしたほうがよいでしょう。
以下の表は、データベースからアクセスできる情報をまとめたものです。
サーバーの識別 | 代表的なクエリ | 注記> |
---|---|---|
インスタンスが実行されているホスト名 |
|
この情報は、bashから次を実行して取得することもできます。
または
|
オペレーティング・システム・プラットフォーム |
|
uname - sを実行すると、同様の情報が返されます。 |
Oracleファイルの場所 | 代表的なクエリ | 注 |
---|---|---|
制御ファイル |
|
データベース制御ファイルの場所。init.oraパラメータcontrol_filesにも、この情報が含まれています。 |
データファイル |
|
データベース・データファイルの場所 |
一時ファイル |
|
データベース一時ファイルの場所 |
ログファイル |
|
REDOログの場所 |
アーカイブ済ログ |
|
アーカイブREDOログの場所。init.oraパラメータlog_archive_dest_nにも、この情報が含まれています。データベースがArchivelogモードでない場合、このクエリは結果を返しません。 |
フラッシュ・リカバリ領域 |
|
フラッシュ・リカバリ領域のOracle 10gインストールで使用されているディレクトリ。init.oraパラメータdb_recovery_file_destにも、この情報が含まれています。 |
パラメータで示されるファイルシステム上のその他のアクセスポイント |
|
この問合せの結果は、Oracle Databaseのインストールおよびバージョンによって大きく異なる場合があります。返されるパラメータは次のとおりです。 spfile standby_archive_dest utl_file_dir background_dump_dest user_dump_dest core_dump_dest audit_file_dest dg_broker_config_file1 dg_broker_config_file2 |
ファイル・システムへのプログラムによるアクセス | select directory_path from dba_directories |
Oracle UTL_FILE_DIRパラメータおよびDIRECTORYデータベース・オブジェクトを使用して、標準のデータベース機能の一部ではないファイルにアクセスできます。 |
プロセッサ/プロセス | 代表的なクエリ | 注 |
---|---|---|
セッション・プロセス |
|
spidをps–efの結果と相関させて、データベース内で利用可能な情報を特定のプロセスのOS情報と比較できます。 |
並列に関連するプロセス |
|
ロード、クエリ、オブジェクトの作成、リカバリ、レプリケーションなど、Oracle Databaseの多くの側面で並列処理を利用して、分解可能なアクティビティを高速化できます。パラメータparallel_threads_per_cpuは、インスタンスのデフォルトの並列度を設定します。 |
メモリ | 代表的なクエリ | 注 |
---|---|---|
プログラム・グローバル領域 | select * from V$PGASTAT |
パラメータpga_aggregate_targetは、すべての専用サーバー接続のメモリーを構成するために使用されます。 vmstatおよびtopを含む Linuxユーティリティーは、メモリー使用状況をモニターするために使用できます。 |
システム グローバル領域 | select * from v$sga |
パラメータSGA_MAX_SIZEおよびSGA_TARGETは、Oracle Database 10 gの動的メモリー割当て機能を構成するために使用されます。その他のパラメータを使用して、特定の目的でメモリーを手動で割り当てることができます。 また、メモリー割り当てをモニターするためにさまざまな Linuxユーティリティーを使用できます。 |
BASHスクリプト
スクリプトは、自動プロセスの一部として(人の介入なしで)呼び出されるか、プロンプトに応答してインタラクティブに実行されます。ファイルの実行可能権限があるかぎり、コマンドラインから名前を入力して実行できます。ファイルに対して実行可能権限がないが読取り権限がある場合は、sh
で前にスクリプトを実行できます。
スクリプトがユーザー入力なしで実行されるように設計されている場合は、そのスクリプトを呼び出すための複数のオプションを使用できます。次の形式でコマンドを入力して、スクリプトをバックグラウンドで実行し、切断しても続行できます。
nohup /path_to_dir/myscript_here.sh &
これは、完了に時間がかかるスクリプトを実行する場合に便利です。at
コマンドは、将来スクリプトを実行するために使用でき、cron
を使用してスクリプトを定期的に実行するようにスケジュールできます。
次の例では、(echo
を使用して)、ループ、条件付きロジックおよび変数割当てを表示する出力の基本的な側面について説明します。
print_args.sh。引数は、スクリプトに渡されるコマンド名の右側にある単語です。最初のパラメータにアクセスするには、$1
変数を使用します。$0
変数には、スクリプト自体の名前が含まれます。$#
変数には、スクリプト内の引数の数が含まれます。渡されるすべてのパラメータを反復する便利な方法は、while
ループおよびShiftコマンドの使用です。このコマンドを使用すると、(無限ループで残るのではなく)引数リスト内のすべての引数を反復処理できます。
while [ $# -ne 0 ]
do
echo $1
shift
done
スクリプトが引数としてファイル名を取得(またはユーザーにファイル名を要求)し、スクリプトの後半でファイルが読み取られる場合は、アクセス可能で読取り可能かどうかを確認することをお薦めします。たとえば、バックアップされた制御ファイルの選択を含むリカバリ・スクリプトでは、あとでファイルのリストアに使用される選択をユーザーに求めることがあります。
if [ ! -r $1 ]; then # not exists and is readable
echo "File $1 does not exist or is not readable."
exit;
fi
文字の順序
[ ! - r $1 ]の場合;
実際にテストを実行しています。大カッコ内の内容がtrueと評価されると、ifとfiの間に現れるコマンドが実行されます。実際のテストが括弧の間に表示されます。感嘆符は、実行しているテストの無効化させます。-r
オプションは、ファイルが読み取り可能かどうかをチェックします。この特定のケースでテストされる内容は、スクリプトに渡される最初の引数です。別のテスト(-d
)を使用すると、特定のエントリがディレクトリであるかどうかを確認できます(is_a_directory.shを参照)。
do_continue.shこの例は、さまざまな目的でユーザー入力を読み取るために使用できるコマンドの単純かつ代表的なシーケンスです。スクリプト内から判断できない特定の条件でデータ損失やその他の望ましくない結果になる可能性があるプロセスを実行する前に、ユーザーがスクリプトで次のコマンドを実行するかどうかを尋ねるプロンプトを含めることをお勧めします。次の例では、ユーザーが続行するかどうかを尋ね、コマンドラインからdoContinue
という名前の変数を読み取り、ユーザーが入力した内容を評価します。ユーザーがy以外の値を入力すると、そのユーザーはスクリプトがquittingであることが通知され、ifブロック(fi
)の最後に続く残りのスクリプトを実行せずに終了します。
doContinue=n
echo -n "Do you really want to continue? (y/n) "
read doContinue
if [ "$doContinue" != "y" ]; then
echo "Quitting..."
exit
fi
適切な権限と環境を持つユーザーのみが特定のスクリプトを実行することが不可欠です。スクリプトの有用なチェックインによって、スクリプトを実行しようとしているユーザーがテストされます。コマンドを逆引用符( ')文字で囲むと、コマンドの結果をスクリプトに戻すことができます。次の例では、whoami
を使用して現在ログインしているユーザーを取得し、スクリプトの後半でdateコマンドを使用して日付を表示します。
echo "You are logged in as ‘whoami‘";
if [ ‘whoami‘ != "oracle" ]; then
echo "Must be logged on as oracle to run this script."
exit
fi
echo "Running script at ‘date‘"
Oracle Databaseと対話するために書き込まれたスクリプトでは、データベース・パスワードなどの機密情報の入力が必要になることがあります。stty –echo
コマンドは、画面エコーをオフにして、後続のreadコマンドに入力された情報が画面に表示されないようにします。機密情報が変数(次の例ではpw
)で読み取られて格納された後、sttyエコーを使用して表示をオンに戻すことができます。
stty -echo
echo -n "Enter the database system password: "
read pw
stty echo
Oracle Scripts
一部のファイルは、特定の Oracleインストールの固定の場所にあります。/etc/oraInst.locファイルを表示して、Oracleインベントリを決定できます。/etc/oratabファイルは、サーバーにインストールされているデータベース(およびその他のOracleプログラム)を識別します。
get_inv_location.sh。このスクリプトは、前述の例よりも少し直感的です。スクリプトをコンポーネント・コマンドに分解すると、実行内容の理解が向上します。
インベントリの場所を決定するために、catコマンド(ファイルの内容を表示する)の結果をgrep (特定のパターンに一致する行を出力するユーティリティ)にパイプします。リテラルinventory_loc.
を含む行を検索しています
cat /etc/oraInst.loc | grep inventory_loc
複数のインストールによって複数のインベントリの場所がある場合は、#でコメントアウトされた行を除外する必要があります。- vオプションは、指定されたパターンを含む行を除外します。
cat /etc/oraInst.loc |grep - v "#"|grep inventory_loc
このコマンドの結果は次のようになります。
inventory_loc= /u01/oraInventory
>リダイレクションを使用して、標準出力をファイルにリダイレクトできます。ファイルが存在しない場合は作成されます。存在する場合は上書きされます。
cat /etc/oraInst.loc|grep - v "#"|grep inventory_loc > tmp
インベントリの場所を示すレコードがある場合は、等号の前にレコードの一部を削除します。今回は、catコマンドの結果をawk (可変長フィールドを分割するために使用されることが多いパターンスキャンおよび処理言語)にパイプして、基本的に文字列をトークン化します。–F
オプションは、区切り文字として等号を使用するようにawkに指示します。次に、この文字列の2番目のトークン($2
)を出力します。これは、等号の右にあるすべてです。その結果が、インベントリの場所(/u01/oraInventory)になります。
cat tmp | awk - F= '{print $2}'
一時ファイル(tmp)を残す理由は特にないので、削除してもかまいません。
rm tmp
list_oracle_homes.sh特定のデータベースのORACLE_HOMEを決定する場合は、いくつかのオプションがあります。データベース・ユーザーとしてログオンし、$ORACLE_HOME変数をecho
できます。/etc/oratabファイルを検索して、特定のインスタンスに関連付けられている名前を選択することもできます。このファイルのデータベース・エントリの形式
$ORACLE_SID:$ORACLE_HOME:<N|Y>:
次の1行で、TESTDBのORACLE_SIDを含むエントリのORACLE_HOMEが出力されます。
cat /etc/oratab | awk - F: '{if ($1= = "TESTDB") print $2 }'
しかし、/etc/orainst ファイルに記載されている各 ORACLE_HOME に対して操作を行う必要があるという要件がある場合はどうでしょうか。次のコード・スニペットを使用して、このようなリストを繰り返すことができます。
dblist=‘cat /etc/oratab | grep -v "#" | awk -F: '{print $2 }'‘
for ohome in $dblist ; do
echo $ohome
done
dblist
変数は配列として使用されています。すべてのORACLE_HOMEパスは、この変数によって保持されます。for
ループは、このリストの反復処理に使用され、各エントリは変数ohome
に割り当てられ、標準出力にエコーされます。
search_log.shOracle製品ではさまざまなログが生成されますが、それらを監視することに興味をお持ちかもしれません。データベース・アラート・ログには、データベース操作に不可欠なメッセージが含まれています。ログ・ファイルは、製品のインストールまたはアンインストール時およびパッチの適用時にも生成されます。次のスクリプトは、引数として渡されたファイルを反復します。ORA- を含む行が見つかった場合は、指定した受信者に電子メール・メッセージが送信されます。
cat $1 | grep ORA- > alert.err
if [ ‘cat alert.err|wc -l‘ -gt 0 ]
then
mail -s "$0 $1 Errors" administrator@yourcompany.com < alert.err
fi
実行される特定のテストは、ファイルのalert.errに存在する単語の数です。この数値は、alert.errにリダイレクトしたときに書き込まれます。単語数(wc
)がゼロ(-gt
)より大きい場合、ifブロックの内容が実行されます。この場合、mail
(send mail
も使用される可能性があります)を使用してメッセージを送信します。メッセージのタイトルには、実行されるスクリプト($0
)、検索されるログの名前($1
)、およびメッセージの本文として最初の検索(ORA-
)と一致した行が含まれます。
ORACLE_HOME、ORACLE_BASE、ORACLE_SIDなどの環境変数を使用して、Linux環境の固定の場所にないリソースを特定できます。Oracle E-Business Suite 11iアプリケーション・インスタンスを管理している場合は、リソースの検索に使用できる他の多数の環境変数があります。これには、APPL_TOP、TWO_TASK、CONTEXT_NAMEおよびCONTEXT_FILEが含まれます。環境内の完全なリストを表示するには、次のコマンドを実行して、結果のファイル(myenv.txt)を確認します。
env > myenv.txt
これらの環境変数は、検索するファイルの場所として使用できます。たとえば、アラート・ログの場所が次のように指定されている場合があります。
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log
このスクリプトで導入した原則に基づいて、アラート・ログ(または別の目的のファイル)の内容を検索し、エラーがある場合は電子メールを送信する間隔で、より大きなものを記述して実行するようにスケジュールできます。その後、ログの内容を別のファイルに移動できるため、最新のエラー・メッセージのみが電子メールで送信されます。
Oracle Recovery Manager Scripts.Oracle Recovery Manager (RMAN)は、データベースのバックアップおよびリカバリの管理に使用できるユーティリティです。これにより、すべてのバックアップ・スクリプトをRMANで実行できるように記述できるため、プラットフォーム固有のコードの量を削減できるため、複数のプラットフォームでの管理が大幅に簡略化されます。RMANは、基礎となるオペレーティング・システムによってコールされ、スクリプトを渡すことができます。たとえば、コールド(cold.sh)バックアップは次のスクリプトで構成できます。
#!/bin/bash
rman target / <<EOF
shutdown immediate;
startup mount;
backup spfile;
backup database;
alter database open;
delete noprompt obsolete;
quit;
EOF
1行目は、bashシェルを使用していることを示しています。2行目はOracle Recovery Managerを起動し、ターゲット・データベースへのOSユーザー・ログインを指定します(環境変数$ORACLE_SIDで指定)。この後の<<<<EOF
は、後続のコマンドがRMANに渡されて処理されることを示します。最後の行のEOFは、RMANに渡される一連のコマンドの最後に達したことを示します。その後、RMANを使用してデータベースの停止、データベースの起動およびマウントを行い、サーバー・パラメータ・ファイルおよびデータベースの内容のバックアップに進みます。その後、データベースがオープンされます。その後、保存ポリシーで指定したバックアップより古いバックアップは削除されます。お客様の状況に関連するバックアップを作成するには、RMANのドキュメントを参照してください。
通常、夜間バックアップはスケジュールされ、自動的に実行されます。前述のスクリプトをコールし、標準出力の内容を次のコマンドを使用して電子メール・アドレスに送信できます。
sh Cold.sh | mail - s"バックアップ'date'" administrator@yourcompany.com
他のOracleユーティリティもシェル・スクリプト内から実行できます。tnspingユーティリティを使用して、特定のOracle接続識別子がリスナーに接続できるかどうかを確認できます。このユーティリティーを実行して、接続の問題をチェックできます。
tnsping ptch04 |grep TNS-
データベースのエクスポートとインポート(従来のデータポンプ)も、繰り返しプロセスのスクリプトを作成するのに適しています。
データベースのインストール。データベースの設定に関連する多くの手順は自動化できます。Linuxに Oracle 10gをインストールする前に、さまざまなテストを実行して、必要なパッケージの最小バージョンとカーネルパラメータの設定を確認する必要があります。パッケージのバージョンを問い合せるには、rpm
コマンドを–q
オプションとともに使用します。
rpm - q comp- libstdc++
/procの"virtual"または"pseudo"ファイル・システムを参照して、システムの様々な側面を判断できます。これには実際のファイルではなく、ファイル内に存在しているかのように表示できる実行時システム情報が含まれます。たとえば、/proc/meminfoにはシステムのメモリー情報が含まれ、grep MemTotal /proc/meminfo
にはシステムの合計メモリーが表示されます。awk
を前述のように使用すると、次を使用してメモリー量をキロバイト単位で分離できます。
grep MemTotal /proc/meminfo | awk '{print $2}'
このようなコマンドは、比較を行い、それに応じて応答する(システム自体をアップデートする場合でも)スクリプトのコンテキストで使用できます。サンプル・スクリプトである10gchecks_kernel.shおよび10gchecks.shには、Oracleのドキュメントに基づいて現在および推奨されているバージョンと設定のみが表示されます。
データベースのモニタリング。ps
コマンドを使用して、プロセス・ステータスをレポートし、データベース、リスナー、スクリプトまたはその他のプロセスが実行されているかどうかを確認できます。サーバー上で現在実行されているすべてのデータベースをリストする場合は、次のコマンドを実行します。
echo "'ps - ef | grep smon|grep - v grep|awk '{print $8}'| awk - F \"_\" '{print$3}''"
これは機能しますが、一目で理解することは少し困難です。最初のコマンドps
(すべてのプロセスの完全なリストについては、-ef
オプションを使用して)は、サーバーで実行されているすべてのプロセスを検索します。次のgrep
は、データベースが実行中であることを示すSMON (Oracle System Monitorバックグラウンド・プロセス)を検索します。実行中のgrepコマンド自体を参照するエントリを削除します。次に、awk
を使用してリスト内の8番目の列を見つけ、システム・モニターのプロセス名がora_smon_<oracle_sid>の形式で含まれます。次に、awkの最後のインスタンスは、デリミタとしてアンダースコア文字を使用して、SMONプロセスを所有するデータベース名を検索して印刷します。アンダースコア文字を引用符で囲む必要があります。バックスラッシュは、これらの引用符をエスケープするために各引用符の前に使用されます(文字列全体が二重引用符で囲まれているためです)。
exec_sql.sh前述のように、ユーザーがsqlplusにアクセスできる場合は、シェル・スクリプトからデータベースを問い合せることができます。次の例では、データベース内のセッションを現在維持しているマシンの(スペース区切り)リストを返します。
#!/bin/bash
output=‘sqlplus -s "/ as sysdba" <<EOF
set heading off feedback off verify off
select distinct machine from v\\$session;
exit
EOF
‘
echo $output
このスクリプトは、別のプログラムにコマンドを入力する前のRMANスクリプトと似ています。ローカルのOS認証接続は、データベースに対してsysdbaとして行われます。余分なメッセージが返されないようにするために、このスクリプトはSQL*Plusの見出し、フィードバックおよび検証オプションをオフにします。問合せが実行され、SQL*Plusが終了します。
ビュー名のドル記号の前に二重バックスラッシュを書き留めます。これらは、文字列内の必要なエスケープ・シーケンスです。最初のスラッシュは、ドル記号をエスケープする2番目のスラッシュをエスケープします。またしても美しいとは言えませんが、機能性は高いと言えるでしょう。
前述のように、大規模なデータベース・アクセスが必要なものを記述する場合、シェル・スクリプトが最適なオプションとは限りません。PL/SQL、Perl (シェル・スクリプトで使用される構文と同様)、Python、Java、または選択した別の言語を使用するスクリプトをリライトすることをお薦めします。
結論
シェルスクリプトは、反復的でエラーが発生しやすい管理タスクをすばやく自動化する効果的なツールとなります。この記事の例は、利用可能性を紹介するものですが、包括的なものではありません。どのシステムにも特徴があり、固有の構成があります。管理者は、特定のシステムのニーズを満たすために独自のソリューションを開発する必要があるでしょう。
Casimir Saternosは、ペンシルベニア州アレンタウンを拠点とするOracle認定DBA、IBM Certified Enterprise DeveloperおよびSun Certified Javaプログラマーです。