oracle 19c不能直接编译安装,因其为闭源商业软件,仅提供预编译二进制包;实际需准备环境、解压官方包、运行静默或图形化安装器,并安装gcc等工具链以支撑安装器自身运行而非编译数据库。

不能直接编译安装 Oracle 19c —— 它不是开源软件,不提供源码,也没有 ./configure && make && make install 流程。你实际能做的,是正确准备环境、解压官方二进制包、运行静默安装脚本或图形化安装器。
为什么不能用 gcc 编译 Oracle 19c
Oracle 数据库是闭源商业软件,只分发预编译的 x86_64 二进制包(如 LINUX.X64_193000_db_home.zip)。它依赖大量私有符号、Oracle 自研链接器行为和特定版本的系统库(如 libpthread_nonshared.a),这些在统信UOS上并不存在标准路径或 ABI 兼容实现。
试图“编译 Oracle”本质是误解:你真正需要的是让它的二进制安装程序在 UOS 上跑通,而不是从 C 源码构建。
常见错误现象:
- 执行
runInstaller报错Unable to execute command 'gcc'—— 实际是 Oracle 安装器在检查环境,不是真要调 gcc 编译自己 - 解压后
./runInstaller启动黑屏或闪退 —— 缺少图形依赖(xorg-x11-utils、libXtst)或字体缓存未更新 -
makefile ... /usr/bin/ld: 找不到 -lclntshcore—— 不是链接失败,而是libpthread_nonshared.a未放对位置,或compat-libstdc++-33版本不匹配
必须安装的 GCC 相关组件(非用于编译 Oracle,而是支撑其安装器)
Oracle 安装过程会调用 gcc、ld、ar 等工具来构建监听器、网络库、补丁模块(如 OPatch 中的 emctl 重链接)。所以你要装的是工具链,不是为了编译 Oracle 本身。
在统信UOS V20(基于 Debian/Deepin)上,执行:
sudo apt update sudo apt install build-essential libaio1 libaio-dev ksh sysstat libnsl2 libnsl-dev xorg-x11-utils libxtst6 libxrender1 libxext6
特别注意:
-
build-essential提供gcc、g++、make、dpkg-dev—— 缺一不可,否则ins_rdbms.mk会报make: *** No rule to make target -
libaio1和libaio-dev必须同时存在;UOS 默认可能只装了 runtime 版,缺少.so符号链接 -
libnsl2是 glibc 2.34+ 后拆分出的独立包,Oracle 19c 仍硬依赖libnsl.so.1,需创建软链:sudo ln -sf /usr/lib/x86_64-linux-gnu/libnsl.so.2 /usr/lib/x86_64-linux-gnu/libnsl.so.1
关键补丁与 so 文件缺失导致的链接失败
统信UOS 的 glibc 和 libpthread 行为与 RHEL/CentOS 不同,Oracle 安装器在链接 libclntshcore 时会因找不到 libpthread_nonshared.a 直接中断。
解决方法(实测有效):
- 手动下载
libpthread_nonshared.a(注意架构匹配 x86_64),放到/usr/lib64/:sudo cp libpthread_nonshared.a /usr/lib64/ - 安装兼容包:
sudo apt install libstdc++6-8-dev(提供libstdc++.so.6兼容层),再软链:sudo ln -sf /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64/libstdc++.so.6 - 若仍报
-lclntshcore错误,在解压后的database目录下执行:find . -name "ins_rdbms.mk" -exec sed -i 's/-lclntshcore//g' {} \;(临时绕过,仅限测试环境)
静默安装前必须校验的三项系统参数
UOS 的默认内核参数远低于 Oracle 要求,不调整会导致数据库实例启动失败或共享内存分配异常。
编辑 /etc/sysctl.conf,追加以下三行(数值按实际内存比例调整,非固定):
kernel.shmmax = 8589934592 kernel.shmall = 2097152 fs.file-max = 6815744
然后立即生效:sudo sysctl -p
容易被忽略的点:
-
shmmax单位是 byte,不是 MB;设成4G写成4294967296,别写4096(那是 MB,会被当 byte) -
shmall必须 ≥shmmax / PAGE_SIZE(UOS 默认 page size 是 4096),算出来至少是 2097152 -
file-max影响监听器最大连接数,低于 6815744 时lsnrctl start可能卡住无响应
最后提醒一句:所有操作必须以 root 执行,但 Oracle 安装用户(oracle)的 home 目录权限必须是 755,且 ~oracle/.bash_profile 中的 ORACLE_HOME 路径不能包含软链接 —— 这一点在 UOS 上出错率极高,一旦用了 /u01/app/oracle/19c → /opt/oracle/19c 这类映射,dbca 创建数据库必失败。











