折腾ARM服务器装Oracle这事儿,我太有发言权了。前阵子搞了台鲲鹏920的机器,想着把生产环境的Oracle迁过去省点电费,结果愣是折腾了两个通宵。网上那些教程写得云里雾里,要么是x86的思维惯性,要么干脆就是纸上谈兵。今天不整虚的,把我踩过的坑和验证过的路子,一条条给你捋清楚。

先泼盆冷水:如果你以为装Oracle就是下载个zip解压跑一下,那在ARM上会死得很难看。Oracle官方对ARM的支持,说好听点叫“渐进式”,说白了就是19c之前基本别想,20c开始才有正经的aarch64版本,而且只认Oracle Linux 8和Red Hat 8.6以上。我一开始图省事,在Ubuntu 22.04上硬装,结果glibc版本不对,rpm包冲突得像打地鼠。所以第一步不是装数据库,是把系统换成Oracle Linux 8.6或8.8,这是硬门槛,别想着绕过。
系统搞定后,最关键的其实是依赖库。ARM架构下很多x86时代的编译参数不通用,比如那个著名的,在aarch64上必须装版本,否则装到一半报错“cannot execute binary file”。这还算好的,更坑的是Oracle自带的脚本,它在检测CPU架构时是写死的,你得手动改这个二进制,用把interpreter指向。这个细节网上几乎没人提,但你不改,装完一启动就直接段错误。
装的过程中还有个容易被忽略的点:内存和swap的配置。ARM服务器的内存带宽跟x86不太一样,Oracle的错误在ARM上出现频率更高。我那次就是,明明物理内存64G,但因为swap分区设小了,SGA目标值一调高就报错。解决办法是把改成tmpfs挂载,并且给足大小,我直接给了32G。还有,内核参数建议调到10以下,否则ARM的NUMA架构下内存回收策略会跟Oracle的LRU算法打架,性能能掉一半。
等安装界面走完,你以为就完事了?太天真。监听器配置和网络参数这块,ARM上有个特别恶心的坑:Oracle 19c的默认会启用IPv6,但很多ARM服务器(尤其是云厂商的裸金属实例)的IPv6是禁用的。于是监听器起不来,日志里全是。我排查了半天,在里显式加上才行。另外,里的建议设成OFF,不然ARM上那个诊断日志能把你磁盘写满。
数据文件布局这块,也得提前规划。ARM服务器通常配NVMe SSD,IO性能比传统SAS强一个量级,但Oracle对异步IO的检测在ARM上有bug——它有时候识别不了的异步调用,导致你用参数怎么调都无效。我是直接在里强制设置,然后关闭,反而稳定了。还有个细节:表空间自动扩展的增量设成100M,别用默认的10M,ARM上的文件系统块分配粒度不一样,增量太小会频繁触发扩展操作,影响并发写入。
说到性能调优,ARM的L3缓存和x86差异巨大,Oracle的和别照搬x86的配置模板。我实测下来,在鲲鹏920上,缓存池大小设为物理内存的25%左右比较合适,而x86那套40%的配置会让ARM的缓存一致性协议开销暴涨。另外,这个隐藏参数,在ARM上一定要设成FALSE——Oracle的NUMA优化在aarch64上还很不成熟,开了反而导致CPU亲和性错乱,出现莫名其妙的“log file sync”等待事件。
说说备份和恢复。ARM上跑Oracle,RMAN的默认块大小是8K,但如果你用,压缩算法在ARM上的CPU占用率会飙到80%以上,因为Oracle默认的BZIP2压缩对ARM的NEON指令集优化不到位。我换成了,CPU占用直接降到15%,备份时间还缩短了三分之一。还有,模式的别放在系统盘,ARM服务器的系统盘通常是一块小容量SATA,日志增长快了容易撑爆。
折腾这一圈下来,我的感受是:ARM装Oracle不是能不能的问题,而是愿不愿意跟一堆架构细节死磕的问题。如果你只是测试环境,我劝你直接用Docker镜像,社区里有现成的aarch64 Oracle 19c镜像,跑起来省心。但生产环境,还是老老实实按我上面说的步骤来,每一步都别跳。提醒一句:装完了一定跑一遍,然后执行——看到“OPEN”那一刻,你才能松口气。这坑填完了,但下一个坑可能就在你改参数的时候等着你,祝你顺利。


