Ubuntu 上 Oracle 常见问题与解决方案
一 安装与依赖
- 建议使用专用系统用户与组:创建 oinstall、dba,并指定 Oracle 家目录;不要用 root 直接安装。
- 安装常用依赖(以 11g/12c 为例):libaio1、libaio-dev、build-essential、unzip、wget 等;若安装介质为 RPM,可借助 alien 转换为 DEB 再装(注意校验与兼容性)。
- 安装 Oracle XE 11gR2 时,若 postinst 脚本报错缺少 /sbin/chkconfig,可编辑 /var/lib/dpkg/info/oracle-xe.postinst,注释相关 chkconfig 行并改用 update-rc.d 注册服务,然后执行配置:/etc/init.d/oracle-xe configure。
- 若遇到安装器链接阶段卡住或报错,可按需打补丁(示例为 32 位环境下的链接参数修正,64 位请谨慎对照版本与路径):
- ins_emagent.mk:sed -i ‘s/^\s*$(MKEMAGENTNMECTL)\s*$/\1 -lnnz11/g’ $ORACLE_HOME/sysman/lib/ins_emagent.mk
- 网络/内核库链接:在 $ORACLE_HOME/network/lib/env_network.mk、$ORACLE_HOME/rdbms/lib/env_rdbms.mk 等文件相应行尾追加 -Wl,–no-as-needed 后点 Retry。
二 环境变量与命令找不到
- 正确做法是在 Oracle 用户的 profile 中设置环境变量,而不是拷贝二进制到 /bin。在 ~/.bashrc 或 /etc/profile 中加入(路径按实际调整):
- export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
- export ORACLE_SID=XE
- export PATH=$ORACLE_HOME/bin:$PATH
- 使配置生效:source ~/.bashrc(或 source /etc/profile)。
- 若仍提示 sqlplus: command not found,先确认 echo $PATH 包含 $ORACLE_HOME/bin,再检查文件权限与所属用户组。
- 不建议将 $ORACLE_HOME/bin/sqlplus、lsnrctl 等复制到 /bin;这会带来维护与安全风险,且不利于多用户环境。
三 监听与连接故障
- 首次登录报 ORA-12162: TNS:net service name is incorrectly specified,通常是 ORACLE_SID 未设置:执行 export ORACLE_SID=orcl(或你的实例名)。
- 客户端连不上或报 ORA-12514: TNS:listener does not currently know of service,需确认监听已启动并注册服务:
- 启动监听:lsnrctl start
- 在 $ORACLE_HOME/network/admin/listener.ora 的 SID_LIST_LISTENER 中显式声明 SID:
- SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/xe)))
- 重启监听:lsnrctl stop && lsnrctl start
- 远程访问需开放 1521 端口(云主机安全组/本机防火墙),并确保客户端使用正确的 HOST、PORT、SERVICE_NAME/SID。
四 存储与内存相关错误
- 启动数据库出现 ORA-00845: MEMORY_TARGET cannot be created,多因 /dev/shm 不足或挂载不当。Ubuntu 使用 /run/shm,可做符号链接或挂载共享内存:
- 创建挂载脚本 /etc/init.d/oracle-shm,内容示例:
- #!/bin/sh
case “$1” in
start) mkdir -p /dev/shm
mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=1G tmpfs /dev/shm ;;
stop) umount /dev/shm ;;
*) echo “Usage: $0 {start|stop}” ;;
esac
- 赋权并注册:chmod +x /etc/init.d/oracle-shm && update-rc.d oracle-shm defaults
- 重启后确认:df -h | grep shm
- 初始化或运行期间若提示共享内存不足,可适当增大 MEMORY_TARGET 或改用 SGA_TARGET/PGA_AGGREGATE_TARGET 分步配置。
五 快速替代方案与后续优化
- 快速体验可用 Docker 运行 Oracle XE:
- 拉取镜像:docker pull oracleinanutshell/oracle-xe-11g
- 启动容器:docker run -d -p 1521:1521 --name oracle11g oracleinanutshell/oracle-xe-11g
- 环境变量示例:ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe,ORACLE_SID=XE,PATH 包含 $ORACLE_HOME/bin
- 连接测试:sqlplus system/oracle(或 docker exec -it oracle11g sqlplus / as sysdba)
- 上线前的稳定性与性能建议:
- 配置开机自启:在 /etc/oratab 将实例设为 Y,并编写 systemd 单元或 init 脚本管理 listener 与数据库;
- 参数与容量:结合负载设置 SGA/PGA、连接数、日志缓冲区;大表考虑 分区;SQL 使用 索引 与 绑定变量;
- 存储与 OS:优先 SSD/NVMe,合理文件系统挂载选项;按需调优内核网络/文件句柄;
- 运维:定期收集统计信息、监控 alert.log、验证备份恢复流程。