VirtualBox中的Debian安装Oracle 19c备忘

1、软件版本说明

VirtualBox 6.0,建立虚拟机,4G内存,2个CPU,80G磁盘,开启端口映射2222到22

Debian 9.8,下载网络安装版,地址:http://mirrors.163.com/debian-cd/9.8.0/amd64/iso-cd/debian-mac-9.8.0-amd64-netinst.iso,安装分区为三个,/boot分区1G,采用ext4,开启bootable,swap分区8G,剩余磁盘分给/,也是ext4。镜像使用mirrors.163.com,软件包只选SSH server、standard system utilities,没有桌面环境。

Oracle 19c,下载地址:https://edelivery.oracle.com

2、参考文献

https://askubuntu.com/questions/1121649/how-to-install-oracle-18c-enterprise-edition-on-ubuntu-18-04

如果无法显示图片,则需要爬墙,感谢作者Marmayogi。

3、安装前准备

$ su

添加i386体系结构

$ dpkg --add-architecture i386

更改debian源

$ vi /etc/apt/sources.list

deb http://mirrors.163.com/debian/ stretch main non-free contrib
deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib

$ apt update

安装一些必要工具

$ apt install sudo vim net-tools unzip
$ echo 'oracle ALL=(ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers

安装oracle必须的软件包

$ apt install build-essential libaio1 libaio-dev libstdc++5 default-jdk nscd ndctl

rpm实际用途不大,此处省略安装,使用sh脚本欺骗oracle

$ vi /usr/bin/rpm

#!/bin/sh

for x in $*; do
  pkg=$x
done

if ([ $pkg = "redhat-release" ])
then
  echo "7.6"
  exit 0
elif ([ $(echo $pkg | awk '{s=substr($0,0,1);print s;}') = "-" ])
then
  echo ""
  exit 0
else
  echo "no package provides ${pkg}"
  exit 1
fi

$ chmod +x /usr/bin/rpm
$ ln -s /usr/bin/rpm /bin/rpm

建立软链接

$ mkdir /usr/lib64
$ ln -s /usr/bin/awk /bin/awk
$ ln -s /usr/bin/rpm /bin/rpm
$ ln -s /usr/bin/basename /bin/basename
$ ln -s /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a /usr/lib64/
$ ln -s /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64/
$ ln -s /usr/lib/x86_64-linux-gnu/libndctl.so.6.10.1 /usr/lib64/libndctl.so
$ ln -s /usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0 /usr/lib64/libnuma.so
$ ln -s /usr/lib/x86_64-linux-gnu/crti.o /usr/lib64/
$ ln -s /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib64/
$ ln -s /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib64/

创建oracle用户组与用户

$ groupadd oinstall
$ groupadd dba
$ groupadd oper
$ groupadd backupdba
$ groupadd dgdba
$ groupadd kmdba
$ groupadd racdba
$ useradd -d /home/oracle -m -s /bin/bash -g oinstall -G dba,oper,backupdba,dgdba,kmdba,racdba oracle
$ mkdir -p /opt/oracle/app/oracle/product/dbhome
$ chown -R oracle:oinstall /opt/oracle
为oracle用户设置密码
$ passwd oracle

禁止透明大页(Transparent Huge Pages)

$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
$ echo never > /sys/kernel/mm/transparent_hugepage/defrag
$ vi /etc/systemd/system/disable-thp.service

# ---------------------------------------------------
# Disable THP in Ubuntu 18.04:
# ---------------------------------------------------
[Unit]
Description=Disable Transparent Huge Pages (THP)
[Service]
Type=simple
ExecStart=/bin/sh -c "echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled && echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload
$ systemctl start disable-thp
$ systemctl enable disable-thp

更改IP地址

$ vi /etc/hosts

127.0.0.1 debian
替换成
10.0.2.15 debian

IP地址由ifconfig获得

更改内核配置

$ cat >> /etc/sysctl.conf << EOT
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 1048576
kernel.shmmax = 4294967296
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
net.ipv4.ip_local_port_range = 9000 65500
EOT

更改资源限制

$ cat >> /etc/security/limits.conf << EOT
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728
oracle soft memlock 134217728
EOT

$ echo 'session required pam_limits.so' >> /etc/pam.d/login
$ echo 'session required pam_limits.so' >> /etc/pam.d/common-session
$ echo 'session required pam_limits.so' >> /etc/pam.d/common-session-noninteractive
$ echo 'session required pam_limits.so' >> /etc/pam.d/su

设置环境变量

$ cat >> /etc/profile << EOT
export TMP=/tmp
export TMPDIR=\$TMP
export ORACLE_HOSTNAME=debian
export ORACLE_UNQNAME=oracdb
export ORACLE_BASE=/opt/oracle/app
export ORACLE_HOME=\$ORACLE_BASE/oracle/product/db
export ORACLE_BASE_HOME=\$ORACLE_HOME
export ORACLE_SID=oracdb
export DB_UNIQUE_NAME=oracdb
export ORACLE_OWNER=oracle
export PATH=\$PATH:\$ORACLE_HOME/bin
export LD_LIBRARY_PATH=/lib:/usr/lib:\$ORACLE_HOME/lib
export CLASSPATH=\$ORACLE_HOME/jlib:\$ORACLE_HOME/rdbms/jlib
EOT

重启虚拟机

4、安装数据库软件

使用xshell的sftp协议将下载的oracle 19c压缩文件V981623-01.zip上传到虚拟机,sftp设置登录账号为oracle

切换到ssh
$ su - oracle
$ unzip -d $ORACLE_HOME V981623-01.zip
$ chmod -R 775 /opt/oracle

建立fix脚本

$ mkdir ~/scripts
$ vi ~/scripts/omkfix.sh

#!/bin/sh
# Change the path below to point to your installation
# /etc/profile的环境变量中已经设置ORACLE_HOME,这里就不重复设置了
# export ORACLE_HOME=/oracle18c/app/oracle/product/18.0.0/dbhome_1
# make changes in orld script
sed -i 's/exec gcc "\$@"/exec gcc -no-pie "\$@"/' $ORACLE_HOME/bin/orald
# Take backup before committing changes
cp $ORACLE_HOME/rdbms/lib/ins_rdbms.mk $ORACLE_HOME/rdbms/lib/ins_rdbms.mk.back
cp $ORACLE_HOME/rdbms/lib/env_rdbms.mk $ORACLE_HOME/rdbms/lib/env_rdbms.mk.back
cp $ORACLE_HOME/network/lib/env_network.mk $ORACLE_HOME/network/lib/env_network.mk.back
cp $ORACLE_HOME/srvm/lib/env_srvm.mk $ORACLE_HOME/srvm/lib/env_srvm.mk.back
cp $ORACLE_HOME/crs/lib/env_has.mk $ORACLE_HOME/crs/lib/env_has.mk.back
cp $ORACLE_HOME/odbc/lib/env_odbc.mk $ORACLE_HOME/odbc/lib/env_odbc.mk.back
cp $ORACLE_HOME/precomp/lib/env_precomp.mk $ORACLE_HOME/precomp/lib/env_precomp.mk.back
cp $ORACLE_HOME/ldap/lib/env_ldap.mk $ORACLE_HOME/ldap/lib/env_ldap.mk.back
cp $ORACLE_HOME/ord/im/lib/env_ordim.mk $ORACLE_HOME/ord/im/lib/env_ordim.mk.back
cp $ORACLE_HOME/ctx/lib/env_ctx.mk $ORACLE_HOME/ctx/lib/env_ctx.mk.back
cp $ORACLE_HOME/plsql/lib/env_plsql.mk $ORACLE_HOME/plsql/lib/env_plsql.mk.back
cp $ORACLE_HOME/sqlplus/lib/env_sqlplus.mk $ORACLE_HOME/sqlplus/lib/env_sqlplus.mk.back
cp $ORACLE_HOME/bin/genorasdksh $ORACLE_HOME/bin/genorasdksh.back
#
# make changes changes in .mk files
#
sed -i 's/\$(ORAPWD_LINKLINE)/\$(ORAPWD_LINKLINE) -lnnz19/' $ORACLE_HOME/rdbms/lib/ins_rdbms.mk
# 如果安装oracle 18c,则改成-lnnz18
sed -i 's/\$(HSOTS_LINKLINE)/\$(HSOTS_LINKLINE) -lagtsh/' $ORACLE_HOME/rdbms/lib/ins_rdbms.mk
sed -i 's/\$(EXTPROC_LINKLINE)/\$(EXTPROC_LINKLINE) -lagtsh/' $ORACLE_HOME/rdbms/lib/ins_rdbms.mk
sed -i 's/\$(OPT) \$(HSOTSMAI)/\$(OPT) -Wl,--no-as-needed \$(HSOTSMAI)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(OPT) \$(HSDEPMAI)/\$(OPT) -Wl,--no-as-needed \$(HSDEPMAI)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(OPT) \$(EXTPMAI)/\$(OPT) -Wl,--no-as-needed \$(EXTPMAI)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(SPOBJS) \$(LLIBDMEXT)/\$(SPOBJS) -Wl,--no-as-needed \$(LLIBDMEXT)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk

sed -i 's/\$(S0MAIN) \$(SSKRMED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKRMED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSBBDED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSBBDED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSKRSED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKRSED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SKRNPT)/\$(S0MAIN) -Wl,--no-as-needed \$(SKRNPT)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSTRCED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSTRCED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSTNTED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSTNTED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSKFEDED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKFEDED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk

sed -i 's/\$(S0MAIN) \$(SSKFODED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKFODED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSKFNDGED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKFNDGED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSKFMUED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKFMUED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSKFSAGED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKFSAGED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(DBGVCI)/\$(S0MAIN) -Wl,--no-as-needed \$(DBGVCI)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(DBGUCI)/\$(S0MAIN) -Wl,--no-as-needed \$(DBGUCI)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/\$(S0MAIN) \$(SSKECED)/\$(S0MAIN) -Wl,--no-as-needed \$(SSKECED)/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk

sed -i 's/^\(ORACLE_LINKLINE.*\$(ORACLE_LINKER)\) \($(PL_FLAGS)\)/\1 -Wl,--no-as-needed \2/g' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/^\(TNSLSNR_LINKLINE.*\$(TNSLSNR_OFILES)\) \(\$(LINKTTLIBS)\)/\1 -Wl,--no-as-needed \2/g' $ORACLE_HOME/network/lib/env_network.mk
sed -i 's/\$LD \$1G/$LD -Wl,--no-as-needed \$LD_RUNTIME/' $ORACLE_HOME/bin/genorasdksh
sed -i 's/\$(GETCRSHOME_OBJ1) \$(OCRLIBS_DEFAULT)/\$(GETCRSHOME_OBJ1) -Wl,--no-as-needed \$(OCRLIBS_DEFAULT)/' $ORACLE_HOME/srvm/lib/env_srvm.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/rdbms/lib/env_rdbms.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/crs/lib/env_has.mk;
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/odbc/lib/env_odbc.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/precomp/lib/env_precomp.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/srvm/lib/env_srvm.mk;
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/network/lib/env_network.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/ldap/lib/env_ldap.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/ord/im/lib/env_ordim.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/ctx/lib/env_ctx.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/plsql/lib/env_plsql.mk
sed -i 's/LDDISABLENEWDTAGS=-Wl,--disable-new-dtags/LDDISABLENEWDTAGS=-Wl,--no-as-needed,--disable-new-dtags/' $ORACLE_HOME/sqlplus/lib/env_sqlplus.mk

$ chmod +x ~/scripts/omkfix.sh
$ . ~/scripts/omkfix.sh

执行抛出两个错误,可以忽略:

cp: cannot stat '/opt/oracle/app/oracle/product/db/ord/im/lib/env_ordim.mk': No such file or directory
sed: can't read /opt/oracle/app/oracle/product/db/ord/im/lib/env_ordim.mk: No such file or directory

应该是19c里没有这个文件,感谢Marmayogi提供这么详尽的脚本,不然安装中途去修改mk文件让人很别扭。

清空临时目录下的文件,开始安装软件。

$ rm -rf /tmp/*
$ cd $ORACLE_HOME
$ ./runInstaller -silent  -force -noconfig -ignorePrereq \
oracle.install.option=INSTALL_DB_SWONLY \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=/opt/oracle/oraInventory \
ORACLE_HOME=$ORACLE_HOME \
ORACLE_BASE=$ORACLE_BASE \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSOPER_GROUP=oper \
oracle.install.db.OSBACKUPDBA_GROUP=backupdba \
oracle.install.db.OSDGDBA_GROUP=dgdba \
oracle.install.db.OSKMDBA_GROUP=kmdba \
oracle.install.db.OSRACDBA_GROUP=racdba \
oracle.install.db.rootconfig.executeRootScript=true \
oracle.install.db.rootconfig.configMethod=ROOT \
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE \
oracle.install.db.config.starterdb.globalDBName=oracdb \
oracle.install.db.config.starterdb.SID=oracdb \
oracle.install.db.ConfigureAsContainerDB=true \
oracle.install.db.config.PDBName=orapdb \
oracle.install.db.config.starterdb.characterSet=AL32UTF8 \
oracle.install.db.config.starterdb.memoryOption=true \
oracle.install.db.config.starterdb.memoryLimit=2048 \
oracle.install.db.config.starterdb.installExampleSchemas=true \
oracle.install.db.config.starterdb.password.ALL=123456 \
oracle.install.db.config.starterdb.managementOption=CLOUD_CONTROL \
oracle.install.db.config.starterdb.enableRecovery=true \
oracle.install.db.config.starterdb.storageType=FILE_SYSTEM_STORAGE \
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=$ORACLE_BASE/oradata \
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=$ORACLE_BASE/fast_recovery_area

[WARNING] [INS-13013] Target environment does not meet some mandatory requirements.

可以忽略,那是oracle在检测必要的软件包,虽然rpm欺骗了Oracle的OS检测,但是软件包毕竟不是通过yum安装的,所以rpm无法检测

 

5、设置监听

$ vi $ORACLE_HOME/assistants/netca/netca.rsp

#修改两个选项
SHOW_GUI=false
LOG_FILE=""/opt/oracle/app/cfgtoollogs/netca/netca.log""

$ netca -silent -responsefile $ORACLE_HOME/assistants/netca/netca.rsp
$ lsnrctl status

6、创建数据库实例

如果是Ubuntu,则需重建链接库,否则sqlplus / as sysdba会有lost contact错误,导致无法建库,错误提示为:

[DBT-05509] Failed to connect to the specified database (oracdb)

OS Authentication might be disabled for this database (oracdb)

解决办法:

$ rm $ORACLE_HOME/lib/stubs/libc*
$ relink all

然后开始创建数据库实例

$ dbca -silent -createDatabase -responseFile NO_VALUE \
-gdbName oracdb \
-sid oracdb \
-databaseConfigType SI \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName orapdb \
-pdbAdminPassword 123456 \
-templateName General_Purpose.dbc \
-sysPassword 123456 \
-systemPassword 123456 \
-emConfiguration DBEXPRESS \
-emExpressPort 5500 \
-datafileJarLocation {ORACLE_HOME}/assistants/dbca/templates \
-datafileDestination {ORACLE_BASE}/oradata/{DB_UNIQUE_NAME} \
-recoveryAreaDestination {ORACLE_BASE}/fast_recovery_area/{DB_UNIQUE_NAME} \
-storageType FS \
-characterSet AL32UTF8 \
-listeners LISTENER \
-sampleSchema true

7、检测oracle

$ ps -ef | grep ora_ | grep -v grep
$ lsnrctl status
$ netstat -tnpl
$ sqlplus / as sysdba

PS:Oracle 18c的安装没有这么复杂,下载oracle 18c for linux的rpm文件,然后转成deb文件

$ apt install alien
$ alien -k --scripts oracle-database-ee-18c-1.0-1.x86_64.rpm
$ dpkg -i oracle-database-ee-18c-1.0-1_amd64.deb
$ apt-get -f -y install
$ /etc/init.d/oracledb_ORCLCDB-18c configure

2020除夕PS:

Debian 10无法使用zip文件安装,只能用rpm转deb文件。问题就是netca时,抛出端口已被占用的错误,实际没有哪个程序占用1521端口,并且分别用C与JAVA写了程序监听1521端口,都没有问题。而且oracle安装日志最后显示端口监听成功,偏偏就是检测时发现端口占用。lsnrctl start也无法启动,真是活见鬼了。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值