from time to time I am testing different flavors of linux on my workstation/laptop. this time it is fedora 20 (kde edition). tried to install oracle 12c with my simple script and ups:
****** *** creating database
SQL*Plus: Release 12.1.0.1.0 Production on Thu Jan 2 17:19:07 2014
Copyright (c) 1982, 2013, Oracle. All rights reserved.
ERROR:
ORA-12547: TNS:lost contact
the script does not work anymore. what happened? the problem is with the linking phase, reproducable by:
[oracle@localhost ~]$ /opt/oracle/product/base/12.1.0.1/bin/relink all
writing relink log to: /opt/oracle/product/base/12.1.0.1/install/relink.log
tail -100 /opt/oracle/product/base/12.1.0.1/install/relink.log
.....
/usr/bin/ld: /opt/oracle/product/base/12.1.0.1/lib//libnls12.a(lxhclrs.o): undefined reference to symbol '__tls_get_addr@@GLIBC_2.3'
/usr/bin/ld: note: '__tls_get_addr@@GLIBC_2.3' is defined in DSO /lib64/ld-linux-x86-64.so.2 so try adding it to the linker command line
/lib64/ld-linux-x86-64.so.2: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make: *** [/opt/oracle/product/base/12.1.0.1/rdbms/lib/rman] Error 1
Error in invoking target 'irman ioracle' of makefile '/opt/oracle/product/base/12.1.0.1/rdbms/lib/ins_rdbms.mk'. See '/opt/oracle/product/base/12.1.0.1/install/relinkActions2014-01-02_05-24-05-PM.log' for details.
asking my favorite search engine gave the right answer
so, here is an updated version of the script which works for fedora20 ( keep in mind that fedora is not supported ):
#!/bin/bash
##################################################
# CONFIGURATION SECTION #
##################################################
# ** location of the database source files
SOURCEPATH=/home/dwe/Downloads
# ** name of the first source file
SOURCE1=linuxamd64_12c_database_1of2.zip
# ** name of the second source file
SOURCE2=linuxamd64_12c_database_2of2.zip
# ** working directory for extracting the source
WORKDIR=/opt/oracle/stage
# ** the oracle top directory
ORATOPDIR=/opt/oracle
# ** the oracle inventory
ORAINVDIR=${ORATOPDIR}/oraInventory
# ** the ORACLE_BASE to use
ORACLE_BASE=${ORATOPDIR}/product/base
# ** the ORACLE_HOME to use
ORACLE_HOME=${ORACLE_BASE}/12.1.0.1
# ** base directory for the oracle database files
ORABASEDIR=/oradata
# the ORACLE_SID to use
ORACLE_SID=orcl
# ** the owner of the oracle software
ORAOWNER=oracle
# ** the primary installation group
ORAINSTGROUP=oinstall
# ** the dba group
ORADBAGROUP=dba
# ** the oper group
ORAOPERGROUP=oper
# ** the backup dba group
ORABACKUPDBA=backupdba
# ** the dataguard dba group
ORADGBAGROUP=dgdba
# ** the transparent data encryption group
ORAKMBAGROUP=kmdba
##################################################
# MAIN SECTION #
##################################################
PFILE=${ORACLE_HOME}/dbs/init${ORACLE_SID}.ora
# print the header
_header() {
echo "*** ---------------------------- ***"
echo "*** -- starting oracle 12c setup ***"
echo "*** ---------------------------- ***"
}
# print simple log messages to screen
_log() {
echo "****** $1 "
}
# check for the current os user
_check_user() {
if [ $(id -un) != "${1}" ]; then
_log "you must run this as ${1}"
exit 0
fi
}
# create the user and the groups
_create_user_and_groups() {
_log "*** checking for group: ${ORAINSTGROUP} "
getent group ${ORAINSTGROUP}
if [ "$?" -ne "0" ]; then
/usr/sbin/groupadd ${ORAINSTGROUP} 2> /dev/null || :
fi
_log "*** checking for group: ${ORADBAGROUP} "
getent group ${ORADBAGROUP}
if [ "$?" -ne "0" ]; then
/usr/sbin/groupadd ${ORADBAGROUP} 2> /dev/null || :
fi
_log "*** checking for group: ${ORAOPERGROUP} "
getent group ${ORAOPERGROUP}
if [ "$?" -ne "0" ]; then
/usr/sbin/groupadd ${ORAOPERGROUP} 2> /dev/null || :
fi
_log "*** checking for group: ${ORABACKUPDBA} "
getent group ${ORABACKUPDBA}
if [ "$?" -ne "0" ]; then
/usr/sbin/groupadd ${ORABACKUPDBA} 2> /dev/null || :
fi
_log "*** checking for group: ${ORADGBAGROUP} "
getent group ${ORADGBAGROUP}
if [ "$?" -ne "0" ]; then
/usr/sbin/groupadd ${ORADGBAGROUP} 2> /dev/null || :
fi
_log "*** checking for group: ${ORAKMBAGROUP} "
getent group ${ORAKMBAGROUP}
if [ "$?" -ne "0" ]; then
/usr/sbin/groupadd ${ORAKMBAGROUP} 2> /dev/null || :
fi
_log "*** checking for user: ${ORAOWNER} "
getent passwd ${ORAOWNER}
if [ "$?" -ne "0" ]; then
/usr/sbin/useradd -g ${ORAINSTGROUP} -G ${ORADBAGROUP},${ORAOPERGROUP},${ORABACKUPDBA},${ORADGBAGROUP},${ORAKMBAGROUP} \
-c "oracle software owner" -m -d /home/${ORAOWNER} -s /bin/bash ${ORAOWNER}
fi
}
# create the directories
_create_dirs() {
_log "*** creating: ${WORKDIR} "
mkdir -p ${WORKDIR}
chown ${ORAOWNER}:${ORAINSTGROUP} ${WORKDIR}
_log "*** creating: ${ORATOPDIR} "
mkdir -p ${ORATOPDIR}
chown ${ORAOWNER}:${ORAINSTGROUP} ${ORATOPDIR}
_log "*** creating: ${ORACLE_BASE} "
mkdir -p ${ORACLE_BASE}
chown ${ORAOWNER}:${ORAINSTGROUP} ${ORACLE_BASE}
_log "*** creating: ${ORACLE_HOME} "
mkdir -p ${ORACLE_HOME}
chown ${ORAOWNER}:${ORAINSTGROUP} ${ORACLE_HOME}
_log "*** creating: ${ORABASEDIR} "
mkdir -p ${ORABASEDIR}
chown ${ORAOWNER}:${ORAINSTGROUP} ${ORABASEDIR}
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID} "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}
chown ${ORAOWNER}:${ORAINSTGROUP} ${ORABASEDIR}/${ORACLE_SID}
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/rdo1 "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/rdo1
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/rdo2 "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/rdo2
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/dbf "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/dbf
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/arch "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/arch
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/admin "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/admin
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/admin/adump "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/admin/adump
_log "*** creating: ${ORABASEDIR}/${ORACLE_SID}/pdbseed "
mkdir -p ${ORABASEDIR}/${ORACLE_SID}/pdbseed
chown -R ${ORAOWNER}:${ORADBAGROUP} ${ORABASEDIR}/${ORACLE_SID}
}
# extract the source files
_extract_sources() {
cp ${SOURCEPATH}/${SOURCE1} ${WORKDIR}
cp ${SOURCEPATH}/${SOURCE2} ${WORKDIR}
chown ${ORAOWNER}:${ORAINSTGROUP} ${WORKDIR}/*
_log "*** extracting: ${SOURCE1} "
su - ${ORAOWNER} -c "unzip -d ${WORKDIR} ${WORKDIR}/${SOURCE1}"
_log "*** extracting: ${SOURCE2} "
su - ${ORAOWNER} -c "unzip -d ${WORKDIR} ${WORKDIR}/${SOURCE2}"
}
# install required software
_install_required_software() {
_log "*** installing required software "
yum install -y binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh \
libgcc libstdc++ libstdc++-devel libaio libaio-devel libXext libXtst libX11 libXau libxcb libXi make sysstat
}
# install oracle software
_install_oracle_software() {
_log "*** installing oracle software"
su - ${ORAOWNER} -c "cd ${WORKDIR}/database; ./runInstaller oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_BASE=${ORACLE_BASE} \
ORACLE_HOME=${ORACLE_HOME} \
UNIX_GROUP_NAME=${ORAINSTGROUP} \
oracle.install.db.DBA_GROUP=${ORADBAGROUP} \
oracle.install.db.OPER_GROUP=${ORAOPERGROUP} \
oracle.install.db.BACKUPDBA_GROUP=${ORABACKUPDBA} \
oracle.install.db.DGDBA_GROUP=${ORADGBAGROUP} \
oracle.install.db.KMDBA_GROUP=${ORAKMBAGROUP} \
FROM_LOCATION=../stage/products.xml \
INVENTORY_LOCATION=${ORAINVDIR} \
SELECTED_LANGUAGES=en \
oracle.install.db.InstallEdition=EE \
DECLINE_SECURITY_UPDATES=true -silent -ignoreSysPrereqs -ignorePrereq -waitForCompletion"
${ORAINVDIR}/orainstRoot.sh
${ORACLE_HOME}/root.sh
}
# create a very minimal pfile
_create_pfile() {
_log "*** creating pfile "
echo "instance_name=${ORACLE_SID}" > ${PFILE}
echo "db_name=${ORACLE_SID}" >> ${PFILE}
echo "db_block_size=8192" >> ${PFILE}
echo "control_files=${ORABASEDIR}/${ORACLE_SID}/rdo1/control01.ctl,${ORABASEDIR}/${ORACLE_SID}/rdo2/control02.ctl" >> ${PFILE}
echo "sga_max_size=512m" >> ${PFILE}
echo "sga_target=512m" >> ${PFILE}
echo "diagnostic_dest=${ORABASEDIR}/${ORACLE_SID}/admin" >> ${PFILE}
echo "audit_file_dest=${ORABASEDIR}/${ORACLE_SID}/admin/adump" >> ${PFILE}
echo "enable_pluggable_database=true" >> ${PFILE}
}
# create the database
_create_database() {
_log "*** creating database "
# escaping the dollar seems not to work in EOF
echo "alter pluggable database pdb\$seed close;" > ${ORABASEDIR}/${ORACLE_SID}/admin/seedhack.sql
echo "alter pluggable database pdb\$seed open;" >> ${ORABASEDIR}/${ORACLE_SID}/admin/seedhack.sql
su - ${ORAOWNER} -c "export ORACLE_HOME=${ORACLE_HOME};export LD_LIBRARY_PATH=${LD_LIBRARY_PATH};export PATH=${ORACLE_HOME}/bin:${PATH};export ORACLE_SID=${ORACLE_SID};export PERL5LIB=${ORACLE_HOME}/rdbms/admin; sqlplus / as sysdba <> /home/${ORAOWNER}/.bash_profile
echo "ORACLE_HOME=${ORACLE_HOME}" >> /home/${ORAOWNER}/.bash_profile
echo "ORACLE_SID=${ORACLE_SID}" >> /home/${ORAOWNER}/.bash_profile
echo "LD_LIBRARY_PATH=${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}" >> /home/${ORAOWNER}/.bash_profile
echo "PATH=${ORACLE_HOME}/bin:${PATH}" >> /home/${ORAOWNER}/.bash_profile
echo "export ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH PATH" >> /home/${ORAOWNER}/.bash_profile
}
# fix for fedora 20
_fix_fedora_20() {
is_20=`cat /etc/fedora-release | grep Heisenbug`
if [ $? -eq "0" ]; then
_log "running on fedora 20 -> applying fix"
rm -f $ORACLE_HOME/rdbms/lib/config.o
mv $ORACLE_HOME/lib/stubs $ORACLE_HOME/lib/stubs_bak
sed 's/LINKTTLIBS\=\$(LLIBCLNTSH) \$(ORACLETTLIBS) \$(LINKLDLIBS)/LINKTTLIBS\=\$(LLIBCLNTSH) \$(ORACLETTLIBS) \$(LINKLDLIBS) -lons/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk > /tmp/env_rdbms.mk
cp /tmp/env_rdbms.mk $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed 's/LINK\=\$(FORT_CMD) \$(PURECMDS) \$(ORALD) \$(LDFLAGS) \$(COMPSOBJS)/LINK\=\$(FORT_CMD) \$(PURECMDS) \$(ORALD) \$(LDFLAGS) \$(COMPSOBJS) -Wl,--no-as-needed/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk > /tmp/env_rdbms.mk
cp /tmp/env_rdbms.mk $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed 's/LINK32\=\$(FORT_CMD) \$(PURECMDS) \$(ORALD) \$(LDFLAGS32) \$(COMPSOBJS)/LINK32\=\$(FORT_CMD) \$(PURECMDS) \$(ORALD) \$(LDFLAGS32) \$(COMPSOBJS) -Wl,--no-as-needed/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk > /tmp/env_rdbms.mk
cp /tmp/env_rdbms.mk $ORACLE_HOME/rdbms/lib/env_rdbms.mk
su - ${ORAOWNER} -c "export ORACLE_HOME=${ORACLE_HOME}; $ORACLE_HOME/bin/relink all"
fi
}
_header
_check_user "root"
_create_user_and_groups
_create_dirs
_install_required_software
_extract_sources
_install_oracle_software
######## fedora 20 fix
_fix_fedora_20
######################
_create_pfile
_create_database
_create_env