error while loading shared libraries: $ORACLE_HOME/lib/libnnz10.so: cannot restore segment prot afte

本文介绍在CentOS 64位系统中安装Oracle 11g时遇到的错误及解决方案。错误表现为加载共享库时权限被拒绝,通过调整文件的安全上下文成功解决问题。

在linux CentOS 64位机上安装完 oracle 11g以后,出现如下问题:

sqlplus: error while loading shared libraries: /home/zhang/app/zhang/product/11.2.0/dbhome_1/lib/libclntsh.so.11.1: cannot restore segment prot after reloc: Permission denied

 

解决方法:

#chcon -t texrel_shlib_t $ORACLE_HOME/lib/*.so

这个错误: ``` vi: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory ``` 表示系统在运行 `vi` 命令时,无法加载关键的共享库文件 `libc.so.6`。这个文件是 GNU C 库(glibc)的核心部分,几乎所有 Linux 程序都依赖它。 ### 错误原因分析 1. **`libc.so.6` 文件丢失或损坏** - 可能由于误删、文件系统损坏、不完整的系统更新等导致。 2. **动态链接器路径问题** - `ld-linux.so` 或 `LD_LIBRARY_PATH` 配置错误,导致系统找不到标准库路径。 3. **环境变量被污染** - 特别是在 Oracle 环境中,有时设置了错误的 `LD_LIBRARY_PATH`,覆盖了系统默认库路径。 4. **使用了非本机架构的二进制文件** - 比如在 x86_64 系统上运行了 i386 二进制但缺少兼容库,或反之。 5. **chroot 环境或容器中缺失基础库** - 如果你在容器、精简系统或恢复环境中操作,可能根本没有安装 glibc。 --- ### 解决方案 #### ✅ 方案一:检查并修复 `LD_LIBRARY_PATH` Oracle 安装常会修改 `LD_LIBRARY_PATH`,这可能导致系统命令找不到标准库。 ```bash # 查看当前 LD_LIBRARY_PATH echo $LD_LIBRARY_PATH # 临时清空它,再尝试运行 vi LD_LIBRARY_PATH= vi $ORACLE_HOME/network/admin/listener.ora ``` > 如果这样可以打开 `vi`,说明问题出在 `LD_LIBRARY_PATH` 被错误设置,屏蔽了系统库路径。 **修复方法:** 编辑你的 shell 配置文件(如 `.bash_profile`, `.bashrc`),找到类似: ```bash export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib:$LD_LIBRARY_PATH ``` 改为: ```bash export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib ``` 或者确保系统路径也被包含: ```bash export LD_LIBRARY_PATH=/u01/app/oracle/product/11.2.0/dbhome_1/lib:/lib:/lib64:/usr/lib:/usr/lib64 ``` 然后重新加载配置: ```bash source ~/.bash_profile ``` --- #### ✅ 方案二:使用绝对路径调用系统编辑器(绕过问题) 即使 `vi` 命令失败,也可以尝试直接调用 `/bin/vi` 或其他编辑器: ```bash /bin/vi $ORACLE_HOME/network/admin/listener.ora ``` 或者使用 `nano`(如果存在): ```bash /bin/nano $ORACLE_HOME/network/admin/listener.ora ``` 或者使用 `sed` / `echo` 修改内容(无交互式编辑): ```bash # 示例:添加一行 echo "NEW_CONFIG = VALUE" >> $ORACLE_HOME/network/admin/listener.ora ``` --- #### ✅ 方案三:确认 `libc.so.6` 是否存在 运行以下命令查找该库文件: ```bash find /lib /lib64 /usr/lib /usr/lib64 -name "libc.so.6" 2>/dev/null ``` 典型路径包括: - `/lib/x86_64-linux-gnu/libc.so.6` (Debian/Ubuntu) - `/lib64/libc.so.6` (RHEL/CentOS) 如果找不到,说明 glibc 被删除或损坏。 --- #### ✅ 方案四:重建动态链接缓存(需要 root) 以 root 用户执行: ```bash /sbin/ldconfig ``` 然后检查是否能定位到 `libc`: ```bash /sbin/ldconfig -p | grep libc.so.6 ``` 预期输出示例: ``` libc.so.6 (libc6,x86-64) => /lib64/libc.so.6 ``` --- #### ✅ 方案五:重装 glibc(最后手段,非常危险!) ⚠️ 警告:`glibc` 是系统核心组件,错误操作会导致系统无法启动! 仅建议在有救援模式或 Live CD 的情况下进行。 对于 CentOS/RHEL: ```bash yum reinstall glibc ``` 对于 Ubuntu/Debian: ```bash apt-get install --reinstall libc6 ``` > 注意:不要在生产服务器上轻易尝试此操作。 --- ### 快速诊断脚本 你可以运行以下命令快速排查: ```bash # 1. 查看 vi 是什么 which vi ls -l $(which vi) # 2. 查看 vi 依赖哪些库 ldd $(which vi) # 3. 检查 libc 是否能找到 ldconfig -p | grep libc.so.6 # 4. 尝试清除 LD_LIBRARY_PATH 后运行 LD_LIBRARY_PATH= ldd $(which vi) ``` --- ### 总结 | 原因 | 解决方式 | |------|----------| | `LD_LIBRARY_PATH` 错误 | 清除或修正该变量 | | `libc.so.6` 缺失 | 使用 `find` 查找或重装 glibc | | 动态链接器未刷新 | 运行 `ldconfig` | | 编辑器本身异常 | 改用 `/bin/vi`, `nano`, `cat`, `sed` 等 | 最常见原因是 Oracle 设置的 `LD_LIBRARY_PATH` 屏蔽了系统库路径,**优先尝试清空 `LD_LIBRARY_PATH` 再运行 `vi`**。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值