
1. 安装前的整体规划与介质准备1.1 为什么到现在还有人在装Oracle 11g看到标题点进来的朋友估计心里都有同一个疑问Oracle 12c、19c、21c都出了这么多代为什么还要折腾11g说句实在话我自己在培训环境和项目维护里也反复装过很多次11g核心原因就三个存量系统多、学习曲线平滑、资料齐全。很多企业核心系统跑的就是11g尤其是金融、政务、制造业的老项目动辄七八年没做过大版本升级运维手里全是11g的脚本和备份策略。对于刚入门的DBA或者开发来说用11g做练习机几乎能避开12c以后才出现的CDB/PDB概念专注学SQL、学备份恢复、学性能调优学习成本低很多。另外网上能找到的Oracle资料里十本有八本还是以11g为例写的跟着教程走不容易卡壳。不过必须先泼一盆冷水Oracle 11g的官方Extended Support在2020年底就已经结束了也就是说不再有公开补丁和安全更新。生产环境选型我不建议再上新系统用11g但如果是为了学技术、复现老项目、在虚拟机里跑一个测试库11g依然是很好的练手对象。这也是我写这篇教程的前提虚拟机里学习用不是推荐生产环境部署。1.2 安装包该从哪下载以及怎么辨别靠谱版本Oracle 11g R2官方提供了Linux 64位和Windows 64位两个常见版本。Linux下的介质是两个zip包名字是linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zip这两个包必须放在同一个目录下解压因为第一个包是安装主程序第二个包里面是组件包少一个都会导致安装中途报错。Windows版则是V17530-01_1of2.zip、V17530-01_2of2.zip这样的命名规则。获取渠道上Oracle官方网站虽然把11g放进了“存档下载”区但依然可以免费下载只需要注册一个Oracle账号并登录即可不需要付费。这里要强调一点Oracle Database从11g开始个人学习使用在官方下载页面是不收费的很多人误以为需要付费其实只是需要接受一份OTN许可协议。至于标题里提到的网盘离线包我的态度是方便归方便但要格外小心。网盘里的安装包有可能被二次打包、捆绑推广软件甚至植入恶意代码所以拿到包之后务必核对几件事压缩包的MD5/SHA256哈希值是否与官方公布的一致解压后目录结构是否正常有没有奇怪的exe、脚本文件安装包大小是否和官方一致两个zip加起来大约2GB出头。如果只是自己学习我建议优先走官网下载慢一点但安心。1.3 实验环境准备虚拟机配置推荐与资源规划这里我默认大多数人是在Windows电脑上用VMware虚拟机装Linux版Oracle这也是主流做法。有一说一Oracle装在Windows本机虽然也能跑但内存占用和进程数量对日常开发机影响太大虚拟机随开随关反而更方便还能随时拍快照。虚拟机软件的版本没什么讲究VMware Workstation 15/16/17都能用网上有大量安装教程可以参考。操作系统建议优先选择CentOS 7.9或Oracle Linux 7.9原因后文会说。如果你手头只有CentOS 6.8/6.10其实也可以6系的兼容性反而更好但内核较老新机器虚拟化支持上偶尔有坑。我给一份自己常用的虚拟机配置项目最低配置推荐配置物理机内存8GB16GB以上虚拟机内存2GB4GBCPU核心数24系统磁盘40GB60GBSwap分区2GB4GB/dev/shm1GB2GB以上特别想提醒一句Oracle 11g安装检查对Swap是有要求的官方规则是内存小于等于2GB时Swap要等于内存的两倍内存2GB到16GB之间Swap等于内存即可。如果你虚拟机内存分配了4GBSwap配4GB就行太小会在先决条件检查时直接卡住。另外安装介质大概3GB左右解压后又占一份空间安装完成后的Oracle主目录约5GB所以系统盘给40GB以上比较稳妥。别拿20GB的磁盘挑战极限装到一半提示磁盘空间不足是最扫兴的。2. 系统环境配置与安装前检查2.1 主机名、网络与SELinux/防火墙处理这一节是所有人最容易忽略、也最容易在后期翻车的地方。Oracle对主机名解析很敏感它要求系统能通过hostname解析到自己的IP地址否则安装时会出现“无法解析主机名”的报错。建议在装系统阶段就把主机名改成oracle.example.com这种带域名后缀的形式装完系统后检查一下/etc/hosts确保有这一行192.168.x.x oracle.example.com oracle如果/etc/hosts里只有一个127.0.0.1的映射数据库跑起来后监听服务经常会有奇怪问题所以这一步宁可花两分钟确认好后面省一天。SELinux和防火墙是Linux自带的保护机制但对Oracle这种老软件并不友好。在虚拟机学习环境里直接关闭它们是最省心的选择操作方式如下systemctl stop firewalld systemctl disable firewalldSELinux则修改/etc/selinux/config把SELINUXenforcing改成SELINUXdisabled然后重启虚拟机。如果你不想重启也可以临时执行setenforce 0但下次重启前最好还是把配置文件改掉。生产环境的加固策略当然不会这么粗暴但在学习虚拟机里先把环境跑通比什么都重要。等你能熟练把数据库装好以后再回头研究防火墙放行1521端口和SELinux的用户定义策略也不迟。2.2 安装依赖包一次yum解决问题Oracle 11g安装程序自带的先决条件检查会扫描很多系统库包缺少任何一个都会在列表里显示为Error。CentOS 7自带的基础源里能装大部分包但compat-libstdc-33这个包在默认源里没有需要额外处理。我习惯在安装前一次性把依赖包装齐命令如下yum install -y binutils compat-libcap1 compat-libstdc-33 \ gcc gcc-c glibc glibc-devel ksh libaio libaio-devel \ libgcc libstdc libstdc-devel libXext libXtst \ libX11 libXau libXi make sysstat unixODBC unixODBC-devel如果你的系统是CentOS 7且提示找不到compat-libstdc-33可以通过yum install -y compat-libstdc-33 --enablerepo*从第三方源安装实在装不上也不要慌安装界面先决条件检查到这一项时点“忽略”也能继续只是稍微有点隐患。这里要多说一句网上有些教程让你跳过依赖检查我的建议是最好别跳。很多用户装了Oracle之后启动报错回头排查半天结果就是缺了libaio或libaio-devel这种不起眼的包白白浪费时间。2.3 创建Oracle用户、用户组与目录结构Oracle不允许直接用root安装这是它的安全策略所以必须创建一个专用用户。规范做法是建两个组oinstall负责软件安装管理dba负责数据库管理。groupadd oinstall groupadd dba useradd -g oinstall -G dba oracle passwd oracle把oracle用户的密码设置成自己好记的比如oracle123学习环境无所谓。然后是目录规划。Oracle的目录结构有自己的推荐标准即OFAOptimal Flexible Architecture遵循这个标准可以避免后期升级和迁移时路径混乱。一条命令把它们都建好mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01/app chmod -R 775 /u01/app后续安装时Oracle基目录就指定为/u01/app/oracle软件主目录会是/u01/app/oracle/product/11.2.0/dbhome_1这样整个结构一眼就能看懂。2.4 内核参数与资源限制配置这是很多人忽视的硬门槛Oracle 11g安装检查里有不少内核参数要求如果直接点忽略数据库虽然能装上但运行一段时间后可能出现内存分配失败、进程数超限之类的问题。所以这一步建议照着做。编辑/etc/sysctl.conf追加以下内容fs.aio-max-nr 1048576 fs.file-max 6815744 kernel.shmall 1073741824 kernel.shmmax 4294967295 kernel.shmmni 4096 kernel.sem 250 32000 100 128 net.ipv4.ip_local_port_range 9000 65500 net.core.rmem_default 262144 net.core.rmem_max 4194304 net.core.wmem_default 262144 net.core.wmem_max 1048576然后执行sysctl -p让参数生效。挑几个关键参数讲一下原理kernel.shmmax是单个共享内存段的最大字节数Oracle的SGA会使用共享内存这个值如果设得太小数据库启动时容易报内存相关错误。设成4GB一般够用。kernel.sem的四个值分别对应信号量数组的最大值、系统范围内最大信号量数、每个信号量集的最大信号量数、系统范围内最大信号量集数按官方推荐值写就行。net.core.wmem_max和rmem_max影响数据库网络通信的缓冲区虽然平时感知不明显但大并发连接时差距就出来了。接下来还要修改用户资源限制。编辑/etc/security/limits.conf追加oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240这些限制的意思是oracle用户最多打开65536个文件、最多16384个进程、栈空间10MB。如果没有这些限制数据库跑一段时间后可能报ORA-12537: TNS:connection closed或者进程崩溃。最后检查一下/dev/shm。这个目录在Linux里默认是物理内存的一半Oracle的自动内存管理AMMAutomatic Memory Management严重依赖它。如果虚拟机内存4GB/dev/shm一般有2GB够用。如果只有几百MB建议调整mount -o remount,size2G /dev/shm并把对应配置写入/etc/fstab否则重启后又会恢复原样。3. runInstaller安装全流程详解3.1 解压安装介质与环境变量预处理先把两个zip包上传到服务器我习惯放在/soft目录下然后执行解压cd /soft unzip linux.x64_11gR2_database_1of2.zip unzip linux.x64_11gR2_database_2of2.zip注意两个包解压到同一个目录最终会得到一个database文件夹里面是runInstaller、install、response这些子目录。图形化安装需要DISPLAY变量这个坑几乎每个新手都会踩。如果你是用VMware虚拟机打开Linux桌面直接运行./runInstaller即可但如果你用的是MobaXterm、Xshell这类远程工具就需要配置X11转发或者X Server。我的建议是不要图省事用静默安装文件第一次装Oracle就老老实实走图形界面每一步选什么看得清清楚楚出问题也容易排查。远程工具推荐MobaXterm自带X Server连接Linux后会自动转发图形界面相当省心。如果是Xshell需要配合安装Xmanager设置稍繁琐。另外为了防止安装界面出现中文乱码建议在运行安装程序前临时把语言环境切到UTF-8export LANGen_US.UTF-8 export DISPLAY:0.0有些教程让你装中文字体包来解决乱码实际没必要直接切英文环境最省事。3.2 安装界面一步步怎么选以root身份登录时不能运行runInstaller必须先切到oracle用户su - oracle cd /soft/database ./runInstaller弹出安装界面后各步骤的选择如下我按顺序列出配置安全更新取消“我希望通过My Oracle Support接收安全更新”的勾选点击Next这时会弹出一个警告框问你是否确定不接收安全更新点Yes。安装选项选择“创建和配置数据库”这个选项会安装数据库软件并自动创建一个实例适合新手一步到位。如果你想只装软件后面再用DBCA建库就选第二个“仅安装数据库软件”但考虑到教程完整性这一步建议选第一项。系统类选“服务器类”。桌面类只是简化了部分配置实际部署基本都用服务器类。安装类型选“企业版”。Standard Edition、Standard Edition One功能受限Enterprise Edition功能全虽然License问题暂不讨论但学习用企业版最合适。安装位置Oracle基目录填/u01/app/oracle软件位置会自动带出/u01/app/oracle/product/11.2.0/dbhome_1不用改。产品语言把“简体中文”和“英语”都选中后面客户端连接时字符集支持更好。数据库版本选“企业版”这一步和前面的安装类型其实是对应的。配置类型选“典型安装”。如果你想手动指定SGA大小、字符集、示例方案可以选“高级安装”但新手阶段典型安装完全够用。数据库标识符全局数据库名和SID默认是orcl可以改成你想要的但建议保持一致后面环境变量好配。字符集这里默认即可如果想数据库存中文不乱码可以手动改成ZHS16GBK或AL32UTF8后面细说。管理口令设置SYS、SYSTEM、DBSNMP用户的密码。注意Oracle对密码复杂度有校验必须是字母数字混搭且满足一定长度比如Root_123456。这个密码后面要用别设置完就忘。设置完这些安装程序会进入“先决条件检查”页面。这里大概率会看到一堆Warning甚至Error。我的经验是Error级别的项必须处理比如/dev/shm不足、磁盘空间不够Warning级别的项可以放心点“忽略”比如某些依赖包的版本比要求的还新属于误报。检查列表底部有一个勾选框“忽略所有先决条件检查”如果你确认依赖包都装过了可以直接勾上再点Next。但我不建议一上来就无脑忽略万一真的是内存不够装到一半挂了更难受。3.3 安装过程中的root脚本执行与数据库创建点击Install之后Oracle会进入安装主流程进度条大致会走十几分钟期间日志文件在/u01/app/oraInventory/logs里。如果你的CPU核数给够了这个过程其实挺快的。装到大约90%的位置系统会弹出一个窗口要求以root身份执行两个脚本/u01/app/oraInventory/orainstRoot.sh /u01/app/oracle/product/11.2.0/dbhome_1/root.sh这时候另开一个终端切到root用户依次执行这两条命令。注意root.sh执行过程中会询问是否把oracle用户加入dba组输入y即可。执行完回到安装窗口点击OK继续。脚本执行完后安装程序会自动调用DBCADatabase Configuration Assistant创建数据库实例。这个过程大概也要5到10分钟期间控制台日志会显示ORA-....之类的信息看到错误别慌大部分只是DBCA在检查过程中的正常输出。等到最终页面显示“Completed”并且给出EM管理地址一般形如http://localhost:1158/em就说明安装成功。这里可以顺手验证一下ps -ef | grep smon如果能看到一个名为ora_smon_orcl的进程说明数据库实例已经在跑了。4. 安装后的初始化配置与验证4.1 配置oracle用户环境变量安装完成不代表万事大吉如果你直接重启虚拟机再执行sqlplus会发现命令都找不到。原因很简单Oracle的安装目录没有加进PATH环境变量。编辑oracle用户的家目录下的.bash_profile把下面内容追加进去export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/11.2.0/dbhome_1 export ORACLE_SIDorcl export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:$LD_LIBRARY_PATH然后执行source ~/.bash_profile让它立即生效。这几个变量的含义非常简单ORACLE_BASE是Oracle基础目录ORACLE_HOME是数据库软件的安装位置ORACLE_SID是你要连接的实例名这里对应安装时的orcl。不配置环境变量的话每次登入都要手动写一长串绝对路径去执行sqlplus烦都烦死。4.2 监听器与数据库实例的启停监听器Listener是数据库对外服务的大门客户端连接数据库时先通过监听器找到实例。11g里监听器默认已经在安装时配置好了可以通过命令查看lsnrctl status如果显示Service orcl has 1 instance(s)之类的信息说明监听正常。如果因为某种原因没起来启动命令是lsnrctl start数据库实例本身的启动停止比较直观sqlplus / as sysdba进入SQL*Plus后SQL startup SQL shutdown immediateshutdown immediate会等待当前事务结束然后快速关闭是最常用的关闭方式不要习惯性地用shutdown abort除非实例真的卡死了连immediate都关不掉。另外还有一个细节重启虚拟机后监听器和数据库默认都不会自动启动需要你手动执行lsnrctl start和startup。如果想省事可以把/etc/oratab里的orcl:/u01/app/oracle/product/11.2.0/dbhome_1:N改成Y这样dbstart命令就能用了。不过在学习环境里我更推荐自己手动启停顺便加深对组件之间关系的理解。4.3 客户端连接验证与图形工具推荐数据库装完了怎么确认它真的能用最简单的验证方式是在本机用SQL*Plus连接sqlplus system/Root_123456orcl能进入SQL提示符就说明实例和监听都正常。如果你想从Windows本机通过Navicat、PL/SQL Developer这些工具连接虚拟机里的Oracle需要注意几点虚拟机网络模式用NAT或桥接都行但要保证Windows能ping通虚拟机IP数据库监听默认端口是1521连接时服务名填orcl不是SID名对应很多人用PL/SQL Developer时把Database字段填成orcl反而连不上这个字段填的是服务名通常与SID一致所以容易混淆。我个人现在推荐用Oracle官方的SQL Developer完全免费不需要破解JDBC直连也不依赖Oracle Client对新手上手友好。下载后配置连接时选“基本连接”主机填虚拟机IP端口1521服务名填orcl用户名密码填system和安装时设置的密码就能连上。5. 常见安装问题与排查经验5.1 先决条件检查报错的典型处理把常见的报错和处理方法整理成一张表遇到问题直接对号入座报错现象原因解决办法物理内存不足虚拟机内存小于1GB给虚拟机加到2GB以上Swap空间不足swap分区过小加大swap或用swap文件补充缺少gcc、libaio等包依赖包未安装按2.2节yum命令补齐/dev/shm小于建议值默认只有内存一半mount -o remount,size2G /dev/shm无法解析主机名/etc/hosts缺少映射补上IP 主机名映射compat-libstdc-33缺失CentOS 7默认源没有忽略该项或第三方源安装这里面最常见的场景就是Swap不足。很多人在VMware里建虚拟机时只分了1GB内存Swap默认也只有1GBOracle一检查Swap不满足两倍内存的要求直接给个Error。最简单的解决办法是在控制台先关机把虚拟机内存调到2GB然后进入系统用dd创建一个大文件作为swap补充dd if/dev/zero of/swapfile bs1M count4096 mkswap /swapfile swapon /swapfile这样临时补充swap不用重新分区就能骗过Oracle的检查。5.2 图形界面启动失败的坑远程连接Linux运行./runInstaller时最常见的报错是DISPLAY not set. Please set the DISPLAY variable or use the -silent option这是因为你没有配置X11转发。如果是MobaXterm用户新建SSH会话时左侧会话设置里勾上“X11-Forwarding”然后重新连接执行export DISPLAY:0.0后再运行安装程序就能看到界面了。如果是Xshell用户需要先在Windows端安装Xmanager然后运行Xmanager中的Xstart或Xshell会话属性里勾选“转发X11连接”方法类似。装了Xmanager之后DISPLAY一般设成localhost:0.0或:0.0。还有一个容易被忽略的坑切到oracle用户后发现sudo权限没有配置导致没法临时切回root执行脚本。建议在配置用户阶段就用visudo给oracle用户加一行oracle ALL(ALL) NOPASSWD:ALL后面执行root脚本方便很多。5.3 安装完成后运行报错速查安装完成不代表从此高枕无忧实际使用中还有一批高频报错我遇到过无数次这里一并记录ORA-01031: insufficient privileges执行sqlplus / as sysdba报权限不足说明当前操作系统用户不在dba组里。检查id oracle是否包含dba没有就执行usermod -aG dba oracle然后重新登录。ORA-01034: ORACLE not available / ORA-27101: shared memory realm does not exist通常发生在实例没有启动时。进入SQL*Plus执行startup如果提示无法连接先确认环境变量ORACLE_SID是否设置正确。ORA-28001: the password has expired11g的默认密码策略是180天过期很多实验库放两三个月再连就连不上了。解决办法是登录后改掉密码策略ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; ALTER USER system IDENTIFIED BY 新密码;开发环境我一般都顺手把密码有效期改成无限少给自己找麻烦。ORA-12514: TNS listener does not currently know of service requested in connect descriptor这是开发环境最常遇到的一个。原因大概是数据库实例没有向监听器动态注册或者数据库刚启动监听还没刷新。可以先执行lsnrctl services看看有没有对应服务没有的话重启一下监听lsnrctl stop lsnrctl start如果还不行检查$ORACLE_HOME/network/admin/listener.ora里的监听配置是否正常。ORA-12541: TNS: no listener这个就纯粹是监听没起来或者你连的IP/端口不对。执行lsnrctl status确认监听进程存在并且确认连接串里的主机是虚拟机的实际IP。5.4 安装包与解压环节的独家提醒再分享两个和安装介质有关的经验这些在官方文档里基本不会写第一两个zip包解压时必须保持在同一目录层级且磁盘剩余空间要足够。先解压1of2再解压2of2后者会自动往已有的database目录里补充文件不会覆盖已有内容。如果你解压2of2时选择了不同的目录安装时会报找不到某些组件。第二安装过程如果突然中断再次运行runInstaller之前建议先检查/u01/app/oraInventory里是否残留了上次的安装信息。最干净的办法是删掉oraInventory和/u01/app/oracle重新来否则可能出现“Oracle实例已存在”的诡异提示。6. 数据库使用中的实用配置建议6.1 字符集到底怎么选ZHS16GBK还是AL32UTF8这个问题看起来小但数据库一旦建完字符集再想改就非常麻烦大概率只能重建库。所以安装时就要想清楚。如果你的业务系统主要面向国内用户历史系统也以GBK编码居多选ZHS16GBK兼容性最好和旧系统的数据迁移基本无感。如果是新项目、涉及多语言或移动端直接选AL32UTF8这是Oracle目前主推的字符集能存emoji和一些生僻字。一条简单的判断标准只要不确定就选AL32UTF8。UTF8是趋势现在新开发的系统基本都默认UTF8GBK反而是为兼容老系统才选的。真到了和老库做DMP导入的时候再单独处理字符集转换也不迟。6.2 内存管理别让虚拟机吃掉整个物理机Oracle 11g的典型安装会自动启用自动内存管理AMM它会在允许范围内动态调整SGA和PGA的大小。问题在于如果虚拟机的内存只有2GBOracle可能默认分配了1GB左右给数据库再跑Linux系统本身、SSH服务和其他进程物理内存容易紧张严重时会触发swap风暴整个虚拟机卡成PPT。我建议在安装前就规划好虚拟机给4GB内存的话可以在安装的“数据库配置”步骤里把SGA大小手动限制在1.5GB以内PGA限制在512MB。这样数据库能跑宿主机也不会被拖垮。当然这属于学习环境的取舍。真生产环境里内存规划要和业务并发量、缓存命中率一起评估不是一两句话能说清的。6.3 时隔多日再打开虚拟机怎么快速恢复环境练手机最尴尬的场景是隔了两周再打开虚拟机突然忘了数据库怎么启动。这里给一套固定动作按顺序执行即可su - oracle export ORACLE_SIDorcl lsnrctl start sqlplus / as sysdba进入SQL*Plus后SQL startup如果startup报错提示文件找不到大概率是环境变量没加载检查.bash_profile是否生效。如果想省事可以把前面那几条启动命令写进一个脚本start_oracle.sh每次开机直接跑脚本就行。另外我强烈建议在虚拟机安装完Oracle并且验证无误后立刻给虚拟机拍一个干净快照。以后装实验数据搞坏了库直接回滚快照十分钟恢复初始状态比什么都强。7. 从安装到掌握我的一点实操心得最后我想结合自己装过的几十次Oracle经历说几句掏心窝的话。Oracle安装这件事难点从来不在“点Next”上而在于安装前那半小时的系统准备。依赖包、内核参数、用户目录、资源限制每一步看起来都像在“走形式”但少了任何一环后面都可能以最诡异的方式翻车。我见过太多同学卡在验证阶段对着报错一头雾水最后发现是/etc/hosts缺了一行。如果这篇教程你只记一个要点我想说安装前老老实实把第2章的所有配置过一遍不要跳步。哪怕你觉得某些参数无所谓也照着配了再说。等你装过两三遍、对整个体系有了感觉再回头看哪些可以精简也不迟。还有一个经验是这个教程没有细讲的装完之后赶紧学会看日志文件。Oracle的运行日志在$ORACLE_HOME/cfgtoollogs/dbca和$ORACLE_HOME/log里遇到问题先看日志再决定怎么处理。比起在搜索引擎里无头苍蝇一样翻帖子直接看日志往往能少走很多弯路。最后给你留一个小练习装完数据库后尝试用sqlplus system/密码orcl连接一次再用SQL Developer连接一次。能通过两种方式都连上就说明监听器、实例、网络、认证这条链路已经完整打通了。这一步通了后面学表空间、用户权限、备份恢复才会顺畅。