【Oracle】Ubuntu 部署 Oracle 10g 的完整实战复盘

8 阅读4分钟

说实话,如果是新项目,我绝对不会首选 Oracle 10g。但工作中你难免会遇到一些老系统的迁移工作,这就没有办法了。之前我也分享过使用 Docker 来进行快速部署,但并不是每个项目都能允许我这样做,因此 Oracle 的 Linux 部署多多少少也要会一点(可能是公司的业务缘故,我参与的项目用 Oracle 的还是比较多)。

但不得不说 Oracle 10g 对系统环境的苛刻程度,反而非常适合用来测试自己的 Linux 基本功。

一、Oracle 部署的难点不在 Oracle

真正的难点在这三点:

  1. Oracle 假设你在用 RHEL / CentOS
  2. Ubuntu 的 库版本、包名、目录结构都不一样
  3. 安装脚本写死了很多“旧时代假设”

过往的经验告诉我,Oracle 安装失败,80% 是系统没准备好,而不是安装步骤错了。

二、安装前准备

1.操作系统选择

Oracle 10g 对内核和 glibc 非常挑剔。在 Ubuntu 上,我默认遵循三个原则:

  • 尽量使用 LTS 版本
  • 不追新内核(重点)
  • 不混用奇怪的第三方源

2.创建 Oracle 专用用户与用户组

这个是多次惨痛经历换来的教训,不要用 root 跑 Oracle

groupadd oinstall
groupadd dba
useradd -g oinstall -G dba oracle
passwd oracle

在 Oracle 的世界里,用户就相当于“安全边界”、“权限模型”和“安装与运行的唯一载体”,这就是底线。

3.目录规划

mkdir -p /u01/app/oracle
chown -R oracle:oinstall /u01
chmod -R 775 /u01

永远不用随意路径,免得出现奇奇怪怪的情况

三、内核参数与系统限制

这是 最关键、最容易被忽略的一步

1.修改 /etc/sysctl.conf

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
net.ipv4.ip_local_port_range = 9000 65500

然后:

sysctl -p

以上参数不能“照抄”,这是 Oracle 对系统资源的最低预期而已,建议根据用户的实际情况进行配置。

2.用户级限制 /etc/security/limits.conf

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

如果这里没配置好,那么你会发现你安装的时候虽然能够通过,但数据库启动时会死的很难看。

四、Ubuntu 与 Oracle 依赖冲突(重点)

Oracle 10g 依赖了一堆早已被 Ubuntu 淘汰的库。

我遇到最多的是 libaio、libstdc++5 和 gcc 的版本不匹配问题。

我的解决办法是:

  • 缺什么 → 查包名 → 找 Ubuntu 对应版本
  • 没有 → 用兼容包 / 手动安装
  • 能不用 --force 就不用

坦白说,有时候真的会被折腾到没脾气,因此现在我是宁可多花时间补依赖,也不轻易破坏系统包管理一致性。

五、Oracle 安装

如果将上面的难关都过了,后面基本上就没什么问题了。

su - oracle
./runInstaller

安装过程我只盯三件事:

  1. 警告(Warning)和错误(Error)
  2. 是否卡在 linking 阶段
  3. 是否提示 kernel / OS 不支持

很多“看起来可怕的警告”,其实都可以忽略的。譬如,系统版本校验失败,swap 大小不满足推荐值等。但当出现“共享内存不足”,“文件句柄不够”、“权限错误”的时候就应该注意了,这些才是致命的。

六、root.sh

安装过程中会提示执行:

/u01/app/oracle/oraInventory/orainstRoot.sh
/u01/app/oracle/product/10.2.0/db_1/root.sh

这是我唯一一次允许 root 介入 Oracle 安装流程(这没有办法)。但原则上只执行安装器明确要求的 root 操作,其余一律不要多做。

七、环境变量

oracle 用户下的 .bash_profile 我是这样写的:

export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin

以前的我会选择将配置拆的稀碎,然后到处引用。经过多年的淬炼,现在的我不追求“灵活”,只追求“可读”、“可复制”、“可复现”。

八、我最怕的几类错误

当出现:

  • ORA-27102: out of memory
  • ORA-01034: ORACLE not available
  • ORA-12541: TNS:no listener

我知道肯定是我系统又没有配置好了,因为这些错误的出现 90% (盲猜)指向:

  • 内核参数
  • 用户限制
  • 环境变量

这意味着我又要重头检查一遍了,艹。

九、真正学到的东西

Oracle 并没有教会我如何使用数据库,它逼着我学会了如何对待一台 Linux 服务器。

从那之后,我对系统的态度不再是“尽量让它跑起来”,而是“在明确理解代价的前提下,让它长期、可控、可恢复地运行”。

这可能是我从 Oracle 安装这件事里,真正带走、并且一直沿用至今的东西。