昨天有个朋友在微信上问我,说他在Ubuntu上装Oracle数据库,折腾了一整天没搞定,差点想把电脑砸了。我听完笑了,这事儿我太熟了。Oracle这玩意儿,在Linux圈子里就是个“异类”——它官方只支持Red Hat和SUSE,对Ubuntu这种基于Debian的发行版,态度就跟后妈养的一样,文档少得可怜,安装流程也藏着各种坑。但现实是,很多开发者、中小企业就是喜欢用Ubuntu做服务器,图它包管理方便、社区活跃、更新快。所以,怎么在Ubuntu上把Oracle装起来,就成了一个绕不开的硬骨头。

先说说最让人头疼的问题:依赖。Oracle数据库对系统环境的要求特别矫情,比如它需要特定的glibc版本、特定的libaio库、甚至特定版本的binutils。Ubuntu的包管理虽然强大,但apt-get装出来的东西,Oracle未必认。我踩过的第一个坑就是缺了libnsl.so.1这个库,结果安装程序直接报错退出,连个像样的提示都没有。解决方案其实不复杂,但得自己手动去翻Oracle的官方文档,找到它要求的依赖列表,然后用apt-get一个一个装。比如libaio1、libncurses5、libpam-dev这些,一个都不能少。装完还得检查一下符号链接,有时候Ubuntu的库文件路径和Oracle预期的不一样,得手动ln -s一把。
接下来是内核参数。Oracle对Linux内核的共享内存、信号量、文件句柄这些参数有硬性要求,否则启动时会报ORA-27102之类的错误。Ubuntu默认的内核参数设置偏保守,比如kernel.shmall和kernel.shmmax的值往往不够大。你得编辑/etc/nf,把kernel.shmall设成物理内存的一半左右,kernel.shmmax设成物理内存的大小,还得加上fs.file-max=6815744这些。改完别忘执行sysctl -p让它生效。这一步虽然琐碎,但跳过的话,后面装完启动不了数据库,那才叫欲哭无泪。
Oracle用户和组的创建也是坑。官方文档要求用oinstall和dba两个组,还有一个oracle用户,但Ubuntu的useradd命令和Red Hat系略有不同。比如在Ubuntu上,你不指定用户主目录的话,它默认不会创建/home/oracle,而Oracle安装程序又偏偏需要在这个目录下写东西。所以最好手动指定:groupadd oinstall和groupadd dba之后,用useradd -g oinstall -G dba -m -d /home/oracle oracle。别忘了给oracle用户设密码,否则后面用图形界面安装时,su切换过去会卡住。
说到图形界面,Oracle的安装程序是Java写的,需要X Window支持。如果你用的是Ubuntu桌面版,那直接跑./runInstaller就行。但很多服务器是命令行环境,没装图形界面。这时候你有两个选择:要么用VNC远程桌面,要么用静默模式安装。VNC配置起来比较繁琐,得先装个tightvncserver,再设置分辨率、启动Xfce或GNOME。我建议新手直接走静默模式,因为Oracle提供了一个response file模板,你可以把安装路径、数据库类型、字符集这些参数写在里面,然后./runInstaller -silent -responseFile xxx.rsp。省心,而且不会因为图形界面卡顿而报错。
安装过程中还有个细节:Oracle对/tmp目录的磁盘空间有要求,至少1GB以上。Ubuntu的/tmp默认挂载在内存里,空间可能不够。我遇到过安装程序在验证阶段报“insufficient space in /tmp”,结果发现是tmpfs的大小没调。解决办法是临时改mount选项:mount -o remount,size=2G /tmp。更稳妥的做法是安装前用df -h检查一下,不够就提前扩容。另外,Oracle的安装包解压后,目录不能有中文或特殊字符,否则Java的Unicode处理会出幺蛾子。
安装完才是开始。Oracle数据库启动需要监听器,所以得先配listener.ora和tnsnames.ora。这两个文件在$ORACLEHOME/network/admin目录下,内容格式很严格,多一个空格都可能报错。我建议用netca命令来配置,它会自动生成正确的格式。然后启动监听器:lsnrctl start。接着用dbca创建数据库实例。这里要注意,Ubuntu上dbca的图形界面可能因字体问题显示乱码,解决方案是设置LANG=enUS.UTF-8环境变量。创建实例时,选择“General Purpose or Transaction Processing”模板,字符集选AL32UTF8,内存分配根据你的服务器配置来,别贪心,给系统留点余量。
日常运维也有坑。Oracle在Ubuntu上默认不会开机自启,你得手动写systemd服务单元文件。网上很多教程给的脚本不靠谱,有的连环境变量都没加载。我的做法是创建一个/etc/systemd/system/oracle.service文件,里面写ExecStart=/bin/su - oracle -c '/u01/app/oracle/product/19.0.0/dbhome_1/bin/dbstart',然后systemctl enable oracle。但注意,dbstart脚本需要依赖/etc/oratab文件里的配置,所以你得先确保oratab里把数据库的启动标志从N改成Y。另外,关机前最好手动执行dbshut,否则数据库文件可能损坏。
说个心态问题。很多人装Oracle失败就怀疑是Ubuntu不行,其实不是。Oracle在Ubuntu上完全能跑,只是需要你多花点心思去适应它的“怪脾气”。我见过有人在Ubuntu上跑Oracle 19c做生产库,跑了两年没出过问题。关键是要理解:Linux发行版之间的差异,本质上就是库文件路径、包管理方式和默认配置的不同。你把Oracle当个挑剔的客人,提前给它铺好红地毯——该装的依赖装好,该调的参数调好,该建的目录建好——它一样能在Ubuntu上服服帖帖。相反,如果你指望apt-get一键搞定,那还是趁早换PostgreSQL或者MySQL吧。


