ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Oracle 19c 下载安装与 CDB/PDB 建库监听配置指南

Oracle 19c 下载安装与 CDB/PDB 建库监听配置指南 这几年还在项目里装 19c 的人其实一点不少Oracle 19c 是 12.2 系列里唯一被官方划进长期支持名单的版本很多做数据库课程设计、企业内部老系统迁移、以及给第三方同步工具对接数据源的兄弟第一反应都是先把 19c 装上再说话。问题在于这东西的下载入口藏得比较深安装过程也不像 MySQL 那样一路下一步就能收工光没有 Oracle 账户怎么下载 19c这一条就能卡住一大半刚开始接触 Oracle 的朋友。我自己前前后后在不同发行版上装过二十来次图形界面装过、静默模式也装过被监听服务坑过、被字符集坑过、也被 dbca 建库时的 CDB 概念绕晕过。这篇就把从拿到安装包到监听正常监听、SQL 能连通的全流程拆开讲顺带把那些文档里不写、只有踩过才知道的细节补上。不管你是在自己笔记本的虚拟机里练手还是要给公司测试机搭一套环境都能直接照着抄。1. 先把版本这件事定下来19c 到底处在什么位置1.1 为什么很多人跳过 12c 直接选 19cOracle 的版本命名一直有点绕。12.1 之后官方改成了发布年份的命名方式12.2 之后直接跳到 18c再往后就是 19c、21c。这里有个关键点18c 是个短命版本官方支持周期很短而 19c 被列为长期支持版本Long Term Support这也是为什么大量生产环境停在了 19c。你去看很多行业软件的兼容性说明写的都是支持 Oracle 11g、12c、19c中间那段 18c 基本被跳过了。从技术谱系上说19c 的本质是 12.2.0.3 这个补丁集基础上继续演进的产物所以它的内部版本号其实还是 12.2 打头的东西比如你看到19.0.0.0.0这种显示不用惊讶。理解这一点很重要因为它直接决定了后面几个问题的答案12c 引入的**多租户架构CDB/PDB**在 19c 里是默认玩法你建库的时候绕不开12c 时期的很多参数、视图、管理方式在 19c 里基本通用网上搜 12c 的教程大部分也能套用但 19c 的补丁策略、RURelease Update节奏和 12c 早期又不一样别把老补丁往上套。我见过太多人拿着 11g 的思维去装 19c结果一进 dbca 就被容器数据库这个词整懵了其实只要理解了 CDB 的思路后面所有操作都会顺。1.2 non-CDB 和 CDB 的取舍装之前就得想清楚19c 建库时你会面对一个选择是建传统架构的non-CDB还是建多租户的CDB。这里给一个非常直接的判断标准。如果你是自己练手、跑课程设计、对接一个老系统其实 non-CDB 完全够用SQL 写法、连接方式和 11g 时代几乎一致学习曲线最平缓。但如果你是在给长期维护的测试环境或者准生产环境做准备那建议直接上 CDB原因有两个一是 20c 之后官方已经不再支持 non-CDB 了早点熟悉多租户是趋势二是 CDB 里一个数据库实例可以挂多个 PDB做数据隔离、环境复制会灵活很多。需要提醒的是19c 的 dbca 默认就是以 CDB 方式建库会同时生成一个根容器 CDB$ROOT、一个种子 PDB$SEED以及一个你自己命名的 PDB。很多新手第一次连上数据库发现里面有XEPDB1这种奇怪名字就是因为默认建的是一个 PDB。搞清楚这条链路后面排查连接问题时能省下大量时间。对比项non-CDBCDB多租户概念复杂度低接近 11g略高多一层容器概念后续版本支持已逐步淘汰官方主推方向多环境隔离靠多实例一个实例挂多 PDB适合场景练手、老系统对接测试/准生产、长期维护2. 绕开账户这道墙19c 安装包从哪拿最省事2.1 官方下载入口的真实路径很多人卡在没有 Oracle 账户怎么下载 19c。其实下载页面本身是公开可访问的问题往往出在搜索结果给的链接指向了错误的平台或者错误的版本。正确的做法是走官方数据库技术页面找到对应 Linux x86-64 的Database板块。注意关键词你要的是Database不是 Client、不是 Grid Infrastructure、也不是 Instant Client很多人下错包就是在这里栽的。下载页面上你会看到不同的介质类型对于全新的安装选完整数据库安装包通常是一个几 GB 的 zip就行。以 19.3 为例Linux 平台的文件名类似LINUX.X64_193000_db_home.zip大小在 2.9 GB 左右。如果你要打补丁到更高的 RU思路是先装基础版本再打 RU不要指望一次性下到最新补丁整合版。2.2 没有账户时的几种合规替代途径官方下载确实经常要求登录 Oracle 账号这里给几个我实际用过的合规途径按推荐度排序。第一种走 Oracle 的软件分发平台。官方有一个专门用于分发软件介质的云平台入口用一套账号体系登录后可以直接拿到带校验的完整介质介质的完整性会比各种第三方转载强得多。第二种从已有实例的机器上直接取。如果你手上有一台已经装好 19c 的机器$ORACLE_HOME目录本身就是一个完整的 Oracle Home把它整目录打包拷到新机器上配合环境变量和 root.sh 是能完成复用的。这个方法在批量部署时特别高效但要注意两点操作系统大版本和补丁级别必须一致否则链接库大概率不匹配拷贝后用relink或重新运行 root.sh修正一下权限和软链。第三种容器镜像思路。现在不少人练习时直接用容器化的数据库镜像来起步跑上来就是可用的实例省掉整个安装流程。但这条路只适合学习体验真要理解安装过程本身还是得老老实实在虚拟机上走一遍否则监听配置、内存参数、目录权限这些东西你永远是黑盒。注意不管从哪拿安装包落地后一定要核对文件大小和校验值。我遇到过一次包在传输中截断解压到一半报错白折腾两个小时。3. 装之前的地基工程系统层准备别偷懒3.1 硬件与操作系统的底线要求Oracle 对资源的要求不算特别高但低于底线会直接导致安装失败或者建库报错。经验上的安全区间是这样的内存至少 2 GB 起但实际建议给到 4 GB 以上因为 dbca 建库时会根据可用内存自动分配 SGA/PGA内存太小容易在创建阶段报 ORA-27102 之类的错。磁盘方面Oracle Home 加上数据文件、重做日志、归档准备 40 GB 以上比较稳妥如果你要开归档和闪回建议直接给 100 GB。操作系统层面主流选择是Oracle Linux 7.x / 8.x、RHEL 7.x / 8.x或者统信、麒麟这类国产化版本。这里有个容易忽略的点不同发行版对应的 preinstall 包不一样OL7 和 OL8 的内核参数默认值就有差异别拿 OL7 的教程直接套在 OL8 上。还有一个特别隐蔽的坑/dev/shm的大小。默认很多系统给的是内存的一半甚至更小而 Oracle 的自动内存管理会依赖共享内存段。装之前先df -h /dev/shm看一眼如果是几百 MB用下面这条命令临时扩到 2 GB 以上或者直接改 fstab 持久化。# 临时调整 /dev/shm 大小到 2G重启失效 mount -o remount,size2G /dev/shm # 查看当前值 df -h /dev/shm3.2 内核参数、用户和组的一次性配置手工调内核参数是老 DBA 的基本功但如果你用的是 Oracle Linux最省事的做法是装 preinstall 包它会自动帮你把sysctl参数、用户、组、limits 都配好一大半。命令大致是这样# Oracle Linux 7 上安装预安装包 yum install -y oracle-database-preinstall-19c装完之后你需要手动确认几个关键系统参数。核心的几个是共享内存段的最大值kernel.shmmax、共享内存总页数kernel.shmall、信号量kernel.sem、以及文件句柄数fs.file-max。很多安装失败其实就卡在 shmmax 太小SGA 分配不出来。用户和组这块最小配置是创建一个oinstall组和一个dba组然后创建oracle用户主组挂oinstall附加组挂dba。如果你后面要用到 Data Guard、备份管理这些可以额外加oper、backupdba、dgdba这些组但对单机练习来说不是必须的。# 参考的用户/组创建方式 groupadd -g 54321 oinstall groupadd -g 54322 dba useradd -u 54321 -g oinstall -G dba -m oracle passwd oracle目录规划上我习惯把 Oracle Base 放在/u01/app/oracleOracle Home 放在/u01/app/oracle/product/19.0.0/dbhome_1。这套路径不是强制的但跟很多教程、脚本保持一致有个好处别人给的命令你直接粘贴就能用不用改路径。创建完目录记得改属主mkdir -p /u01/app/oracle/product/19.0.0/dbhome_1 chown -R oracle:oinstall /u01 chmod -R 775 /u013.3 一个被低估的步骤环境变量环境变量这事儿听起来简单但它是后面 SQL Plus 能跑、监听能起的前提。oracle用户的家目录下的.bash_profile里至少要写清楚这几条ORACLE_BASE、ORACLE_HOME、ORACLE_SID、PATH、LD_LIBRARY_PATH。export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_BASE/product/19.0.0/dbhome_1 export ORACLE_SIDorcl export PATH$ORACLE_HOME/bin:$PATH export LD_LIBRARY_PATH$ORACLE_HOME/lib:/lib:/usr/lib export NLS_LANGAMERICAN_AMERICA.AL32UTF8这里特别说一句NLS_LANG。字符集的坑从你设环境变量的那一刻就开始埋了。如果你以后要往这个库里导入含中文的数据字符集不对会直接给你导成一堆问号。国内环境下我的建议是统一用AL32UTF8除非对接的老系统明确要求 ZHS16GBK。4. runInstaller 的两种打开方式图形与静默4.1 安装包解压的位置很讲究拿到LINUX.X64_193000_db_home.zip之后不要随便找个目录解压再挪过去。19c 的这种完整安装包正确的做法是直接解压到最终的$ORACLE_HOME目录里。也就是说先把空的 dbhome_1 建好然后在这个目录里解压 zip。cd $ORACLE_HOME unzip -q /tmp/LINUX.X64_193000_db_home.zip解压完你会看到runInstaller就在这个目录下。为什么强调要解压到 ORACLE_HOME因为 19c 安装器支持就地安装它会直接从这个目录读取 stage 文件装完之后目录结构天然就是对的省掉了中间搬运可能引发的权限问题。4.2 图形安装的关键几个界面怎么选如果你有图形界面本地 VNC 或者 X11 转发直接跑./runInstaller就能进图形向导。整个流程里有几个界面的选择会直接影响后面安装选项选仅安装数据库软件因为建库我建议单独用 dbca 来做这样出问题好定位数据库版本企业版还是标准版练习用标准版足够企业版有些选项光是配置就够研究一天安装类型单实例数据库安装别选 RAC安装位置确认 Oracle Base 和 ORACLE_HOME 跟你的环境变量一致清单目录默认/u01/app/oraInventory保持默认即可。安装过程会持续十几分钟最后一步会提示你用 root 身份执行两个脚本orainstRoot.sh和root.sh。这两个脚本必须老老实实执行而且要在提示的目录下执行很多人嫌麻烦跳过或者执行失败不处理后面监听起不来、权限不对全都跟这有关。4.3 没有图形界面时怎么静默装服务器环境经常没有图形界面这时候静默安装就是救星。核心思路是准备一个 response file把原本界面里的选择都写进去然后跑$ORACLE_HOME/runInstaller -silent -responseFile /home/oracle/db_install.rsp \ -ignorePrereq -waitforcompletion-ignorePrereq这个参数要慎用它会让安装器忽略预检不通过的项。我一般只在明确知道某个检查项是误报时才加比如缺一个不影响运行的包。真正的问题是静默安装的日志默认不在控制台打全你要去/u01/app/oraInventory/logs/下面翻最新的 installActions 日志出错了直接搜ERROR关键字。静默安装跑完同样会提示执行 root.sh这一步和图形模式一样不能省。执行完之后用$ORACLE_HOME/bin/sqlplus -V验证一下版本能看到 19.0 的信息说明软件层已经装好了。5. dbca 建库单机 CDB 到底怎么配5.1 先搞懂 dbca 的三个必填项软件装好只是第一步真正让数据库活起来的是建库。19c 里建库的主力工具就是 dbca。图形模式下除了常规的数据库名、SID 之外有三个地方最容易被忽略第一容器数据库选项。前面说过默认勾选就是 CDB。勾了之后你需要给 PDB 起名字默认会给个pdborcl或者orclpdb之类。如果你只想练手也可以在这个界面取消勾选建出来的就是传统 non-CDB。第二字符集。这个界面里我的建议是选AL32UTF8理由和前面说环境变量时一样。字符集一旦建库确定后期改起来极其麻烦几乎等同于重建数据库所以宁可在这里多花一分钟确认。第三内存分配。dbca 里一般选使用自动内存管理然后给一个目标值。这里有个经验SGA 加 PGA 的总和不要超过物理内存的 80%给操作系统留出余量。如果你是在资源紧张的虚拟机上练手可以手动切到自定义里把 SGA 调到 1 GB 左右。5.2 静默建库的参数写法图形界面点一遍固然直观但要在多台机器上批量建还是静默命令更靠谱。一个典型的 dbca 静默建库命令大致长这样dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl -sid orcl \ -createAsContainerDatabase true \ -numberOfPDBs 1 -pdbName orclpdb \ -sysPassword oracle123 -systemPassword oracle123 \ -characterSet AL32UTF8 \ -totalMemory 2048 \ -sampleSchema false跑完这条命令dbca 会自己串起建库、注册监听、启动实例等一系列动作进度会打个百分比出来。建库过程千万别中途 CtrlC 或者关终端一旦中断数据文件目录会残留一堆半成品下次再建就会冲突得先手工清干净。这个日志一般在$ORACLE_BASE/cfgtoollogs/dbca/下面。5.3 建完库后的第一件事建库成功后很多人急着连上去结果一sqlplus / as sysdba就懵了连进去发现默认是 CDB$ROOT 容器。这是多租户的正常表现。要切到你的业务 PDB 里得执行-- 查看当前容器 SHOW CON_NAME; -- 切换到具体 PDB ALTER SESSION SET CONTAINER orclpdb; -- 查看当前 PDB 状态 SELECT name, open_mode FROM v$pdbs;如果你的 PDB 状态是MOUNTED而不是READ WRITE说明 PDB 没打开需要手工执行ALTER PLUGGABLE DATABASE orclpdb OPEN;并且设置成随 CDB 启动而打开。6. 监听服务起不来一次完整的排查链路6.1 先看清楚报的是什么错监听起不来是我遇到过频率最高的问题而且报错五花八门。别急着搜命令先老老实实看你敲lsnrctl start之后终端上的输出。常见的几类现象和背后的方向是这样的报错现象大概率原因排查方向TNS-12547 或 lost contact监听日志目录不存在或没权限检查诊断目录TNS-01106 已经启动过残留进程或重复启动先 stop 再查进程启动没反应返回无输出listener.ora 配置错误检查配置文件路径起得来但连不上主机名解析问题检查 hosts 文件6.2 顺着排查链路一步步走第一步确认 ORACLE_HOME 和 PATH。十次里有三次是因为你当前 shell 的环境变量没生效lsnrctl根本不在 PATH 里或者它用了另一个 Oracle Home 的配置。先echo $ORACLE_HOME确认一下再看which lsnrctl指向哪。第二步看 listener.ora 到底在哪。19c 默认会去$ORACLE_HOME/network/admin找。如果这个目录下根本没文件那监听会尝试用默认名和默认端口启动有时候也能起来但注册不到服务。生产环境我更倾向于用 netca 生成一份标准的listener.ora或者手工写清楚主要项LISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 你的主机名)(PORT 1521)) ) )注意那个 HOST。这里写主机名而不是 IP 时系统必须能正确解析这个名字否则监听注册会出诡异问题。第三步检查主机名解析。这是最隐蔽的坑之一。执行hostname拿到主机名然后ping 主机名看看能不能解析到正确的 IP。如果解析不了就得往/etc/hosts里加一条主机名到本机 IP 的映射。很多云主机默认没有这条记录监听就会启动异常或者启动了连不上。第四步看监听日志目录。19c 的监听日志默认放在诊断目录下路径类似$ORACLE_BASE/diag/tnslsnr/主机名/listener/。如果这个目录因为权限或者路径问题建不出来监听直接就挂。手工检查一下这个路径存不存在、oracle 用户有没有写权限。第五步端口占用和防火墙。如果前面都正常但客户端连不上用netstat -tlnp | grep 1521看端口有没有被别的程序占了。同时确认主机防火墙和 SELinux 没有拦掉 1521。# 临时关闭防火墙验证 systemctl stop firewalld # 查看 SELinux 状态 getenforce6.3 起完之后验证才算完监听起来了不代表就万事大吉。执行lsnrctl status重点看两处一是监听是否在 LISTENING 状态二是下面列出来的服务里有没有你建的数据库。如果只有一个空的监听、没有服务注册说明数据库实例没跟监听挂上关系。这时候可以在数据库里手动触发注册ALTER SYSTEM REGISTER;还有一个思路是检查local_listener参数。在 CDB 和 PDB 混合的环境里有时需要显式指定实例向哪个监听地址注册否则它会去找默认名字的监听对不上就注册失败。提示排查监听问题时养成先看日志再动手改配置的习惯。日志里那行 TNS 开头的错误码就是你少走两小时弯路的关键。7. 装完之后那些真用得上的细节7.1 连接字符串和客户端配置数据库能连了接下来大多数人的诉求是用工具连上去。这时候你会遇到tnsnames.ora或者 EZConnect 两种连法。EZConnect 最省事格式就是主机:端口/服务名比如192.168.1.100:1521/orclpdb。注意服务名和 SID 不是一回事CDB 环境里连 PDB 一般用服务名连根容器也各有各的服务名写错了就会报 ORA-12514。如果你是在装客户端工具记得tnsnames.ora要放在客户端自己的network/admin目录下不是服务端那份。我见过有人改了服务端的配置文件然后在自己的 Windows 电脑上死活连不上就是因为找错了文件。7.2 数据导入导出时的字符集坑前面反复提字符集这里说一个真实高频场景SQL 导出的身份证号变成科学计数法。这种情况通常不是数据库的问题而是导出工具或者 Excel 把长数字自动转成了科学计数。正确做法是在导出时把那一列显式转成字符串类型或者在查看工具里设置按文本显示。另一个经典坑是数据泵导出导入时的字符集。如果你的目标库字符集跟源库不一致导出时用NLS_LANG指定源库字符集导入时指定目标库字符集中间别用系统默认值糊弄否则中文全变问号。这条经验在跨版本迁移时尤其重要。7.3 几个新手必会的基础操作装完库总得会用。这里挑几个最核心的语句给新手垫个底。日期处理上TRUNC(SYSDATE)是把当前时间截断到当天零点做按天统计时特别常用TRUNC(SYSDATE, MM)则是截断到当月一号这些是写报表 SQL 的基本功。分页查询方面老版本靠ROWNUM套两层子查询19c 里虽然也支持OFFSET ... FETCH这种更直观的写法但分页稳定的关键是排序字段如果你的ORDER BY字段有重复值翻页时容易出现数据重复或漏行稳妥做法是加上唯一键作为第二排序条件。-- 传统 ROWNUM 分页写法 SELECT * FROM ( SELECT t.*, ROWNUM rn FROM (SELECT * FROM emp ORDER BY empno) t WHERE ROWNUM 20 ) WHERE rn 10;7.4 让数据库开机自启省点心虚拟机环境经常重启每次都手工startup太麻烦。19c 提供了自动启动的机制核心是配置一个/etc/oratab文件把对应实例那一行的最后一个字段从N改成Y然后启用服务。这样系统重启后数据库实例会跟着起来。但要注意这个机制不会自动帮你打开 PDBCDB 起来了 PDB 还可能是 MOUNTED 状态如果要 PDB 也自动打开需要在 PDB 里配置保存状态或者写个触发器在启动后自动打开。# 修改 /etc/oratab把 N 改成 Y # 例如orcl:/u01/app/oracle/product/19.0.0/dbhome_1:Y # 启用并启动服务 systemctl enable oracle-rdbms.service systemctl start oracle-rdbms.service我在虚拟机里做练习环境时最常被忽略的就是 PDB 自动打开这一步隔几天重启一次就要手动连进去开一遍后来干脆写了个小脚本跟着系统启动跑省了不少事。8. 我个人踩过的几个真实坑说实话19c 的安装本身没什么玄学出问题的永远是那些看起来不相干的系统层细节。我印象最深的一次是在一台国产化操作系统上装preinstall 包对不上内核参数全是手工调的kernel.shmall没算对导致 dbca 建到一半 SGA 分配失败报了个 ORA-27102日志里那行信息藏得很深翻了半小时才定位到。后来我的习惯是装之前先把ipcs -l跑一遍把共享内存和信号量的实际值记下来跟官方推荐值对一遍再动手比出了错再回头找强太多。还有一次是监听问题现象是听起得来、lsnrctl status也正常但远程客户端就是连不上。折腾了半天发现是主机名解析的问题——hostname出来的名字在/etc/hosts里没有对应记录监听把服务注册到了一个解析不出来的地址上。往 hosts 里补一行映射重启监听问题立马消失。另外一个经验是如果你正在找相关的试题目录或者课程设计素材别只盯着安装这一步。很多练习场景其实要求你能熟练在 PDB 里建表、写存储过程、做增删改查装库只是入场券。把 19c 装通之后建议顺手在 PDB 里跑一遍建表、插数据、写个带游标的存储过
返回列表