Engineering Note

プログラミングなどの技術的なメモ

シェルスクリプトからSQLPLUSでOracleデータベースにアクセスする

dbicon

 プログラミング言語からデータベースにアクセスする際は、ドライバをインストールしたり何かと面倒ですが、Linux環境にSQLPLUSが入っていればシェルから手軽に起動し、データベースにアクセスすることができます。

今回はシェルを使いSQLPLUSからDBにアクセスする方法について学んでいきます。

 

 

事前準備

今回はCentOS7上にインストールしたOracle 12c R2を使い、その際に一緒にインストールされたSQLPLUSを使います。

シェルスクリプトの内容としては、

 

  • CDB上のリソース情報(プロセス数一覧)を取得する
  • リソース情報をログファイルに出力する
  • cronから1分周期で実行する
  • エラー時は別途エラーファイルに出力し、異常終了とする

 

のようなものを作成していきます。

 

シェルスクリプトの作成

それではスクリプトを作成していきます。

なお、SQLPLUSを単体でインストールした場合、cronから呼び出す際に共有ライブラリのパスが変わっている場合があるので、その際は別途exportが必要となります。

 

# check_db_resource.sh
#!/bin/bash

export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0.1/dbhome_1
export ORACLE_SID=orcl
export LANG=ja_JP.UTF-8
export NLS_LANG=Japanese_Japan.AL32UTF8
USER="sys"
PASS="oracle"
BASEDIR="/home/oracle"
DBLOGFILE="$BASEDIR/dbprocesses.log"
DBERRORFILE="$BASEDIR/dberror.log"
DB_CONNECT="${USER}/${PASS} as sysdba"
SQLPLUS="/opt/app/oracle/product/12.2.0.1/dbhome_1/bin/sqlplus"
HEAD="datetime,current_utilization,max_utilization,initial_allocation,limit_value"
ERRHEAD="datetime,error_message"
NOW=`date +"%Y%m%d-%H:%M:%S"`

RESULT=`$SQLPLUS -s $DB_CONNECT <<EOF
WHENEVER SQLERROR EXIT 1
SET HEAD OFF
SET TRIMS ON
SET TERMOUT OFF
SET FEEDBACK OFF
SET ECHO OFF

SELECT CURRENT_UTILIZATION || ',' || 
MAX_UTILIZATION  || ',' ||
TRIM(INITIAL_ALLOCATION)  || ',' ||
TRIM(LIMIT_VALUE)
FROM V\\$RESOURCE_LIMIT
WHERE RESOURCE_NAME = 'processes';

exit
EOF`

if [ $? -eq 1 ]; then
  if [ ! -f "$DBERRORFILE" ]; then
    echo $ERRHEAD > $DBERRORFILE
  fi
  ERRMSG=`echo "$RESULT" | awk ' /ORA-/ {print }'`
  echo "$NOW,$ERRMSG" >> $DBERRORFILE
  exit 1
fi

if [ ! -f "$DBLOGFILE" ]; then
  echo $HEAD > $DBLOGFILE
fi
RESULT=`echo $RESULT | sed -e "s/[\r\n]\+//g"`
echo "$NOW,$RESULT" >> $DBLOGFILE

 

動作確認

それでは、上記スクリプトをcronに追加して実行させます。

 

 # dbprocesses.log
 datetime,current_utilization,max_utilization,initial_allocation,limit_value
 20200718-23:07:01,51,66,300,300
 20200718-23:08:01,51,66,300,300

 

エラーが出た場合も以下に出力されていることが確認できます。

 # dberror.log
 datetime,error_message
 20200718-23:03:01,ORA-12162: TNS:net service name is incorrectly specified
 20200718-23:11:01,ORA-00942: 表またはビューが存在しません。

 

 

参考書籍

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界