この記事について
OracleDatabaseClient19cをサイレントインストールを用いて配布する方法のまとめです。
OracleDatabaseはサーバー上にあり、中身が同じクライアント環境を複数箇所で作成することを想定しています。
普通にやると詰まる箇所があったので、その回避方法も紹介しています。
①Oracleのファイルを配布先へコピー
Oracle公式などから取得したOracleClientのファイルを配布元サーバーに配置し、配布先へコピーします。
USBなどに入れて直接コピーしてもいいですが、以下のように配布用batファイルを作成すると手間が省けます。
@echo off
xcopy "配布元フォルダディレクトリ" "配布先フォルダディレクトリ" /S /C /E /Q /H /R /Y
rem 配布元ディレクトリでは、以下の配布ファイルイメージが格納されているフォルダを指定すればおkです。
rem 例:"\\servername\c$\Database_Client"
rem 配布先ディレクトリでは、存在していないフォルダを指定すると自動生成してくれるxcopyの性質を利用してフォルダ作成とコピーを同時に行います。
rem 例:"C:\Oracle\product\19.3.0\client_1\"
②レジストリに値を格納
19cからの変更点なのかは不明ですが、このままサイレントインストールを実行すると、、
[FATAL] java.lang.NullPointerException
が出てしまい、インストールが失敗します。
このエラーの解決の為にはレジストリエディターなどから事前に特定の値を設定しておく必要があります。
手動で追加する場合とBatファイルを配布して自動で行い場合の2パターンを紹介します。
Batファイルでレジストリを追加する場合
以下のBatファイルでレジストリの値をチェックし、レジストリに指定の値が存在していない場合に追加、既に存在している場合は何も実行せず終了出来ます。
@echo off
echo レジストリの設定を開始します。
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" > nul 2>&1
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" )
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /v "inst_loc" > nul 2>&1
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /V "inst_loc" /d "C:\Program Files\Oracle\Inventory"
echo レジストリの設定が完了しました。何かキーを押すとプログラムが終了します。
pause > nul) else ( echo 既にレジストリが設定されているため、Batファイルの起動は不要です。何かキーを押すとプログラムが終了します。
pause > nul
exit /b
)
rem 32bit版の場合は(86)を追加して"C:\Program Files (x86)\Oracle\Inventory"としてください。
手動でレジストリを追加する場合
③指定の位置にORACLEキーを追加
場所:HKEY_LOCAL_MASHINE\SOFTWARE\WOW6432Node
WOW6432Nodeを右クリック→新規→キー→Oracleと入力→Enter
④追加したORACLEキーにInventoryの値を格納
ORACLEを右クリック→新規→文字列値→inst_locと入力→Enter→Inst_locを右クリック→修正→C:\Program Files\Oracle\Inventoryと入力(32bit版の場合はC:\Program Files (x86)\Oracle\Inventory)→Enter
③レスポンスファイルの作成
サイレントインストールで必要になる、Oracle_BASEやOracle_HOMEなどの設定情報を格納したレスポンスファイルの作成をします。
レスポンスファイルはsetup.exeをGUIで起動して基本情報を入力して進めた後、以下の画面で「レスポンス・ファイルの保存」を選択することによって簡単に作成出来ます。
しかし、19cではなぜかレスポンスファイルの情報が抜け落ちている場合があるので、メモ帳などで開いて値を追加する必要があります。
以下の例では、ORACLE_BASEしか情報がないので、その下にORACLE_HOME=C:\Oracle\product\19.3.0\client_1を追加して上書き保存
④サイレントインストール用Batファイルの作成
以下のようにBatファイルを作成するとサイレントインストールが実行出来ます。
@echo off
"C:\Oracle\product\19.3.0\client_1\setup.exe" -silent -responseFile "C:\Users\hoge\Desktop\client.rsp"
pause
rem pause入れないと実行後にエラーが出ていても画面が閉じてしまうので一応入れています。
-silent -responseFileの指定は必須で、次に紹介するコマンドを追加して様々な動きを加える事も可能です。(-debugはエラーが出たときに原因を追えるので便利)
サイレントインストール時に指定出来るコマンド一覧
ヘルプを表示する
-help
サイレントモードで実行する
-silent
レスポンスファイルの指定
-responseFile -レスポンスファイルの完全パス(C:\Users\hoge\Desktop\client.rspとか)
表示するメッセージログの指定(指定した優先度レベルまでのメッセージログを有効に出来る)
-logLevel -優先度の指定
【指定出来る優先度】
severe,warning,info,config,fine,finer,finest
インストールされたホームに構成ツールを実行
-executePrereqs
デバッグモードで実行
-debug
ディスクの使用状況に関するデバッグ情報をログに記録
-printdiskusage
メモリー使用量に関するデバッグ情報をログに記録
-printmemory
時間の使用状況に関するデバッグ情報をログに記録
-printtime
完了するまでプロンプトが返ってこないようにする
-waitForCompletion
構成ツールを実行しない
-noconfig
メッセージをコンソールに表示しない
-noconsole
内部ドライバエラーを無視して実行
ignoreInternalDriverError
Oracleホームにリリース更新を適用
-applyRU
個別パッチをOracleホームに適用
-applyOneOffs -個別パッチを指定(カンマ区切りで複数指定可能)
⑤まとめ
これまでのBatは一つのファイルに合体させて使うと便利です。
実際使う際にはsqlnet.oraとtnsnames.oraも必要になると思うので、それらのコピーも兼ねて作ると以下のようになります。
@echo off
rem Oracleファイルのコピー
xcopy "配布元フォルダディレクトリ" "配布先フォルダディレクトリ" /S /C /E /Q /H /R /Y
rem ディレクトリの設定
echo レジストリの設定を開始します。
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" > nul 2>&1
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" )
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /v "inst_loc" > nul 2>&1
if ERRORLEVEL 1 ( REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE" /V "inst_loc" /d "C:\Program Files\Oracle\Inventory"
echo レジストリの設定が完了しました。
) else ( echo 既にレジストリが設定されています。)
rem OracleClientのサイレントインストール
"C:\Oracle\product\19.3.0\client_1\setup.exe" -silent -responseFile "C:\Users\hoge\Desktop\client.rsp"
pause
rem エラーが出た場合に確認する必要がなく、一切操作したくない場合はpauseを消してもいい
rem sqlnet.oraとtnsnames.oraのコピー
xcopy "コピー元\sqlnet.ora" "C:\Oracle\product\19.3.0\client_1\network\admin\" /C /Q /H /R /Y
xcopy "コピー元\tnsnames.ora" "C:\Oracle\product\19.3.0\client_1\network\admin\" /C /Q /H /R /Y