Ever want to just install the minimal amount of Oracle client software for client applications on Linux? Well, Oracle has provided Oracle Instant Client to do this but they have neglected to make it intuitive to install. I’ve written a couple scripts that make it easy on Linux. I’ve tested this on Ubuntu Linux 8.04 Server JEOS.
Download the files you need
Download Oracle Instant Client
Retrieve the Instant Client packages and save them to a directory (e.g. “linux 32bit”).
- Instant Client Package – Basic
- Instant Client Package – JDBC Supplement
- Instant Client Package – SQL*Plus
- Instant Client Package – SDK
- Instant Client Package – ODBC
Download DBD::Oracle and place it in the build-cfg directory
Copy your tnsnames.ora file into the build-cfg directory
Download build_oracle_instantclient.sh into the directory above build-cfg directory
Save root.sh into the build-cfg directory
Build a tar ball containing everything we need in the directory format we need.
Script1: build_oracle_instantclient.sh
BUILD_DIR=builddir
CFG_DIR=build-cfg
if [[ -z $1 ]]
then
echo "Usage: build_oracle_instantclient.sh <directory containing oracle instant client zip files>"
exit 1
fi
if [[ ! -d "${SOURCE_DIR}" ]]
then
echo "${SOURCE_DIR} is not a directory"
exit 1
fi
find "${SOURCE_DIR}" -name "*.zip" -type f -exec unzip {} \;
if [[ -d instantclient_11_1 ]]
then
TMP_DIR=instantclient_11_1
elif [[ -d instantclient_10_2 ]]
then
TMP_DIR=instantclient_10_2
else
echo "unable to determine extraction dir"
exit 1
fi
if [[ -d ${BUILD_DIR} ]]
then
rm -rf ${BUILD_DIR}
fi
mkdir -p ${BUILD_DIR}
mkdir -p ${BUILD_DIR}/bin
mkdir -p ${BUILD_DIR}/doc
mkdir -p ${BUILD_DIR}/java
mkdir -p ${BUILD_DIR}/lib
cp ${CFG_DIR}/* ${BUILD_DIR}
mv ${TMP_DIR}/*README* ${BUILD_DIR}/doc
mv ${TMP_DIR}/*.html ${BUILD_DIR}/doc
mv ${TMP_DIR}/*.htm ${BUILD_DIR}/doc
mv ${TMP_DIR}/lib* ${BUILD_DIR}/lib
mv ${TMP_DIR}/*.jar ${BUILD_DIR}/java
mv ${TMP_DIR}/sdk ${BUILD_DIR}
mv ${TMP_DIR}/* ${BUILD_DIR}/bin
cd ${BUILD_DIR}/lib
ln -s libclntsh.so.* libclntsh.so
ln -s libocci.so.* libocci.so
ln -s libsqora.so.* libsqora.so
cd ..
tarball=`echo ${SOURCE_DIR} | tr ‘ ‘ ‘-’`
tarball=`basename ${tarball}`
tarball=Oracle-${TMP_DIR}-${tarball}
tar cvf – * | gzip -9c > "../${tarball}.tgz"
cd ..
rm -rf ${BUILD_DIR} ${TMP_DIR}</directory>
Once we have the tar ball, we can copy that file to any compatible Linux system, extract it and run the root.sh file which will copy the install to /usr/local/oracle/InstantClient, set up the system variables and build DBD::Oracle for you.
Script2: root.sh
############################################
function copy_instantclient () {
if [[ `pwd` != "/usr/local/oracle/InstantClient" ]]
then
if [[ ! -d /usr/local/oracle/InstantClient ]]
then
echo "Creating /usr/local/oracle/InstantClient directory"
mkdir -p /usr/local/oracle/InstantClient
fi
echo "Copying Oracle Instant Client to /usr/local/oracle/InstantClient"
cp -Ra * /usr/local/oracle/InstantClient
fi
}
#———
function update_etc_profile () {
if [[ -f /etc/profile ]]
then
if [[ `grep -c "ORACLE_HOME" /etc/profile` = 0 ]]
then
echo "Updating /etc/profile"
cat >> /etc/profile < < EOF
export ORACLE_HOME=/usr/local/oracle/InstantClient
export TNS_ADMIN=\${ORACLE_HOME}
export PATH=\${ORACLE_HOME}/bin:\${PATH}
export CLASSPATH=\${ORACLE_HOME}/classes:\${CLASSPATH}
export LD_LIBRARY_PATH=\${ORACLE_HOME}/lib:\${LD_LIBRARY_PATH}
export SQLPATH=\${ORACLE_HOME}/bin
EOF
else
echo "Updates to /etc/profile already applied"
fi
fi
}
#———
function update_library_cache () {
if [[ -d /etc/ld.so.conf.d ]]
then
if [[ -f /etc/ld.so.conf.d/oracle_instant_client.conf
&& `grep -c "/usr/local/oracle/InstantClient" /etc/ld.so.conf.d/oracle_instant_client.conf` != 0 ]]
then
echo "Updates to /etc/ld.so.conf.d/oracle_instant_client.conf already applied"
else
echo "Updating /etc/ld.so.conf.d/oracle_instant_client.conf"
echo "/usr/local/oracle/InstantClient" > /etc/ld.so.conf.d/oracle_instant_client.conf
/sbin/ldconfig
fi
else
if [[ `grep -c "/usr/local/oracle/InstantClient" /etc/ld.so.conf` == 0 ]]
then
echo "Updating /etc/ld.so.conf"
echo "/usr/local/oracle/InstantClient" > /etc/ld.so.conf
/sbin/ldconfig
else
echo "Updates to /etc/ld.so.conf already applied"
fi
fi
}
#———
function print_env () {
echo "Add the following to the rc.d script for any daemon processes that need to access Oracle. For example, apache"
echo ‘ export ORACLE_HOME=/usr/local/oracle/InstantClient
export TNS_ADMIN=${ORACLE_HOME}
export PATH=${ORACLE_HOME}/bin:${PATH}
export CLASSPATH=${ORACLE_HOME}/classes:${CLASSPATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
export SQLPATH=${ORACLE_HOME}/bin’
}
#———
function install_DBD-Oracle () {
echo "Building DBD::Oracle"
DBDORA=`ls DBD-Oracle-*`
if [[ -f ${DBDORA} ]]
then
tar zxf ${DBDORA}
cd DBD-Oracle*
TMP_DBDORA=`pwd`
TMP_DBDORA=`basename ${TMP_DBDORA}`
perl Makefile.PL -m $ORACLE_HOME/sdk/demo/demo.mk
make && make install
cd ..
rm -rf ${TMP_DBDORA}
else
echo "Unable to find DBD-Oracle file"
fi
}
############################################
export ORACLE_HOME=/usr/local/oracle/InstantClient
export TNS_ADMIN=${ORACLE_HOME}
export PATH=${ORACLE_HOME}/bin:${PATH}
export CLASSPATH=${ORACLE_HOME}/classes:${CLASSPATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
export SQLPATH=${ORACLE_HOME}/bin
copy_instantclient
update_etc_profile
update_library_cache
print_env
install_DBD-Oracle



